mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-01-06 05:18:32 -05:00
Compare commits
391 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f709d11952 | ||
|
|
2a3463b746 | ||
|
|
737a370874 | ||
|
|
2a2b6f312b | ||
|
|
96d220acbd | ||
|
|
b9a9b8695d | ||
|
|
e80c8a50e6 | ||
|
|
41795799e6 | ||
|
|
9980e49eef | ||
|
|
a283828461 | ||
|
|
7c365b7c03 | ||
|
|
16da55f58b | ||
|
|
e280734e33 | ||
|
|
a312c4dbf3 | ||
|
|
79fb1fb299 | ||
|
|
b7c1cdfd46 | ||
|
|
09873d4814 | ||
|
|
7f596c653b | ||
|
|
bb06b0414b | ||
|
|
6b720bafd6 | ||
|
|
6449591143 | ||
|
|
8fb43246b2 | ||
|
|
95d3fd4958 | ||
|
|
dfbc890f2c | ||
|
|
21886ab4b8 | ||
|
|
4b0df3ace8 | ||
|
|
7505b5cf65 | ||
|
|
45e71da402 | ||
|
|
3ded63dfdf | ||
|
|
735c3e3146 | ||
|
|
83861cfcb8 | ||
|
|
c22ff8ccad | ||
|
|
9a17a484f3 | ||
|
|
bc6734399f | ||
|
|
8e6f2a3d61 | ||
|
|
20fa3a25f2 | ||
|
|
1a9f5470ca | ||
|
|
2254d114be | ||
|
|
ef22d29ef1 | ||
|
|
ef165cd276 | ||
|
|
e6477920ce | ||
|
|
c49584d027 | ||
|
|
e56eabf1e2 | ||
|
|
a35f2ae56a | ||
|
|
2a4a195dcb | ||
|
|
6318e8d1c6 | ||
|
|
b7a4899302 | ||
|
|
7fe6ef4da5 | ||
|
|
0391763d18 | ||
|
|
3250384862 | ||
|
|
1bf496751c | ||
|
|
580700458c | ||
|
|
6c6276cb79 | ||
|
|
787f9293fb | ||
|
|
aa0547ae69 | ||
|
|
1c6b0f1122 | ||
|
|
014721b6f7 | ||
|
|
692d8a5681 | ||
|
|
120d4cfc5a | ||
|
|
e3b3f70621 | ||
|
|
c5e55a2207 | ||
|
|
f6d508af92 | ||
|
|
516a732b12 | ||
|
|
dfd4943304 | ||
|
|
511e08e7e9 | ||
|
|
ed50dfc145 | ||
|
|
ee542255a5 | ||
|
|
32fa9d4439 | ||
|
|
f2be3383ac | ||
|
|
fd6874e8dd | ||
|
|
09e514fa84 | ||
|
|
f4678f99ed | ||
|
|
4e9670acf6 | ||
|
|
fb097ca095 | ||
|
|
8f40d13f20 | ||
|
|
2aaef9ae54 | ||
|
|
a6d31638e2 | ||
|
|
f73aefce4e | ||
|
|
ff5131018b | ||
|
|
1c6c5042ae | ||
|
|
d770009e0d | ||
|
|
4a0b211f27 | ||
|
|
7dcf2ca33d | ||
|
|
95c15504d0 | ||
|
|
4e38625bde | ||
|
|
4a411f0483 | ||
|
|
95b6d901bf | ||
|
|
c9d74e25ac | ||
|
|
54aef24caf | ||
|
|
6050b1e25a | ||
|
|
b54cef2702 | ||
|
|
abb2c8110c | ||
|
|
f1e8d633fc | ||
|
|
c4f60942b5 | ||
|
|
abbaf12e9e | ||
|
|
04e6601d5b | ||
|
|
1ebc7d27d4 | ||
|
|
59d53a02b3 | ||
|
|
370da5aee3 | ||
|
|
af2992eee9 | ||
|
|
e17b8b813c | ||
|
|
9b4e0dd0d9 | ||
|
|
d7bc1c75da | ||
|
|
b963b99a4c | ||
|
|
9270e22f19 | ||
|
|
7df34890d4 | ||
|
|
36b0661e1d | ||
|
|
6da50b576f | ||
|
|
517491e507 | ||
|
|
82aca1f77f | ||
|
|
8c4f657aa7 | ||
|
|
4352762e93 | ||
|
|
ad0ea09be9 | ||
|
|
52c6fe34b2 | ||
|
|
b6ccb9fbdb | ||
|
|
f83ab6ecc1 | ||
|
|
1af0f426ae | ||
|
|
d960947258 | ||
|
|
f2735ba22b | ||
|
|
aa4c02ef30 | ||
|
|
f1fbf0d120 | ||
|
|
63a362a48a | ||
|
|
e0d7341139 | ||
|
|
5f5b06683a | ||
|
|
42523bbfc9 | ||
|
|
0a344731c8 | ||
|
|
e83fa89ec4 | ||
|
|
13cd7a1c0f | ||
|
|
0e23a41bdb | ||
|
|
e17b320dc8 | ||
|
|
403038a5b2 | ||
|
|
430e1d7d4e | ||
|
|
c44cd7ffab | ||
|
|
73dfb523ec | ||
|
|
21d57735c9 | ||
|
|
05e13e6078 | ||
|
|
5f6844eceb | ||
|
|
bea1a592d7 | ||
|
|
b54cdf6425 | ||
|
|
02da2114f9 | ||
|
|
a67533a778 | ||
|
|
59ad834c12 | ||
|
|
315d5b370e | ||
|
|
130813ffe4 | ||
|
|
65ddb7c9e2 | ||
|
|
dbe29e15ae | ||
|
|
980b3c634b | ||
|
|
457d8c93ce | ||
|
|
23aad6358c | ||
|
|
7c896361f2 | ||
|
|
5b7f5738e3 | ||
|
|
5bfcb80c98 | ||
|
|
b1278b45e2 | ||
|
|
e7ae76ea48 | ||
|
|
e84e5e2910 | ||
|
|
5e6f5bc175 | ||
|
|
d577978f2f | ||
|
|
e30728e8e9 | ||
|
|
29368d9cc4 | ||
|
|
4776da7aea | ||
|
|
87518b1fbd | ||
|
|
d7deb5a3f8 | ||
|
|
445ec18bb4 | ||
|
|
3ecc289e1a | ||
|
|
805e1c2d7d | ||
|
|
58286013c9 | ||
|
|
1afdc400a8 | ||
|
|
f6d526741b | ||
|
|
c9b21f862e | ||
|
|
4ae7f6eca4 | ||
|
|
c9fdf862a3 | ||
|
|
cf97c2247c | ||
|
|
9c95c56f0a | ||
|
|
9f3aca5a3f | ||
|
|
dd87779476 | ||
|
|
2e7078e90b | ||
|
|
6b52b61604 | ||
|
|
41e2643755 | ||
|
|
170b4d338d | ||
|
|
ecd506c714 | ||
|
|
e6aadc4902 | ||
|
|
ae74e0d71c | ||
|
|
d6db8c23ce | ||
|
|
dcf7afa441 | ||
|
|
185c93100b | ||
|
|
cf68420976 | ||
|
|
dea3b756f1 | ||
|
|
825b19c634 | ||
|
|
8d59c35bc9 | ||
|
|
06ec8dd4f3 | ||
|
|
fc4ec3261f | ||
|
|
663716ca0f | ||
|
|
6c4ce585d6 | ||
|
|
0acf30db61 | ||
|
|
db9035f92c | ||
|
|
a475afd570 | ||
|
|
57ca357969 | ||
|
|
cac099eeb3 | ||
|
|
c0929634a9 | ||
|
|
52de8afe2d | ||
|
|
2809b87ab0 | ||
|
|
7aab87813c | ||
|
|
4a67fffccd | ||
|
|
12b7625d42 | ||
|
|
275e1dc85c | ||
|
|
3a8e814315 | ||
|
|
07ebd1e613 | ||
|
|
a626330139 | ||
|
|
5ac7645350 | ||
|
|
efc6064605 | ||
|
|
71a6f32665 | ||
|
|
d60c4c179b | ||
|
|
c5c8c59168 | ||
|
|
fca75c5c07 | ||
|
|
012142feec | ||
|
|
d532395d89 | ||
|
|
b25f9f2cdf | ||
|
|
5471e742f0 | ||
|
|
c5849b2a74 | ||
|
|
429b2adf98 | ||
|
|
df366cd82a | ||
|
|
0a4bb583ff | ||
|
|
dfb650c4b1 | ||
|
|
aa4527e5f7 | ||
|
|
ae8ea16dab | ||
|
|
d321c69244 | ||
|
|
478a4e5d73 | ||
|
|
44cd2fef1c | ||
|
|
0abe8b1921 | ||
|
|
4a13714177 | ||
|
|
ac3514f4c6 | ||
|
|
f9b71f4b4c | ||
|
|
7ca50b63f9 | ||
|
|
62adc920a9 | ||
|
|
eeda71e186 | ||
|
|
8e5ea1df5e | ||
|
|
0bf3aed287 | ||
|
|
74d6f58363 | ||
|
|
3d4405cd42 | ||
|
|
98c8694979 | ||
|
|
32812d6a6c | ||
|
|
1f8d7c0b21 | ||
|
|
8b88f6892c | ||
|
|
618c567392 | ||
|
|
fb44451c6f | ||
|
|
9e1edbacb6 | ||
|
|
f45d02299a | ||
|
|
7afd7b2334 | ||
|
|
0a28d36df9 | ||
|
|
2c1185e1d4 | ||
|
|
69bbf9fdcc | ||
|
|
38125fa362 | ||
|
|
5db7a735d7 | ||
|
|
4d2363ea22 | ||
|
|
994940f270 | ||
|
|
3adb324b25 | ||
|
|
fbfc5b31d6 | ||
|
|
2a016ecce9 | ||
|
|
782d4ec180 | ||
|
|
8c52448da2 | ||
|
|
7e194887f5 | ||
|
|
806a1b9392 | ||
|
|
d575a3b222 | ||
|
|
f61fdb8623 | ||
|
|
ea7005e822 | ||
|
|
a7775ea7ef | ||
|
|
ba4eddccd9 | ||
|
|
6fcda5e446 | ||
|
|
34d742963a | ||
|
|
59cd68d54a | ||
|
|
1e4dbe4e95 | ||
|
|
5d89d53a4a | ||
|
|
349ccbad6f | ||
|
|
5d68620382 | ||
|
|
cb06c8a877 | ||
|
|
7d57fdcd96 | ||
|
|
fa60d81e26 | ||
|
|
6c4294dc49 | ||
|
|
0a3542e97c | ||
|
|
83887e3c37 | ||
|
|
5fe29cdd93 | ||
|
|
f618c45767 | ||
|
|
e1a87b32d9 | ||
|
|
9e739c8b35 | ||
|
|
d6fab197e7 | ||
|
|
89a5326d3f | ||
|
|
f0b542c990 | ||
|
|
c1a3516b37 | ||
|
|
db467105b9 | ||
|
|
2b5372f693 | ||
|
|
1a2ff9540f | ||
|
|
28fdc8a9ac | ||
|
|
b0ce1483fe | ||
|
|
ad251b2449 | ||
|
|
0ebc2a746b | ||
|
|
9c6e3ebe5b | ||
|
|
1b404ee6d8 | ||
|
|
72052be92f | ||
|
|
f2e7deb5cb | ||
|
|
b2e0c51ead | ||
|
|
3d73e7498f | ||
|
|
690f595491 | ||
|
|
058d968833 | ||
|
|
da2adaa694 | ||
|
|
fb9be66f97 | ||
|
|
0a446928d7 | ||
|
|
dc01ff36dc | ||
|
|
2d90ae903b | ||
|
|
d324c6ac57 | ||
|
|
aebf229b86 | ||
|
|
3c76a82997 | ||
|
|
30ec65f43c | ||
|
|
2471c7b08e | ||
|
|
4be23ccffb | ||
|
|
99db24cdec | ||
|
|
719a33352a | ||
|
|
fe3bd95c85 | ||
|
|
8db08c21e5 | ||
|
|
a384e6716d | ||
|
|
e35b2e9fbf | ||
|
|
b48c2ab736 | ||
|
|
a12ee536d9 | ||
|
|
97d5439a4f | ||
|
|
c94a1d7c17 | ||
|
|
0ce05c781c | ||
|
|
0e0dfbf014 | ||
|
|
ae03e61bb9 | ||
|
|
f6167b1d81 | ||
|
|
df75cb4034 | ||
|
|
67313f8f03 | ||
|
|
39eab01885 | ||
|
|
9fb63a00fd | ||
|
|
f945cb8d2d | ||
|
|
7a107584c7 | ||
|
|
248459671e | ||
|
|
67e48c2fd1 | ||
|
|
368d25fa01 | ||
|
|
12b1d29413 | ||
|
|
dccc676b24 | ||
|
|
d9c1cf8bec | ||
|
|
0836c303d9 | ||
|
|
a43fd6b7fc | ||
|
|
e7ee189fbb | ||
|
|
b6708613b9 | ||
|
|
3317e061a8 | ||
|
|
0dc8584485 | ||
|
|
673ad6d42b | ||
|
|
1450d6fc4c | ||
|
|
b082242439 | ||
|
|
de69a3ca86 | ||
|
|
96e37b3ee1 | ||
|
|
cb2d8a9a50 | ||
|
|
19c5b7c7ab | ||
|
|
38a4215b35 | ||
|
|
77a05c754e | ||
|
|
2226d7cbf9 | ||
|
|
c1a2c7d485 | ||
|
|
8127f48924 | ||
|
|
a0e7f85c32 | ||
|
|
b45ffd2046 | ||
|
|
ef4f6245d5 | ||
|
|
7bd1c8ef14 | ||
|
|
5d049d5696 | ||
|
|
704d0a8392 | ||
|
|
12547feb4c | ||
|
|
7dbc031725 | ||
|
|
70ce34d6c9 | ||
|
|
dff351a8eb | ||
|
|
abf4b7706f | ||
|
|
813a124250 | ||
|
|
7299c9ec9a | ||
|
|
3a0e4ff119 | ||
|
|
9cc59e81d6 | ||
|
|
a04b6983e7 | ||
|
|
6beea06a41 | ||
|
|
e75b5f2f15 | ||
|
|
c9acc48bd6 | ||
|
|
f4df68a9e2 | ||
|
|
4cee8ea879 | ||
|
|
e7f5a4adff | ||
|
|
0301713214 | ||
|
|
5ef23e0330 | ||
|
|
88529457bf | ||
|
|
890b5d93a7 | ||
|
|
7dafa6c7fe | ||
|
|
8d2d571683 | ||
|
|
19e776a772 | ||
|
|
f77649abc8 | ||
|
|
33870dc845 | ||
|
|
265313919c | ||
|
|
dd5d1b9cba |
9
.github/DISCUSSION_TEMPLATE/oauth-provider-example.yaml
vendored
Normal file
9
.github/DISCUSSION_TEMPLATE/oauth-provider-example.yaml
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
---
|
||||
title: OAuth setup with <PROVIDER>
|
||||
body:
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Configuration Example
|
||||
description: Add your example configuration. You can provide code blocks, screenshots, and links.
|
||||
validations:
|
||||
required: true
|
||||
12
.github/ISSUE_TEMPLATE/task.yaml
vendored
12
.github/ISSUE_TEMPLATE/task.yaml
vendored
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: v1.0.0b Task
|
||||
name: Task
|
||||
description: "CONTRIBUTORS ONLY: Submit a Task that needs to be completed"
|
||||
title: "[v1.0.0b] [Task] - TASK DESCRIPTION"
|
||||
title: "[Task] - TASK DESCRIPTION"
|
||||
labels:
|
||||
- task
|
||||
- v1
|
||||
@@ -11,17 +11,17 @@ body:
|
||||
value: |
|
||||
Thanks for your interest in Mealie! 🚀
|
||||
|
||||
This is a place for Mealie contributors to find tasks that need to get done around the repository. Tasks are different than issues as they are generally related to providing a new feature or improve an existing feature. They are _generally_ not related to an issue.
|
||||
This is a place for Mealie contributors to find tasks that need to get done around the repository. Tasks are different than issues as they are generally related to providing a new feature or improving an existing feature. They are _generally_ not related to an issue.
|
||||
|
||||
**DO NOT** create a task unless
|
||||
- You are a contributors who has prior approval via discord/discussions
|
||||
- You are a contributor who has prior approval via discord/discussions
|
||||
- You have otherwise been given approval to post the tasks
|
||||
|
||||
Otherwise, your post will be closed/deleted.
|
||||
|
||||
**Interested in Taking This?**
|
||||
|
||||
If you're interested in completing this tasks and it hasn't already been taken, comment below and to let others know you're working on it. As you work through the task, I ask that you submit a draft pull request as soon as possible, and tag this issue so we can all collaborate as best as possible.
|
||||
If you're interested in completing this task and it hasn't already been taken, comment below and to let others know you're working on it. As you work through the task, I ask that you submit a draft pull request as soon as possible, and tag this issue so we can all collaborate as best as possible.
|
||||
- type: textarea
|
||||
id: problem
|
||||
attributes:
|
||||
@@ -33,6 +33,6 @@ body:
|
||||
id: solution
|
||||
attributes:
|
||||
label: Proposed/Possible Solution(s)?
|
||||
placeholder: Provide as much context around the idea as possible with potential files and roadblocks that may come up
|
||||
placeholder: Provide as much context around the idea as possible with potential files and roadblocks that may come up.
|
||||
validations:
|
||||
required: true
|
||||
|
||||
46
.github/workflows/e2e.yml
vendored
Normal file
46
.github/workflows/e2e.yml
vendored
Normal file
@@ -0,0 +1,46 @@
|
||||
name: E2E Tests
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- mealie-next
|
||||
jobs:
|
||||
test:
|
||||
timeout-minutes: 60
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./tests/e2e
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 18
|
||||
cache: 'yarn'
|
||||
cache-dependency-path: ./tests/e2e/yarn.lock
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
- name: Build Image
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
file: ./docker/Dockerfile
|
||||
context: .
|
||||
push: false
|
||||
load: true
|
||||
tags: mealie:e2e
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
- name: Deploy E2E Test Environment
|
||||
run: docker compose up -d
|
||||
working-directory: ./tests/e2e/docker
|
||||
- name: Install dependencies
|
||||
run: npm install -g yarn && yarn
|
||||
- name: Install Playwright Browsers
|
||||
run: yarn playwright install --with-deps
|
||||
- name: Check test environment
|
||||
run: docker ps
|
||||
- name: Run Playwright tests
|
||||
run: yarn playwright test
|
||||
- name: Destroy Test Environment
|
||||
if: always()
|
||||
run: docker compose down --volumes
|
||||
working-directory: ./tests/e2e/docker
|
||||
13
.github/workflows/nightly.yml
vendored
13
.github/workflows/nightly.yml
vendored
@@ -4,6 +4,12 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- mealie-next
|
||||
paths-ignore:
|
||||
- '*.md'
|
||||
- '.devcontainer/**'
|
||||
# I'm not excluding .github as changes in there might be to workflows etc
|
||||
- '.vscode/**'
|
||||
- 'docs/**'
|
||||
|
||||
concurrency:
|
||||
group: nightly-${{ github.ref }}
|
||||
@@ -22,7 +28,13 @@ jobs:
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
# The id-token write permission is needed to connect to Depot.dev
|
||||
# as part of the partial-builder.yml action. It needs to be declared
|
||||
# in the parent action, as noted here:
|
||||
# https://github.com/orgs/community/discussions/76409#discussioncomment-8131390
|
||||
id-token: write
|
||||
name: Build Tagged Release
|
||||
if: github.repository == 'mealie-recipes/mealie'
|
||||
uses: ./.github/workflows/partial-builder.yml
|
||||
needs:
|
||||
- frontend-tests
|
||||
@@ -35,6 +47,7 @@ jobs:
|
||||
|
||||
notify-discord:
|
||||
name: Notify Discord
|
||||
if: github.repository == 'mealie-recipes/mealie'
|
||||
needs:
|
||||
- build-release
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
16
.github/workflows/partial-builder.yml
vendored
16
.github/workflows/partial-builder.yml
vendored
@@ -35,19 +35,16 @@ jobs:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Override __init__.py
|
||||
run: |
|
||||
echo "__version__ = \"${{ inputs.tag }}\"" > ./mealie/__init__.py
|
||||
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@v5
|
||||
- uses: depot/setup-action@v1
|
||||
|
||||
- name: Build and push Docker image, via Depot.dev
|
||||
uses: depot/build-push-action@v1
|
||||
with:
|
||||
project: srzjb6mhzm
|
||||
file: ./docker/Dockerfile
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
@@ -58,6 +55,3 @@ jobs:
|
||||
${{ inputs.tags }}
|
||||
build-args: |
|
||||
COMMIT=${{ github.sha }}
|
||||
# https://docs.docker.com/build/ci/github-actions/cache/#github-cache
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
|
||||
24
.github/workflows/release.yml
vendored
24
.github/workflows/release.yml
vendored
@@ -17,6 +17,11 @@ jobs:
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
# The id-token write permission is needed to connect to Depot.dev
|
||||
# as part of the partial-builder.yml action. It needs to be declared
|
||||
# in the parent action, as noted here:
|
||||
# https://github.com/orgs/community/discussions/76409#discussioncomment-8131390
|
||||
id-token: write
|
||||
name: Build Tagged Release
|
||||
uses: ./.github/workflows/partial-builder.yml
|
||||
needs:
|
||||
@@ -51,6 +56,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Checkout 🛎
|
||||
uses: actions/checkout@v4
|
||||
@@ -60,11 +66,15 @@ jobs:
|
||||
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:${{ github.event.release.tag_name }}/' docs/docs/documentation/getting-started/installation/sqlite.md
|
||||
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:${{ github.event.release.tag_name }}/' docs/docs/documentation/getting-started/installation/postgres.md
|
||||
|
||||
- name: Commit updates
|
||||
uses: test-room-7/action-update-file@v1
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
# This doesn't currently work for us because it creates the PR but the workflows don't run.
|
||||
# TODO: Provide a personal access token as a parameter here, that solves that problem.
|
||||
# https://github.com/peter-evans/create-pull-request
|
||||
with:
|
||||
file-path: |
|
||||
docs/docs/documentation/getting-started/installation/sqlite.md
|
||||
docs/docs/documentation/getting-started/installation/postgres.md
|
||||
commit-msg: "Change image tag, for release ${{ github.event.release.tag_name }}"
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
commit-message: "Update image tag, for release ${{ github.event.release.tag_name }}"
|
||||
branch: "docs/newrelease-update-version-${{ github.event.release.tag_name }}"
|
||||
delete-branch: true
|
||||
base: mealie-next
|
||||
title: "docs(auto): Update image tag, for release ${{ github.event.release.tag_name }}"
|
||||
body: "Auto-generated by `.github/workflows/release.yml`, on publish of release ${{ github.event.release.tag_name }}"
|
||||
|
||||
10
.vscode/tasks.json
vendored
10
.vscode/tasks.json
vendored
@@ -24,16 +24,6 @@
|
||||
},
|
||||
"problemMatcher": []
|
||||
},
|
||||
{
|
||||
"label": "Init Database",
|
||||
"command": "poetry run python mealie/db/init_db.py",
|
||||
"type": "shell",
|
||||
"presentation": {
|
||||
"reveal": "always",
|
||||
"group": "groupA"
|
||||
},
|
||||
"problemMatcher": []
|
||||
},
|
||||
{
|
||||
"label": "Dev: Start Frontend",
|
||||
"command": "task ui",
|
||||
|
||||
@@ -71,12 +71,9 @@ Distributed under the AGPL License. See `LICENSE` for more information.
|
||||
|
||||
Huge thanks to all the sponsors of this project on [Github Sponsors](https://github.com/sponsors/hay-kot) and Buy Me a Coffee. Without you, this project would surely not be possible.
|
||||
|
||||
Thanks to Linode for providing Hosting for the Demo, Beta, and Documentation sites! Another big thanks to JetBrains for providing their IDEs for development.
|
||||
Thanks to Depot for providing build instances for our Docker image builds.
|
||||
|
||||
<div align='center'>
|
||||
<img height="100" src="docs/docs/assets/img/sponsors-linode.svg" />
|
||||
<img height="100" src="docs/docs/assets/img/sponsors-jetbrains.png" />
|
||||
</div>
|
||||
[](https://depot.dev?utm_source=Mealie)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -14,7 +14,9 @@ env:
|
||||
SMTP_HOST: localhost
|
||||
SMTP_PORT: 1025
|
||||
SMTP_FROM_NAME: MealieDev
|
||||
SMTP_FROM_EMAIL: mealie@example.com
|
||||
SMTP_AUTH_STRATEGY: NONE
|
||||
BASE_URL: http://localhost:3000
|
||||
LANG: en-US
|
||||
|
||||
# loads .env file if it exists
|
||||
@@ -108,7 +110,7 @@ tasks:
|
||||
py:lint:
|
||||
desc: runs python linter
|
||||
cmds:
|
||||
- poetry run ruff mealie
|
||||
- poetry run ruff check mealie
|
||||
|
||||
py:check:
|
||||
desc: runs all linters, type checkers, and formatters
|
||||
@@ -130,7 +132,6 @@ tasks:
|
||||
py:
|
||||
desc: runs the backend server
|
||||
cmds:
|
||||
- poetry run python mealie/db/init_db.py
|
||||
- poetry run python mealie/app.py
|
||||
|
||||
py:postgres:
|
||||
@@ -143,7 +144,6 @@ tasks:
|
||||
POSTGRES_PORT: 5432
|
||||
POSTGRES_DB: mealie
|
||||
cmds:
|
||||
- poetry run python mealie/db/init_db.py
|
||||
- poetry run python mealie/app.py
|
||||
|
||||
ui:build:
|
||||
|
||||
@@ -9,7 +9,7 @@ Create Date: 2023-21-02 22:03:19.837244
|
||||
from uuid import uuid4
|
||||
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy.orm.session import Session
|
||||
from sqlalchemy import orm
|
||||
|
||||
import mealie.db.migration_types
|
||||
from alembic import op
|
||||
@@ -23,8 +23,10 @@ branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def populate_shopping_lists_multi_purpose_labels(shopping_lists_multi_purpose_labels_table: sa.Table, session: Session):
|
||||
shopping_lists = session.query(ShoppingList).all()
|
||||
def populate_shopping_lists_multi_purpose_labels(
|
||||
shopping_lists_multi_purpose_labels_table: sa.Table, session: orm.Session
|
||||
):
|
||||
shopping_lists = session.query(ShoppingList).options(orm.load_only(ShoppingList.id, ShoppingList.group_id)).all()
|
||||
|
||||
shopping_lists_labels_data: list[dict] = []
|
||||
for shopping_list in shopping_lists:
|
||||
@@ -60,7 +62,7 @@ def upgrade():
|
||||
)
|
||||
# ### end Alembic commands ###
|
||||
|
||||
session = Session(bind=op.get_bind())
|
||||
session = orm.Session(bind=op.get_bind())
|
||||
populate_shopping_lists_multi_purpose_labels(shopping_lists_multi_purpose_labels_table, session)
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
"""added user to shopping list
|
||||
|
||||
Revision ID: 2298bb460ffd
|
||||
Revises: ba1e4a6cfe99
|
||||
Create Date: 2024-02-23 16:15:07.115641
|
||||
|
||||
"""
|
||||
|
||||
from uuid import UUID
|
||||
|
||||
import sqlalchemy as sa
|
||||
from sqlalchemy import orm
|
||||
|
||||
import mealie.db.migration_types
|
||||
from alembic import op
|
||||
from mealie.core.root_logger import get_logger
|
||||
|
||||
logger = get_logger()
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = "2298bb460ffd"
|
||||
down_revision = "ba1e4a6cfe99"
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def is_postgres():
|
||||
return op.get_context().dialect.name == "postgresql"
|
||||
|
||||
|
||||
def find_user_id_for_group(group_id: UUID):
|
||||
bind = op.get_bind()
|
||||
session = orm.Session(bind=bind)
|
||||
|
||||
if is_postgres():
|
||||
stmt = "SELECT id FROM users WHERE group_id=:group_id AND admin = TRUE LIMIT 1"
|
||||
else:
|
||||
stmt = "SELECT id FROM users WHERE group_id=:group_id AND admin = 1 LIMIT 1"
|
||||
|
||||
with session:
|
||||
try:
|
||||
# try to find an admin user
|
||||
return session.execute(sa.text(stmt).bindparams(group_id=group_id)).scalar_one()
|
||||
except orm.exc.NoResultFound:
|
||||
pass
|
||||
|
||||
try:
|
||||
# fallback to any user
|
||||
return session.execute(
|
||||
sa.text("SELECT id FROM users WHERE group_id=:group_id LIMIT 1").bindparams(group_id=group_id)
|
||||
).scalar_one()
|
||||
except orm.exc.NoResultFound:
|
||||
pass
|
||||
|
||||
# no user could be found
|
||||
return None
|
||||
|
||||
|
||||
def populate_shopping_list_users():
|
||||
bind = op.get_bind()
|
||||
session = orm.Session(bind=bind)
|
||||
|
||||
with session:
|
||||
list_ids_and_group_ids = session.execute(sa.text("SELECT id, group_id FROM shopping_lists")).all()
|
||||
for list_id, group_id in list_ids_and_group_ids:
|
||||
user_id = find_user_id_for_group(group_id)
|
||||
if user_id:
|
||||
session.execute(
|
||||
sa.text(f"UPDATE shopping_lists SET user_id=:user_id WHERE id=:id").bindparams(
|
||||
user_id=user_id, id=list_id
|
||||
)
|
||||
)
|
||||
else:
|
||||
logger.warning(
|
||||
f"No user found for shopping list {list_id} with group {group_id}; deleting shopping list"
|
||||
)
|
||||
session.execute(sa.text(f"DELETE FROM shopping_lists WHERE id=:id").bindparams(id=list_id))
|
||||
|
||||
|
||||
def upgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
with op.batch_alter_table("shopping_lists") as batch_op:
|
||||
# allow nulls during migration
|
||||
batch_op.add_column(sa.Column("user_id", mealie.db.migration_types.GUID(), nullable=True))
|
||||
batch_op.create_index(op.f("ix_shopping_lists_user_id"), ["user_id"], unique=False)
|
||||
batch_op.create_foreign_key("fk_user_shopping_lists", "users", ["user_id"], ["id"])
|
||||
# ### end Alembic commands ###
|
||||
|
||||
populate_shopping_list_users()
|
||||
|
||||
# forbid nulls after migration
|
||||
with op.batch_alter_table("shopping_lists") as batch_op:
|
||||
batch_op.alter_column("user_id", nullable=False)
|
||||
|
||||
|
||||
def downgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_constraint(None, "shopping_lists", type_="foreignkey")
|
||||
op.drop_index(op.f("ix_shopping_lists_user_id"), table_name="shopping_lists")
|
||||
op.drop_column("shopping_lists", "user_id")
|
||||
# ### end Alembic commands ###
|
||||
@@ -0,0 +1,31 @@
|
||||
"""add OIDC auth method
|
||||
|
||||
Revision ID: 09aba125b57a
|
||||
Revises: 2298bb460ffd
|
||||
Create Date: 2024-03-10 05:08:32.397027
|
||||
|
||||
"""
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
import mealie.db.migration_types
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = "09aba125b57a"
|
||||
down_revision = "2298bb460ffd"
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def is_postgres():
|
||||
return op.get_context().dialect.name == "postgresql"
|
||||
|
||||
|
||||
def upgrade():
|
||||
if is_postgres():
|
||||
op.execute("ALTER TYPE authmethod ADD VALUE 'OIDC'")
|
||||
|
||||
|
||||
def downgrade():
|
||||
pass
|
||||
@@ -3,8 +3,8 @@ from pathlib import Path
|
||||
|
||||
from fastapi import FastAPI
|
||||
from jinja2 import Template
|
||||
from pydantic import BaseModel
|
||||
from utils import PROJECT_DIR, CodeTemplates, HTTPRequest, RouteObject
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
from utils import PROJECT_DIR, CodeTemplates, HTTPRequest, RouteObject, RequestType
|
||||
|
||||
CWD = Path(__file__).parent
|
||||
|
||||
@@ -12,23 +12,25 @@ OUTFILE = PROJECT_DIR / "tests" / "utils" / "api_routes" / "__init__.py"
|
||||
|
||||
|
||||
class PathObject(BaseModel):
|
||||
model_config = ConfigDict(arbitrary_types_allowed=True)
|
||||
route_object: RouteObject
|
||||
http_verbs: list[HTTPRequest]
|
||||
|
||||
class Config:
|
||||
arbitrary_types_allowed = True
|
||||
|
||||
|
||||
def get_path_objects(app: FastAPI):
|
||||
paths = []
|
||||
|
||||
for key, value in app.openapi().items():
|
||||
if key == "paths":
|
||||
for key, value in value.items():
|
||||
for key, value2 in value.items():
|
||||
verbs = []
|
||||
for k, v in value2.items():
|
||||
verbs.append(HTTPRequest(request_type=k, **v))
|
||||
|
||||
paths.append(
|
||||
PathObject(
|
||||
route_object=RouteObject(key),
|
||||
http_verbs=[HTTPRequest(request_type=k, **v) for k, v in value.items()],
|
||||
http_verbs=verbs,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ from pathlib import Path
|
||||
import dotenv
|
||||
import requests
|
||||
from jinja2 import Template
|
||||
from pydantic import Extra
|
||||
from pydantic import ConfigDict
|
||||
from requests import Response
|
||||
from utils import CodeDest, CodeKeys, inject_inline, log
|
||||
|
||||
@@ -56,7 +56,7 @@ LOCALE_DATA: dict[str, LocaleData] = {
|
||||
"zh-TW": LocaleData(name="繁體中文 (Chinese traditional)"),
|
||||
}
|
||||
|
||||
LOCALE_TEMPLATE = """// This Code is auto generated by gen_global_components.py
|
||||
LOCALE_TEMPLATE = """// This Code is auto generated by gen_ts_locales.py
|
||||
export const LOCALES = [{% for locale in locales %}
|
||||
{
|
||||
name: "{{ locale.name }}",
|
||||
@@ -70,6 +70,8 @@ export const LOCALES = [{% for locale in locales %}
|
||||
|
||||
|
||||
class TargetLanguage(MealieModel):
|
||||
model_config = ConfigDict(populate_by_name=True, extra="allow")
|
||||
|
||||
id: str
|
||||
name: str
|
||||
locale: str
|
||||
@@ -78,10 +80,6 @@ class TargetLanguage(MealieModel):
|
||||
twoLettersCode: str
|
||||
progress: float = 0.0
|
||||
|
||||
class Config:
|
||||
extra = Extra.allow
|
||||
allow_population_by_field_name = True
|
||||
|
||||
|
||||
class CrowdinApi:
|
||||
project_name = "Mealie"
|
||||
@@ -152,6 +150,7 @@ PROJECT_DIR = Path(__file__).parent.parent.parent
|
||||
datetime_dir = PROJECT_DIR / "frontend" / "lang" / "dateTimeFormats"
|
||||
locales_dir = PROJECT_DIR / "frontend" / "lang" / "messages"
|
||||
nuxt_config = PROJECT_DIR / "frontend" / "nuxt.config.js"
|
||||
reg_valid = PROJECT_DIR / "mealie" / "schema" / "_mealie" / "validators.py"
|
||||
|
||||
"""
|
||||
This snippet walks the message and dat locales directories and generates the import information
|
||||
@@ -175,6 +174,19 @@ def inject_nuxt_values():
|
||||
inject_inline(nuxt_config, CodeKeys.nuxt_local_dates, all_date_locales)
|
||||
|
||||
|
||||
def inject_registration_validation_values():
|
||||
all_langs = []
|
||||
for match in locales_dir.glob("*.json"):
|
||||
lang_string = f'"{match.stem}",'
|
||||
all_langs.append(lang_string)
|
||||
|
||||
# sort
|
||||
all_langs.sort()
|
||||
|
||||
log.debug(f"injecting locales into user registration validation -> {reg_valid}")
|
||||
inject_inline(reg_valid, CodeKeys.nuxt_local_messages, all_langs)
|
||||
|
||||
|
||||
def generate_locales_ts_file():
|
||||
api = CrowdinApi("")
|
||||
models = api.get_languages()
|
||||
@@ -193,6 +205,7 @@ def main():
|
||||
|
||||
generate_locales_ts_file()
|
||||
inject_nuxt_values()
|
||||
inject_registration_validation_values()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
@@ -6,7 +6,7 @@ from utils import log
|
||||
|
||||
# ============================================================
|
||||
|
||||
template = """// This Code is auto generated by gen_global_components.py
|
||||
template = """// This Code is auto generated by gen_ts_types.py
|
||||
{% for name in global %}import {{ name }} from "@/components/global/{{ name }}.vue";
|
||||
{% endfor %}{% for name in layout %}import {{ name }} from "@/components/layout/{{ name }}.vue";
|
||||
{% endfor %}
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
import re
|
||||
from enum import Enum
|
||||
from typing import Optional
|
||||
|
||||
from humps import camelize
|
||||
from pydantic import BaseModel, Extra, Field
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
from slugify import slugify
|
||||
|
||||
|
||||
@@ -34,33 +33,30 @@ class ParameterIn(str, Enum):
|
||||
|
||||
|
||||
class RouterParameter(BaseModel):
|
||||
model_config = ConfigDict(extra="allow")
|
||||
|
||||
required: bool = False
|
||||
name: str
|
||||
location: ParameterIn = Field(..., alias="in")
|
||||
|
||||
class Config:
|
||||
extra = Extra.allow
|
||||
|
||||
|
||||
class RequestBody(BaseModel):
|
||||
required: bool = False
|
||||
model_config = ConfigDict(extra="allow")
|
||||
|
||||
class Config:
|
||||
extra = Extra.allow
|
||||
required: bool = False
|
||||
|
||||
|
||||
class HTTPRequest(BaseModel):
|
||||
model_config = ConfigDict(extra="allow", populate_by_name=True)
|
||||
|
||||
request_type: RequestType
|
||||
description: str = ""
|
||||
summary: str
|
||||
requestBody: Optional[RequestBody]
|
||||
request_body: RequestBody | None = None
|
||||
|
||||
parameters: list[RouterParameter] = []
|
||||
tags: list[str] | None = []
|
||||
|
||||
class Config:
|
||||
extra = Extra.allow
|
||||
|
||||
def list_as_js_object_string(self, parameters, braces=True):
|
||||
if len(parameters) == 0:
|
||||
return ""
|
||||
@@ -71,11 +67,11 @@ class HTTPRequest(BaseModel):
|
||||
return ", ".join(parameters)
|
||||
|
||||
def payload(self):
|
||||
return "payload" if self.requestBody else ""
|
||||
return "payload" if self.request_body else ""
|
||||
|
||||
def function_args(self):
|
||||
all_params = [p.name for p in self.parameters]
|
||||
if self.requestBody:
|
||||
if self.request_body:
|
||||
all_params.append("payload")
|
||||
return self.list_as_js_object_string(all_params)
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ class CodeSlicer:
|
||||
self._next_line += 1
|
||||
|
||||
|
||||
def get_indentation_of_string(line: str, comment_char: str = "//") -> str:
|
||||
def get_indentation_of_string(line: str, comment_char: str = "//|#") -> str:
|
||||
return re.sub(rf"{comment_char}.*", "", line).removesuffix("\n")
|
||||
|
||||
|
||||
|
||||
@@ -33,9 +33,6 @@ init() {
|
||||
|
||||
# Activate our virtual environment here
|
||||
. /opt/pysetup/.venv/bin/activate
|
||||
|
||||
# Initialize Database Prerun
|
||||
poetry run python /app/mealie/db/init_db.py
|
||||
}
|
||||
|
||||
change_user
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 88 KiB |
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 230 90" width="2500" height="978"><path d="M93.8 27.8l5.8-1.4v28c0 3.1.9 4.9 2.7 5.5-.9 1.7-2.4 2.6-4.6 2.6-2.6 0-4-1.8-4-5.5V27.8zM108.4 62V41.8h-3.2V37h9.1v25h-5.9zm3-34.6c.9 0 1.7.3 2.4 1s1 1.5 1 2.4c0 .9-.3 1.7-1 2.4s-1.5 1-2.4 1c-.9 0-1.7-.3-2.4-1s-1-1.5-1-2.4c0-.9.3-1.7 1-2.4s1.5-1 2.4-1zM137.1 62V47.6c0-2.1-.4-3.7-1.2-4.6-.8-1-2.1-1.5-4-1.5-.9 0-1.8.2-2.7.7-1 .5-1.7 1.1-2.3 1.8v18h-5.8V37.1h4.2l1.1 2.3c1.6-1.9 3.9-2.8 7-2.8 3 0 5.3.9 7 2.7 1.7 1.8 2.6 4.3 2.6 7.4V62h-5.9zM147.5 49.5c0-3.8 1.1-6.9 3.3-9.3 2.2-2.4 5.1-3.6 8.7-3.6 3.8 0 6.7 1.1 8.8 3.4 2.1 2.3 3.1 5.4 3.1 9.4s-1.1 7.1-3.2 9.5c-2.1 2.3-5 3.5-8.8 3.5-3.8 0-6.7-1.2-8.8-3.5-2-2.4-3.1-5.5-3.1-9.4zm6.1 0c0 5.5 2 8.2 5.9 8.2 1.8 0 3.2-.7 4.3-2.1 1.1-1.4 1.6-3.5 1.6-6.1 0-5.4-2-8.1-5.9-8.1-1.8 0-3.3.7-4.3 2.1-1.1 1.4-1.6 3.4-1.6 6zM192.1 62v-1.5c-.5.5-1.3 1-2.4 1.4-1.1.4-2.3.6-3.6.6-3.5 0-6.2-1.1-8.2-3.3-2-2.2-3-5.3-3-9.2 0-3.9 1.1-7.1 3.4-9.6s5.1-3.7 8.6-3.7c1.9 0 3.6.4 5.2 1.2v-10l5.8-1.4V62h-5.8zm0-19c-1.2-1-2.5-1.5-3.9-1.5-2.3 0-4.1.7-5.4 2.1-1.3 1.4-1.9 3.5-1.9 6.1 0 5.2 2.5 7.8 7.5 7.8.6 0 1.2-.2 2.1-.5.8-.3 1.3-.7 1.6-1V43zM226 51.3h-17.8c.1 2 .8 3.5 2 4.6 1.3 1.1 2.9 1.7 5.1 1.7 2.6 0 4.7-.7 6-2.1l2.3 4.4c-2 1.7-5.1 2.5-9.2 2.5-3.8 0-6.8-1.1-9-3.3-2.2-2.2-3.3-5.3-3.3-9.3 0-3.9 1.2-7.1 3.6-9.5 2.4-2.4 5.3-3.6 8.7-3.6 3.6 0 6.5 1.1 8.7 3.2 2.2 2.2 3.3 4.9 3.3 8.2.1.7-.1 1.7-.4 3.2zm-17.6-4.4h12.2c-.4-3.6-2.4-5.5-6-5.5-3.3.1-5.4 1.9-6.2 5.5z"/><g><path fill="#004712" d="M65.9 47.4l-1 11.5-3.3-2.3.4-5.8v-.1-.1l-.1-.1-.1-.1-7.1-4.7.1-5.1 11.1 6.8zM48.5 59.9L43.4 56v.9c0 .2-.1.4-.2.5L39.4 60l4.2 3.4.1.1v.2l.2 4 4.7 3.9-.1-11.7zm-32.1 5l2.4 11.5 9.9 10.5L27 75.3 16.4 64.9zm9.3 1.7l-2.4-16.1-12-10 3.2 15.6 11.2 10.5zm-3.8-26l-3.3-22.8L4.8 9.2l4.5 21.5 12.6 9.9z"/><path fill="#00B259" d="M75.7 41.2l-1.5 10.9-8.2 6.6 1-11.2 8.7-6.3zM49.6 59.9l.1 11.8 10.5-8.4.7-11.5-11.3 8.1zm-6.8 4.8L28 75.3l1.8 12.2 13.4-10.7-.4-12.1zm-.4-8l-.7-16-17.3 9.9 2.4 16.6 15.6-10.5zm-1.1-25.3l-.9-21.6-20.8 8L23 41l18.3-9.6z"/><path d="M76.9 40c0-.1 0-.1 0 0v-.2s0-.1-.1-.1c0 0-.1 0-.1-.1l-12-6.7c-.2-.1-.4-.1-.5 0L54 39.1h-.1v.6l-.1 5.4-4.1-2.7c-.2-.1-.4-.1-.6 0L43 45.8l-.3-6v-.1-.1-.1-.1-.1h-.1l-6.2-4.1 5.8-3c.2-.1.3-.3.3-.5L41.4 9v-.1s0-.1-.1-.1c0 0 0-.1-.1-.1L25.5 1.1c-.1-.1-.2-.1-.3-.1L3.9 7.6s-.1 0-.1.1c0 0-.1 0-.1.1v.6l4.7 22.9c0 .1.1.2.2.3l6.4 5-4.7 2.2s-.1 0-.1.1c0 0 0 .1-.1.1v.2l3.6 17.2c0 .1.1.2.2.3l4.5 4.2-3 1.8-.1.1s0 .1-.1.1V63.2L18 76.5c0 .1.1.2.1.3l10.9 12h.1s.1 0 .1.1h.5l14.4-11.5c.1-.1.2-.3.2-.4l-.3-7.9 4.8 4s.1 0 .1.1h.5L61 64c.1-.1.2-.2.2-.4l.4-5.8 3.5 2.4h.4s.1 0 .1-.1l9.4-7.5c.1-.1.2-.2.2-.3L76.9 40c0 .1 0 .1 0 0zM66 58.7l1-11.2 8.8-6.3-1.5 10.9-8.3 6.6zm-4.4-2.1l.4-5.8v-.1-.1l-.1-.1-.1-.1-7.1-4.7.1-5.1 11.1 6.9-1 11.5-3.3-2.4zm-1.5 6.7l-10.5 8.4-.1-11.8 11.3-8.1-.7 11.5zM43.3 76.8L29.8 87.5 28 75.3l14.7-10.5.6 12zm-24.6-.4l-2.4-11.5L27 75.3l1.7 11.6-10-10.5zm-.2-58.6l3.3 22.8-12.5-9.9L4.8 9.2l13.7 8.6zm21.9-8l.9 21.6L23 41l-3.4-23.2 20.8-8zm2 46.9L26.8 67.1l-2.4-16.6 17.3-9.9.7 16.1zm-19.1-6.1l2.4 16.1-11.2-10.6-3.2-15.6 12 10.1zm20.5 13.1v-.1-.1l-.1-.1-4.2-3.4 3.8-2.6c.2-.1.2-.3.2-.5V56l5.1 3.9.1 11.8-4.7-3.9-.2-4.1z"/></g></svg>
|
||||
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -5,8 +5,8 @@
|
||||
## We Develop with Github
|
||||
We use github to host code, to track issues and feature requests, as well as accept pull requests.
|
||||
|
||||
## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests
|
||||
Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests:
|
||||
## We Use [Github Flow](https://docs.github.com/en/get-started/using-github/github-flow), So All Code Changes Happen Through Pull Requests
|
||||
Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://docs.github.com/en/get-started/using-github/github-flow)). We actively welcome your pull requests:
|
||||
|
||||
1. Fork the repo and create your branch from `mealie-next`.
|
||||
2. Checkout the Discord, the PRs page, or the Projects page to get an idea of what's already being worked on.
|
||||
@@ -28,8 +28,8 @@ We use GitHub issues to track public bugs. Report a bug by [opening a new issue]
|
||||
|
||||
- A quick summary and/or background
|
||||
- Steps to reproduce
|
||||
- Be specific!
|
||||
- Give sample code if you can. [This stackoverflow question](http://stackoverflow.com/q/12488905/180626) includes sample code that *anyone* with a base R setup can run to reproduce what I was seeing
|
||||
* Be specific!
|
||||
* Give sample code if you can. [This stackoverflow question](http://stackoverflow.com/q/12488905/180626) includes sample code that *anyone* with a base R setup can run to reproduce what I was seeing
|
||||
- What you expected would happen
|
||||
- What actually happens
|
||||
- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
|
||||
@@ -41,4 +41,4 @@ People *love* thorough bug reports. I'm not even kidding.
|
||||
By contributing, you agree that your contributions will be licensed under its AGPL License.
|
||||
|
||||
## References
|
||||
This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md)
|
||||
This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebookarchive/draft-js/blob/main/CONTRIBUTING.md)
|
||||
|
||||
@@ -6,7 +6,7 @@ This is the start of the maintainers guide for Mealie developers. Those who have
|
||||
|
||||
If you are working on issues, it can be helpful to understand the workflow for our repository. When an issue comes in it is tagged with the `bug` and `triage` flags. This is to indicate that they need to be reviewed by a maintainer to determine validity.
|
||||
|
||||
After you've reviered an issue it will generally move into one of two states:
|
||||
After you've reviewed an issue it will generally move into one of two states:
|
||||
|
||||
`bug:confirmed`
|
||||
: Your were able to verify the issue and we determined we need to fix it
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
# OpenID Connect (OIDC) Authentication
|
||||
|
||||
:octicons-tag-24: v1.4.0
|
||||
|
||||
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)
|
||||
- [Authelia](https://www.authelia.com/configuration/identity-providers/open-id-connect/)
|
||||
- [Keycloak](https://www.keycloak.org/docs/latest/securing_apps/#_oidc)
|
||||
- [Okta](https://www.okta.com/openid-connect/)
|
||||
|
||||
## Account Linking
|
||||
|
||||
Signing in with OAuth will automatically find your account in Mealie and link to it. If a user does not exist in Mealie, then one will be created (if enabled), but will be unable to log in with any other authentication method. An admin can configure another authentication method for such a user.
|
||||
|
||||
## Provider Setup
|
||||
|
||||
Before you can start using OIDC Authentication, you must first configure a new client application in your identity provider. Your identity provider must support the OAuth **Authorization Code flow with PKCE**. The steps will vary by provider, but generally, the steps are as follows.
|
||||
|
||||
1. Create a new client application
|
||||
- The Provider type should be OIDC or OAuth2
|
||||
- The Grant type should be `Authorization Code`
|
||||
- The Application type should be `Web`
|
||||
- The Client type should be `public`
|
||||
|
||||
2. Configure redirect URI
|
||||
|
||||
The redirect URI(s) that are needed:
|
||||
|
||||
1. `http(s)://DOMAIN:PORT/login`
|
||||
2. `https(s)://DOMAIN:PORT/login?direct=1`
|
||||
1. This URI is only required if your IdP supports [RP-Initiated Logout](https://openid.net/specs/openid-connect-rpinitiated-1_0.html) such as Keycloak. You may also be able to combine this into the previous URI by using a wildcard: `http(s)://DOMAIN:PORT/login*`
|
||||
|
||||
The redirect URI(s) should include any URL that Mealie is accessible from. Some examples include
|
||||
|
||||
http://localhost:9091/login
|
||||
https://mealie.example.com/login
|
||||
|
||||
3. Configure origins
|
||||
|
||||
If your identity provider enforces CORS on any endpoints, you will need to specify your Mealie URL as an Allowed Origin.
|
||||
|
||||
4. Configure allowed scopes
|
||||
|
||||
The scopes required are `openid profile email groups`
|
||||
|
||||
## Mealie Setup
|
||||
|
||||
Take the client id and your discovery URL and update your environment variables to include the required OIDC variables described in [Installation - Backend Configuration](../installation/backend-config.md#openid-connect-oidc).
|
||||
|
||||
### Groups
|
||||
|
||||
There are two (optional) [environment variables](../installation/backend-config.md#openid-connect-oidc) that can control which of the users in your IdP can log in to Mealie and what permissions they will have. The groups should be **defined in your IdP** and be returned in the `groups` claim.
|
||||
|
||||
`OIDC_USER_GROUP`: Users must be a part of this group (within your IdP) to be able to log in.
|
||||
|
||||
`OIDC_ADMIN_GROUP`: Users that are in this group (within your IdP) will be made an **admin** in Mealie.
|
||||
|
||||
## Examples
|
||||
|
||||
Example configurations for several Identity Providers have been provided by the Community in the [GitHub Discussions](https://github.com/mealie-recipes/mealie/discussions/categories/oauth-provider-example).
|
||||
|
||||
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.
|
||||
@@ -94,6 +94,10 @@ docker exec -it mealie-next bash
|
||||
python /app/mealie/scripts/change_password.py
|
||||
```
|
||||
|
||||
## I can't log in with external auth. How can I change my authentication method?
|
||||
|
||||
Follow the [steps above](#how-can-i-change-my-password) for changing your password. You will be prompted if you would like to switch your authentication method back to local auth so you can log in again.
|
||||
|
||||
## How do private groups and recipes work?
|
||||
|
||||
Managing private groups and recipes can be confusing. The following diagram and notes should help explain how they work to determine if a recipe can be shared publicly.
|
||||
|
||||
@@ -4,17 +4,19 @@
|
||||
|
||||
### General
|
||||
|
||||
| Variables | Default | Description |
|
||||
| ------------- | :-------------------: | ----------------------------------------------------------------------------------- |
|
||||
| PUID | 911 | UserID permissions between host OS and container |
|
||||
| PGID | 911 | GroupID permissions between host OS and container |
|
||||
| DEFAULT_GROUP | Home | The default group for users |
|
||||
| BASE_URL | http://localhost:8080 | Used for Notifications |
|
||||
| TOKEN_TIME | 48 | The time in hours that a login/auth token is valid |
|
||||
| API_PORT | 9000 | The port exposed by backend API. **Do not change this if you're running in Docker** |
|
||||
| API_DOCS | True | Turns on/off access to the API documentation locally. |
|
||||
| TZ | UTC | Must be set to get correct date/time on the server |
|
||||
| ALLOW_SIGNUP | true | Allow user sign-up without token |
|
||||
| Variables | Default | Description |
|
||||
| ----------------------------- | :-------------------: | ----------------------------------------------------------------------------------- |
|
||||
| PUID | 911 | UserID permissions between host OS and container |
|
||||
| PGID | 911 | GroupID permissions between host OS and container |
|
||||
| DEFAULT_GROUP | Home | The default group for users |
|
||||
| BASE_URL | http://localhost:8080 | Used for Notifications |
|
||||
| TOKEN_TIME | 48 | The time in hours that a login/auth token is valid |
|
||||
| API_PORT | 9000 | The port exposed by backend API. **Do not change this if you're running in Docker** |
|
||||
| API_DOCS | True | Turns on/off access to the API documentation locally. |
|
||||
| TZ | UTC | Must be set to get correct date/time on the server |
|
||||
| ALLOW_SIGNUP<super>\*</super> | false | Allow user sign-up without token |
|
||||
|
||||
<super>\*</super> Starting in v1.4.0 this was changed to default to `false` as apart of a security review of the application.
|
||||
|
||||
### Security
|
||||
|
||||
@@ -54,8 +56,8 @@ Changing the webworker settings may cause unforeseen memory leak issues with Mea
|
||||
| ---------------- | :-----: | --------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| WEB_GUNICORN | false | Enables Gunicorn to manage Uvicorn web for multiple works |
|
||||
| WORKERS_PER_CORE | 1 | Set the number of workers to the number of CPU cores multiplied by this value (Value \* CPUs). More info [here][workers_per_core] |
|
||||
| MAX_WORKERS | 1 | Set the maximum number of workers to use. Default is not set meaning unlimited. More info [here][max_workers] |
|
||||
| WEB_CONCURRENCY | 1 | Override the automatic definition of number of workers. More info [here][web_concurrency] |
|
||||
| MAX_WORKERS | None | Set the maximum number of workers to use. Default is not set meaning unlimited. More info [here][max_workers] |
|
||||
| WEB_CONCURRENCY | 2 | Override the automatic definition of number of workers. More info [here][web_concurrency] |
|
||||
|
||||
### LDAP
|
||||
|
||||
@@ -75,6 +77,25 @@ Changing the webworker settings may cause unforeseen memory leak issues with Mea
|
||||
| LDAP_NAME_ATTRIBUTE | name | The LDAP attribute that maps to the user's name |
|
||||
| LDAP_MAIL_ATTRIBUTE | mail | The LDAP attribute that maps to the user's email |
|
||||
|
||||
### OpenID Connect (OIDC)
|
||||
|
||||
:octicons-tag-24: v1.4.0
|
||||
|
||||
For usage, see [Usage - OpenID Connect](../authentication/oidc.md)
|
||||
|
||||
| Variables | Default | Description |
|
||||
| ---------------------- | :-----: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| OIDC_AUTH_ENABLED | False | Enables authentication via OpenID Connect |
|
||||
| OIDC_SIGNUP_ENABLED | True | Enables new users to be created when signing in for the first time with OIDC |
|
||||
| OIDC_CONFIGURATION_URL | None | The URL to the OIDC configuration of your provider. This is usually something like https://auth.example.com/.well-known/openid-configuration |
|
||||
| OIDC_CLIENT_ID | None | The client id of your configured client in your provider |
|
||||
| OIDC_USER_GROUP | None | If specified, only users belonging to this group will be able to successfully authenticate, regardless of the `OIDC_ADMIN_GROUP`. For more information see [this page](../authentication/oidc.md#groups) |
|
||||
| OIDC_ADMIN_GROUP | None | If specified, users belonging to this group will be made an admin. For more information see [this page](../authentication/oidc.md#groups) |
|
||||
| OIDC_AUTO_REDIRECT | False | If `True`, then the login page will be bypassed an you will be sent directly to your Identity Provider. You can still get to the login page by adding `?direct=1` to the login URL |
|
||||
| OIDC_PROVIDER_NAME | OAuth | The provider name is shown in SSO login button. "Login with <OIDC_PROVIDER_NAME\>" |
|
||||
| OIDC_REMEMBER_ME | False | Because redirects bypass the login screen, you cant extend your session by clicking the "Remember Me" checkbox. By setting this value to true, a session will be extended as if "Remember Me" was checked |
|
||||
| OIDC_SIGNING_ALGORITHM | RS256 | The algorithm used to sign the id token (examples: RS256, HS256) |
|
||||
|
||||
### Themeing
|
||||
|
||||
Setting the following environmental variables will change the theme of the frontend. Note that the themes are the same for all users. This is a break-change when migration from v0.x.x -> 1.x.x.
|
||||
@@ -95,3 +116,7 @@ Setting the following environmental variables will change the theme of the front
|
||||
| THEME_DARK_INFO | #1976D2 | Dark Theme Config Variable |
|
||||
| THEME_DARK_WARNING | #FF6D00 | Dark Theme Config Variable |
|
||||
| THEME_DARK_ERROR | #EF5350 | Dark Theme Config Variable |
|
||||
|
||||
[workers_per_core]: https://github.com/tiangolo/uvicorn-gunicorn-docker/blob/2daa3e3873c837d5781feb4ff6a40a89f791f81b/README.md#workers_per_core
|
||||
[max_workers]: https://github.com/tiangolo/uvicorn-gunicorn-docker/blob/2daa3e3873c837d5781feb4ff6a40a89f791f81b/README.md#max_workers
|
||||
[web_concurrency]: https://github.com/tiangolo/uvicorn-gunicorn-docker/blob/2daa3e3873c837d5781feb4ff6a40a89f791f81b/README.md#web_concurrency
|
||||
|
||||
@@ -9,7 +9,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In
|
||||
version: "3.7"
|
||||
services:
|
||||
mealie:
|
||||
image: ghcr.io/mealie-recipes/mealie:v1.1.0 # (3)
|
||||
image: ghcr.io/mealie-recipes/mealie:v1.3.2 # (3)
|
||||
container_name: mealie
|
||||
ports:
|
||||
- "9925:9000" # (1)
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
---
|
||||
tags:
|
||||
- Security
|
||||
---
|
||||
|
||||
# Security Considerations
|
||||
|
||||
This page is a collection of security considerations for Mealie. It mostly deals with reported issues and how it's possible to mitigate them. Note that this page is for you to use as a guide for how secure you want to make your deployment. It's important to note that most of these will not apply to you, if you:
|
||||
|
||||
1. Run behind a VPN
|
||||
2. Use a strong password
|
||||
3. Disable Sign-Ups
|
||||
4. Don't host for malicious users
|
||||
|
||||
Use your best judgement when deciding what to do.
|
||||
|
||||
## Denial of Service
|
||||
|
||||
By default, the API is **not** rate limited. This leaves Mealie open to a potential **Denial of Service Attack**. While it's possible to perform a **Denial of Service Attack** on any endpoint, there are a few key endpoints that are more vulnerable than others.
|
||||
|
||||
- `/api/recipes/create-url`
|
||||
- `/api/recipes/{id}/image`
|
||||
|
||||
These endpoints are used to scrape data based off a user provided URL. It is possible for a malicious user to issue multiple requests to download an arbitrarily large external file (e.g a Debian ISO) and sufficiently saturate a CPU assigned to the container. While we do implement some protections against this by chunking the response, and using a timeout strategy, it's still possible to overload the CPU if an attacker issues multiple requests concurrently.
|
||||
|
||||
### Mitigation
|
||||
|
||||
If you'd like to mitigate this risk, we suggest that you rate limit the API in general, and apply strict rate limits to these endpoints. You can do this by utilizing a reverse proxy. See the following links to get started:
|
||||
|
||||
- [Traefik](https://doc.traefik.io/traefik/middlewares/http/ratelimit/)
|
||||
- [Nginx](https://nginx.org/en/docs/http/ngx_http_limit_req_module.html)
|
||||
- [Caddy](https://caddyserver.com/docs/modules/http.handlers.rate_limit)
|
||||
|
||||
## Server Side Request Forgery
|
||||
|
||||
- `/api/recipes/create-url`
|
||||
- `/api/recipes/{id}/image`
|
||||
|
||||
Given the nature of these APIs it's possible to perform a **Server Side Request Forgery** attack. This is where a malicious user can issue a request to an internal network resource, and potentially exfiltrate data. We _do_ perform some checks to mitigate access to resources within your network but at the end of the day, users of Mealie are allowed to trigger HTTP requests on **your server**.
|
||||
|
||||
### Mitigation
|
||||
|
||||
If you'd like to mitigate this risk, we suggest that you isolate the container that Mealie is running in to ensure that it's access to internal resources is limited only to what is required. _Note that Mealie does require access to the internet for recipe imports._ You might consider isolating Mealie from your home network entirely and only allowing access to the external internet.
|
||||
@@ -13,7 +13,7 @@ SQLite is a popular, open source, self-contained, zero-configuration database th
|
||||
version: "3.7"
|
||||
services:
|
||||
mealie:
|
||||
image: ghcr.io/mealie-recipes/mealie:v1.1.0 # (3)
|
||||
image: ghcr.io/mealie-recipes/mealie:v1.3.2 # (3)
|
||||
container_name: mealie
|
||||
ports:
|
||||
- "9925:9000" # (1)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# Permissions and Public Access
|
||||
|
||||
Mealie provides various levels of user access and permissions. This includes:
|
||||
- Authentication and registration ([check out the LDAP guide](./ldap.md) for how to configure access using LDAP)
|
||||
- Authentication and registration ([LDAP](../authentication/ldap.md) and [OpenID Connect](../authentication/oidc.md) are both supported)
|
||||
- Customizable user permissions
|
||||
- Fine-tuned public access for non-users
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -41,7 +41,8 @@ markdown_extensions:
|
||||
custom_checkbox: true
|
||||
- admonition
|
||||
- attr_list
|
||||
- pymdownx.tabbed
|
||||
- pymdownx.tabbed:
|
||||
alternate_style: true
|
||||
- pymdownx.superfences:
|
||||
custom_fences:
|
||||
- name: mermaid
|
||||
@@ -71,9 +72,14 @@ nav:
|
||||
- SQLite (Recommended): "documentation/getting-started/installation/sqlite.md"
|
||||
- PostgreSQL: "documentation/getting-started/installation/postgres.md"
|
||||
- Backend Configuration: "documentation/getting-started/installation/backend-config.md"
|
||||
- Security: "documentation/getting-started/installation/security.md"
|
||||
- Usage:
|
||||
- Backup and Restoring: "documentation/getting-started/usage/backups-and-restoring.md"
|
||||
- LDAP Authentication: "documentation/getting-started/usage/ldap.md"
|
||||
- Permissions and Public Access: "documentation/getting-started/usage/permissions-and-public-access.md"
|
||||
|
||||
- Authentication:
|
||||
- LDAP: "documentation/getting-started/authentication/ldap.md"
|
||||
- OpenID Connect: "documentation/getting-started/authentication/oidc.md"
|
||||
|
||||
- Community Guides:
|
||||
- iOS Shortcuts: "documentation/community-guide/ios.md"
|
||||
|
||||
@@ -1,8 +1,33 @@
|
||||
<template>
|
||||
<div>
|
||||
<!-- Edit Dialog -->
|
||||
<BaseDialog
|
||||
v-if="editTarget"
|
||||
v-model="dialogStates.edit"
|
||||
:width="650"
|
||||
:icon="$globals.icons.pages"
|
||||
:title="$t('general.edit')"
|
||||
:submit-icon="$globals.icons.save"
|
||||
:submit-text="$tc('general.save')"
|
||||
@submit="editCookbook"
|
||||
>
|
||||
<v-card-text>
|
||||
<CookbookEditor :cookbook="editTarget" :actions="actions" />
|
||||
</v-card-text>
|
||||
</BaseDialog>
|
||||
|
||||
<!-- Page -->
|
||||
<v-container v-if="book" fluid>
|
||||
<v-app-bar color="transparent" flat class="mt-n1 rounded">
|
||||
<v-app-bar color="transparent" flat class="mt-n1">
|
||||
<v-icon large left> {{ $globals.icons.pages }} </v-icon>
|
||||
<v-toolbar-title class="headline"> {{ book.name }} </v-toolbar-title>
|
||||
<v-spacer></v-spacer>
|
||||
<BaseButton
|
||||
v-if="isOwnGroup"
|
||||
class="mx-1"
|
||||
:edit="true"
|
||||
@click="handleEditCookbook"
|
||||
/>
|
||||
</v-app-bar>
|
||||
<v-card flat>
|
||||
<v-card-text class="py-0">
|
||||
@@ -22,17 +47,20 @@
|
||||
/>
|
||||
</v-container>
|
||||
</v-container>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, useRoute, ref, useContext, useMeta } from "@nuxtjs/composition-api";
|
||||
import { computed, defineComponent, useRoute, ref, useContext, useMeta, reactive, useRouter } from "@nuxtjs/composition-api";
|
||||
import { useLazyRecipes } from "~/composables/recipes";
|
||||
import RecipeCardSection from "@/components/Domain/Recipe/RecipeCardSection.vue";
|
||||
import { useCookbook } from "~/composables/use-group-cookbooks";
|
||||
import { useCookbook, useCookbooks } from "~/composables/use-group-cookbooks";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import { RecipeCookBook } from "~/lib/api/types/cookbook";
|
||||
import CookbookEditor from "~/components/Domain/Cookbook/CookbookEditor.vue";
|
||||
|
||||
export default defineComponent({
|
||||
components: { RecipeCardSection },
|
||||
components: { RecipeCardSection, CookbookEditor },
|
||||
setup() {
|
||||
const { $auth } = useContext();
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
@@ -43,10 +71,36 @@
|
||||
const { recipes, appendRecipes, assignSorted, removeRecipe, replaceRecipes } = useLazyRecipes(isOwnGroup.value ? null : groupSlug.value);
|
||||
const slug = route.value.params.slug;
|
||||
const { getOne } = useCookbook(isOwnGroup.value ? null : groupSlug.value);
|
||||
const { actions } = useCookbooks();
|
||||
const router = useRouter();
|
||||
|
||||
const tab = ref(null);
|
||||
const book = getOne(slug);
|
||||
|
||||
const dialogStates = reactive({
|
||||
edit: false,
|
||||
});
|
||||
|
||||
const editTarget = ref<RecipeCookBook | null>(null);
|
||||
function handleEditCookbook() {
|
||||
dialogStates.edit = true;
|
||||
editTarget.value = book.value;
|
||||
}
|
||||
|
||||
async function editCookbook() {
|
||||
if (!editTarget.value) {
|
||||
return;
|
||||
}
|
||||
const response = await actions.updateOne(editTarget.value);
|
||||
|
||||
// if name changed, redirect to new slug
|
||||
if (response?.slug && book.value?.slug !== response?.slug) {
|
||||
router.push(`/g/${route.value.params.groupSlug}/cookbooks/${response?.slug}`);
|
||||
}
|
||||
dialogStates.edit = false;
|
||||
editTarget.value = null;
|
||||
}
|
||||
|
||||
useMeta(() => {
|
||||
return {
|
||||
title: book?.value?.name || "Cookbook",
|
||||
@@ -62,6 +116,12 @@
|
||||
recipes,
|
||||
removeRecipe,
|
||||
replaceRecipes,
|
||||
isOwnGroup,
|
||||
dialogStates,
|
||||
editTarget,
|
||||
handleEditCookbook,
|
||||
editCookbook,
|
||||
actions,
|
||||
};
|
||||
},
|
||||
head: {}, // Must include for useMeta
|
||||
|
||||
@@ -107,7 +107,7 @@ export default defineComponent({
|
||||
})
|
||||
|
||||
async function getShoppingLists() {
|
||||
const { data } = await api.shopping.lists.getAll();
|
||||
const { data } = await api.shopping.lists.getAll(1, -1, { orderBy: "name", orderDirection: "asc" });
|
||||
if (data) {
|
||||
shoppingLists.value = data.items ?? [];
|
||||
}
|
||||
|
||||
@@ -3,8 +3,9 @@
|
||||
<v-hover v-slot="{ hover }" :open-delay="50">
|
||||
<v-card
|
||||
:class="{ 'on-hover': hover }"
|
||||
:style="{ cursor }"
|
||||
:elevation="hover ? 12 : 2"
|
||||
:to="route ? recipeRoute : ''"
|
||||
:to="recipeRoute"
|
||||
:min-height="imageHeight + 75"
|
||||
@click="$emit('click')"
|
||||
>
|
||||
@@ -33,7 +34,7 @@
|
||||
</v-card-title>
|
||||
|
||||
<slot name="actions">
|
||||
<v-card-actions class="px-1">
|
||||
<v-card-actions v-if="showRecipeContent" class="px-1">
|
||||
<RecipeFavoriteBadge v-if="isOwnGroup" class="absolute" :slug="slug" show-always />
|
||||
|
||||
<RecipeRating class="pb-1" :value="rating" :name="name" :slug="slug" :small="true" />
|
||||
@@ -101,10 +102,6 @@ export default defineComponent({
|
||||
required: false,
|
||||
default: "abc123",
|
||||
},
|
||||
route: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
tags: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
@@ -123,14 +120,18 @@ export default defineComponent({
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "")
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
const showRecipeContent = computed(() => props.recipeId && props.slug);
|
||||
const recipeRoute = computed<string>(() => {
|
||||
return `/g/${groupSlug.value}/r/${props.slug}`;
|
||||
return showRecipeContent.value ? `/g/${groupSlug.value}/r/${props.slug}` : "";
|
||||
});
|
||||
const cursor = computed(() => showRecipeContent.value ? "pointer" : "auto");
|
||||
|
||||
return {
|
||||
isOwnGroup,
|
||||
recipeRoute,
|
||||
showRecipeContent,
|
||||
cursor,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
<v-card
|
||||
:ripple="false"
|
||||
:class="isFlat ? 'mx-auto flat' : 'mx-auto'"
|
||||
:style="{ cursor }"
|
||||
hover
|
||||
:to="$listeners.selected ? undefined : recipeRoute"
|
||||
@click="$emit('selected')"
|
||||
@@ -37,8 +38,9 @@
|
||||
</v-list-item-subtitle>
|
||||
<div class="d-flex flex-wrap justify-end align-center">
|
||||
<slot name="actions">
|
||||
<RecipeFavoriteBadge v-if="isOwnGroup" :slug="slug" show-always />
|
||||
<RecipeFavoriteBadge v-if="isOwnGroup && showRecipeContent" :slug="slug" show-always />
|
||||
<v-rating
|
||||
v-if="showRecipeContent"
|
||||
color="secondary"
|
||||
:class="isOwnGroup ? 'ml-auto' : 'ml-auto pb-2'"
|
||||
background-color="secondary lighten-3"
|
||||
@@ -52,7 +54,7 @@
|
||||
<!-- If we're not logged-in, no items display, so we hide this menu -->
|
||||
<!-- We also add padding to the v-rating above to compensate -->
|
||||
<RecipeContextMenu
|
||||
v-if="isOwnGroup"
|
||||
v-if="isOwnGroup && showRecipeContent"
|
||||
:slug="slug"
|
||||
:menu-icon="$globals.icons.dotsHorizontal"
|
||||
:name="name"
|
||||
@@ -113,10 +115,6 @@ export default defineComponent({
|
||||
required: false,
|
||||
default: "abc123",
|
||||
},
|
||||
route: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
recipeId: {
|
||||
type: String,
|
||||
required: true,
|
||||
@@ -135,14 +133,19 @@ export default defineComponent({
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "")
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
const showRecipeContent = computed(() => props.recipeId && props.slug);
|
||||
const recipeRoute = computed<string>(() => {
|
||||
return `/g/${groupSlug.value}/r/${props.slug}`;
|
||||
return showRecipeContent.value ? `/g/${groupSlug.value}/r/${props.slug}` : "";
|
||||
});
|
||||
const cursor = computed(() => showRecipeContent.value ? "pointer" : "auto");
|
||||
|
||||
|
||||
return {
|
||||
isOwnGroup,
|
||||
recipeRoute,
|
||||
showRecipeContent,
|
||||
cursor,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
color="accent"
|
||||
:small="small"
|
||||
dark
|
||||
:to="isOwnGroup ? `${baseRecipeRoute}?${urlPrefix}=${category.id}` : undefined"
|
||||
:to="`${baseRecipeRoute}?${urlPrefix}=${category.id}`"
|
||||
>
|
||||
{{ truncateText(category.name) }}
|
||||
</v-chip>
|
||||
@@ -18,7 +18,6 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, useContext, useRoute } from "@nuxtjs/composition-api";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import { RecipeCategory, RecipeTag, RecipeTool } from "~/lib/api/types/user";
|
||||
|
||||
export type UrlPrefixParam = "tags" | "categories" | "tools";
|
||||
@@ -56,7 +55,6 @@ export default defineComponent({
|
||||
},
|
||||
setup(props) {
|
||||
const { $auth } = useContext();
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "")
|
||||
@@ -74,7 +72,6 @@ export default defineComponent({
|
||||
|
||||
return {
|
||||
baseRecipeRoute,
|
||||
isOwnGroup,
|
||||
truncateText,
|
||||
};
|
||||
},
|
||||
|
||||
@@ -59,7 +59,13 @@
|
||||
v-on="on"
|
||||
></v-text-field>
|
||||
</template>
|
||||
<v-date-picker v-model="newMealdate" no-title @input="pickerMenu = false"></v-date-picker>
|
||||
<v-date-picker
|
||||
v-model="newMealdate"
|
||||
no-title
|
||||
:first-day-of-week="firstDayOfWeek"
|
||||
:local="$i18n.locale"
|
||||
@input="pickerMenu = false"
|
||||
/>
|
||||
</v-menu>
|
||||
<v-select
|
||||
v-model="newMealType"
|
||||
@@ -111,6 +117,7 @@ import RecipeDialogPrintPreferences from "./RecipeDialogPrintPreferences.vue";
|
||||
import RecipeDialogShare from "./RecipeDialogShare.vue";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
import { useGroupSelf } from "~/composables/use-groups";
|
||||
import { alert } from "~/composables/use-toast";
|
||||
import { usePlanTypeOptions } from "~/composables/use-group-mealplan";
|
||||
import { Recipe } from "~/lib/api/types/recipe";
|
||||
@@ -224,11 +231,16 @@ export default defineComponent({
|
||||
});
|
||||
|
||||
const { i18n, $auth, $globals } = useContext();
|
||||
const { group } = useGroupSelf();
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
|
||||
const firstDayOfWeek = computed(() => {
|
||||
return group.value?.preferences?.firstDayOfWeek || 0;
|
||||
});
|
||||
|
||||
// ===========================================================================
|
||||
// Context Menu Setup
|
||||
|
||||
@@ -321,7 +333,7 @@ export default defineComponent({
|
||||
const recipeRefWithScale = computed(() => recipeRef.value ? { scale: props.recipeScale, ...recipeRef.value } : undefined);
|
||||
|
||||
async function getShoppingLists() {
|
||||
const { data } = await api.shopping.lists.getAll();
|
||||
const { data } = await api.shopping.lists.getAll(1, -1, { orderBy: "name", orderDirection: "asc" });
|
||||
if (data) {
|
||||
shoppingLists.value = data.items ?? [];
|
||||
}
|
||||
@@ -432,6 +444,7 @@ export default defineComponent({
|
||||
addRecipeToPlan,
|
||||
icon,
|
||||
planTypeOptions,
|
||||
firstDayOfWeek,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<BaseDialog v-if="shoppingListDialog" v-model="dialog" :title="$t('recipe.add-to-list')" :icon="$globals.icons.cartCheck">
|
||||
<v-card-text>
|
||||
<v-card
|
||||
v-for="list in shoppingLists"
|
||||
v-for="list in shoppingListChoices"
|
||||
:key="list.id"
|
||||
hover
|
||||
class="my-2 left-border"
|
||||
@@ -14,6 +14,18 @@
|
||||
</v-card-title>
|
||||
</v-card>
|
||||
</v-card-text>
|
||||
<template #card-actions>
|
||||
<v-btn
|
||||
text
|
||||
color="grey"
|
||||
@click="dialog = false"
|
||||
>
|
||||
{{ $t("general.cancel") }}
|
||||
</v-btn>
|
||||
<div class="d-flex justify-end" style="width: 100%;">
|
||||
<v-checkbox v-model="preferences.viewAllLists" hide-details :label="$tc('general.show-all')" class="my-auto mr-4" />
|
||||
</div>
|
||||
</template>
|
||||
</BaseDialog>
|
||||
<BaseDialog
|
||||
v-if="shoppingListIngredientDialog"
|
||||
@@ -120,6 +132,7 @@ import { toRefs } from "@vueuse/core";
|
||||
import RecipeIngredientListItem from "./RecipeIngredientListItem.vue";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
import { alert } from "~/composables/use-toast";
|
||||
import { useShoppingListPreferences } from "~/composables/use-users/preferences";
|
||||
import { ShoppingListSummary } from "~/lib/api/types/group";
|
||||
import { Recipe, RecipeIngredient } from "~/lib/api/types/recipe";
|
||||
|
||||
@@ -164,8 +177,9 @@ export default defineComponent({
|
||||
},
|
||||
},
|
||||
setup(props, context) {
|
||||
const { i18n } = useContext();
|
||||
const { $auth, i18n } = useContext();
|
||||
const api = useUserApi();
|
||||
const preferences = useShoppingListPreferences();
|
||||
|
||||
// v-model support
|
||||
const dialog = computed({
|
||||
@@ -183,6 +197,10 @@ export default defineComponent({
|
||||
shoppingListIngredientDialog: false,
|
||||
});
|
||||
|
||||
const shoppingListChoices = computed(() => {
|
||||
return props.shoppingLists.filter((list) => preferences.value.viewAllLists || list.userId === $auth.user?.id);
|
||||
});
|
||||
|
||||
const recipeIngredientSections = ref<ShoppingListRecipeIngredientSection[]>([]);
|
||||
const selectedShoppingList = ref<ShoppingListSummary | null>(null);
|
||||
|
||||
@@ -334,6 +352,8 @@ export default defineComponent({
|
||||
|
||||
return {
|
||||
dialog,
|
||||
preferences,
|
||||
shoppingListChoices,
|
||||
...toRefs(state),
|
||||
addRecipesToList,
|
||||
bulkCheckIngredients,
|
||||
|
||||
@@ -45,7 +45,6 @@
|
||||
:rating="recipe.rating"
|
||||
:image="recipe.image"
|
||||
:recipe-id="recipe.id"
|
||||
:route="true"
|
||||
v-on="$listeners.selected ? { selected: () => handleSelect(recipe) } : {}"
|
||||
/>
|
||||
</v-card>
|
||||
|
||||
@@ -22,7 +22,13 @@
|
||||
v-on="on"
|
||||
></v-text-field>
|
||||
</template>
|
||||
<v-date-picker v-model="expirationDate" no-title @input="datePickerMenu = false"></v-date-picker>
|
||||
<v-date-picker
|
||||
v-model="expirationDate"
|
||||
no-title
|
||||
:first-day-of-week="firstDayOfWeek"
|
||||
:local="$i18n.locale"
|
||||
@input="datePickerMenu = false"
|
||||
/>
|
||||
</v-menu>
|
||||
</v-card-text>
|
||||
<v-card-actions class="justify-end">
|
||||
@@ -60,6 +66,7 @@ import { defineComponent, computed, toRefs, reactive, useContext, useRoute } fro
|
||||
import { useClipboard, useShare, whenever } from "@vueuse/core";
|
||||
import { RecipeShareToken } from "~/lib/api/types/recipe";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
import { useGroupSelf } from "~/composables/use-groups";
|
||||
import { alert } from "~/composables/use-toast";
|
||||
|
||||
export default defineComponent({
|
||||
@@ -106,9 +113,14 @@ export default defineComponent({
|
||||
);
|
||||
|
||||
const { $auth, i18n } = useContext();
|
||||
const { group } = useGroupSelf();
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
|
||||
const firstDayOfWeek = computed(() => {
|
||||
return group.value?.preferences?.firstDayOfWeek || 0;
|
||||
});
|
||||
|
||||
// ============================================================
|
||||
// Token Actions
|
||||
|
||||
@@ -185,6 +197,7 @@ export default defineComponent({
|
||||
dialog,
|
||||
createNewToken,
|
||||
deleteToken,
|
||||
firstDayOfWeek,
|
||||
shareRecipe,
|
||||
copyTokenLink,
|
||||
};
|
||||
|
||||
@@ -67,12 +67,16 @@
|
||||
<v-list>
|
||||
<v-list-item @click="toggleOrderDirection()">
|
||||
<v-icon left>
|
||||
{{ $globals.icons.sort }}
|
||||
{{
|
||||
state.orderDirection === "asc" ?
|
||||
$globals.icons.sortDescending : $globals.icons.sortAscending
|
||||
}}
|
||||
</v-icon>
|
||||
<v-list-item-title>
|
||||
{{ state.orderDirection === "asc" ? "Sort Descending" : "Sort Ascending" }}
|
||||
{{ state.orderDirection === "asc" ? $tc("general.sort-descending") : $tc("general.sort-ascending") }}
|
||||
</v-list-item-title>
|
||||
</v-list-item>
|
||||
<v-divider />
|
||||
<v-list-item
|
||||
v-for="v in sortable"
|
||||
:key="v.name"
|
||||
@@ -120,11 +124,12 @@
|
||||
<v-divider></v-divider>
|
||||
<v-container class="mt-6 px-md-6">
|
||||
<RecipeCardSection
|
||||
v-if="state.ready"
|
||||
class="mt-n5"
|
||||
:icon="$globals.icons.search"
|
||||
:title="$tc('search.results')"
|
||||
:recipes="recipes"
|
||||
:query="passedQuery"
|
||||
:query="passedQueryWithSeed"
|
||||
@replaceRecipes="replaceRecipes"
|
||||
@appendRecipes="appendRecipes"
|
||||
/>
|
||||
@@ -133,11 +138,12 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { ref, defineComponent, useRouter, onMounted, useContext, computed, Ref, useRoute } from "@nuxtjs/composition-api";
|
||||
import { ref, defineComponent, useRouter, onMounted, useContext, computed, Ref, useRoute, watch } from "@nuxtjs/composition-api";
|
||||
import { watchDebounced } from "@vueuse/shared";
|
||||
import SearchFilter from "~/components/Domain/SearchFilter.vue";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import { useCategoryStore, useFoodStore, useTagStore, useToolStore } from "~/composables/store";
|
||||
import { useUserSortPreferences } from "~/composables/use-users/preferences";
|
||||
import RecipeCardSection from "~/components/Domain/Recipe/RecipeCardSection.vue";
|
||||
import { IngredientFood, RecipeCategory, RecipeTag, RecipeTool } from "~/lib/api/types/recipe";
|
||||
import { NoUndefinedField } from "~/lib/api/types/non-generated";
|
||||
@@ -157,6 +163,7 @@ export default defineComponent({
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
const state = ref({
|
||||
auto: true,
|
||||
ready: false,
|
||||
search: "",
|
||||
orderBy: "created_at",
|
||||
orderDirection: "desc" as "asc" | "desc",
|
||||
@@ -170,6 +177,7 @@ export default defineComponent({
|
||||
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
const preferences = useUserSortPreferences();
|
||||
|
||||
const { recipes, appendRecipes, assignSorted, removeRecipe, replaceRecipes } = useLazyRecipes(isOwnGroup.value ? null : groupSlug.value);
|
||||
const categories = isOwnGroup.value ? useCategoryStore() : usePublicCategoryStore(groupSlug.value);
|
||||
@@ -184,7 +192,30 @@ export default defineComponent({
|
||||
const tools = isOwnGroup.value ? useToolStore() : usePublicToolStore(groupSlug.value);
|
||||
const selectedTools = ref<NoUndefinedField<RecipeTool>[]>([]);
|
||||
|
||||
const passedQuery = ref<RecipeSearchQuery | null>(null);
|
||||
function calcPassedQuery(): RecipeSearchQuery {
|
||||
return {
|
||||
search: state.value.search,
|
||||
categories: toIDArray(selectedCategories.value),
|
||||
foods: toIDArray(selectedFoods.value),
|
||||
tags: toIDArray(selectedTags.value),
|
||||
tools: toIDArray(selectedTools.value),
|
||||
requireAllCategories: state.value.requireAllCategories,
|
||||
requireAllTags: state.value.requireAllTags,
|
||||
requireAllTools: state.value.requireAllTools,
|
||||
requireAllFoods: state.value.requireAllFoods,
|
||||
orderBy: state.value.orderBy,
|
||||
orderDirection: state.value.orderDirection,
|
||||
};
|
||||
}
|
||||
const passedQuery = ref<RecipeSearchQuery>(calcPassedQuery());
|
||||
|
||||
// we calculate this separately because otherwise we can't check for query changes
|
||||
const passedQueryWithSeed = computed(() => {
|
||||
return {
|
||||
...passedQuery.value,
|
||||
_searchSeed: Date.now().toString()
|
||||
};
|
||||
})
|
||||
|
||||
function reset() {
|
||||
state.value.search = "";
|
||||
@@ -199,10 +230,6 @@ export default defineComponent({
|
||||
selectedTags.value = [];
|
||||
selectedTools.value = [];
|
||||
|
||||
router.push({
|
||||
query: {},
|
||||
});
|
||||
|
||||
search();
|
||||
}
|
||||
|
||||
@@ -211,7 +238,8 @@ export default defineComponent({
|
||||
}
|
||||
|
||||
function toIDArray(array: { id: string }[]) {
|
||||
return array.map((item) => item.id);
|
||||
// we sort the array to make sure the query is always the same
|
||||
return array.map((item) => item.id).sort();
|
||||
}
|
||||
|
||||
function hideKeyboard() {
|
||||
@@ -221,40 +249,33 @@ export default defineComponent({
|
||||
const input: Ref<any> = ref(null);
|
||||
|
||||
async function search() {
|
||||
await router.push({
|
||||
query: {
|
||||
categories: toIDArray(selectedCategories.value),
|
||||
foods: toIDArray(selectedFoods.value),
|
||||
tags: toIDArray(selectedTags.value),
|
||||
tools: toIDArray(selectedTools.value),
|
||||
// Only add the query param if it's or not default
|
||||
...{
|
||||
auto: state.value.auto ? undefined : "false",
|
||||
search: state.value.search === "" ? undefined : state.value.search,
|
||||
orderBy: state.value.orderBy === "createdAt" ? undefined : state.value.orderBy,
|
||||
orderDirection: state.value.orderDirection === "desc" ? undefined : state.value.orderDirection,
|
||||
requireAllCategories: state.value.requireAllCategories ? "true" : undefined,
|
||||
requireAllTags: state.value.requireAllTags ? "true" : undefined,
|
||||
requireAllTools: state.value.requireAllTools ? "true" : undefined,
|
||||
requireAllFoods: state.value.requireAllFoods ? "true" : undefined,
|
||||
},
|
||||
},
|
||||
});
|
||||
const oldQueryValueString = JSON.stringify(passedQuery.value);
|
||||
const newQueryValue = calcPassedQuery();
|
||||
const newQueryValueString = JSON.stringify(newQueryValue);
|
||||
if (oldQueryValueString === newQueryValueString) {
|
||||
return;
|
||||
}
|
||||
|
||||
passedQuery.value = {
|
||||
search: state.value.search,
|
||||
categories: toIDArray(selectedCategories.value),
|
||||
foods: toIDArray(selectedFoods.value),
|
||||
tags: toIDArray(selectedTags.value),
|
||||
tools: toIDArray(selectedTools.value),
|
||||
requireAllCategories: state.value.requireAllCategories,
|
||||
requireAllTags: state.value.requireAllTags,
|
||||
requireAllTools: state.value.requireAllTools,
|
||||
requireAllFoods: state.value.requireAllFoods,
|
||||
orderBy: state.value.orderBy,
|
||||
orderDirection: state.value.orderDirection,
|
||||
_searchSeed: Date.now().toString()
|
||||
};
|
||||
passedQuery.value = newQueryValue;
|
||||
const query = {
|
||||
categories: passedQuery.value.categories,
|
||||
foods: passedQuery.value.foods,
|
||||
tags: passedQuery.value.tags,
|
||||
tools: passedQuery.value.tools,
|
||||
// Only add the query param if it's or not default
|
||||
...{
|
||||
auto: state.value.auto ? undefined : "false",
|
||||
search: passedQuery.value.search === "" ? undefined : passedQuery.value.search,
|
||||
orderBy: passedQuery.value.orderBy === "created_at" ? undefined : passedQuery.value.orderBy,
|
||||
orderDirection: passedQuery.value.orderDirection === "desc" ? undefined : passedQuery.value.orderDirection,
|
||||
requireAllCategories: passedQuery.value.requireAllCategories ? "true" : undefined,
|
||||
requireAllTags: passedQuery.value.requireAllTags ? "true" : undefined,
|
||||
requireAllTools: passedQuery.value.requireAllTools ? "true" : undefined,
|
||||
requireAllFoods: passedQuery.value.requireAllFoods ? "true" : undefined,
|
||||
},
|
||||
}
|
||||
await router.push({ query });
|
||||
preferences.value.searchQuery = JSON.stringify(query);
|
||||
}
|
||||
|
||||
function waitUntilAndExecute(
|
||||
@@ -325,13 +346,20 @@ export default defineComponent({
|
||||
},
|
||||
];
|
||||
|
||||
onMounted(() => {
|
||||
// Hydrate Search
|
||||
// wait for stores to be hydrated
|
||||
watch(
|
||||
() => route.value.query,
|
||||
() => {
|
||||
if (state.value.ready) {
|
||||
hydrateSearch();
|
||||
}
|
||||
},
|
||||
{
|
||||
deep: true,
|
||||
},
|
||||
)
|
||||
|
||||
// read query params
|
||||
async function hydrateSearch() {
|
||||
const query = router.currentRoute.query;
|
||||
|
||||
if (query.auto) {
|
||||
state.value.auto = query.auto === "true";
|
||||
}
|
||||
@@ -363,6 +391,8 @@ export default defineComponent({
|
||||
}
|
||||
)
|
||||
);
|
||||
} else {
|
||||
selectedCategories.value = [];
|
||||
}
|
||||
|
||||
if (query.foods) {
|
||||
@@ -380,6 +410,8 @@ export default defineComponent({
|
||||
}
|
||||
)
|
||||
);
|
||||
} else {
|
||||
selectedFoods.value = [];
|
||||
}
|
||||
|
||||
if (query.tags) {
|
||||
@@ -392,6 +424,8 @@ export default defineComponent({
|
||||
}
|
||||
)
|
||||
);
|
||||
} else {
|
||||
selectedTags.value = [];
|
||||
}
|
||||
|
||||
if (query.tools) {
|
||||
@@ -404,11 +438,28 @@ export default defineComponent({
|
||||
}
|
||||
)
|
||||
);
|
||||
} else {
|
||||
selectedTools.value = [];
|
||||
}
|
||||
|
||||
Promise.allSettled(promises).then(() => {
|
||||
search();
|
||||
});
|
||||
await Promise.allSettled(promises);
|
||||
};
|
||||
|
||||
onMounted(async () => {
|
||||
// restore the user's last search query
|
||||
if (preferences.value.searchQuery && !(Object.keys(route.value.query).length > 0)) {
|
||||
try {
|
||||
const query = JSON.parse(preferences.value.searchQuery);
|
||||
await router.replace({ query });
|
||||
} catch (error) {
|
||||
preferences.value.searchQuery = "";
|
||||
router.replace({ query: {} });
|
||||
}
|
||||
}
|
||||
|
||||
await hydrateSearch();
|
||||
await search();
|
||||
state.value.ready = true;
|
||||
});
|
||||
|
||||
watchDebounced(
|
||||
@@ -426,7 +477,7 @@ export default defineComponent({
|
||||
selectedTools,
|
||||
],
|
||||
async () => {
|
||||
if (state.value.auto) {
|
||||
if (state.value.ready && state.value.auto) {
|
||||
await search();
|
||||
}
|
||||
},
|
||||
@@ -459,7 +510,7 @@ export default defineComponent({
|
||||
recipes,
|
||||
removeRecipe,
|
||||
replaceRecipes,
|
||||
passedQuery,
|
||||
passedQueryWithSeed,
|
||||
};
|
||||
},
|
||||
head: {},
|
||||
|
||||
@@ -41,6 +41,7 @@
|
||||
<v-date-picker
|
||||
v-model="newTimelineEventTimestamp"
|
||||
no-title
|
||||
:first-day-of-week="firstDayOfWeek"
|
||||
:local="$i18n.locale"
|
||||
@input="datePickerMenu = false"
|
||||
/>
|
||||
@@ -109,10 +110,11 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, reactive, ref, toRefs, useContext } from "@nuxtjs/composition-api";
|
||||
import { computed, defineComponent, reactive, ref, toRefs, useContext } from "@nuxtjs/composition-api";
|
||||
import { whenever } from "@vueuse/core";
|
||||
import { VForm } from "~/types/vuetify";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
import { useGroupSelf } from "~/composables/use-groups";
|
||||
import { Recipe, RecipeTimelineEventIn } from "~/lib/api/types/recipe";
|
||||
|
||||
export default defineComponent({
|
||||
@@ -129,11 +131,11 @@ export default defineComponent({
|
||||
setup(props, context) {
|
||||
const madeThisDialog = ref(false);
|
||||
const userApi = useUserApi();
|
||||
const { group } = useGroupSelf();
|
||||
const { $auth, i18n } = useContext();
|
||||
const domMadeThisForm = ref<VForm>();
|
||||
const newTimelineEvent = ref<RecipeTimelineEventIn>({
|
||||
// @ts-expect-error - TS doesn't like the $auth global user attribute
|
||||
subject: i18n.t("recipe.user-made-this", { user: $auth.user.fullName } as string),
|
||||
subject: "",
|
||||
eventType: "comment",
|
||||
eventMessage: "",
|
||||
timestamp: undefined,
|
||||
@@ -154,6 +156,10 @@ export default defineComponent({
|
||||
}
|
||||
);
|
||||
|
||||
const firstDayOfWeek = computed(() => {
|
||||
return group.value?.preferences?.firstDayOfWeek || 0;
|
||||
});
|
||||
|
||||
function clearImage() {
|
||||
newTimelineEventImage.value = undefined;
|
||||
newTimelineEventImageName.value = "";
|
||||
@@ -178,6 +184,8 @@ export default defineComponent({
|
||||
}
|
||||
|
||||
newTimelineEvent.value.recipeId = props.recipe.id
|
||||
// @ts-expect-error - TS doesn't like the $auth global user attribute
|
||||
newTimelineEvent.value.subject = i18n.t("recipe.user-made-this", { user: $auth.user.fullName })
|
||||
|
||||
// the user only selects the date, so we set the time to end of day local time
|
||||
// we choose the end of day so it always comes after "new recipe" events
|
||||
@@ -225,6 +233,7 @@ export default defineComponent({
|
||||
...toRefs(state),
|
||||
domMadeThisForm,
|
||||
madeThisDialog,
|
||||
firstDayOfWeek,
|
||||
newTimelineEvent,
|
||||
newTimelineEventImage,
|
||||
newTimelineEventImagePreviewUrl,
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
</div>
|
||||
|
||||
<div v-if="edit" class="d-flex justify-end">
|
||||
<BaseButton class="ml-auto my-2" @click="addNote"> {{ $t("general.new") }}</BaseButton>
|
||||
<BaseButton class="ml-auto my-2" @click="addNote"> {{ $t("general.add") }}</BaseButton>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -19,11 +19,11 @@
|
||||
</div>
|
||||
</v-card-text>
|
||||
<v-list v-if="showViewer" dense class="mt-0 pt-0">
|
||||
<v-list-item v-for="(item, key, index) in labels" :key="index" style="min-height: 25px" dense>
|
||||
<v-list-item v-for="(item, key, index) in renderedList" :key="index" style="min-height: 25px" dense>
|
||||
<v-list-item-content>
|
||||
<v-list-item-title class="pl-4 caption flex row">
|
||||
<div>{{ item.label }}</div>
|
||||
<div class="ml-auto mr-1">{{ value[key] }}</div>
|
||||
<div class="ml-auto mr-1">{{ item.value }}</div>
|
||||
<div>{{ item.suffix }}</div>
|
||||
</v-list-item-title>
|
||||
</v-list-item-content>
|
||||
@@ -37,6 +37,14 @@
|
||||
import { computed, defineComponent, useContext } from "@nuxtjs/composition-api";
|
||||
import { Nutrition } from "~/lib/api/types/recipe";
|
||||
|
||||
type NutritionLabelType = {
|
||||
[key: string]: {
|
||||
label: string;
|
||||
suffix: string;
|
||||
value?: string;
|
||||
};
|
||||
};
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
value: {
|
||||
@@ -50,34 +58,34 @@ export default defineComponent({
|
||||
},
|
||||
setup(props, context) {
|
||||
const { i18n } = useContext();
|
||||
const labels = {
|
||||
const labels = <NutritionLabelType>{
|
||||
calories: {
|
||||
label: i18n.t("recipe.calories"),
|
||||
suffix: i18n.t("recipe.calories-suffix"),
|
||||
label: i18n.tc("recipe.calories"),
|
||||
suffix: i18n.tc("recipe.calories-suffix"),
|
||||
},
|
||||
fatContent: {
|
||||
label: i18n.t("recipe.fat-content"),
|
||||
suffix: i18n.t("recipe.grams"),
|
||||
label: i18n.tc("recipe.fat-content"),
|
||||
suffix: i18n.tc("recipe.grams"),
|
||||
},
|
||||
fiberContent: {
|
||||
label: i18n.t("recipe.fiber-content"),
|
||||
suffix: i18n.t("recipe.grams"),
|
||||
label: i18n.tc("recipe.fiber-content"),
|
||||
suffix: i18n.tc("recipe.grams"),
|
||||
},
|
||||
proteinContent: {
|
||||
label: i18n.t("recipe.protein-content"),
|
||||
suffix: i18n.t("recipe.grams"),
|
||||
label: i18n.tc("recipe.protein-content"),
|
||||
suffix: i18n.tc("recipe.grams"),
|
||||
},
|
||||
sodiumContent: {
|
||||
label: i18n.t("recipe.sodium-content"),
|
||||
suffix: i18n.t("recipe.milligrams"),
|
||||
label: i18n.tc("recipe.sodium-content"),
|
||||
suffix: i18n.tc("recipe.milligrams"),
|
||||
},
|
||||
sugarContent: {
|
||||
label: i18n.t("recipe.sugar-content"),
|
||||
suffix: i18n.t("recipe.grams"),
|
||||
label: i18n.tc("recipe.sugar-content"),
|
||||
suffix: i18n.tc("recipe.grams"),
|
||||
},
|
||||
carbohydrateContent: {
|
||||
label: i18n.t("recipe.carbohydrate-content"),
|
||||
suffix: i18n.t("recipe.grams"),
|
||||
label: i18n.tc("recipe.carbohydrate-content"),
|
||||
suffix: i18n.tc("recipe.grams"),
|
||||
},
|
||||
};
|
||||
const valueNotNull = computed(() => {
|
||||
@@ -96,11 +104,25 @@ export default defineComponent({
|
||||
context.emit("input", { ...props.value, [key]: event });
|
||||
}
|
||||
|
||||
// Build a new list that only contains nutritional information that has a value
|
||||
const renderedList = computed(() => {
|
||||
return Object.entries(labels).reduce((item: NutritionLabelType, [key, label]) => {
|
||||
if (props.value[key]?.trim()) {
|
||||
item[key] = {
|
||||
...label,
|
||||
value: props.value[key],
|
||||
};
|
||||
}
|
||||
return item;
|
||||
}, {});
|
||||
});
|
||||
|
||||
return {
|
||||
labels,
|
||||
valueNotNull,
|
||||
showViewer,
|
||||
updateValue,
|
||||
renderedList,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
@@ -13,6 +13,9 @@
|
||||
$globals.icons.tags"
|
||||
return-object
|
||||
v-bind="inputAttrs"
|
||||
auto-select-first
|
||||
:search-input.sync="searchInput"
|
||||
@change="resetSearchInput"
|
||||
>
|
||||
<template #selection="data">
|
||||
<v-chip
|
||||
@@ -138,7 +141,6 @@ export default defineComponent({
|
||||
}
|
||||
|
||||
function appendCreated(item: RecipeTag | RecipeCategory | RecipeTool) {
|
||||
console.log(item);
|
||||
if (selected.value === undefined) {
|
||||
return;
|
||||
}
|
||||
@@ -148,6 +150,12 @@ export default defineComponent({
|
||||
|
||||
const dialog = ref(false);
|
||||
|
||||
const searchInput = ref("");
|
||||
|
||||
function resetSearchInput() {
|
||||
searchInput.value = "";
|
||||
}
|
||||
|
||||
return {
|
||||
Organizer,
|
||||
appendCreated,
|
||||
@@ -156,6 +164,8 @@ export default defineComponent({
|
||||
label,
|
||||
selected,
|
||||
removeByIndex,
|
||||
searchInput,
|
||||
resetSearchInput,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
/>
|
||||
<div v-if="isEditForm" class="d-flex">
|
||||
<RecipeDialogBulkAdd class="ml-auto my-2 mr-1" @bulk-data="addStep" />
|
||||
<BaseButton class="my-2" @click="addStep()"> {{ $t("general.new") }}</BaseButton>
|
||||
<BaseButton class="my-2" @click="addStep()"> {{ $t("general.add") }}</BaseButton>
|
||||
</div>
|
||||
<div v-if="!$vuetify.breakpoint.mdAndUp">
|
||||
<RecipePageOrganizers :recipe="recipe" />
|
||||
@@ -112,6 +112,7 @@ import { useUserApi } from "~/composables/api";
|
||||
import { uuid4, deepCopy } from "~/composables/use-utils";
|
||||
import RecipeDialogBulkAdd from "~/components/Domain/Recipe/RecipeDialogBulkAdd.vue";
|
||||
import RecipeNotes from "~/components/Domain/Recipe/RecipeNotes.vue";
|
||||
import { useNavigationWarning } from "~/composables/use-navigation-warning";
|
||||
|
||||
const EDITOR_OPTIONS = {
|
||||
mode: "code",
|
||||
@@ -151,6 +152,7 @@ export default defineComponent({
|
||||
const api = useUserApi();
|
||||
const { pageMode, editMode, setMode, isEditForm, isEditJSON, isCookMode, isEditMode, toggleCookMode } =
|
||||
usePageState(props.recipe.slug);
|
||||
const { deactivateNavigationWarning } = useNavigationWarning();
|
||||
|
||||
/** =============================================================
|
||||
* Recipe Snapshot on Mount
|
||||
@@ -175,6 +177,7 @@ export default defineComponent({
|
||||
await api.recipes.updateOne(props.recipe.slug, props.recipe);
|
||||
}
|
||||
}
|
||||
deactivateNavigationWarning();
|
||||
});
|
||||
|
||||
/** =============================================================
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
<span>{{ parserToolTip }}</span>
|
||||
</v-tooltip>
|
||||
<RecipeDialogBulkAdd class="mx-1 mb-1" @bulk-data="addIngredient" />
|
||||
<BaseButton class="mb-1" @click="addIngredient" > {{ $t("general.new") }} </BaseButton>
|
||||
<BaseButton class="mb-1" @click="addIngredient" > {{ $t("general.add") }} </BaseButton>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -148,10 +148,6 @@
|
||||
text: $tc('recipe.link-ingredients'),
|
||||
event: 'link-ingredients',
|
||||
},
|
||||
{
|
||||
text: $tc('recipe.merge-above'),
|
||||
event: 'merge-above',
|
||||
},
|
||||
{
|
||||
text: $tc('recipe.upload-image'),
|
||||
event: 'upload-image'
|
||||
@@ -160,11 +156,26 @@
|
||||
icon: previewStates[index] ? $globals.icons.edit : $globals.icons.eye,
|
||||
text: previewStates[index] ? $tc('recipe.edit-markdown') : $tc('markdown-editor.preview-markdown-button-label'),
|
||||
event: 'preview-step',
|
||||
divider: true,
|
||||
},
|
||||
{
|
||||
text: $tc('recipe.merge-above'),
|
||||
event: 'merge-above',
|
||||
},
|
||||
{
|
||||
text: $tc('recipe.move-to-top'),
|
||||
event: 'move-to-top',
|
||||
},
|
||||
{
|
||||
text: $tc('recipe.move-to-bottom'),
|
||||
event: 'move-to-bottom',
|
||||
},
|
||||
],
|
||||
},
|
||||
]"
|
||||
@merge-above="mergeAbove(index - 1, index)"
|
||||
@move-to-top="moveTo('top', index)"
|
||||
@move-to-bottom="moveTo('bottom', index)"
|
||||
@toggle-section="toggleShowTitle(step.id)"
|
||||
@link-ingredients="openDialog(index, step.text, step.ingredientReferences)"
|
||||
@preview-step="togglePreviewState(index)"
|
||||
@@ -531,6 +542,14 @@ export default defineComponent({
|
||||
}
|
||||
}
|
||||
|
||||
function moveTo(dest: string, source: number) {
|
||||
if (dest === "top") {
|
||||
props.value.unshift(props.value.splice(source, 1)[0]);
|
||||
} else {
|
||||
props.value.push(props.value.splice(source, 1)[0]);
|
||||
}
|
||||
}
|
||||
|
||||
const previewStates = ref<boolean[]>([]);
|
||||
|
||||
function togglePreviewState(index: number) {
|
||||
@@ -646,6 +665,7 @@ export default defineComponent({
|
||||
getIngredientByRefId,
|
||||
showTitleEditor,
|
||||
mergeAbove,
|
||||
moveTo,
|
||||
openDialog,
|
||||
setIngredientIds,
|
||||
availableNextStep,
|
||||
|
||||
@@ -3,9 +3,53 @@
|
||||
<v-row class="my-0 mx-7">
|
||||
<v-spacer />
|
||||
<v-col class="text-right">
|
||||
<v-btn fab small color="info" @click="reverseSort">
|
||||
<v-icon> {{ preferences.orderDirection === "asc" ? $globals.icons.sortCalendarAscending : $globals.icons.sortCalendarDescending }} </v-icon>
|
||||
</v-btn>
|
||||
<!-- Filters -->
|
||||
<v-menu offset-y bottom left nudge-bottom="3" :close-on-content-click="false">
|
||||
<template #activator="{ on, attrs }">
|
||||
<v-badge :content="filterBadgeCount" :value="filterBadgeCount" bordered overlap>
|
||||
<v-btn fab small color="info" v-bind="attrs" v-on="on">
|
||||
<v-icon> {{ $globals.icons.filter }} </v-icon>
|
||||
</v-btn>
|
||||
</v-badge>
|
||||
</template>
|
||||
<v-card>
|
||||
<v-list>
|
||||
<v-list-item @click="reverseSort">
|
||||
<v-icon left>
|
||||
{{
|
||||
preferences.orderDirection === "asc" ?
|
||||
$globals.icons.sortCalendarDescending : $globals.icons.sortCalendarAscending
|
||||
}}
|
||||
</v-icon>
|
||||
<v-list-item-title>
|
||||
{{ preferences.orderDirection === "asc" ? $tc("general.sort-descending") : $tc("general.sort-ascending") }}
|
||||
</v-list-item-title>
|
||||
</v-list-item>
|
||||
<v-divider />
|
||||
<v-list-item class="pa-0">
|
||||
<v-list class="py-0" style="width: 100%;">
|
||||
<v-list-item
|
||||
v-for="option, idx in eventTypeFilterState"
|
||||
:key="idx"
|
||||
>
|
||||
<v-checkbox
|
||||
:input-value="option.checked"
|
||||
readonly
|
||||
@click="toggleEventTypeOption(option.value)"
|
||||
>
|
||||
<template #label>
|
||||
<v-icon left>
|
||||
{{ option.icon }}
|
||||
</v-icon>
|
||||
{{ option.label }}
|
||||
</template>
|
||||
</v-checkbox>
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
</v-card>
|
||||
</v-menu>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-divider class="mx-2"/>
|
||||
@@ -29,9 +73,9 @@
|
||||
/>
|
||||
</v-timeline>
|
||||
</div>
|
||||
<v-card v-else-if="!loading">
|
||||
<v-card v-else-if="!loading" class="mt-2">
|
||||
<v-card-title class="justify-center pa-9">
|
||||
{{ $t("recipe.timeline-is-empty") }}
|
||||
{{ $t("recipe.timeline-no-events-found-try-adjusting-filters") }}
|
||||
</v-card-title>
|
||||
</v-card>
|
||||
<div v-if="loading" class="mb-3 text-center">
|
||||
@@ -41,14 +85,15 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, onMounted, ref, useAsync, useContext } from "@nuxtjs/composition-api";
|
||||
import { computed, defineComponent, onMounted, ref, useAsync, useContext } from "@nuxtjs/composition-api";
|
||||
import { useThrottleFn, whenever } from "@vueuse/core";
|
||||
import RecipeTimelineItem from "./RecipeTimelineItem.vue"
|
||||
import { useTimelinePreferences } from "~/composables/use-users/preferences";
|
||||
import { useTimelineEventTypes } from "~/composables/recipes/use-recipe-timeline-events";
|
||||
import { useAsyncKey } from "~/composables/use-utils";
|
||||
import { alert } from "~/composables/use-toast";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
import { Recipe, RecipeTimelineEventOut, RecipeTimelineEventUpdate } from "~/lib/api/types/recipe"
|
||||
import { Recipe, RecipeTimelineEventOut, RecipeTimelineEventUpdate, TimelineEventType } from "~/lib/api/types/recipe";
|
||||
|
||||
export default defineComponent({
|
||||
components: { RecipeTimelineItem },
|
||||
@@ -76,6 +121,7 @@ export default defineComponent({
|
||||
const api = useUserApi();
|
||||
const { i18n } = useContext();
|
||||
const preferences = useTimelinePreferences();
|
||||
const { eventTypeOptions } = useTimelineEventTypes();
|
||||
const loading = ref(true);
|
||||
const ready = ref(false);
|
||||
|
||||
@@ -85,6 +131,15 @@ export default defineComponent({
|
||||
|
||||
const timelineEvents = ref([] as RecipeTimelineEventOut[]);
|
||||
const recipes = new Map<string, Recipe>();
|
||||
const filterBadgeCount = computed(() => eventTypeOptions.value.length - preferences.value.types.length);
|
||||
const eventTypeFilterState = computed(() => {
|
||||
return eventTypeOptions.value.map(option => {
|
||||
return {
|
||||
...option,
|
||||
checked: preferences.value.types.includes(option.value),
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
interface ScrollEvent extends Event {
|
||||
target: HTMLInputElement;
|
||||
@@ -112,7 +167,7 @@ export default defineComponent({
|
||||
}
|
||||
);
|
||||
|
||||
// Sorting
|
||||
// Preferences
|
||||
function reverseSort() {
|
||||
if (loading.value) {
|
||||
return;
|
||||
@@ -122,6 +177,21 @@ export default defineComponent({
|
||||
initializeTimelineEvents();
|
||||
}
|
||||
|
||||
function toggleEventTypeOption(option: TimelineEventType) {
|
||||
if (loading.value) {
|
||||
return;
|
||||
}
|
||||
|
||||
const index = preferences.value.types.indexOf(option);
|
||||
if (index === -1) {
|
||||
preferences.value.types.push(option);
|
||||
} else {
|
||||
preferences.value.types.splice(index, 1);
|
||||
}
|
||||
|
||||
initializeTimelineEvents();
|
||||
}
|
||||
|
||||
// Timeline Actions
|
||||
async function updateTimelineEvent(index: number) {
|
||||
const event = timelineEvents.value[index]
|
||||
@@ -179,8 +249,11 @@ export default defineComponent({
|
||||
async function scrollTimelineEvents() {
|
||||
const orderBy = "timestamp";
|
||||
const orderDirection = preferences.value.orderDirection === "asc" ? "asc" : "desc";
|
||||
// eslint-disable-next-line quotes
|
||||
const eventTypeValue = `["${preferences.value.types.join('", "')}"]`;
|
||||
const queryFilter = `(${props.queryFilter}) AND eventType IN ${eventTypeValue}`
|
||||
|
||||
const response = await api.recipes.getAllTimelineEvents(page.value, perPage, { orderBy, orderDirection, queryFilter: props.queryFilter });
|
||||
const response = await api.recipes.getAllTimelineEvents(page.value, perPage, { orderBy, orderDirection, queryFilter });
|
||||
page.value += 1;
|
||||
if (!response?.data) {
|
||||
return;
|
||||
@@ -256,11 +329,14 @@ export default defineComponent({
|
||||
|
||||
return {
|
||||
deleteTimelineEvent,
|
||||
filterBadgeCount,
|
||||
loading,
|
||||
onScroll,
|
||||
preferences,
|
||||
eventTypeFilterState,
|
||||
recipes,
|
||||
reverseSort,
|
||||
toggleEventTypeOption,
|
||||
timelineEvents,
|
||||
updateTimelineEvent,
|
||||
};
|
||||
|
||||
@@ -99,6 +99,7 @@ import { computed, defineComponent, ref, useContext, useRoute } from "@nuxtjs/co
|
||||
import RecipeCardMobile from "./RecipeCardMobile.vue";
|
||||
import RecipeTimelineContextMenu from "./RecipeTimelineContextMenu.vue";
|
||||
import { useStaticRoutes } from "~/composables/api";
|
||||
import { useTimelineEventTypes } from "~/composables/recipes/use-recipe-timeline-events";
|
||||
import { Recipe, RecipeTimelineEventOut } from "~/lib/api/types/recipe"
|
||||
import UserAvatar from "~/components/Domain/User/UserAvatar.vue";
|
||||
import SafeMarkdown from "~/components/global/SafeMarkdown.vue";
|
||||
@@ -124,6 +125,7 @@ export default defineComponent({
|
||||
setup(props) {
|
||||
const { $auth, $globals, $vuetify } = useContext();
|
||||
const { recipeTimelineEventImage } = useStaticRoutes();
|
||||
const { eventTypeOptions } = useTimelineEventTypes();
|
||||
const timelineEvents = ref([] as RecipeTimelineEventOut[]);
|
||||
|
||||
const route = useRoute();
|
||||
@@ -164,21 +166,10 @@ export default defineComponent({
|
||||
}
|
||||
})
|
||||
|
||||
const icon = computed( () => {
|
||||
switch (props.event.eventType) {
|
||||
case "comment":
|
||||
return $globals.icons.commentTextMultiple;
|
||||
|
||||
case "info":
|
||||
return $globals.icons.informationVariant;
|
||||
|
||||
case "system":
|
||||
return $globals.icons.cog;
|
||||
|
||||
default:
|
||||
return $globals.icons.informationVariant;
|
||||
};
|
||||
})
|
||||
const icon = computed(() => {
|
||||
const option = eventTypeOptions.value.find((option) => option.value === props.event.eventType);
|
||||
return option ? option.icon : $globals.icons.informationVariant;
|
||||
});
|
||||
|
||||
const hideImage = ref(false);
|
||||
const eventImageUrl = computed<string>( () => {
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
:label="$t('shopping-list.note')"
|
||||
rows="1"
|
||||
auto-grow
|
||||
@keypress="handleNoteKeyPress"
|
||||
></v-textarea>
|
||||
</div>
|
||||
<div class="d-flex align-end" style="gap: 20px">
|
||||
@@ -95,7 +96,7 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, computed } from "@nuxtjs/composition-api";
|
||||
import { defineComponent, computed, watch } from "@nuxtjs/composition-api";
|
||||
import { ShoppingListItemCreate, ShoppingListItemOut } from "~/lib/api/types/group";
|
||||
import { MultiPurposeLabelOut } from "~/lib/api/types/labels";
|
||||
import { IngredientFood, IngredientUnit } from "~/lib/api/types/recipe";
|
||||
@@ -128,9 +129,28 @@ export default defineComponent({
|
||||
context.emit("input", val);
|
||||
},
|
||||
});
|
||||
|
||||
watch(
|
||||
() => props.value.food,
|
||||
(newFood) => {
|
||||
// @ts-ignore our logic already assumes there's a label attribute, even if TS doesn't think there is
|
||||
listItem.value.label = newFood?.label || null;
|
||||
listItem.value.labelId = listItem.value.label?.id || null;
|
||||
}
|
||||
);
|
||||
|
||||
return {
|
||||
listItem,
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
handleNoteKeyPress(event) {
|
||||
// Save on Enter
|
||||
if (!event.shiftKey && event.key === "Enter") {
|
||||
event.preventDefault();
|
||||
this.$emit("save");
|
||||
}
|
||||
},
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
160
frontend/components/Domain/User/UserRegistrationForm.vue
Normal file
160
frontend/components/Domain/User/UserRegistrationForm.vue
Normal file
@@ -0,0 +1,160 @@
|
||||
<template>
|
||||
<div>
|
||||
<v-card-title>
|
||||
<v-icon large class="mr-3"> {{ $globals.icons.user }}</v-icon>
|
||||
<span class="headline"> {{ $t("user-registration.account-details") }}</span>
|
||||
</v-card-title>
|
||||
<v-divider />
|
||||
<v-card-text>
|
||||
<v-form ref="domAccountForm" @submit.prevent>
|
||||
<v-text-field
|
||||
v-model="accountDetails.username.value"
|
||||
autofocus
|
||||
v-bind="inputAttrs"
|
||||
:label="$tc('user.username')"
|
||||
:prepend-icon="$globals.icons.user"
|
||||
:rules="[validators.required]"
|
||||
:error-messages="usernameErrorMessages"
|
||||
@blur="validateUsername"
|
||||
/>
|
||||
<v-text-field
|
||||
v-model="accountDetails.fullName.value"
|
||||
v-bind="inputAttrs"
|
||||
:label="$tc('user.full-name')"
|
||||
:prepend-icon="$globals.icons.user"
|
||||
:rules="[validators.required]"
|
||||
/>
|
||||
<v-text-field
|
||||
v-model="accountDetails.email.value"
|
||||
v-bind="inputAttrs"
|
||||
:prepend-icon="$globals.icons.email"
|
||||
:label="$tc('user.email')"
|
||||
:rules="[validators.required, validators.email]"
|
||||
:error-messages="emailErrorMessages"
|
||||
@blur="validateEmail"
|
||||
/>
|
||||
<v-text-field
|
||||
v-model="credentials.password1.value"
|
||||
v-bind="inputAttrs"
|
||||
:type="pwFields.inputType.value"
|
||||
:append-icon="pwFields.passwordIcon.value"
|
||||
:prepend-icon="$globals.icons.lock"
|
||||
:label="$tc('user.password')"
|
||||
:rules="[validators.required, validators.minLength(8), validators.maxLength(258)]"
|
||||
@click:append="pwFields.togglePasswordShow"
|
||||
/>
|
||||
|
||||
<UserPasswordStrength :value="credentials.password1.value" />
|
||||
|
||||
<v-text-field
|
||||
v-model="credentials.password2.value"
|
||||
v-bind="inputAttrs"
|
||||
:type="pwFields.inputType.value"
|
||||
:append-icon="pwFields.passwordIcon.value"
|
||||
:prepend-icon="$globals.icons.lock"
|
||||
:label="$tc('user.confirm-password')"
|
||||
:rules="[validators.required, credentials.passwordMatch]"
|
||||
@click:append="pwFields.togglePasswordShow"
|
||||
/>
|
||||
<div class="px-2">
|
||||
<v-checkbox
|
||||
v-model="accountDetails.advancedOptions.value"
|
||||
:label="$tc('user.enable-advanced-content')"
|
||||
/>
|
||||
<p class="text-caption mt-n4">
|
||||
{{ $tc("user.enable-advanced-content-description") }}
|
||||
</p>
|
||||
</div>
|
||||
</v-form>
|
||||
</v-card-text>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, ref } from "@nuxtjs/composition-api";
|
||||
import { useDark } from "@vueuse/core";
|
||||
import { validators } from "~/composables/use-validators";
|
||||
import { useUserRegistrationForm } from "~/composables/use-users/user-registration-form";
|
||||
import { usePasswordField } from "~/composables/use-passwords";
|
||||
import UserPasswordStrength from "~/components/Domain/User/UserPasswordStrength.vue";
|
||||
|
||||
const inputAttrs = {
|
||||
filled: true,
|
||||
rounded: true,
|
||||
validateOnBlur: true,
|
||||
class: "rounded-lg",
|
||||
};
|
||||
|
||||
export default defineComponent({
|
||||
components: { UserPasswordStrength },
|
||||
layout: "blank",
|
||||
setup() {
|
||||
const isDark = useDark();
|
||||
const langDialog = ref(false);
|
||||
|
||||
const pwFields = usePasswordField();
|
||||
const {
|
||||
accountDetails,
|
||||
credentials,
|
||||
emailErrorMessages,
|
||||
usernameErrorMessages,
|
||||
validateUsername,
|
||||
validateEmail,
|
||||
domAccountForm,
|
||||
} = useUserRegistrationForm();
|
||||
return {
|
||||
accountDetails,
|
||||
credentials,
|
||||
emailErrorMessages,
|
||||
inputAttrs,
|
||||
isDark,
|
||||
langDialog,
|
||||
pwFields,
|
||||
usernameErrorMessages,
|
||||
validators,
|
||||
// Validators
|
||||
validateUsername,
|
||||
validateEmail,
|
||||
// Dom Refs
|
||||
domAccountForm,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="css" scoped>
|
||||
.icon-primary {
|
||||
fill: var(--v-primary-base);
|
||||
}
|
||||
|
||||
.icon-white {
|
||||
fill: white;
|
||||
}
|
||||
|
||||
.icon-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
margin-top: 2.5rem;
|
||||
}
|
||||
|
||||
.icon-divider {
|
||||
width: 100%;
|
||||
margin-bottom: -2.5rem;
|
||||
}
|
||||
|
||||
.icon-avatar {
|
||||
border-color: rgba(0, 0, 0, 0.12);
|
||||
border: 2px;
|
||||
}
|
||||
|
||||
.bg-off-white {
|
||||
background: #f5f8fa;
|
||||
}
|
||||
|
||||
.preferred-width {
|
||||
width: 840px;
|
||||
}
|
||||
</style>
|
||||
@@ -6,8 +6,6 @@
|
||||
v-model="sidebar"
|
||||
absolute
|
||||
:top-link="topLinks"
|
||||
:secondary-header="cookbookLinks.length ? $tc('sidebar.cookbooks') : undefined"
|
||||
:secondary-header-link="isOwnGroup && cookbookLinks.length ? `/g/${groupSlug}/cookbooks` : undefined"
|
||||
:secondary-links="cookbookLinks || []"
|
||||
:bottom-links="isAdmin ? bottomLinks : []"
|
||||
>
|
||||
@@ -146,14 +144,6 @@
|
||||
to: `/g/${groupSlug.value}/r/create/new`,
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
insertDivider: true,
|
||||
icon: $globals.icons.pages,
|
||||
title: i18n.tc("sidebar.cookbook"),
|
||||
subtitle: i18n.tc("sidebar.create-cookbook"),
|
||||
to: `/g/${groupSlug.value}/cookbooks`,
|
||||
restricted: true,
|
||||
},
|
||||
]);
|
||||
|
||||
const bottomLinks = computed<SidebarLinks>(() => [
|
||||
@@ -191,22 +181,35 @@
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.categories,
|
||||
to: `/g/${groupSlug.value}/recipes/categories`,
|
||||
title: i18n.tc("sidebar.categories"),
|
||||
icon: $globals.icons.book,
|
||||
to: `/g/${groupSlug.value}/cookbooks`,
|
||||
title: i18n.tc("cookbook.cookbooks"),
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.tags,
|
||||
to: `/g/${groupSlug.value}/recipes/tags`,
|
||||
title: i18n.tc("sidebar.tags"),
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.potSteam,
|
||||
to: `/g/${groupSlug.value}/recipes/tools`,
|
||||
title: i18n.tc("tool.tools"),
|
||||
icon: $globals.icons.organizers,
|
||||
title: "Organizers",
|
||||
restricted: true,
|
||||
children: [
|
||||
{
|
||||
icon: $globals.icons.categories,
|
||||
to: `/g/${groupSlug.value}/recipes/categories`,
|
||||
title: i18n.tc("sidebar.categories"),
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.tags,
|
||||
to: `/g/${groupSlug.value}/recipes/tags`,
|
||||
title: i18n.tc("sidebar.tags"),
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.potSteam,
|
||||
to: `/g/${groupSlug.value}/recipes/tools`,
|
||||
title: i18n.tc("tool.tools"),
|
||||
restricted: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
|
||||
|
||||
@@ -39,13 +39,12 @@
|
||||
<v-list-item-title>{{ nav.title }}</v-list-item-title>
|
||||
</template>
|
||||
|
||||
<v-list-item v-for="child in nav.children" :key="child.title" exact :to="child.to">
|
||||
<v-list-item v-for="child in nav.children" :key="child.title" exact :to="child.to" class="ml-2">
|
||||
<v-list-item-icon>
|
||||
<v-icon>{{ child.icon }}</v-icon>
|
||||
</v-list-item-icon>
|
||||
<v-list-item-title>{{ child.title }}</v-list-item-title>
|
||||
</v-list-item>
|
||||
<v-divider class="mb-4"></v-divider>
|
||||
</v-list-group>
|
||||
|
||||
<!-- Single Item -->
|
||||
@@ -68,18 +67,8 @@
|
||||
</template>
|
||||
|
||||
<!-- Secondary Links -->
|
||||
<template v-if="secondaryLinks">
|
||||
<router-link v-if="secondaryHeader && secondaryHeaderLink" :to="secondaryHeaderLink" style="text-decoration: none;">
|
||||
<v-subheader :to="secondaryHeaderLink" class="pb-0">
|
||||
{{ secondaryHeader }}
|
||||
</v-subheader>
|
||||
</router-link>
|
||||
<div v-else-if="secondaryHeader">
|
||||
<v-subheader :to="secondaryHeaderLink" class="pb-0">
|
||||
{{ secondaryHeader }}
|
||||
</v-subheader>
|
||||
</div>
|
||||
<v-divider v-if="secondaryHeader"></v-divider>
|
||||
<template v-if="secondaryLinks.length > 0">
|
||||
<v-divider class="mt-2"></v-divider>
|
||||
<v-list nav dense exact>
|
||||
<template v-for="nav in secondaryLinks">
|
||||
<div v-if="!nav.restricted || isOwnGroup" :key="nav.title">
|
||||
@@ -179,14 +168,6 @@ export default defineComponent({
|
||||
required: false,
|
||||
default: null,
|
||||
},
|
||||
secondaryHeader: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
secondaryHeaderLink: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
},
|
||||
setup(props, context) {
|
||||
// V-Model Support
|
||||
|
||||
@@ -15,12 +15,22 @@
|
||||
v-if="inputField.type === fieldTypes.BOOLEAN"
|
||||
v-model="value[inputField.varName]"
|
||||
class="my-0 py-0"
|
||||
:label="inputField.label"
|
||||
:name="inputField.varName"
|
||||
:hint="inputField.hint || ''"
|
||||
:disabled="(inputField.disableUpdate && updateMode) || (!updateMode && inputField.disableCreate) || (disabledFields && disabledFields.includes(inputField.varName))"
|
||||
@change="emitBlur"
|
||||
/>
|
||||
>
|
||||
<template #label>
|
||||
<div>
|
||||
<v-card-text class="text-body-1 my-0 py-0">
|
||||
{{ inputField.label }}
|
||||
</v-card-text>
|
||||
<v-card-text v-if="inputField.hint" class="text-caption my-0 py-0">
|
||||
{{ inputField.hint }}
|
||||
</v-card-text>
|
||||
</div>
|
||||
</template>
|
||||
</v-checkbox>
|
||||
|
||||
|
||||
<!-- Text Field -->
|
||||
<v-text-field
|
||||
|
||||
@@ -10,9 +10,12 @@
|
||||
</v-btn>
|
||||
</template>
|
||||
<v-list dense>
|
||||
<v-list-item v-for="(child, idx) in btn.children" :key="idx" dense @click="$emit(child.event)">
|
||||
<v-list-item-title>{{ child.text }}</v-list-item-title>
|
||||
</v-list-item>
|
||||
<template v-for="(child, idx) in btn.children">
|
||||
<v-list-item :key="idx" dense @click="$emit(child.event)">
|
||||
<v-list-item-title>{{ child.text }}</v-list-item-title>
|
||||
</v-list-item>
|
||||
<v-divider v-if="child.divider" :key="`divider-${idx}`" class="my-1"></v-divider>
|
||||
</template>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
<v-tooltip
|
||||
@@ -55,6 +58,7 @@ export interface ButtonOption {
|
||||
event: string;
|
||||
children?: ButtonOption[];
|
||||
disabled?: boolean;
|
||||
divider?: boolean;
|
||||
}
|
||||
|
||||
export default defineComponent({
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
<v-icon>{{ item.icon }}</v-icon>
|
||||
</v-list-item-icon>
|
||||
<v-list-item-title>{{ item.text }}</v-list-item-title>
|
||||
<v-divider v-if="item.divider" :key="`divider-${index}`" class="my-1" ></v-divider>
|
||||
</v-list-item>
|
||||
<v-divider v-if="item.divider" :key="`divider-${index}`" class="my-1" ></v-divider>
|
||||
</template>
|
||||
</v-list-item-group>
|
||||
</v-list>
|
||||
@@ -47,8 +47,8 @@
|
||||
<v-icon>{{ item.icon }}</v-icon>
|
||||
</v-list-item-icon>
|
||||
<v-list-item-title>{{ item.text }}</v-list-item-title>
|
||||
<v-divider v-if="item.divider" :key="`divider-${index}`" class="my-1" ></v-divider>
|
||||
</v-list-item>
|
||||
<v-divider v-if="item.divider" :key="`divider-${index}`" class="my-1" ></v-divider>
|
||||
</template>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
|
||||
259
frontend/components/global/BaseWizard.vue
Normal file
259
frontend/components/global/BaseWizard.vue
Normal file
@@ -0,0 +1,259 @@
|
||||
<template>
|
||||
<div :style="`width: ${width}; height: 100%;`">
|
||||
<LanguageDialog v-model="langDialog" />
|
||||
<v-card>
|
||||
<div>
|
||||
<v-toolbar width="100%" color="primary" class="d-flex justify-center" style="margin-bottom: 4rem" dark>
|
||||
<v-toolbar-title class="headline text-h4"> Mealie </v-toolbar-title>
|
||||
</v-toolbar>
|
||||
|
||||
<div class="icon-container">
|
||||
<v-divider class="icon-divider"></v-divider>
|
||||
<v-avatar class="pa-2 icon-avatar" color="primary" size="75">
|
||||
<svg class="icon-white" style="width: 75" viewBox="0 0 24 24">
|
||||
<path
|
||||
d="M8.1,13.34L3.91,9.16C2.35,7.59 2.35,5.06 3.91,3.5L10.93,10.5L8.1,13.34M13.41,13L20.29,19.88L18.88,21.29L12,14.41L5.12,21.29L3.71,19.88L13.36,10.22L13.16,10C12.38,9.23 12.38,7.97 13.16,7.19L17.5,2.82L18.43,3.74L15.19,7L16.15,7.94L19.39,4.69L20.31,5.61L17.06,8.85L18,9.81L21.26,6.56L22.18,7.5L17.81,11.84C17.03,12.62 15.77,12.62 15,11.84L14.78,11.64L13.41,13Z"
|
||||
/>
|
||||
</svg>
|
||||
</v-avatar>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex justify-center grow items-center my-4">
|
||||
<slot :width="pageWidth"></slot>
|
||||
</div>
|
||||
<div class="mx-2 my-4">
|
||||
<v-progress-linear
|
||||
v-if="value > 0"
|
||||
:value="Math.ceil((value/maxPageNumber)*100)"
|
||||
striped
|
||||
height="10"
|
||||
/>
|
||||
</div>
|
||||
<v-divider class="ma-2" />
|
||||
<v-card-actions width="100%">
|
||||
<v-btn
|
||||
v-if="prevButtonShow"
|
||||
:disabled="!prevButtonEnable"
|
||||
:color="prevButtonColor"
|
||||
@click="decrementPage"
|
||||
>
|
||||
<v-icon v-if="prevButtonIconRef">
|
||||
{{ prevButtonIconRef }}
|
||||
</v-icon>
|
||||
{{ prevButtonTextRef }}
|
||||
</v-btn>
|
||||
<v-spacer />
|
||||
<v-btn
|
||||
v-if="nextButtonShow"
|
||||
:disabled="!nextButtonEnable"
|
||||
:color="nextButtonColorRef"
|
||||
@click="incrementPage"
|
||||
>
|
||||
<div v-if="isSubmitting">
|
||||
<v-progress-circular indeterminate color="white" size="24" />
|
||||
</div>
|
||||
<div v-else>
|
||||
<v-icon v-if="nextButtonIconRef && !nextButtonIconAfter">
|
||||
{{ nextButtonIconRef }}
|
||||
</v-icon>
|
||||
{{ nextButtonTextRef }}
|
||||
<v-icon v-if="nextButtonIconRef && nextButtonIconAfter">
|
||||
{{ nextButtonIconRef }}
|
||||
</v-icon>
|
||||
</div>
|
||||
</v-btn>
|
||||
</v-card-actions>
|
||||
<v-card-actions class="justify-center flex-column py-8">
|
||||
<BaseButton large color="primary" @click="langDialog = true">
|
||||
<template #icon> {{ $globals.icons.translate }}</template>
|
||||
{{ $t("language-dialog.choose-language") }}
|
||||
</BaseButton>
|
||||
</v-card-actions>
|
||||
</v-card>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, ref, useContext } from "@nuxtjs/composition-api";
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
value: {
|
||||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
minPageNumber: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
maxPageNumber: {
|
||||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
width: {
|
||||
type: [String, Number],
|
||||
default: "1200px",
|
||||
},
|
||||
pageWidth: {
|
||||
type: [String, Number],
|
||||
default: "600px",
|
||||
},
|
||||
prevButtonText: {
|
||||
type: String,
|
||||
default: undefined,
|
||||
},
|
||||
prevButtonIcon: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
prevButtonColor: {
|
||||
type: String,
|
||||
default: "grey-darken-3",
|
||||
},
|
||||
prevButtonShow: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
prevButtonEnable: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
nextButtonText: {
|
||||
type: String,
|
||||
default: undefined,
|
||||
},
|
||||
nextButtonIcon: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
nextButtonIconAfter: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
nextButtonColor: {
|
||||
type: String,
|
||||
default: undefined,
|
||||
},
|
||||
nextButtonShow: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
nextButtonEnable: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
nextButtonIsSubmit: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
title: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
icon: {
|
||||
type: String,
|
||||
default: null,
|
||||
},
|
||||
isSubmitting: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
}
|
||||
},
|
||||
setup(props, context) {
|
||||
const { $globals, i18n } = useContext();
|
||||
const ready = ref(false);
|
||||
const langDialog = ref(false);
|
||||
|
||||
const prevButtonTextRef = computed(() => props.prevButtonText || i18n.tc("general.back"));
|
||||
const prevButtonIconRef = computed(() => props.prevButtonIcon || $globals.icons.back);
|
||||
const nextButtonTextRef = computed(
|
||||
() => props.nextButtonText || (
|
||||
props.nextButtonIsSubmit ? i18n.tc("general.submit") : i18n.tc("general.next")
|
||||
)
|
||||
);
|
||||
const nextButtonIconRef = computed(
|
||||
() => props.nextButtonIcon || (
|
||||
props.nextButtonIsSubmit ? $globals.icons.createAlt : $globals.icons.forward
|
||||
)
|
||||
);
|
||||
const nextButtonColorRef = computed(
|
||||
() => props.nextButtonColor || (props.nextButtonIsSubmit ? "success" : "info")
|
||||
);
|
||||
|
||||
function goToPage(page: number) {
|
||||
if (page < props.minPageNumber) {
|
||||
goToPage(props.minPageNumber);
|
||||
return;
|
||||
} else if (page > props.maxPageNumber) {
|
||||
goToPage(props.maxPageNumber);
|
||||
return;
|
||||
}
|
||||
|
||||
context.emit("input", page);
|
||||
}
|
||||
|
||||
function decrementPage() {
|
||||
goToPage(props.value - 1);
|
||||
}
|
||||
|
||||
function incrementPage() {
|
||||
if (props.nextButtonIsSubmit) {
|
||||
context.emit("submit", props.value);
|
||||
} else {
|
||||
goToPage(props.value + 1);
|
||||
}
|
||||
}
|
||||
|
||||
ready.value = true;
|
||||
|
||||
return {
|
||||
ready,
|
||||
langDialog,
|
||||
prevButtonTextRef,
|
||||
prevButtonIconRef,
|
||||
nextButtonTextRef,
|
||||
nextButtonIconRef,
|
||||
nextButtonColorRef,
|
||||
decrementPage,
|
||||
incrementPage,
|
||||
};
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="css" scoped>
|
||||
.icon-primary {
|
||||
fill: var(--v-primary-base);
|
||||
}
|
||||
|
||||
.icon-white {
|
||||
fill: white;
|
||||
}
|
||||
|
||||
.icon-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
margin-top: 2.5rem;
|
||||
}
|
||||
|
||||
.icon-divider {
|
||||
width: 100%;
|
||||
margin-bottom: -2.5rem;
|
||||
}
|
||||
|
||||
.icon-avatar {
|
||||
border-color: rgba(0, 0, 0, 0.12);
|
||||
border: 2px;
|
||||
}
|
||||
|
||||
.bg-off-white {
|
||||
background: #f5f8fa;
|
||||
}
|
||||
|
||||
.preferred-width {
|
||||
width: 840px;
|
||||
}
|
||||
</style>
|
||||
@@ -37,6 +37,7 @@ export function usePublicStoreActions<T extends BoundT>(
|
||||
loading.value = true;
|
||||
const allItems = useAsync(async () => {
|
||||
const { data } = await api.getAll(page, perPage, params);
|
||||
loading.value = false;
|
||||
|
||||
if (data && allRef) {
|
||||
allRef.value = data.items;
|
||||
@@ -49,7 +50,6 @@ export function usePublicStoreActions<T extends BoundT>(
|
||||
}
|
||||
}, useAsyncKey());
|
||||
|
||||
loading.value = false;
|
||||
return allItems;
|
||||
}
|
||||
|
||||
@@ -88,6 +88,7 @@ export function useStoreActions<T extends BoundT>(
|
||||
loading.value = true;
|
||||
const allItems = useAsync(async () => {
|
||||
const { data } = await api.getAll(page, perPage, params);
|
||||
loading.value = false;
|
||||
|
||||
if (data && allRef) {
|
||||
allRef.value = data.items;
|
||||
@@ -100,7 +101,6 @@ export function useStoreActions<T extends BoundT>(
|
||||
}
|
||||
}, useAsyncKey());
|
||||
|
||||
loading.value = false;
|
||||
return allItems;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { computed, ComputedRef, ref, Ref, useContext } from "@nuxtjs/composition-api";
|
||||
import { UserOut } from "~/lib/api/types/user";
|
||||
import { useNavigationWarning } from "~/composables/use-navigation-warning";
|
||||
|
||||
export enum PageMode {
|
||||
EDIT = "EDIT",
|
||||
@@ -65,6 +66,8 @@ function pageRefs(slug: string) {
|
||||
}
|
||||
|
||||
function pageState({ slugRef, pageModeRef, editModeRef, imageKey }: PageRefs): PageState {
|
||||
const { activateNavigationWarning, deactivateNavigationWarning } = useNavigationWarning();
|
||||
|
||||
const toggleEditMode = () => {
|
||||
if (editModeRef.value === EditorMode.FORM) {
|
||||
editModeRef.value = EditorMode.JSON;
|
||||
@@ -88,8 +91,13 @@ function pageState({ slugRef, pageModeRef, editModeRef, imageKey }: PageRefs): P
|
||||
const setMode = (toMode: PageMode) => {
|
||||
const fromMode = pageModeRef.value;
|
||||
|
||||
if (fromMode === PageMode.EDIT && toMode === PageMode.VIEW) {
|
||||
setEditMode(EditorMode.FORM);
|
||||
if (fromMode === PageMode.EDIT) {
|
||||
if (toMode === PageMode.VIEW) {
|
||||
setEditMode(EditorMode.FORM);
|
||||
}
|
||||
deactivateNavigationWarning();
|
||||
} else if (toMode === PageMode.EDIT) {
|
||||
activateNavigationWarning();
|
||||
}
|
||||
|
||||
pageModeRef.value = toMode;
|
||||
|
||||
35
frontend/composables/recipes/use-recipe-timeline-events.ts
Normal file
35
frontend/composables/recipes/use-recipe-timeline-events.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
import { computed, useContext } from "@nuxtjs/composition-api";
|
||||
import { TimelineEventType } from "~/lib/api/types/recipe";
|
||||
|
||||
export interface TimelineEventTypeData {
|
||||
value: TimelineEventType;
|
||||
label: string;
|
||||
icon: string;
|
||||
}
|
||||
|
||||
export const useTimelineEventTypes = () => {
|
||||
const { $globals, i18n } = useContext();
|
||||
const eventTypeOptions = computed<TimelineEventTypeData[]>(() => {
|
||||
return [
|
||||
{
|
||||
value: "comment",
|
||||
label: i18n.tc("recipe.comment"),
|
||||
icon: $globals.icons.commentTextMultiple,
|
||||
},
|
||||
{
|
||||
value: "info",
|
||||
label: i18n.tc("settings.theme.info"),
|
||||
icon: $globals.icons.informationVariant,
|
||||
},
|
||||
{
|
||||
value: "system",
|
||||
label: i18n.tc("general.system"),
|
||||
icon: $globals.icons.cog,
|
||||
},
|
||||
];
|
||||
});
|
||||
|
||||
return {
|
||||
eventTypeOptions,
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,8 @@ import { useUserApi } from "~/composables/api";
|
||||
import { RecipeCategory } from "~/lib/api/types/admin";
|
||||
|
||||
const categoryStore: Ref<RecipeCategory[]> = ref([]);
|
||||
const publicStoreLoading = ref(false);
|
||||
const storeLoading = ref(false);
|
||||
|
||||
export function useCategoryData() {
|
||||
const data = reactive({
|
||||
@@ -27,7 +29,7 @@ export function useCategoryData() {
|
||||
|
||||
export function usePublicCategoryStore(groupSlug: string) {
|
||||
const api = usePublicExploreApi(groupSlug).explore;
|
||||
const loading = ref(false);
|
||||
const loading = publicStoreLoading;
|
||||
|
||||
const actions = {
|
||||
...usePublicStoreActions<RecipeCategory>(api.categories, categoryStore, loading),
|
||||
@@ -36,7 +38,7 @@ export function usePublicCategoryStore(groupSlug: string) {
|
||||
},
|
||||
};
|
||||
|
||||
if (!categoryStore.value || categoryStore.value?.length === 0) {
|
||||
if (!loading.value && (!categoryStore.value || categoryStore.value?.length === 0)) {
|
||||
actions.getAll();
|
||||
}
|
||||
|
||||
@@ -50,7 +52,7 @@ export function usePublicCategoryStore(groupSlug: string) {
|
||||
export function useCategoryStore() {
|
||||
// passing the group slug switches to using the public API
|
||||
const api = useUserApi();
|
||||
const loading = ref(false);
|
||||
const loading = storeLoading;
|
||||
|
||||
const actions = {
|
||||
...useStoreActions<RecipeCategory>(api.categories, categoryStore, loading),
|
||||
@@ -59,7 +61,7 @@ export function useCategoryStore() {
|
||||
},
|
||||
};
|
||||
|
||||
if (!categoryStore.value || categoryStore.value?.length === 0) {
|
||||
if (!loading.value && (!categoryStore.value || categoryStore.value?.length === 0)) {
|
||||
actions.getAll();
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@ import { useUserApi } from "~/composables/api";
|
||||
import { IngredientFood } from "~/lib/api/types/recipe";
|
||||
|
||||
let foodStore: Ref<IngredientFood[] | null> = ref([]);
|
||||
const publicStoreLoading = ref(false);
|
||||
const storeLoading = ref(false);
|
||||
|
||||
/**
|
||||
* useFoodData returns a template reactive object
|
||||
@@ -34,7 +36,7 @@ export const useFoodData = function () {
|
||||
|
||||
export const usePublicFoodStore = function (groupSlug: string) {
|
||||
const api = usePublicExploreApi(groupSlug).explore;
|
||||
const loading = ref(false);
|
||||
const loading = publicStoreLoading;
|
||||
|
||||
const actions = {
|
||||
...usePublicStoreActions(api.foods, foodStore, loading),
|
||||
@@ -43,7 +45,7 @@ export const usePublicFoodStore = function (groupSlug: string) {
|
||||
},
|
||||
};
|
||||
|
||||
if (!foodStore.value || foodStore.value.length === 0) {
|
||||
if (!loading.value && (!foodStore.value || foodStore.value.length === 0)) {
|
||||
foodStore = actions.getAll();
|
||||
}
|
||||
|
||||
@@ -52,7 +54,7 @@ export const usePublicFoodStore = function (groupSlug: string) {
|
||||
|
||||
export const useFoodStore = function () {
|
||||
const api = useUserApi();
|
||||
const loading = ref(false);
|
||||
const loading = storeLoading;
|
||||
|
||||
const actions = {
|
||||
...useStoreActions(api.foods, foodStore, loading),
|
||||
@@ -61,7 +63,7 @@ export const useFoodStore = function () {
|
||||
},
|
||||
};
|
||||
|
||||
if (!foodStore.value || foodStore.value.length === 0) {
|
||||
if (!loading.value && (!foodStore.value || foodStore.value.length === 0)) {
|
||||
foodStore = actions.getAll();
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import { MultiPurposeLabelOut } from "~/lib/api/types/labels";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
|
||||
let labelStore: Ref<MultiPurposeLabelOut[] | null> = ref([]);
|
||||
const storeLoading = ref(false);
|
||||
|
||||
export function useLabelData() {
|
||||
const data = reactive({
|
||||
@@ -28,7 +29,7 @@ export function useLabelData() {
|
||||
|
||||
export function useLabelStore() {
|
||||
const api = useUserApi();
|
||||
const loading = ref(false);
|
||||
const loading = storeLoading;
|
||||
|
||||
const actions = {
|
||||
...useStoreActions<MultiPurposeLabelOut>(api.multiPurposeLabels, labelStore, loading),
|
||||
@@ -37,7 +38,7 @@ export function useLabelStore() {
|
||||
},
|
||||
};
|
||||
|
||||
if (!labelStore.value || labelStore.value?.length === 0) {
|
||||
if (!loading.value && (!labelStore.value || labelStore.value?.length === 0)) {
|
||||
labelStore = actions.getAll();
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@ import { useUserApi } from "~/composables/api";
|
||||
import { RecipeTag } from "~/lib/api/types/admin";
|
||||
|
||||
const items: Ref<RecipeTag[]> = ref([]);
|
||||
const publicStoreLoading = ref(false);
|
||||
const storeLoading = ref(false);
|
||||
|
||||
export function useTagData() {
|
||||
const data = reactive({
|
||||
@@ -27,7 +29,7 @@ export function useTagData() {
|
||||
|
||||
export function usePublicTagStore(groupSlug: string) {
|
||||
const api = usePublicExploreApi(groupSlug).explore;
|
||||
const loading = ref(false);
|
||||
const loading = publicStoreLoading;
|
||||
|
||||
const actions = {
|
||||
...usePublicStoreActions<RecipeTag>(api.tags, items, loading),
|
||||
@@ -36,7 +38,7 @@ export function usePublicTagStore(groupSlug: string) {
|
||||
},
|
||||
};
|
||||
|
||||
if (!items.value || items.value?.length === 0) {
|
||||
if (!loading.value && (!items.value || items.value?.length === 0)) {
|
||||
actions.getAll();
|
||||
}
|
||||
|
||||
@@ -49,7 +51,7 @@ export function usePublicTagStore(groupSlug: string) {
|
||||
|
||||
export function useTagStore() {
|
||||
const api = useUserApi();
|
||||
const loading = ref(false);
|
||||
const loading = storeLoading;
|
||||
|
||||
const actions = {
|
||||
...useStoreActions<RecipeTag>(api.tags, items, loading),
|
||||
@@ -58,7 +60,7 @@ export function useTagStore() {
|
||||
},
|
||||
};
|
||||
|
||||
if (!items.value || items.value?.length === 0) {
|
||||
if (!loading.value && (!items.value || items.value?.length === 0)) {
|
||||
actions.getAll();
|
||||
}
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@ import { useUserApi } from "~/composables/api";
|
||||
import { RecipeTool } from "~/lib/api/types/recipe";
|
||||
|
||||
const toolStore: Ref<RecipeTool[]> = ref([]);
|
||||
const publicStoreLoading = ref(false);
|
||||
const storeLoading = ref(false);
|
||||
|
||||
export function useToolData() {
|
||||
const data = reactive({
|
||||
@@ -29,7 +31,7 @@ export function useToolData() {
|
||||
|
||||
export function usePublicToolStore(groupSlug: string) {
|
||||
const api = usePublicExploreApi(groupSlug).explore;
|
||||
const loading = ref(false);
|
||||
const loading = publicStoreLoading;
|
||||
|
||||
const actions = {
|
||||
...usePublicStoreActions<RecipeTool>(api.tools, toolStore, loading),
|
||||
@@ -38,7 +40,7 @@ export function usePublicToolStore(groupSlug: string) {
|
||||
},
|
||||
};
|
||||
|
||||
if (!toolStore.value || toolStore.value?.length === 0) {
|
||||
if (!loading.value && (!toolStore.value || toolStore.value?.length === 0)) {
|
||||
actions.getAll();
|
||||
}
|
||||
|
||||
@@ -51,7 +53,7 @@ export function usePublicToolStore(groupSlug: string) {
|
||||
|
||||
export function useToolStore() {
|
||||
const api = useUserApi();
|
||||
const loading = ref(false);
|
||||
const loading = storeLoading;
|
||||
|
||||
const actions = {
|
||||
...useStoreActions<RecipeTool>(api.tools, toolStore, loading),
|
||||
@@ -60,7 +62,7 @@ export function useToolStore() {
|
||||
},
|
||||
};
|
||||
|
||||
if (!toolStore.value || toolStore.value?.length === 0) {
|
||||
if (!loading.value && (!toolStore.value || toolStore.value?.length === 0)) {
|
||||
actions.getAll();
|
||||
}
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ import { useUserApi } from "~/composables/api";
|
||||
import { IngredientUnit } from "~/lib/api/types/recipe";
|
||||
|
||||
let unitStore: Ref<IngredientUnit[] | null> = ref([]);
|
||||
const storeLoading = ref(false);
|
||||
|
||||
/**
|
||||
* useUnitData returns a template reactive object
|
||||
@@ -35,7 +36,7 @@ export const useUnitData = function () {
|
||||
|
||||
export const useUnitStore = function () {
|
||||
const api = useUserApi();
|
||||
const loading = ref(false);
|
||||
const loading = storeLoading;
|
||||
|
||||
const actions = {
|
||||
...useStoreActions<IngredientUnit>(api.units, unitStore, loading),
|
||||
@@ -44,7 +45,7 @@ export const useUnitStore = function () {
|
||||
},
|
||||
};
|
||||
|
||||
if (!unitStore.value || unitStore.value.length === 0) {
|
||||
if (!loading.value && (!unitStore.value || unitStore.value.length === 0)) {
|
||||
unitStore = actions.getAll();
|
||||
}
|
||||
|
||||
|
||||
@@ -122,6 +122,7 @@ export const useCookbooks = function () {
|
||||
this.refreshAll();
|
||||
}
|
||||
loading.value = false;
|
||||
return data;
|
||||
},
|
||||
|
||||
async updateOrder() {
|
||||
|
||||
@@ -1,30 +1,39 @@
|
||||
import { useAsync, ref } from "@nuxtjs/composition-api";
|
||||
import { useAsyncKey } from "./use-utils";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
import { GroupBase } from "~/lib/api/types/user";
|
||||
import { GroupBase, GroupSummary } from "~/lib/api/types/user";
|
||||
|
||||
const groupSelfRef = ref<GroupSummary | null>(null);
|
||||
const loading = ref(false);
|
||||
|
||||
export const useGroupSelf = function () {
|
||||
const api = useUserApi();
|
||||
async function refreshGroupSelf() {
|
||||
loading.value = true;
|
||||
const { data } = await api.groups.getCurrentUserGroup();
|
||||
groupSelfRef.value = data;
|
||||
loading.value = false;
|
||||
}
|
||||
|
||||
const actions = {
|
||||
get() {
|
||||
const group = useAsync(async () => {
|
||||
const { data } = await api.groups.getCurrentUserGroup();
|
||||
if (!(groupSelfRef.value || loading.value)) {
|
||||
refreshGroupSelf();
|
||||
}
|
||||
|
||||
return data;
|
||||
}, useAsyncKey());
|
||||
|
||||
return group;
|
||||
return groupSelfRef;
|
||||
},
|
||||
async updatePreferences() {
|
||||
if (!group.value?.preferences) {
|
||||
if (!groupSelfRef.value) {
|
||||
await refreshGroupSelf();
|
||||
}
|
||||
if (!groupSelfRef.value?.preferences) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { data } = await api.groups.setPreferences(group.value.preferences);
|
||||
const { data } = await api.groups.setPreferences(groupSelfRef.value.preferences);
|
||||
|
||||
if (data) {
|
||||
group.value.preferences = data;
|
||||
groupSelfRef.value.preferences = data;
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
// This Code is auto generated by gen_global_components.py
|
||||
// This Code is auto generated by gen_ts_locales.py
|
||||
export const LOCALES = [
|
||||
{
|
||||
name: "繁體中文 (Chinese traditional)",
|
||||
value: "zh-TW",
|
||||
progress: 30,
|
||||
progress: 29,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -15,7 +15,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Tiếng Việt (Vietnamese)",
|
||||
value: "vi-VN",
|
||||
progress: 1,
|
||||
progress: 0,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -27,43 +27,43 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Türkçe (Turkish)",
|
||||
value: "tr-TR",
|
||||
progress: 53,
|
||||
progress: 62,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Svenska (Swedish)",
|
||||
value: "sv-SE",
|
||||
progress: 94,
|
||||
progress: 99,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "српски (Serbian)",
|
||||
value: "sr-SP",
|
||||
progress: 32,
|
||||
progress: 31,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Slovenian",
|
||||
value: "sl-SI",
|
||||
progress: 47,
|
||||
progress: 49,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Slovak",
|
||||
value: "sk-SK",
|
||||
progress: 93,
|
||||
progress: 91,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Pусский (Russian)",
|
||||
value: "ru-RU",
|
||||
progress: 98,
|
||||
progress: 99,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Română (Romanian)",
|
||||
value: "ro-RO",
|
||||
progress: 42,
|
||||
progress: 44,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -75,19 +75,19 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Português do Brasil (Brazilian Portuguese)",
|
||||
value: "pt-BR",
|
||||
progress: 97,
|
||||
progress: 95,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Polski (Polish)",
|
||||
value: "pl-PL",
|
||||
progress: 98,
|
||||
progress: 100,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Norsk (Norwegian)",
|
||||
value: "no-NO",
|
||||
progress: 99,
|
||||
progress: 97,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -99,25 +99,25 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Latvian",
|
||||
value: "lv-LV",
|
||||
progress: 1,
|
||||
progress: 0,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Lithuanian",
|
||||
value: "lt-LT",
|
||||
progress: 93,
|
||||
progress: 91,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "한국어 (Korean)",
|
||||
value: "ko-KR",
|
||||
progress: 5,
|
||||
progress: 3,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "日本語 (Japanese)",
|
||||
value: "ja-JP",
|
||||
progress: 12,
|
||||
progress: 11,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -135,25 +135,25 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Magyar (Hungarian)",
|
||||
value: "hu-HU",
|
||||
progress: 100,
|
||||
progress: 98,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Croatian",
|
||||
value: "hr-HR",
|
||||
progress: 93,
|
||||
progress: 91,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "עברית (Hebrew)",
|
||||
value: "he-IL",
|
||||
progress: 97,
|
||||
progress: 98,
|
||||
dir: "rtl",
|
||||
},
|
||||
{
|
||||
name: "Galician",
|
||||
value: "gl-ES",
|
||||
progress: 1,
|
||||
progress: 3,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -165,19 +165,19 @@ export const LOCALES = [
|
||||
{
|
||||
name: "French, Canada",
|
||||
value: "fr-CA",
|
||||
progress: 97,
|
||||
progress: 95,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Suomi (Finnish)",
|
||||
value: "fi-FI",
|
||||
progress: 91,
|
||||
progress: 89,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Español (Spanish)",
|
||||
value: "es-ES",
|
||||
progress: 79,
|
||||
progress: 93,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -189,13 +189,13 @@ export const LOCALES = [
|
||||
{
|
||||
name: "British English",
|
||||
value: "en-GB",
|
||||
progress: 3,
|
||||
progress: 2,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Ελληνικά (Greek)",
|
||||
value: "el-GR",
|
||||
progress: 34,
|
||||
progress: 33,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -219,7 +219,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Català (Catalan)",
|
||||
value: "ca-ES",
|
||||
progress: 75,
|
||||
progress: 74,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -231,13 +231,13 @@ export const LOCALES = [
|
||||
{
|
||||
name: "العربية (Arabic)",
|
||||
value: "ar-SA",
|
||||
progress: 20,
|
||||
progress: 18,
|
||||
dir: "rtl",
|
||||
},
|
||||
{
|
||||
name: "Afrikaans (Afrikaans)",
|
||||
value: "af-ZA",
|
||||
progress: 92,
|
||||
progress: 90,
|
||||
dir: "ltr",
|
||||
},
|
||||
]
|
||||
|
||||
20
frontend/composables/use-navigation-warning.ts
Normal file
20
frontend/composables/use-navigation-warning.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
export function useNavigationWarning() {
|
||||
return { activateNavigationWarning, deactivateNavigationWarning };
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays a warning before the user navigates to another page
|
||||
* e.g., by clicking a link (which isn't internal and rendered without page load),
|
||||
* reloading the page,
|
||||
* or closing the tab.
|
||||
*/
|
||||
const activateNavigationWarning = () => {
|
||||
window.onbeforeunload = () => true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disables the warning when navigating to a page
|
||||
*/
|
||||
const deactivateNavigationWarning = () => {
|
||||
window.onbeforeunload = null;
|
||||
}
|
||||
30
frontend/composables/use-setup/common-settings-form.ts
Normal file
30
frontend/composables/use-setup/common-settings-form.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import { useContext } from "@nuxtjs/composition-api";
|
||||
import { fieldTypes } from "../forms";
|
||||
import { AutoFormItems } from "~/types/auto-forms";
|
||||
|
||||
export const useCommonSettingsForm = () => {
|
||||
const { i18n } = useContext();
|
||||
|
||||
const commonSettingsForm: AutoFormItems = [
|
||||
{
|
||||
section: i18n.tc("profile.group-settings"),
|
||||
label: i18n.tc("group.enable-public-access"),
|
||||
hint: i18n.tc("group.enable-public-access-description"),
|
||||
varName: "makeGroupRecipesPublic",
|
||||
type: fieldTypes.BOOLEAN,
|
||||
rules: ["required"],
|
||||
},
|
||||
{
|
||||
section: i18n.tc("data-pages.data-management"),
|
||||
label: i18n.tc("user-registration.use-seed-data"),
|
||||
hint: i18n.tc("user-registration.use-seed-data-description"),
|
||||
varName: "useSeedData",
|
||||
type: fieldTypes.BOOLEAN,
|
||||
rules: ["required"],
|
||||
},
|
||||
];
|
||||
|
||||
return {
|
||||
commonSettingsForm,
|
||||
}
|
||||
}
|
||||
1
frontend/composables/use-setup/index.ts
Normal file
1
frontend/composables/use-setup/index.ts
Normal file
@@ -0,0 +1 @@
|
||||
export { useCommonSettingsForm } from "./common-settings-form";
|
||||
@@ -1 +1,2 @@
|
||||
export { useUserForm } from "./user-form";
|
||||
export { useUserRegistrationForm } from "./user-registration-form";
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { Ref, useContext } from "@nuxtjs/composition-api";
|
||||
import { useLocalStorage } from "@vueuse/core";
|
||||
import { TimelineEventType } from "~/lib/api/types/recipe";
|
||||
|
||||
export interface UserPrintPreferences {
|
||||
imagePosition: string;
|
||||
@@ -19,14 +20,17 @@ export interface UserRecipePreferences {
|
||||
filterNull: boolean;
|
||||
sortIcon: string;
|
||||
useMobileCards: boolean;
|
||||
searchQuery: string;
|
||||
}
|
||||
|
||||
export interface UserShoppingListPreferences {
|
||||
viewAllLists: boolean;
|
||||
viewByLabel: boolean;
|
||||
}
|
||||
|
||||
export interface UserTimelinePreferences {
|
||||
orderDirection: string;
|
||||
types: TimelineEventType[];
|
||||
}
|
||||
|
||||
export function useUserPrintPreferences(): Ref<UserPrintPreferences> {
|
||||
@@ -56,6 +60,7 @@ export function useUserSortPreferences(): Ref<UserRecipePreferences> {
|
||||
filterNull: false,
|
||||
sortIcon: $globals.icons.sortAlphabeticalAscending,
|
||||
useMobileCards: false,
|
||||
searchQuery: "",
|
||||
},
|
||||
{ mergeDefaults: true }
|
||||
// we cast to a Ref because by default it will return an optional type ref
|
||||
@@ -70,6 +75,7 @@ export function useShoppingListPreferences(): Ref<UserShoppingListPreferences> {
|
||||
const fromStorage = useLocalStorage(
|
||||
"shopping-list-preferences",
|
||||
{
|
||||
viewAllLists: false,
|
||||
viewByLabel: false,
|
||||
},
|
||||
{ mergeDefaults: true }
|
||||
@@ -85,6 +91,7 @@ export function useTimelinePreferences(): Ref<UserTimelinePreferences> {
|
||||
"timeline-preferences",
|
||||
{
|
||||
orderDirection: "asc",
|
||||
types: ["info", "system", "comment"] as TimelineEventType[],
|
||||
},
|
||||
{ mergeDefaults: true }
|
||||
// we cast to a Ref because by default it will return an optional type ref
|
||||
|
||||
@@ -38,7 +38,7 @@ export const useUserForm = () => {
|
||||
type: fieldTypes.SELECT,
|
||||
hint: i18n.tc("user.authentication-method-hint"),
|
||||
disableCreate: true,
|
||||
options: [{ text: "Mealie" }, { text: "LDAP" }],
|
||||
options: [{ text: "Mealie" }, { text: "LDAP" }, { text: "OIDC" }],
|
||||
},
|
||||
{
|
||||
section: i18n.tc("user.permissions"),
|
||||
|
||||
87
frontend/composables/use-users/user-registration-form.ts
Normal file
87
frontend/composables/use-users/user-registration-form.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
import { ref, Ref, useContext } from "@nuxtjs/composition-api";
|
||||
import { useAsyncValidator } from "~/composables/use-validators";
|
||||
import { VForm } from "~/types/vuetify";
|
||||
import { usePublicApi } from "~/composables/api/api-client";
|
||||
|
||||
const domAccountForm = ref<VForm | null>(null);
|
||||
const username = ref("");
|
||||
const fullName = ref("");
|
||||
const email = ref("");
|
||||
const password1 = ref("");
|
||||
const password2 = ref("");
|
||||
const advancedOptions = ref(false);
|
||||
|
||||
export const useUserRegistrationForm = () => {
|
||||
const { i18n } = useContext();
|
||||
function safeValidate(form: Ref<VForm | null>) {
|
||||
if (form.value && form.value.validate) {
|
||||
return form.value.validate();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
// ================================================================
|
||||
// Provide Group Details
|
||||
const publicApi = usePublicApi();
|
||||
// ================================================================
|
||||
// Provide Account Details
|
||||
|
||||
const usernameErrorMessages = ref<string[]>([]);
|
||||
const { validate: validateUsername, valid: validUsername } = useAsyncValidator(
|
||||
username,
|
||||
(v: string) => publicApi.validators.username(v),
|
||||
i18n.tc("validation.username-is-taken"),
|
||||
usernameErrorMessages
|
||||
);
|
||||
const emailErrorMessages = ref<string[]>([]);
|
||||
const { validate: validateEmail, valid: validEmail } = useAsyncValidator(
|
||||
email,
|
||||
(v: string) => publicApi.validators.email(v),
|
||||
i18n.tc("validation.email-is-taken"),
|
||||
emailErrorMessages
|
||||
);
|
||||
const accountDetails = {
|
||||
username,
|
||||
fullName,
|
||||
email,
|
||||
advancedOptions,
|
||||
validate: async () => {
|
||||
if (!(validUsername.value && validEmail.value)) {
|
||||
await Promise.all([validateUsername(), validateEmail()]);
|
||||
}
|
||||
|
||||
return (safeValidate(domAccountForm as Ref<VForm>) && validUsername.value && validEmail.value);
|
||||
},
|
||||
reset: () => {
|
||||
accountDetails.username.value = "";
|
||||
accountDetails.fullName.value = "";
|
||||
accountDetails.email.value = "";
|
||||
accountDetails.advancedOptions.value = false;
|
||||
},
|
||||
};
|
||||
// ================================================================
|
||||
// Provide Credentials
|
||||
const passwordMatch = () => password1.value === password2.value || i18n.tc("user.password-must-match");
|
||||
const credentials = {
|
||||
password1,
|
||||
password2,
|
||||
passwordMatch,
|
||||
reset: () => {
|
||||
credentials.password1.value = "";
|
||||
credentials.password2.value = "";
|
||||
}
|
||||
};
|
||||
|
||||
return {
|
||||
accountDetails,
|
||||
credentials,
|
||||
emailErrorMessages,
|
||||
usernameErrorMessages,
|
||||
// Fields
|
||||
advancedOptions,
|
||||
// Validators
|
||||
validateUsername,
|
||||
validateEmail,
|
||||
// Dom Refs
|
||||
domAccountForm,
|
||||
};
|
||||
};
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"add": "Add",
|
||||
"cancel": "Kanselleer",
|
||||
"clear": "Maak skoon",
|
||||
"close": "Maak toe",
|
||||
"confirm": "Bevestig",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "Is jy seker jy wil dit uitvee?",
|
||||
"copied_message": "Gekopieër!",
|
||||
"create": "Skep",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Stoor",
|
||||
"settings": "Verstellings",
|
||||
"share": "Deel",
|
||||
"show-all": "Show All",
|
||||
"shuffle": "Skommel",
|
||||
"sort": "Sorteer",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-alphabetically": "Alfabeties",
|
||||
"status": "Status",
|
||||
"subject": "Onderwerp",
|
||||
"submit": "Dien in",
|
||||
"success-count": "Sukses: {count}",
|
||||
"sunday": "Sondag",
|
||||
"system": "System",
|
||||
"templates": "Sjablone:",
|
||||
"test": "Toets",
|
||||
"themes": "Temas",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Eenhede",
|
||||
"back": "Terug",
|
||||
"next": "Volgende",
|
||||
"start": "Start",
|
||||
"toggle-view": "Wissel aansig",
|
||||
"date": "Datum",
|
||||
"id": "Id",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Groepvoorkeure",
|
||||
"private-group": "Privaat group",
|
||||
"private-group-description": "Deur jou groep op privaat te stel, stel alle publieke kykopsies op verstek. Dit oorskryf die verstellings per resep.",
|
||||
"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",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Laat gebruikers buite jou groep toe om jou resepte te sien",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Indien hierdie opsie aangeskakel is, kan jy 'n resep met enigiemand deel. Sonder dat hulle 'n rekening het. As hierdie opsie afgeskakel is, kan jy net 'n resep met mense in jou groep deel. Of met 'n voorafgemaakte private skakel",
|
||||
"show-nutrition-information": "Wys voedingsinligting",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Resep migrasie",
|
||||
"recipe-data-migrations-explanation": "Jy kan resepte vanaf 'n ander program in Mealie invoer. Op hierdie manier kan jy vinnig aan die gang kom.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "Kies die tipe migrasie",
|
||||
"tag-all-recipes": "Merk alle resepte met {tag-name}-merker",
|
||||
"nextcloud-text": "Nextcloud-resepte kan ingevoer word vanaf 'n zip-dokument wat die data bevat wat in Nextcloud gestoor is. Sien die voorbeeldstruktuur hieronder om te verseker dat jou resepte ingevoer kan word.",
|
||||
"chowdown-text": "Mealie kan invoer vanaf Chowdown. Laai die .zip-dokument daar af. En laai dit hier op",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "Resep 1",
|
||||
"recipe-2": "Resep 2",
|
||||
"paprika-text": "Mealie kan resepte vanaf die Paprika-program invoer. Voer jou resepte uit Paprika uit, hernoem die uitvoeruitbreiding na .zip en laai dit hieronder op.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie kan resepte invoer vanaf Plan to Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Kook modus",
|
||||
"link-ingredients": "Koppel bestanddele",
|
||||
"merge-above": "Voeg bogenoemde saam",
|
||||
"move-to-bottom": "Move To Bottom",
|
||||
"move-to-top": "Move To Top",
|
||||
"reset-scale": "Stel skaal terug",
|
||||
"decrease-scale-label": "Verminder die skaal met 1",
|
||||
"increase-scale-label": "Verhoog skaal met 1",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "Wysig tydlyn gebeurtenis",
|
||||
"timeline": "Tydlyn",
|
||||
"timeline-is-empty": "Nog niks op die tydlyn nie. Probeer hierdie resep maak!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} Algemene tydlyn",
|
||||
"open-timeline": "Maak tydlyn oop",
|
||||
"made-this": "Ek het dit gemaak",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Op soek na migrasies?",
|
||||
"import-with-url": "Voer in via URL",
|
||||
"create-recipe": "Skep resep",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Voer in met .zip",
|
||||
"create-recipe-from-an-image": "Skep 'n resep vanaf 'n foto",
|
||||
"bulk-url-import": "Grootmaat-URL-invoer",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Invoeropsomming",
|
||||
"partial-backup": "Gedeeltelike back-up",
|
||||
"unable-to-delete-backup": "Kon nie back-up verwyder nie.",
|
||||
"experimental-description": "Back-up skep 'n momentopname van die werf se databasis en data directory. Dit sluit alle data in en kan nie gestel word om substelle data uit te sluit nie. Jy kan dit as 'n momentopname van Mealie neem. Dit dien as 'n agnostiese manier om data uit te voer en in te voer, of om die webwerf na 'n eksterne ligging te back-up.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"backup-restore": "Herlaai vanaf back-up",
|
||||
"back-restore-description": "Die herstel van hierdie back-up sal alle huidige data in jou databasis en in die data-lêergids oorskryf. {cannot-be-undone} As die herstel suksesvol was, sal jy afgemeld word.",
|
||||
"cannot-be-undone": "Hierdie aksie kan nie ongedaan gemaak word nie - gebruik met omsigtigheid.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Nie alle LDAP-waardes is opgestel nie. Dit kan geïgnoreer word as jy nie LDAP-verifikasie gebruik nie.",
|
||||
"ldap-ready-success-text": "Vereiste LDAP-veranderlikes is volledig ingestel.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Resep skraper weergawe"
|
||||
"recipe-scraper-version": "Resep skraper weergawe",
|
||||
"oidc-ready": "OIDC Klar",
|
||||
"oidc-ready-error-text": "Ikke alle OIDC værdier er konfigureret. Dette kan ignoreres hvis du ikke bruger OIDC godkendelse.",
|
||||
"oidc-ready-success-text": "Krævede OIDC variabler er udfyldt."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Alle lyste",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "Skakel ID",
|
||||
"link-name": "Skakel naam",
|
||||
"login": "Meld aan",
|
||||
"login-oidc": "Log ind med",
|
||||
"or": "eller",
|
||||
"logout": "Teken uit",
|
||||
"manage-users": "Bestuur gebruikers",
|
||||
"manage-users-description": "Create and manage users.",
|
||||
"new-password": "Nuwe wagwoord",
|
||||
"new-user": "Nuwe gebruiker",
|
||||
"password-has-been-reset-to-the-default-password": "Wagwoord is teruggestel na die verstekwagwoord",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Agtergrond take",
|
||||
"background-tasks-description": "Hier kan jy al die lopende agtergrond take en hul status sien",
|
||||
"no-logs-found": "Geen logs gevind",
|
||||
"tasks": "Take"
|
||||
"tasks": "Take",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "Welkom, {0}",
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"add": "Add",
|
||||
"cancel": "إلغاء",
|
||||
"clear": "مسح",
|
||||
"close": "إغلاق",
|
||||
"confirm": "تأكيد",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "هل انت متأكد من حذف هذا؟",
|
||||
"copied_message": "تم النسخ!",
|
||||
"create": "إنشاء",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "حفظ",
|
||||
"settings": "الإعدادات",
|
||||
"share": "مشاركة",
|
||||
"show-all": "Show All",
|
||||
"shuffle": "ترتيب عشوائي",
|
||||
"sort": "ترتيب",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-alphabetically": "ترتيب حَسَبَ الحروف الأبجدية",
|
||||
"status": "الحالة",
|
||||
"subject": "الموضوع",
|
||||
"submit": "إرسال",
|
||||
"success-count": "نجحت: {count}",
|
||||
"sunday": "الأحد",
|
||||
"system": "System",
|
||||
"templates": "القوالب:",
|
||||
"test": "تجربة",
|
||||
"themes": "السمات",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "الوحدات",
|
||||
"back": "عودة",
|
||||
"next": "التالي",
|
||||
"start": "Start",
|
||||
"toggle-view": "تبديل طريقة العرض",
|
||||
"date": "التاريخ",
|
||||
"id": "المعرف",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "إعدادات المجموعة",
|
||||
"private-group": "مجموعة خاصة",
|
||||
"private-group-description": "Setting your group to private will default all public view options to default. This overrides an individual recipes 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",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "السماح للمستخدمين خارج مجموعتك لمشاهدة وصفاتك",
|
||||
"allow-users-outside-of-your-group-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 group or with a pre-generated private link",
|
||||
"show-nutrition-information": "عرض معلومات التغذية",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Recipe Data Migrations",
|
||||
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "Choose Migration Type",
|
||||
"tag-all-recipes": "Tag all recipes with {tag-name} tag",
|
||||
"nextcloud-text": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "Recipe 1",
|
||||
"recipe-2": "Recipe 2",
|
||||
"paprika-text": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie can import recipies from Plan to Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Cook Mode",
|
||||
"link-ingredients": "Link Ingredients",
|
||||
"merge-above": "Merge Above",
|
||||
"move-to-bottom": "Move To Bottom",
|
||||
"move-to-top": "Move To Top",
|
||||
"reset-scale": "Reset Scale",
|
||||
"decrease-scale-label": "Decrease Scale by 1",
|
||||
"increase-scale-label": "Increase Scale by 1",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "Edit Timeline Event",
|
||||
"timeline": "Timeline",
|
||||
"timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} Global Timeline",
|
||||
"open-timeline": "Open Timeline",
|
||||
"made-this": "I Made This",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Looking For Migrations?",
|
||||
"import-with-url": "Import with URL",
|
||||
"create-recipe": "Create Recipe",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Import Summary",
|
||||
"partial-backup": "Partial Backup",
|
||||
"unable-to-delete-backup": "Unable to Delete Backup.",
|
||||
"experimental-description": "Backups a total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think off this as a snapshot of Mealie at a specific time. Currently, {not-crossed-version} (data migrations are not done automatically). These serve as a database agnostic way to export and import data or backup the site to an external location.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"backup-restore": "Backup Restore",
|
||||
"back-restore-description": "Restoring this backup will overwrite all the current data in your database and in the data directory and replace them with the contents of this backup. {cannot-be-undone} If the restoration is successful, you will be logged out.",
|
||||
"cannot-be-undone": "This action cannot be undone - use with caution.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.",
|
||||
"ldap-ready-success-text": "Required LDAP variables are all set.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Recipe Scraper Version"
|
||||
"recipe-scraper-version": "Recipe Scraper Version",
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
|
||||
"oidc-ready-success-text": "Required OIDC variables are all set."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "All Lists",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "Link ID",
|
||||
"link-name": "Link Name",
|
||||
"login": "Login",
|
||||
"login-oidc": "Login with",
|
||||
"or": "or",
|
||||
"logout": "Logout",
|
||||
"manage-users": "Manage Users",
|
||||
"manage-users-description": "Create and manage users.",
|
||||
"new-password": "New Password",
|
||||
"new-user": "New User",
|
||||
"password-has-been-reset-to-the-default-password": "Password has been reset to the default password",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Background Tasks",
|
||||
"background-tasks-description": "Here you can view all the running background tasks and their status",
|
||||
"no-logs-found": "No Logs Found",
|
||||
"tasks": "Tasks"
|
||||
"tasks": "Tasks",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Welcome, {0}",
|
||||
|
||||
@@ -37,9 +37,9 @@
|
||||
},
|
||||
"category": {
|
||||
"categories": "Категории",
|
||||
"category-created": "Категория създадена",
|
||||
"category-created": "Категорията бе създадена",
|
||||
"category-creation-failed": "Неуспешно създаване на категория",
|
||||
"category-deleted": "Категория изтрита",
|
||||
"category-deleted": "Категорията бе изтрита",
|
||||
"category-deletion-failed": "Неуспешно изтриване на категория",
|
||||
"category-filter": "Филтър за категории",
|
||||
"category-update-failed": "Неуспешно актуализиране на категория",
|
||||
@@ -73,20 +73,22 @@
|
||||
"mealplan-events": "Известия за хранителен план",
|
||||
"when-a-user-in-your-group-creates-a-new-mealplan": "Когато потребител от твоята потребителска група създаде нов хранителен план",
|
||||
"shopping-list-events": "Събития за списък за пазаруване",
|
||||
"cookbook-events": "Събития за книга с рецепти",
|
||||
"tag-events": "Събития за таг",
|
||||
"cookbook-events": "История на книгата с рецепти",
|
||||
"tag-events": "История на етикетите",
|
||||
"category-events": "Събития за категория",
|
||||
"when-a-new-user-joins-your-group": "Когато потребител се присъедини към твоята потребителска група",
|
||||
"recipe-events": "Събития на рецептата"
|
||||
},
|
||||
"general": {
|
||||
"add": "Добави",
|
||||
"cancel": "Откажи",
|
||||
"clear": "Изчисти",
|
||||
"close": "Затвори",
|
||||
"confirm": "Потвърди",
|
||||
"confirm-how-does-everything-look": "Как изглежда всичко?",
|
||||
"confirm-delete-generic": "Сигурни ли сте, че желаете да изтриете това?",
|
||||
"copied_message": "Копирано!",
|
||||
"create": "Създай",
|
||||
"create": "Добави",
|
||||
"created": "Създадено",
|
||||
"custom": "Персонализиран",
|
||||
"dashboard": "Табло",
|
||||
@@ -123,7 +125,7 @@
|
||||
"monday": "Понеделник",
|
||||
"name": "Име",
|
||||
"new": "Нов",
|
||||
"never": "Никога",
|
||||
"never": "никога",
|
||||
"no": "Не",
|
||||
"no-recipe-found": "Няма намерени рецепти",
|
||||
"ok": "Добре",
|
||||
@@ -142,18 +144,22 @@
|
||||
"save": "Запази",
|
||||
"settings": "Настройки",
|
||||
"share": "Сподели",
|
||||
"show-all": "Покажи всички",
|
||||
"shuffle": "Разбъркано",
|
||||
"sort": "Сортирай",
|
||||
"sort-ascending": "Сортирай възходящо",
|
||||
"sort-descending": "Сортирай низходящо",
|
||||
"sort-alphabetically": "По азбучен ред",
|
||||
"status": "Статус",
|
||||
"status": "състояние",
|
||||
"subject": "Относно",
|
||||
"submit": "Изпрати",
|
||||
"success-count": "Успешни: {count}",
|
||||
"sunday": "Неделя",
|
||||
"system": "Система",
|
||||
"templates": "Шаблони:",
|
||||
"test": "Тест",
|
||||
"themes": "Теми",
|
||||
"thursday": "Четвъртък",
|
||||
"thursday": "четвъртък",
|
||||
"token": "Токън",
|
||||
"tuesday": "Вторник",
|
||||
"type": "Тип",
|
||||
@@ -164,10 +170,11 @@
|
||||
"view": "Преглед",
|
||||
"wednesday": "Сряда",
|
||||
"yes": "Да",
|
||||
"foods": "Храна",
|
||||
"foods": "Продукти",
|
||||
"units": "Мерни единици",
|
||||
"back": "Назад",
|
||||
"next": "Напред",
|
||||
"start": "Начало",
|
||||
"toggle-view": "Превключване на режим",
|
||||
"date": "Дата",
|
||||
"id": "Id",
|
||||
@@ -180,12 +187,12 @@
|
||||
"delete-with-name": "Изтриване {name}",
|
||||
"confirm-delete-generic-with-name": "Сигурни ли сте, че искате да изтриете това {name}?",
|
||||
"confirm-delete-own-admin-account": "Моля имайте предвид, че се опитвате да изтриете собствения си администраторски акаунт! Това действие не може да бъде отменени и ще изтриете окончателно Вашия акаунт?",
|
||||
"organizer": "Организиращ",
|
||||
"organizer": "Органайзер",
|
||||
"transfer": "Преместване",
|
||||
"copy": "Копиране",
|
||||
"color": "Цвят",
|
||||
"timestamp": "Времева отметка",
|
||||
"last-made": "Последно приготвено",
|
||||
"last-made": "Последно приготвена на",
|
||||
"learn-more": "Научи повече",
|
||||
"this-feature-is-currently-inactive": "Тази функционалност в момента е неактивна",
|
||||
"clipboard-not-supported": "Не се поддържа клипборд",
|
||||
@@ -195,7 +202,7 @@
|
||||
"actions": "Действия",
|
||||
"selected-count": "Избрано: {count}",
|
||||
"export-all": "Експортиране на всички",
|
||||
"refresh": "Опресни",
|
||||
"refresh": "Опресняване",
|
||||
"upload-file": "Качване на файл",
|
||||
"created-on-date": "Създадено на {0}",
|
||||
"unsaved-changes": "Имате незапазени промени. Желаете ли да ги запазите преди да излезете? Натиснете Ок за запазване и Отказ за отхвърляне на промените.",
|
||||
@@ -227,7 +234,7 @@
|
||||
"keep-my-recipes-private-description": "Задай групата и всичките рецепти като лични. Винаги може да промените това по-късно."
|
||||
},
|
||||
"manage-members": "Управление на потребителите",
|
||||
"manage-members-description": "Управлявай правата на потребителите в твоите групи. {manage} позволява на потребителя да достъпи страницата за управление на данни {invite} позволява на потребителя да генерира линк за присъединяване за други потребители. Собствениците на група не могат да променят своите права.",
|
||||
"manage-members-description": "Настройки на правата на потребителите в твоите групи. {manage} позволява на потребителя да достъпи страницата за управление на данни {invite} позволява на потребителя да генерира линк за присъединяване за други потребители. Собствениците на група не могат да променят своите права.",
|
||||
"manage": "Управление",
|
||||
"invite": "Покани",
|
||||
"looking-to-update-your-profile": "Търсите да обновите собствения си профил?",
|
||||
@@ -236,9 +243,11 @@
|
||||
"group-preferences": "Настройки на групите",
|
||||
"private-group": "Частна група",
|
||||
"private-group-description": "Задаването на групата като лична ще зададе всички настройки за публично виждане към стандартните. Това е с по-висок приоритет от индивидуалните настройки за публично виждане на всяка една рецепта.",
|
||||
"enable-public-access": "Включи публичния достъп",
|
||||
"enable-public-access-description": "Направи груповите рецепти публични по подразбиране и позволи на посетителите да преглеждат рецептите без да се вписват",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Разрешете на потребители извън вашата група да виждат рецептите Ви",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Когато е пуснато ще може да генерирате публичен линк за споделяне на рецепти без да е нужно потребителя да се нуждае от вписване. Когато е изключено, ще можете да споделяте рецепти само с потребители, които са във Вашата група или чрез предварително генериран личен линк за споделяне.",
|
||||
"show-nutrition-information": "Показвай информация за храната",
|
||||
"show-nutrition-information": "Показвай информация за хранителните стойности",
|
||||
"show-nutrition-information-description": "Когато е пуснато, информацията за хранителната стойност на рецептата ще бъде показана, ако е налична. Ако няма информация за хранителната стойност, тогава тя няма да бъде показана.",
|
||||
"show-recipe-assets": "Покажи медия файловете на рецептата",
|
||||
"show-recipe-assets-description": "Когато е пуснато, медия файловете ще бъдат показани към рецептата, ако са налични.",
|
||||
@@ -246,8 +255,8 @@
|
||||
"default-to-landscape-view-description": "Когато е пуснато, раздела за главната информация на рецептата ще бъде показан в пейзажен режим",
|
||||
"disable-users-from-commenting-on-recipes": "Забрани коментирането на рецепти от потребителите",
|
||||
"disable-users-from-commenting-on-recipes-description": "Скрива раздела за коментари към рецептата и забранява коментирането",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food": "Изключи организирането на съставките на рецепта по мерни единици и храна",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Скрива полетата за храната, мерната единица и количеството за съставките и третира съставките като полета със свободен текст.",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food": "Изключи организирането на съставките по мерни единици и продукти",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Скрива полетата за продукт, мерна единица и количество и третира съставките като полета със свободен текст.",
|
||||
"general-preferences": "Общи предпочитания",
|
||||
"group-recipe-preferences": "Предпочитания за рецепта по група",
|
||||
"report": "Сигнал",
|
||||
@@ -263,37 +272,37 @@
|
||||
"dinner-this-week": "Вечеря тази седмица",
|
||||
"dinner-today": "Вечеря Днес",
|
||||
"dinner-tonight": "Вечеря ТАЗИ ВЕЧЕР",
|
||||
"edit-meal-plan": "Редактиране на хранителен план",
|
||||
"edit-meal-plan": "Редактиране на планираното меню",
|
||||
"end-date": "Крайна дата",
|
||||
"group": "Група (Бета версия)",
|
||||
"main": "Основен",
|
||||
"meal-planner": "Планиране на хранене",
|
||||
"meal-plans": "Хранителни планове",
|
||||
"mealplan-categories": "Категории на хранителния план",
|
||||
"mealplan-created": "Планът за хранене е създаден",
|
||||
"mealplan-creation-failed": "Неуспешно създаване на план за хранене",
|
||||
"mealplan-deleted": "Планът за хранене е изтрит",
|
||||
"mealplan-deletion-failed": "Неуспешно изтриване на план за хранене",
|
||||
"mealplan-settings": "Настройки на плана за хранене",
|
||||
"mealplan-update-failed": "Неуспешно обновяване на план за хранене",
|
||||
"mealplan-updated": "Планът за хранене е обновен",
|
||||
"no-meal-plan-defined-yet": "Все още няма дефинирани планове за хранене",
|
||||
"no-meal-planned-for-today": "Няма хранителен план за днес",
|
||||
"meal-planner": "Планиране на менюта",
|
||||
"meal-plans": "Планирани менюта",
|
||||
"mealplan-categories": "Категории на менюто",
|
||||
"mealplan-created": "Менюто бе създадено",
|
||||
"mealplan-creation-failed": "Неуспешно създаване на меню",
|
||||
"mealplan-deleted": "Менюто бе изтрито",
|
||||
"mealplan-deletion-failed": "Неуспешно изтриване на меню",
|
||||
"mealplan-settings": "Настройки на менюто",
|
||||
"mealplan-update-failed": "Неуспешно обновяване на седмичното меню",
|
||||
"mealplan-updated": "Седмичното меню бе обновено",
|
||||
"no-meal-plan-defined-yet": "Все още няма създадено седмично меню",
|
||||
"no-meal-planned-for-today": "За днес няма планирано меню",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Само рецептите от тези категории ще бъдат използвани в хранителните планове",
|
||||
"planner": "Планьор",
|
||||
"quick-week": "Бърза седмица",
|
||||
"side": "Страна",
|
||||
"side": "Предястие",
|
||||
"sides": "Страни",
|
||||
"start-date": "Начална дата",
|
||||
"rule-day": "Правило за деня",
|
||||
"meal-type": "Тип на ястието",
|
||||
"rule-day": "Ден от седмицата",
|
||||
"meal-type": "Вид ястие",
|
||||
"breakfast": "Закуска",
|
||||
"lunch": "Обяд",
|
||||
"lunch": "обяд",
|
||||
"dinner": "Вечеря",
|
||||
"type-any": "Който и да е",
|
||||
"day-any": "Който и да е",
|
||||
"type-any": "Всички",
|
||||
"day-any": "Всички",
|
||||
"editor": "Редактор",
|
||||
"meal-recipe": "Рецепта за хранене",
|
||||
"meal-recipe": "Рецепта за ястие",
|
||||
"meal-title": "Заглавие на рецептата",
|
||||
"meal-note": "Бележка към рецептата",
|
||||
"note-only": "Само бележка",
|
||||
@@ -303,15 +312,15 @@
|
||||
"this-rule-will-apply": "Това правило ще се приложи на {dayCriteria} {mealTypeCriteria}.",
|
||||
"to-all-days": "за всички дни",
|
||||
"on-days": "на {0}",
|
||||
"for-all-meal-types": "за всички типове ястия",
|
||||
"for-type-meal-types": "за {0} типове ястия",
|
||||
"meal-plan-rules": "Правила на плана за хранене",
|
||||
"for-all-meal-types": "за всички видове ястия",
|
||||
"for-type-meal-types": "за {0}",
|
||||
"meal-plan-rules": "Правила за съставяне на седмично меню",
|
||||
"new-rule": "Ново правило",
|
||||
"meal-plan-rules-description": "Може да създадете правила за автоматично избиране на рецепти от хранителните планове. Тези правила ще бъдат използвани за попълване на списъка от произволното избрани рецепти, от които да избирате, когато създавате нов хранителен план. Бележка: ако тези правила имат еднакви ограничения по ден/тип, тогава техните категории ще бъдат обединени. На практика, е ненужно да създавате дублирани правила, но все пак това е възможно.",
|
||||
"new-rule-description": "Когато създавате ново правило за хранителен план, Вие ще може да зададете ограничение за правилото да бъде приложено за определен ден от седмицата и/или специфичен тип ястие. За да добавите правило за всички дни или всички типове ястия, Вие може да зададете правилото като \"Всички\", което ще го приложи за всички дни и/или типове ястия.",
|
||||
"meal-plan-rules-description": "Може да създадете правила за автоматично избиране на рецепти в седмичното меню. Тези правила ще бъдат използвани за създаване на седмично маню от произволното избрани рецепти. Бележка: ако тези правила имат еднакви ограничения по ден/тип, тогава техните категории ще бъдат обединени. На практика, не е нужно да създавате дублиращи се правила, но все пак това е възможно.",
|
||||
"new-rule-description": "Когато създавате ново правило за създаване на седмично меню, може да зададете ограничение правилото да бъде приложено за определен ден от седмицата и/или специфичен вид ястие. За да добавите правило за всички дни или всички типове ястия, Вие може да изберете \"Всички\", което ще го приложи за всички дни и/или видове ястия.",
|
||||
"recipe-rules": "Правила на рецептата",
|
||||
"applies-to-all-days": "Прилага се за всички дни",
|
||||
"applies-on-days": "Прилага се на {0}",
|
||||
"applies-on-days": "Всеки/всяка {0}",
|
||||
"meal-plan-settings": "Настройки на плана за хранене"
|
||||
},
|
||||
"migration": {
|
||||
@@ -349,17 +358,22 @@
|
||||
},
|
||||
"recipe-data-migrations": "Миграция на данни на рецепти",
|
||||
"recipe-data-migrations-explanation": "Рецептите могат да бъдат мигрирани от други приложения поддържани от Mealie. Това е добър начин да започнете използването си на Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Идваш от друго приложение или дори по-стара версия на Mealie? Провери миграциите и виж дали данните ти могат да бъдат импорторани.",
|
||||
"choose-migration-type": "Избери тип на миграцията",
|
||||
"tag-all-recipes": "Отбележи всички рецепти с {tag-name} таг",
|
||||
"tag-all-recipes": "Добави {tag-name} като етикет във всички рецепти",
|
||||
"nextcloud-text": "Nextcloud рецептите могат да бъдат импортирани от .zip файл, който съдържа данни съхранени в Nextcloud. Вижте примерната структура на папките по-долу за да се подсигурите, че рецептите Ви могат да бъдат импортирани.",
|
||||
"chowdown-text": "Mealie поддържа формата на хранилището на Chowdown. Свалете кода на хранилището като .zip файл и го качете по-долу",
|
||||
"chowdown-text": "Mealie поддържа формата на хранилището на Chowdown. Свалете кода на хранилището като .zip файл и го качете по-долу.",
|
||||
"recipe-1": "Рецепта 1",
|
||||
"recipe-2": "Рецепта 2",
|
||||
"paprika-text": "Mealie може да импортирай рецепти от приложението Paprika. Експортирайте рецептите си от Paprika, преименувате файловото разширение на .zip и го качете по-долу.",
|
||||
"mealie-text": "Mealie може да импортира рецепти от Mealie преди версия 1.0. Експортирайте рецептите от старата си инстанция и ги качете като .zip файл по-долу. Бележка: могат да бъдат импортирани само рецептите.",
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"title": "Планиране на меню",
|
||||
"description-long": "Mealie може да импортира рецепти от Plan to Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "Моята кутия с рецепти",
|
||||
"description-long": "Mealie може да импортира рецепти от Моята кутия за рецепти. Експортирайте рецептите си в CSV формат, после качете .csv файлът по-долу."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -453,7 +467,7 @@
|
||||
"remove-section": "Премахни раздел",
|
||||
"save-recipe-before-use": "Запази рецептата преди да я използваш",
|
||||
"section-title": "Заглавие на раздела",
|
||||
"servings": "Порции",
|
||||
"servings": "Порция|порции",
|
||||
"share-recipe-message": "Искам да споделя моята рецепта {0} с теб.",
|
||||
"show-nutrition-values": "Покажи хранителните стойности",
|
||||
"sodium-content": "Натрий",
|
||||
@@ -471,7 +485,7 @@
|
||||
"date-format-hint-yyyy-mm-dd": "YYYY-MM-DD формат",
|
||||
"add-to-list": "Добави към списък",
|
||||
"add-to-plan": "Добави към план",
|
||||
"add-to-timeline": "Добави към времевата линия",
|
||||
"add-to-timeline": "Добави към историята на събитията",
|
||||
"recipe-added-to-list": "Рецептата е добавена към списъка",
|
||||
"recipes-added-to-list": "Рецептите са добавени към списъка",
|
||||
"successfully-added-to-list": "Успешно добавено в списъка",
|
||||
@@ -483,7 +497,7 @@
|
||||
"quantity": "Количество",
|
||||
"choose-unit": "Избери единица",
|
||||
"press-enter-to-create": "Натисните Enter за да създадете",
|
||||
"choose-food": "Избери храна",
|
||||
"choose-food": "Избери продукт",
|
||||
"notes": "Бележки",
|
||||
"toggle-section": "Превключване на раздела",
|
||||
"see-original-text": "Виж оригиналния текст",
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Режим на готвене",
|
||||
"link-ingredients": "Свържи съставките",
|
||||
"merge-above": "Обедини с по-горната",
|
||||
"move-to-bottom": "Премести най-долу",
|
||||
"move-to-top": "Премести най-горе",
|
||||
"reset-scale": "Оригинален мащаб",
|
||||
"decrease-scale-label": "Намали мащаба с 1",
|
||||
"increase-scale-label": "Увеличи мащаба с 1",
|
||||
@@ -506,12 +522,13 @@
|
||||
"resume-timer": "Възобновяване на таймера",
|
||||
"stop-timer": "Спри таймера"
|
||||
},
|
||||
"edit-timeline-event": "Редактирай събитие от времевата линия",
|
||||
"timeline": "Времева линия",
|
||||
"timeline-is-empty": "Няма нищо във времевата линия. Опитайте да приготвите рецептата!",
|
||||
"group-global-timeline": "{groupName} глобална времева линия",
|
||||
"open-timeline": "Отвори времевата линия",
|
||||
"made-this": "Аз направих това",
|
||||
"edit-timeline-event": "Редактирай събитие",
|
||||
"timeline": "Хронология на събитията",
|
||||
"timeline-is-empty": "Няма история на събитията. Опитайте да приготвите рецептата!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "Няма намерени събития. Опитайте да промените филтрите си за търсене.",
|
||||
"group-global-timeline": "{groupName} История на събитията",
|
||||
"open-timeline": "Отвори историята на събитията",
|
||||
"made-this": "Сготвих рецептата",
|
||||
"how-did-it-turn-out": "Как се получи?",
|
||||
"user-made-this": "{user} направи това",
|
||||
"last-made-date": "Последно приготвена на {date}",
|
||||
@@ -526,29 +543,31 @@
|
||||
"edit-markdown": "Редактирай с markdown",
|
||||
"recipe-creation": "Създаване на рецепта",
|
||||
"select-one-of-the-various-ways-to-create-a-recipe": "Изберете един от разнообразните начини за създаване на рецепта",
|
||||
"looking-for-migrations": "Търсите миграциите?",
|
||||
"looking-for-migrations": "Миграция на данни",
|
||||
"import-with-url": "Импортирай от линк",
|
||||
"create-recipe": "Създай рецепта",
|
||||
"create-recipe": "Добави рецепта",
|
||||
"create-recipe-description": "Създайте нова рецепта от чернова.",
|
||||
"create-recipes": "Създайте рецепти",
|
||||
"import-with-zip": "Импортирай от .zip",
|
||||
"create-recipe-from-an-image": "Създай рецепта от снимка",
|
||||
"create-recipe-from-an-image": "Добави рецепта от снимка",
|
||||
"bulk-url-import": "Импортиране на рецепти от линк",
|
||||
"debug-scraper": "Отстраняване на грешки на скрейпъра",
|
||||
"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": "Името на рецептата трябва да бъде уникално",
|
||||
"scrape-recipe": "Обхождане на рецепта",
|
||||
"scrape-recipe-description": "Обходи рецепта по линк. Предоставете линк за сайт, който искате да бъде обходен. Mealie ще опита да обходи рецептата от този сайт и да я добави във Вашата колекция.",
|
||||
"scrape-recipe-have-a-lot-of-recipes": "Имате много рецепти, които искате да обходите наведнъж?",
|
||||
"scrape-recipe-suggest-bulk-importer": "Пробвайте масовото импорторане",
|
||||
"import-original-keywords-as-tags": "Импортирай оригиналните ключови думи като тагове",
|
||||
"import-original-keywords-as-tags": "Добави оригиналните ключови думи като етикети",
|
||||
"stay-in-edit-mode": "Остани в режим на редакция",
|
||||
"import-from-zip": "Импортирай от Zip",
|
||||
"import-from-zip-description": "Импортирай рецепта, която е била експортирана от друга инстанция на Mealie.",
|
||||
"zip-files-must-have-been-exported-from-mealie": ".zip файловете трябва да бъдат експортирани от Mealie",
|
||||
"create-a-recipe-by-uploading-a-scan": "Създай рецепта като качиш сканирано копие.",
|
||||
"create-a-recipe-by-uploading-a-scan": "Добави рецепта като качиш сканирано копие.",
|
||||
"upload-a-png-image-from-a-recipe-book": "Качи png изображение от книга с рецепти",
|
||||
"recipe-bulk-importer": "Масово импортиране на рецепти",
|
||||
"recipe-bulk-importer-description": "Масовото импортиране Ви позволява да импортиране множество рецепти наведнъж като постави сайтовете на опашка в бекенда и изпълненява задачата във фонов режим. Това може да бъде полезно когато първоначално мигрирате Mealie, или когато искате да импортиране голям брой рецепти наведнъж.",
|
||||
"set-categories-and-tags": "Задай Категории и Тагове",
|
||||
"set-categories-and-tags": "Задай категории и етикети",
|
||||
"bulk-imports": "Масови импортирания",
|
||||
"bulk-import-process-has-started": "Процеса на масово импортиране започна",
|
||||
"bulk-import-process-has-failed": "Процеса на масово импортиране се прекрати с грешка",
|
||||
@@ -577,7 +596,7 @@
|
||||
"search": "Търсене",
|
||||
"search-mealie": "Търсене в Mealie (Натисни /)",
|
||||
"search-placeholder": "Търсене...",
|
||||
"tag-filter": "Филтриране на тагове",
|
||||
"tag-filter": "Филтриране по етикет",
|
||||
"search-hint": "Натисни '/'",
|
||||
"advanced": "Разширени",
|
||||
"auto-search": "Автоматично търсене",
|
||||
@@ -591,7 +610,7 @@
|
||||
"backup-created-at-response-export_path": "Резервно копие е създадено на {path}",
|
||||
"backup-deleted": "Резервното копие е изтрито",
|
||||
"restore-success": "Успешно възстановяване",
|
||||
"backup-tag": "Таг на резервното копие",
|
||||
"backup-tag": "Етикет на резервното копие",
|
||||
"create-heading": "Създай резервно копие",
|
||||
"delete-backup": "Изтрий резервно копие",
|
||||
"error-creating-backup-see-log-file": "Грешка при създаването на резервно копие. Виж лог файла",
|
||||
@@ -719,12 +738,15 @@
|
||||
"secure-site-success-text": "Сайтът е достъпен чрез localhost или https",
|
||||
"server-side-base-url": "Сървърен базов URL",
|
||||
"server-side-base-url-error-text": "„BASE_URL“ все още е стойността по подразбиране на API сървъра. Това ще причини проблеми с връзките за известия, генерирани на сървъра за имейли и др.",
|
||||
"server-side-base-url-success-text": "URL адресът от страна на сървъра не съответства на стандартния",
|
||||
"server-side-base-url-success-text": "URL адресът от страна на сървъра не съответства на зададения",
|
||||
"ldap-ready": "Използва LDAP",
|
||||
"ldap-ready-error-text": "Не всички LDAP стойности са конфигурирани. Това може да бъде игнорирано, ако не използвате LDAP удостоверяване.",
|
||||
"ldap-ready-success-text": "Задължителните LDAP променливи са зададени.",
|
||||
"build": "Компилинирана версия",
|
||||
"recipe-scraper-version": "Версия на скрепер на рецепти"
|
||||
"recipe-scraper-version": "Версия на скрепер на рецепти",
|
||||
"oidc-ready": "Готов за OIDC",
|
||||
"oidc-ready-error-text": "Не всички OIDC стойности са конфигурирани. Това може да бъде игнорирано, ако не използвате OIDC удостоверяване.",
|
||||
"oidc-ready-success-text": "Задължителните OIDC променливи са зададени."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Всички списъци",
|
||||
@@ -735,7 +757,7 @@
|
||||
"quantity": "Количество: {0}",
|
||||
"shopping-list": "Списък за пазаруване",
|
||||
"shopping-lists": "Списъци за пазаруване",
|
||||
"food": "Храна",
|
||||
"food": "Продукт",
|
||||
"note": "Бележка",
|
||||
"label": "Етикет",
|
||||
"linked-item-warning": "Елементът е добавен към една или повече рецепти. Редактиране на единиците или храните ще се отрази с непредвидими резултати когато добавяте или премахвате рецепта от списъка.",
|
||||
@@ -766,7 +788,7 @@
|
||||
"profile": "Профил",
|
||||
"search": "Търсене",
|
||||
"site-settings": "Настройки на сайта",
|
||||
"tags": "Тагове",
|
||||
"tags": "Етикети",
|
||||
"toolbox": "Инструменти",
|
||||
"language": "Език",
|
||||
"maintenance": "Профилактика",
|
||||
@@ -787,17 +809,17 @@
|
||||
"welcome-to-mealie": "Добре дошли в Mealie! За да станете потребител на тази инстанция сте длъжни да имате валиден линк за покана. Ако не сте получили покана, тогава е невъзможно да се регистрирате. За да получите линк, свържете се с администратора на сайта."
|
||||
},
|
||||
"tag": {
|
||||
"tag-created": "Тагът е създаден",
|
||||
"tag-creation-failed": "Неуспешно създаване на таг",
|
||||
"tag-deleted": "Тагът е изтрит",
|
||||
"tag-deletion-failed": "Неуспешно изтриване на таг",
|
||||
"tag-update-failed": "Неуспешно обновяване на таг",
|
||||
"tag-updated": "Тагът е обновен",
|
||||
"tags": "Тагове",
|
||||
"untagged-count": "Без таг {count}",
|
||||
"create-a-tag": "Създаване на таг",
|
||||
"tag-name": "Име на тага",
|
||||
"tag": "Тагове"
|
||||
"tag-created": "Етикетът беше добавен",
|
||||
"tag-creation-failed": "Неуспешно създаване на етикет",
|
||||
"tag-deleted": "Етикетът беше изтрит",
|
||||
"tag-deletion-failed": "Неуспешно изтриване на етикет",
|
||||
"tag-update-failed": "Неуспешно обновяване на етикет",
|
||||
"tag-updated": "Етикетът беше обновен",
|
||||
"tags": "Етикети",
|
||||
"untagged-count": "Без етикет {count}",
|
||||
"create-a-tag": "Създаване на етикет",
|
||||
"tag-name": "Име на етикета",
|
||||
"tag": "Етикет"
|
||||
},
|
||||
"tool": {
|
||||
"tools": "Инструменти",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "ID на линка",
|
||||
"link-name": "Има на линка",
|
||||
"login": "Вход",
|
||||
"login-oidc": "Впиши се с",
|
||||
"or": "или",
|
||||
"logout": "Изход",
|
||||
"manage-users": "Управление на потребителите",
|
||||
"manage-users-description": "Създавайте и управлявайте потребители.",
|
||||
"new-password": "Нова парола",
|
||||
"new-user": "Нов потребител",
|
||||
"password-has-been-reset-to-the-default-password": "Паролата беше възстановена до паролата по подразбиране",
|
||||
@@ -906,7 +931,7 @@
|
||||
"language-dialog": {
|
||||
"translated": "преведено",
|
||||
"choose-language": "Избери Език",
|
||||
"select-description": "Изберете език за Mealie. Тази настройка се прилага само за Вас, не и за други потребители.",
|
||||
"select-description": "Изберете език за Mealie. Тази настройка засяга само текущия профил.",
|
||||
"how-to-contribute-description": "Има ли нещо все още непреведено, с грешка в превода, или езикът Ви липсва в списъка? {read-the-docs-link} за да видите как да допринесете!",
|
||||
"read-the-docs": "Прочетете документацията"
|
||||
},
|
||||
@@ -914,12 +939,12 @@
|
||||
"foods": {
|
||||
"merge-dialog-text": "Комбинирането на избраните храни ще обедини изходната храна и целевата храна в една единствена храна. Изходната храна ще бъде изтрита и всички препратки към изходната храна ще бъдат актуализирани, за да сочат към целевата храна.",
|
||||
"merge-food-example": "Обединяване на {food1} с {food2}",
|
||||
"seed-dialog-text": "Заредете базата данни с храни на базата на вашия местен език. Това ще създаде 200+ общи храни, които могат да се използват за организиране на вашата база данни. Храните се превеждат чрез усилия на общността.",
|
||||
"seed-dialog-text": "Изтеглете базата данни с продукти на вашия местен език. Ще бъдат заредени 200+ продукта, които да използвате за организиране на вашата база данни. Имената на продуктите се превеждат от общността.",
|
||||
"seed-dialog-warning": "Вече имате някои елементи във Вашата база данни. Това действие няма да съгласува дубликати, ще трябва да ги управлявате ръчно.",
|
||||
"combine-food": "Комбинирай Храни",
|
||||
"source-food": "Изходна храна",
|
||||
"target-food": "Целева храна",
|
||||
"create-food": "Създай храна",
|
||||
"create-food": "Създай продукт",
|
||||
"food-label": "Заглавие на храната",
|
||||
"edit-food": "Редактирай храна",
|
||||
"food-data": "Данни за храните",
|
||||
@@ -927,7 +952,7 @@
|
||||
"example-food-plural": "пример: Домати"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Заредете базата данни с общи единици въз основа на Вашия местен език.",
|
||||
"seed-dialog-text": "Заредете базата данни с мерни единици на Вашия местен език.",
|
||||
"combine-unit-description": "Комбинирането на избраните единици ще обедини единицата източник и целевата единица в една единица. {source-unit-will-be-deleted} и всички препратки към изходната единица ще бъдат актуализирани, за да сочат към целевата единица.",
|
||||
"combine-unit": "Комбинирай мерни единици",
|
||||
"source-unit": "Изходна мярна единица",
|
||||
@@ -949,7 +974,7 @@
|
||||
"example-unit-abbreviation-plural": "пример: ч.л.-ки"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Заредете базата данни с общи етикети въз основа на Вашия местен език.",
|
||||
"seed-dialog-text": "Заредете базата данни с етикети на Вашия местен език.",
|
||||
"edit-label": "Редактиране на етикет",
|
||||
"new-label": "Нов етикет",
|
||||
"labels": "Етикети"
|
||||
@@ -966,10 +991,10 @@
|
||||
"recipe-columns": "Колони на рецептата",
|
||||
"data-exports-description": "Този раздел предоставя връзки към налични експортирания, които са готови за изтегляне. Тези експорти изтичат, така че не забравяйте да ги изтеглите, докато все още са налични.",
|
||||
"data-exports": "Експорти на данни",
|
||||
"tag": "Таг",
|
||||
"tag": "Етикет",
|
||||
"categorize": "Категоризиране",
|
||||
"update-settings": "Обнови настройките",
|
||||
"tag-recipes": "Тагове на рецепти",
|
||||
"tag-recipes": "Етикети на рецепти",
|
||||
"categorize-recipes": "Категоризирай рецепти",
|
||||
"export-recipes": "Експортирай рецепти",
|
||||
"delete-recipes": "Изтрий рецепти",
|
||||
@@ -977,8 +1002,8 @@
|
||||
},
|
||||
"create-alias": "Създаване на псевдоним",
|
||||
"manage-aliases": "Управление на псевдоними",
|
||||
"seed-data": "Сийд на данни",
|
||||
"seed": "Сийд",
|
||||
"seed-data": "Зареждане на данни",
|
||||
"seed": "Зареждане",
|
||||
"data-management": "Управление на данни",
|
||||
"data-management-description": "Изберете кой набор от данни искате да промените.",
|
||||
"select-data": "Изберете данни",
|
||||
@@ -991,9 +1016,9 @@
|
||||
"category-data": "Категория за данните"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "Нов таг",
|
||||
"edit-tag": "Редакция на таг",
|
||||
"tag-data": "Данни на тага"
|
||||
"new-tag": "Нов етикет",
|
||||
"edit-tag": "Редакция на етикет",
|
||||
"tag-data": "Данни на етикета"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "Нов инструмент",
|
||||
@@ -1010,7 +1035,7 @@
|
||||
"group-details": "Подробности за групата",
|
||||
"group-details-description": "Преди да създадете акаунт, ще трябва да създадете група. Вашата група ще съдържа само Вас, но ще можете да поканите други по-късно. Членовете във вашата група могат да споделят планове за хранене, списъци за пазаруване, рецепти и други!",
|
||||
"use-seed-data": "Използвай предварителни данни",
|
||||
"use-seed-data-description": "Mealie се доставя с колекция от храни, мерни единици и етикети, които могат да се използват за попълване на Вашата група с полезни данни за организиране на вашите рецепти.",
|
||||
"use-seed-data-description": "Mealie се доставя с колекция от продукти, мерни единици и етикети за попълване на Вашата група с полезни данни за организиране на рецептите.",
|
||||
"account-details": "Подробни данни за акаунта"
|
||||
},
|
||||
"validation": {
|
||||
@@ -1129,11 +1154,21 @@
|
||||
"background-tasks": "Задачи на заден фон",
|
||||
"background-tasks-description": "Тук можете да видите всички изпълнявани задачи на заден фон и техния статус",
|
||||
"no-logs-found": "Няма намерени логове",
|
||||
"tasks": "Задачи"
|
||||
"tasks": "Задачи",
|
||||
"setup": {
|
||||
"first-time-setup": "Настройка за първи път",
|
||||
"welcome-to-mealie-get-started": "Добре дошли в Mealie! Да започваме",
|
||||
"already-set-up-bring-to-homepage": "Вече съм настроен, просто ме отведете до началната страница",
|
||||
"common-settings-for-new-sites": "Ето някои общи настройки за нови сайтове",
|
||||
"setup-complete": "Настройката е завършена!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Ето няколко неща, които ще Ви помогнат да започнете с Mealie",
|
||||
"restore-from-v1-backup": "Имате резервно копие от предишна инстанция на Mealie v1? Можете да го възстановите тук.",
|
||||
"manage-profile-or-get-invite-link": "Управлявайте собствения си профил или вземете връзка за покана, която да споделите с други."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Добре дошъл(а), {0}",
|
||||
"description": "Управлявай твоят профил, рецепти и настройки на групата.",
|
||||
"description": "Настройки на профил, рецепти и настройки на групата.",
|
||||
"get-invite-link": "Вземи линк за покана",
|
||||
"get-public-link": "Вземи публичен линк",
|
||||
"account-summary": "Обобщение на акаунта",
|
||||
@@ -1145,19 +1180,19 @@
|
||||
"personal": "Лични",
|
||||
"personal-description": "Това са настройки, които са лични за Вас. Промените тук няма да засегнат други потребители",
|
||||
"user-settings": "Потребителски настройки",
|
||||
"user-settings-description": "Управлявайте предпочитанията си, променяйте паролата си и актуализирайте имейла си",
|
||||
"api-tokens-description": "Управлявайте вашите API токени за достъп от външни приложения",
|
||||
"user-settings-description": "Нстройки на предпочитанията, смяна на парола и актуализация на имей адрес",
|
||||
"api-tokens-description": "Управление на API токени за достъп от външни приложения",
|
||||
"group-description": "Тези елементи се споделят във вашата група. Редактирането на един от тях ще го промени за цялата група!",
|
||||
"group-settings": "Настройки на групата",
|
||||
"group-settings-description": "Управлявайте общите си групови настройки като план за хранене и настройки за поверителност.",
|
||||
"cookbooks-description": "Управлявайте колекция от категории на рецепти и генерирайте страници за тях.",
|
||||
"group-settings-description": "Общи групови настройки като седмично меню и настройки за поверителност.",
|
||||
"cookbooks-description": "Управление на категории на рецепти и генериране на съответните страници.",
|
||||
"members": "Участници",
|
||||
"members-description": "Вижте кой е във Вашата група и управлявайте техните права.",
|
||||
"members-description": "Списък на потребителите в групата и управление на техните права.",
|
||||
"webhooks-description": "Настройте webhooks, които се задействат в дните, в които имате планиран план за хранене.",
|
||||
"notifiers": "Уведомители",
|
||||
"notifiers-description": "Настройте имейл и push известия, които се задействат при конкретни събития.",
|
||||
"manage-data": "Управление на данни",
|
||||
"manage-data-description": "Управлявайте вашата храна и единици (очаквайте още опции скоро)",
|
||||
"manage-data-description": "Настройки на продукти и мерни единици (очаквайте добавяне на още възможности)",
|
||||
"data-migrations": "Миграция на данни",
|
||||
"data-migrations-description": "Мигрирайте вашите съществуващи данни от други приложения като Nextcloud Recipes и Chowdown",
|
||||
"email-sent": "Имейлът е изпратен",
|
||||
@@ -1177,13 +1212,13 @@
|
||||
},
|
||||
"cookbook": {
|
||||
"cookbooks": "Готварски книги",
|
||||
"description": "Готварските книги са друг начин за организиране на рецепти чрез създаване на напречни сечения на рецепти и тагове. Създаването на готварска книга ще добави запис към страничната лента и всички рецепти с избраните тагове и категории ще бъдат показани в готварската книга.",
|
||||
"description": "Готварските книги са друг начин за организиране на рецепти чрез създаване на напречни сечения на рецепти и етикети. Създаването на готварска книга ще добави запис към страничната лента и всички рецепти с избраните категории и етикети ще бъдат показани в готварската книга.",
|
||||
"public-cookbook": "Публична книга с рецепти",
|
||||
"public-cookbook-description": "Публичните готварски книги могат да се споделят с потребители, които не са в Mealie, и ще се показват на страницата на вашите групи.",
|
||||
"filter-options": "Опции на филтъра",
|
||||
"filter-options-description": "Когато е избрано изискване на всички, готварската книга ще включва само рецепти, които имат всички избрани елементи. Това се отнася за всяко подмножество от селектори, а не за напречно сечение на избраните елементи.",
|
||||
"require-all-categories": "Изискване на всички категории",
|
||||
"require-all-tags": "Изискване на всички тагове",
|
||||
"require-all-tags": "Включване на всички етикети",
|
||||
"require-all-tools": "Изискване на всички инструменти",
|
||||
"cookbook-name": "Име на книгата с рецепти",
|
||||
"cookbook-with-name": "Книга с рецепти {0}",
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Esdeveniments de receptes"
|
||||
},
|
||||
"general": {
|
||||
"add": "Add",
|
||||
"cancel": "Anuŀla",
|
||||
"clear": "Neteja",
|
||||
"close": "Tanca",
|
||||
"confirm": "Confirma",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "Esteu segur de voler suprimir-lo?",
|
||||
"copied_message": "S'ha copiat!",
|
||||
"create": "Crea",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Desa",
|
||||
"settings": "Configuració",
|
||||
"share": "Compartiu",
|
||||
"show-all": "Show All",
|
||||
"shuffle": "Barreja",
|
||||
"sort": "Ordena",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-alphabetically": "Alfabèticament",
|
||||
"status": "Estat",
|
||||
"subject": "Assumpte",
|
||||
"submit": "Envia",
|
||||
"success-count": "Amb èxit: {count}",
|
||||
"sunday": "Diumenge",
|
||||
"system": "System",
|
||||
"templates": "Plantilles:",
|
||||
"test": "Prova",
|
||||
"themes": "Temes",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Unitats",
|
||||
"back": "Torna",
|
||||
"next": "Següent",
|
||||
"start": "Start",
|
||||
"toggle-view": "Commuta la visualització",
|
||||
"date": "Data",
|
||||
"id": "Id",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Preferències per grup",
|
||||
"private-group": "Grup privat",
|
||||
"private-group-description": "Marcar el grup com a privat afectarà a totes les opcions de visualització pública per defecte. Podeu canviar-les individualment en les opcions de visualització de cada recepta.",
|
||||
"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",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Permeteu als usuaris d'altres grups, visualitzar les vostres receptes",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Si ho habiliteu, podreu compartir enllaços públics de receptes específiques sense autoritzar l'usuari. Si està deshabilitat, només podreu compartir amb usuaris del vostre grup o generant enllaços privats",
|
||||
"show-nutrition-information": "Mostra la informació nutricional",
|
||||
@@ -259,7 +268,7 @@
|
||||
},
|
||||
"meal-plan": {
|
||||
"create-a-new-meal-plan": "Crea un nou menú",
|
||||
"update-this-meal-plan": "Update this Meal Plan",
|
||||
"update-this-meal-plan": "Actualitza aquest pla de menjar",
|
||||
"dinner-this-week": "Sopar d'esta setmana",
|
||||
"dinner-today": "Sopar per avui",
|
||||
"dinner-tonight": "Sopar d'aquesta nit",
|
||||
@@ -307,7 +316,7 @@
|
||||
"for-type-meal-types": "per {0} tipus de menús",
|
||||
"meal-plan-rules": "Normes del planificador de menús",
|
||||
"new-rule": "Nova norma",
|
||||
"meal-plan-rules-description": "You can create rules for auto selecting recipes for your meal plans. These rules are used by the server to determine the random pool of recipes to select from when creating meal plans. Note that if rules have the same day/type constraints then the categories of the rules will be merged. In practice, it's unnecessary to create duplicate rules, but it's possible to do so.",
|
||||
"meal-plan-rules-description": "Podeu crear regles per a la selecció automàtica de receptes per als vostres plans d'àpats. El servidor utilitza aquestes regles per determinar el conjunt aleatori de receptes per seleccionar quan es creen plans d'àpats. Tingueu en compte que si les regles tenen les mateixes restriccions de dia/tipus, les categories de les regles es fusionaran. A la pràctica, no és necessari crear regles duplicades, però és possible fer-ho.",
|
||||
"new-rule-description": "When creating a new rule for a meal plan you can restrict the rule to be applicable for a specific day of the week and/or a specific type of meal. To apply a rule to all days or all meal types you can set the rule to \"Any\" which will apply it to all the possible values for the day and/or meal type.",
|
||||
"recipe-rules": "Normes per la recepta",
|
||||
"applies-to-all-days": "Aplica a tots els dies",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Migració de receptes",
|
||||
"recipe-data-migrations-explanation": "Les receptes es poden migrar des d'una altra aplicació suportada cap a Mealie. És una manera genial de començar a utilitzar el Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "Elegeix un tipus de migració",
|
||||
"tag-all-recipes": "Etiqueta totes les receptes amb {tag-name}",
|
||||
"nextcloud-text": "Les receptes de Nextcloud poden ser importades d'un fitxer ZIP que contingui les dades emmagatzemades en Nextcloud. Segueix l'exemple d'estructura de directori de sota per assegurar que les receptes podran ser importades.",
|
||||
"chowdown-text": "Mealie suporta de forma nativa el format de Chowdown. Descarrega el codi del repositori com a .zip i carrega'l a sota",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "Recepta 1",
|
||||
"recipe-2": "Recepta 2",
|
||||
"paprika-text": "Mealie pot importar receptes des de l'aplicació Paprika. Exporta les teves receptes de Paprika, reanomena l'extensió de l'arxiu a .zip i penja'l aquí sota.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie pot importar receptes de Plan to Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Mode \"cuinant\"",
|
||||
"link-ingredients": "Enllaça amb els ingredients",
|
||||
"merge-above": "Fusiona amb el de dalt",
|
||||
"move-to-bottom": "Move To Bottom",
|
||||
"move-to-top": "Move To Top",
|
||||
"reset-scale": "Reinicialitza",
|
||||
"decrease-scale-label": "Divideix",
|
||||
"increase-scale-label": "Multiplica",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "Edita l'esdeveniment de la cronologia",
|
||||
"timeline": "Cronologia",
|
||||
"timeline-is-empty": "Encara no hi ha res a la cronologia. Prova de fer aquesta recepta!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} Global Timeline",
|
||||
"open-timeline": "Obrir la cronologia",
|
||||
"made-this": "Ho he fet",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Estàs buscant migracions?",
|
||||
"import-with-url": "Importar amb l'URL",
|
||||
"create-recipe": "Crea la recepta",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Importar amb un .zip",
|
||||
"create-recipe-from-an-image": "Crea la recepta a partir d'una imatge",
|
||||
"bulk-url-import": "Importació d'URL en massa",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Resum de la importació",
|
||||
"partial-backup": "Còpia de seguretat parcial",
|
||||
"unable-to-delete-backup": "No s'ha pogut suprimir la còpia.",
|
||||
"experimental-description": "Backups a total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think off this as a snapshot of Mealie at a specific time. Currently, {not-crossed-version} (data migrations are not done automatically). These serve as a database agnostic way to export and import data or backup the site to an external location.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"backup-restore": "Restaura la còpia de seguretat",
|
||||
"back-restore-description": "Restaurar aquesta còpia de seguretat sobreescriurà totes les dades actuals de la teva base de dades i qualsevol directori i els substituirà amb el contingut d'aquesta còpia de seguretat. {cannot-be-undone} Si la restauració es duu a terme correctament, se us tancarà la sessió.",
|
||||
"cannot-be-undone": "Aquesta acció no es pot desfer. Utilitza-la amb precaució.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.",
|
||||
"ldap-ready-success-text": "Required LDAP variables are all set.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Recipe Scraper Version"
|
||||
"recipe-scraper-version": "Recipe Scraper Version",
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
|
||||
"oidc-ready-success-text": "Required OIDC variables are all set."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Totes les llistes",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "Id de l'enllaç",
|
||||
"link-name": "Nom de l'enllaç",
|
||||
"login": "Inicieu sessió",
|
||||
"login-oidc": "Login with",
|
||||
"or": "or",
|
||||
"logout": "Tanca la sessió",
|
||||
"manage-users": "Gestionar usuaris",
|
||||
"manage-users-description": "Create and manage users.",
|
||||
"new-password": "Nova contrasenya",
|
||||
"new-user": "Nou Usuari",
|
||||
"password-has-been-reset-to-the-default-password": "S'ha restablert la contrasenya al seu valor per defecte",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Background Tasks",
|
||||
"background-tasks-description": "Here you can view all the running background tasks and their status",
|
||||
"no-logs-found": "No Logs Found",
|
||||
"tasks": "Tasks"
|
||||
"tasks": "Tasks",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Benvingut, {0}",
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"add": "Add",
|
||||
"cancel": "Zrušit",
|
||||
"clear": "Vymazat",
|
||||
"close": "Zavřít",
|
||||
"confirm": "Potvrdit",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "Jste si jistý, že to chcete smazat?",
|
||||
"copied_message": "Zkopírováno!",
|
||||
"create": "Vytvořit",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Uložit",
|
||||
"settings": "Nastavení",
|
||||
"share": "Sdílet",
|
||||
"show-all": "Show All",
|
||||
"shuffle": "Náhodně",
|
||||
"sort": "Seřadit",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-alphabetically": "Abecedně",
|
||||
"status": "Stav",
|
||||
"subject": "Předmět",
|
||||
"submit": "Odeslat",
|
||||
"success-count": "Úspěšné: {count}",
|
||||
"sunday": "Neděle",
|
||||
"system": "System",
|
||||
"templates": "Šablony:",
|
||||
"test": "Test",
|
||||
"themes": "Motivy",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Jednotky",
|
||||
"back": "Zpět",
|
||||
"next": "Další",
|
||||
"start": "Start",
|
||||
"toggle-view": "Přepnout zobrazení",
|
||||
"date": "Datum",
|
||||
"id": "Id",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Nastavení skupiny",
|
||||
"private-group": "Soukromá skupina",
|
||||
"private-group-description": "Setting your group to private will default all public view options to default. This overrides an individual recipes 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",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Povolit uživatelům mimo vaši skupinu vidět vaše recepty",
|
||||
"allow-users-outside-of-your-group-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 group or with a pre-generated private link",
|
||||
"show-nutrition-information": "Show nutrition information",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Recipe Data Migrations",
|
||||
"recipe-data-migrations-explanation": "Recepty mohou být migrovány z jiné podporované aplikace na Mealie. To je skvělý způsob, jak začít s Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "Zvolte si typ migrace",
|
||||
"tag-all-recipes": "Tag all recipes with {tag-name} tag",
|
||||
"nextcloud-text": "Nextcloud recepty lze importovat ze souboru zip, který obsahuje data uložená v Nextcloudu. Podívejte se na příklad struktury složek níže, abyste se ujistili, že vaše recepty lze importovat.",
|
||||
"chowdown-text": "Mealie nativně podporuje formát chowdown. Stáhněte si z repozitáře kód jako .zip soubor a nahrajte ho níže",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "Recept 1",
|
||||
"recipe-2": "Recept 2",
|
||||
"paprika-text": "Mealie může importovat recepty z aplikace Paprika. Exportujte své recepty z papriky, přejmenujte příponu exportovaného souboru na .zip a nahrajte jej níže.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie can import recipies from Plan to Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Režim vaření",
|
||||
"link-ingredients": "Propojit ingredience",
|
||||
"merge-above": "Sloučit s předchozím",
|
||||
"move-to-bottom": "Move To Bottom",
|
||||
"move-to-top": "Move To Top",
|
||||
"reset-scale": "Obnovit násobení",
|
||||
"decrease-scale-label": "Snížit násobení o 1",
|
||||
"increase-scale-label": "Zvýšit násobení o 1",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "Upravit událost časové osy",
|
||||
"timeline": "Časová osa",
|
||||
"timeline-is-empty": "Zatím nic na časové ose není. Zkuste vytvořit tento recept!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} Globální časová osa",
|
||||
"open-timeline": "Otevřít časovou osu",
|
||||
"made-this": "Toto jsem uvařil",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Looking For Migrations?",
|
||||
"import-with-url": "Import with URL",
|
||||
"create-recipe": "Vytvořit recept",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Importovat pomocí .zip",
|
||||
"create-recipe-from-an-image": "Vytvořit recept z obrázku",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Shrnutí importu",
|
||||
"partial-backup": "Částečná záloha",
|
||||
"unable-to-delete-backup": "Zálohu nelze odstranit.",
|
||||
"experimental-description": "Backups a total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think off this as a snapshot of Mealie at a specific time. Currently, {not-crossed-version} (data migrations are not done automatically). These serve as a database agnostic way to export and import data or backup the site to an external location.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"backup-restore": "Backup Restore",
|
||||
"back-restore-description": "Restoring this backup will overwrite all the current data in your database and in the data directory and replace them with the contents of this backup. {cannot-be-undone} If the restoration is successful, you will be logged out.",
|
||||
"cannot-be-undone": "This action cannot be undone - use with caution.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.",
|
||||
"ldap-ready-success-text": "Required LDAP variables are all set.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Recipe Scraper Version"
|
||||
"recipe-scraper-version": "Recipe Scraper Version",
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
|
||||
"oidc-ready-success-text": "Required OIDC variables are all set."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Všechny seznamy",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "ID odkazu",
|
||||
"link-name": "Název odkazu",
|
||||
"login": "Přihlášení",
|
||||
"login-oidc": "Login with",
|
||||
"or": "or",
|
||||
"logout": "Odhlášení",
|
||||
"manage-users": "Spravovat uživatele",
|
||||
"manage-users-description": "Create and manage users.",
|
||||
"new-password": "Nové heslo",
|
||||
"new-user": "Nový uživatel",
|
||||
"password-has-been-reset-to-the-default-password": "Heslo bylo obnoveno na výchozí heslo",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Úlohy na pozadí",
|
||||
"background-tasks-description": "Here you can view all the running background tasks and their status",
|
||||
"no-logs-found": "Nenalezeny žádné záznamy",
|
||||
"tasks": "Tasks"
|
||||
"tasks": "Tasks",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Vítejte, {0}",
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Hændelser for opskrifter"
|
||||
},
|
||||
"general": {
|
||||
"add": "Tilføj",
|
||||
"cancel": "Annuller",
|
||||
"clear": "Ryd",
|
||||
"close": "Luk",
|
||||
"confirm": "Bekræft",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "Er du sikker på, du vil slette dette?",
|
||||
"copied_message": "Kopieret!",
|
||||
"create": "Opret",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Gem",
|
||||
"settings": "Indstillinger",
|
||||
"share": "Del",
|
||||
"show-all": "Vis alle",
|
||||
"shuffle": "Bland",
|
||||
"sort": "Sorter",
|
||||
"sort-ascending": "Sorter stigende",
|
||||
"sort-descending": "Sorter Faldende",
|
||||
"sort-alphabetically": "Alfabetisk",
|
||||
"status": "Status",
|
||||
"subject": "Emne",
|
||||
"submit": "Indsend",
|
||||
"success-count": "Succes: {count}",
|
||||
"sunday": "Søndag",
|
||||
"system": "System",
|
||||
"templates": "Skabeloner:",
|
||||
"test": "Afprøv",
|
||||
"themes": "Temaer",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Enheder",
|
||||
"back": "Tilbage",
|
||||
"next": "Næste",
|
||||
"start": "Start",
|
||||
"toggle-view": "Skift visning",
|
||||
"date": "Dato",
|
||||
"id": "Id",
|
||||
@@ -199,8 +206,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.",
|
||||
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||
"clipboard-copy-failure": "Kopiering til udklipsholderen mislykkedes.",
|
||||
"confirm-delete-generic-items": "Er du sikker på at du ønsker at slette de valgte emner?"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Er du sikker på, du vil slette <b>{groupName}<b/>?",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Gruppe Indstillinger",
|
||||
"private-group": "Privat Gruppe",
|
||||
"private-group-description": "Indstilling af din gruppe til privat, vil ændre alle indstillinger for offentlig visning. Dette tilsidesætter individuelle opskrifters indstillinger for offentlig visning.",
|
||||
"enable-public-access": "Aktiver Offentlig Adgang",
|
||||
"enable-public-access-description": "Gør gruppeopskrifter offentlige som standard, og tillade besøgende at se opskrifter uden at logge ind",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Tillad brugere udenfor din gruppe at se dine opskrifter",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Når aktiveret kan du bruge et link til offentlig deling til at dele specifikke opskrifter uden at oprette en bruger. Når deaktiveret, kan du kun dele opskrifter med brugere, der er i din gruppe eller med et prægenereret privat link",
|
||||
"show-nutrition-information": "Vis ernæringsoplysninger",
|
||||
@@ -259,7 +268,7 @@
|
||||
},
|
||||
"meal-plan": {
|
||||
"create-a-new-meal-plan": "Opret en ny madplan",
|
||||
"update-this-meal-plan": "Update this Meal Plan",
|
||||
"update-this-meal-plan": "Opdater denne måltidsplan",
|
||||
"dinner-this-week": "Madplan denne uge",
|
||||
"dinner-today": "Madplan i dag",
|
||||
"dinner-tonight": "AFTENSMAD I AFTEN",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Migrering af opskrifter",
|
||||
"recipe-data-migrations-explanation": "Opskrifter kan migreres fra et andet understøttet program til Mealie. Dette er en fantastisk måde at komme i gang med Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Kommer fra en anden applikation eller en endnu ældre version af Mealie? Tjek migrationer og se om dine data kan importeres.",
|
||||
"choose-migration-type": "Vælg Migreringstype",
|
||||
"tag-all-recipes": "Tag alle opskrifter med {tag-name} tag",
|
||||
"nextcloud-text": "Nextcloud opskrifter kan importeres fra en zip-fil, der indeholder data lagret i Nextcloud. Se eksempelmappestrukturen nedenfor for at sikre, at dine opskrifter kan importeres.",
|
||||
"chowdown-text": "Mealie understøtter indbygget chowdown repository format. Download repositoriet som en .zip-fil og upload den nedenfor",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "Opskrift 1",
|
||||
"recipe-2": "Opskrift 2",
|
||||
"paprika-text": "Mealie kan importere opskrifter fra Paprika applikationen. Eksporter dine opskrifter fra paprika, omdøbe eksportudvidelsen til .zip og uploade den nedenfor.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Planlæg at spise",
|
||||
"description-long": "Mealie kan importere opskrifter, der er markeret som \"Planlæg at spise\"."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Tilberedningsvisning",
|
||||
"link-ingredients": "Link ingredienser",
|
||||
"merge-above": "Sammenflet ovenstående",
|
||||
"move-to-bottom": "Flyt til bunden",
|
||||
"move-to-top": "Flyt til toppen",
|
||||
"reset-scale": "Nulstil skalering",
|
||||
"decrease-scale-label": "Formindsk skala med 1",
|
||||
"increase-scale-label": "Forøg skala med 1",
|
||||
@@ -509,13 +525,14 @@
|
||||
"edit-timeline-event": "Rediger tidslinjebegivenhed",
|
||||
"timeline": "Tidslinje",
|
||||
"timeline-is-empty": "Intet på tidslinjen endnu. Prøv at lave denne opskrift!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} Global Tidslinje",
|
||||
"open-timeline": "Åbn tidslinje",
|
||||
"made-this": "Jeg har lavet denne",
|
||||
"how-did-it-turn-out": "Hvordan blev det?",
|
||||
"user-made-this": "{user} lavede denne",
|
||||
"last-made-date": "Sidst tilberedt den {date}",
|
||||
"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": "Opskrifter ekstra er en central feature i Mealie API. De giver dig mulighed for at oprette brugerdefinerede JSON nøgle / værdi par inden for en opskrift, at henvise til fra 3. parts applikationer. Du kan bruge disse nøgler til at give oplysninger, for eksempel til at udløse automatiseringer eller brugerdefinerede beskeder til at videresende til din ønskede enhed.",
|
||||
"message-key": "Beskednøgle",
|
||||
"parse": "Behandl data",
|
||||
"attach-images-hint": "Vedhæft billeder ved at trække dem ind i redigeringsværktøjet",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Kigger du efter data migrering?",
|
||||
"import-with-url": "Importér via URL",
|
||||
"create-recipe": "Opret opskrift",
|
||||
"create-recipe-description": "Opret ny opskrift fra bunden.",
|
||||
"create-recipes": "Opret opskrift",
|
||||
"import-with-zip": "Importér fra ZIP-fil",
|
||||
"create-recipe-from-an-image": "Opret opskrift ud fra et billede",
|
||||
"bulk-url-import": "Import fra flere URL-adresser",
|
||||
@@ -537,8 +556,8 @@
|
||||
"new-recipe-names-must-be-unique": "Opskriftsnavnet er allerede i brug",
|
||||
"scrape-recipe": "Scrape Opskrift",
|
||||
"scrape-recipe-description": "Hent en opskrift fra en hjemmeside. Angiv URL'en til den hjemmeside, du vil hente data fra, og Mealie vil forsøge at hente opskriften og tilføje den til din samling.",
|
||||
"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-a-lot-of-recipes": "Har du en masse opskrifter, du ønsker at scrappe på en gang?",
|
||||
"scrape-recipe-suggest-bulk-importer": "Prøv masse import",
|
||||
"import-original-keywords-as-tags": "Importér originale nøgleord som mærker",
|
||||
"stay-in-edit-mode": "Bliv i redigeringstilstand",
|
||||
"import-from-zip": "Importer fra zip-fil",
|
||||
@@ -562,7 +581,7 @@
|
||||
"upload-image": "Upload billede",
|
||||
"screen-awake": "Hold skærmen tændt",
|
||||
"remove-image": "Fjern billede",
|
||||
"nextStep": "Next step"
|
||||
"nextStep": "Næste trin"
|
||||
},
|
||||
"search": {
|
||||
"advanced-search": "Avanceret søgning",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Importer resumé",
|
||||
"partial-backup": "Delvis backup",
|
||||
"unable-to-delete-backup": "Ude af stand til at slette backup.",
|
||||
"experimental-description": "Backups en samlet snapshots af databasen og datamappe på installationen. Dette omfatter alle data og kan ikke indstilles til at udelukke undergrupper af data. Du kan tænke på dette som et øjebliksbillede af Mealie på et bestemt tidspunkt. I øjeblikket, {not-crossed-version} (data migrationer er ikke udført automatisk). Disse fungerer som en database agnostisk måde at eksportere og importere data eller backup af webstedet til en ekstern placering.",
|
||||
"experimental-description": "Backups er samlede snapshots af databasen og datamappe på installationen. Dette omfatter alle data og kan ikke indstilles til at udelukke undergrupper af data. Du kan tænke på dette som et øjebliksbillede af Mealie på et bestemt tidspunkt. Disse fungerer som en database agnostisk måde at eksportere og importere data, eller sikkerhedskopiere installationen til en ekstern placering.",
|
||||
"backup-restore": "Backup / gendannelse",
|
||||
"back-restore-description": "Gendannelse af denne sikkerhedskopi vil overskrive alle de aktuelle data i din database og i datamappen og erstatte dem med indholdet af denne sikkerhedskopi. {cannot-be-undone} Hvis gendannelsen lykkes, vil du blive logget ud.",
|
||||
"cannot-be-undone": "Denne handling kan ikke fortrydes - brug med forsigtighed.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Ikke alle LDAP- værdier er konfigureret. Dette kan ignoreres, hvis du ikke bruger LDAP- godkendelse.",
|
||||
"ldap-ready-success-text": "Påkrævede LDAP-variabler er alle angivet.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Version på opskrift-indsamler"
|
||||
"recipe-scraper-version": "Version på opskrift-indsamler",
|
||||
"oidc-ready": "OIDC er Klar",
|
||||
"oidc-ready-error-text": "Ikke alle OIDC værdier er konfigureret. Dette kan ignoreres, hvis du ikke bruger OIDC godkendelse.",
|
||||
"oidc-ready-success-text": "Alle påkrævede OIDC værdier er angivet."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Alle lister",
|
||||
@@ -807,7 +829,7 @@
|
||||
"create-new-tool": "Opret et nyt værktøj",
|
||||
"on-hand-checkbox-label": "Vis som \"Har allerede\" (afkrydset)",
|
||||
"required-tools": "Nødvendige Værktøjer",
|
||||
"tool": "Tool"
|
||||
"tool": "Værktøj"
|
||||
},
|
||||
"user": {
|
||||
"admin": "Administrator",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "Link ID",
|
||||
"link-name": "Linknavn",
|
||||
"login": "Log på",
|
||||
"login-oidc": "Log ind med",
|
||||
"or": "eller",
|
||||
"logout": "Log ud",
|
||||
"manage-users": "Administrer brugere",
|
||||
"manage-users-description": "Opret og administrér brugere.",
|
||||
"new-password": "Ny adgangskode",
|
||||
"new-user": "Ny bruger",
|
||||
"password-has-been-reset-to-the-default-password": "Adgangskode er blevet nulstillet til systemstandarden",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Baggrundsopgaver",
|
||||
"background-tasks-description": "Her kan du se status på alle opgaver, der afvikles i baggrunden",
|
||||
"no-logs-found": "Ingen logfiler fundet",
|
||||
"tasks": "Opgaver"
|
||||
"tasks": "Opgaver",
|
||||
"setup": {
|
||||
"first-time-setup": "Første Opsætning",
|
||||
"welcome-to-mealie-get-started": "Velkommen til Mealie! Lad os starte",
|
||||
"already-set-up-bring-to-homepage": "Jeg er allerede oprettet, bare bringe mig til hjemmesiden",
|
||||
"common-settings-for-new-sites": "Her er nogle almindelige indstillinger for nye sites",
|
||||
"setup-complete": "Opsætning fuldført!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Her er et par ting, der kan hjælpe dig i gang med Mealie",
|
||||
"restore-from-v1-backup": "Har du en sikkerhedskopi fra en tidligere udgave af Mealie v1? Du kan gendanne den her.",
|
||||
"manage-profile-or-get-invite-link": "Administrer din egen profil, eller tag et invitationslink til at dele med andre."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Velkommen, {0}",
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Rezept-Ereignisse"
|
||||
},
|
||||
"general": {
|
||||
"add": "Hinzufügen",
|
||||
"cancel": "Abbrechen",
|
||||
"clear": "Zurücksetzen",
|
||||
"close": "Schließen",
|
||||
"confirm": "Bestätigen",
|
||||
"confirm-how-does-everything-look": "Wie sieht alles aus?",
|
||||
"confirm-delete-generic": "Bist du dir sicher, dass du dies löschen möchtest?",
|
||||
"copied_message": "Kopiert!",
|
||||
"create": "Erstellen",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Speichern",
|
||||
"settings": "Einstellungen",
|
||||
"share": "Teilen",
|
||||
"show-all": "Alle anzeigen",
|
||||
"shuffle": "Mischen",
|
||||
"sort": "Sortierung",
|
||||
"sort-ascending": "Aufsteigend sortieren",
|
||||
"sort-descending": "Absteigend sortieren",
|
||||
"sort-alphabetically": "Alphabetisch",
|
||||
"status": "Status",
|
||||
"subject": "Ereignis",
|
||||
"submit": "Absenden",
|
||||
"success-count": "Erfolgreich: {count}",
|
||||
"sunday": "Sonntag",
|
||||
"system": "System",
|
||||
"templates": "Vorlagen:",
|
||||
"test": "Testen",
|
||||
"themes": "Themen",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Einheiten",
|
||||
"back": "Zurück",
|
||||
"next": "Weiter",
|
||||
"start": "Starten",
|
||||
"toggle-view": "Ansicht wechseln",
|
||||
"date": "Datum",
|
||||
"id": "ID",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Gruppeneinstellungen",
|
||||
"private-group": "Private Gruppe",
|
||||
"private-group-description": "Wenn du deine Gruppe auf privat stellst, werden alle Einstellungen für den öffentlichen Zugriff zurückgesetzt. Individuelle Einstellungen für einzelne Rezepte werden überschrieben.",
|
||||
"enable-public-access": "Öffentlichen Zugriff aktivieren",
|
||||
"enable-public-access-description": "Gruppenrezepte standardmäßig öffentlich machen und es Besuchern erlauben, Rezepte ohne Anmeldung anzuzeigen",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Erlaube Benutzern außerhalb deiner Gruppe deine Rezepte zu sehen",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Wenn aktiviert, kannst du einen öffentlichen Link verwenden, um ausgewählte Rezepte zu teilen, ohne dass Benutzer sich anmelden müssen. Wenn deaktiviert, kannst du nur Rezepte mit Benutzern teilen, die in deiner Gruppe sind oder einen vorher erstellten privaten Link verwenden",
|
||||
"show-nutrition-information": "Nährwerttabelle anzeigen",
|
||||
@@ -349,6 +358,7 @@
|
||||
},
|
||||
"recipe-data-migrations": "Rezeptdatenmigration",
|
||||
"recipe-data-migrations-explanation": "Rezepte können aus unterstützten Programmen nach Mealie migriert werden. Das ist eine gute Möglichkeit, um mit Mealie loszulegen.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Wechselst du von einer anderen Anwendung oder einer noch älteren Version von Mealie? Prüfe die Migrations-Optionen, vielleicht können deine Daten importiert werden.",
|
||||
"choose-migration-type": "Migrationsart wählen",
|
||||
"tag-all-recipes": "Alle Rezepte mit Schlagwort {tag-name} versehen",
|
||||
"nextcloud-text": "Nextcloud Rezepte können aus einer Zip-Datei importiert werden, die die in Nextcloud gespeicherten Daten enthält. Vergleiche die Beispiel-Ordnerstruktur unten um sicherzustellen, dass deine Rezepte importiert werden können.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie kann Rezepte von Plan to Eat importieren."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie kann Rezepte von My Recipe Box importieren. Exportiere deine Rezepte im CSV-Format und lade dann unten die .csv Datei hoch."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -408,7 +422,7 @@
|
||||
"carbohydrate-content": "Kohlenhydrate",
|
||||
"categories": "Kategorien",
|
||||
"comment-action": "Kommentieren",
|
||||
"comment": "Kommentieren",
|
||||
"comment": "Kommentar",
|
||||
"comments": "Kommentare",
|
||||
"delete-confirmation": "Bist du dir sicher, dass du dieses Rezept löschen möchtest?",
|
||||
"delete-recipe": "Rezept löschen",
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Koch-Modus",
|
||||
"link-ingredients": "Zutaten verlinken",
|
||||
"merge-above": "Mit Eintrag darüber zusammenführen",
|
||||
"move-to-bottom": "Ganz nach unten",
|
||||
"move-to-top": "Ganz nach oben",
|
||||
"reset-scale": "Maßstab zurücksetzen",
|
||||
"decrease-scale-label": "Maßstab um 1 verringern",
|
||||
"increase-scale-label": "Maßstab um 1 erhöhen",
|
||||
@@ -509,13 +525,14 @@
|
||||
"edit-timeline-event": "Zeitstrahl-Ereignis bearbeiten",
|
||||
"timeline": "Zeitstrahl",
|
||||
"timeline-is-empty": "Noch nichts auf dem Zeitstrahl. Probier dieses Rezept aus!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "Keine Ereignisse gefunden. Probiere es mit anderen Suchfiltern.",
|
||||
"group-global-timeline": "{groupName} Globaler Zeitstrahl",
|
||||
"open-timeline": "Zeitstrahl öffnen",
|
||||
"made-this": "Ich hab's gemacht",
|
||||
"how-did-it-turn-out": "Wie ist es geworden?",
|
||||
"user-made-this": "{user} hat's gemacht",
|
||||
"last-made-date": "Zuletzt gemacht {date}",
|
||||
"api-extras-description": "Rezepte-Extras sind ein Hauptmerkmal der Mealie API. Sie ermöglichen es dir, benutzerdefinierte JSON Key-Value-Paare zu einem Rezept zu erstellen, um Drittanbietern-Anwendungen zu steuern. Du kannst diese dazu verwenden, um Automatisierungen auszulösen oder benutzerdefinierte Nachrichten an bestimmte Geräte zu senden.",
|
||||
"api-extras-description": "Rezepte-Extras sind ein Hauptmerkmal der Mealie API. Sie ermöglichen es dir, benutzerdefinierte JSON Key-Value-Paare zu einem Rezept zu erstellen, um Drittanbieter-Anwendungen zu steuern. Du kannst diese dazu verwenden, um Automatisierungen auszulösen oder benutzerdefinierte Nachrichten an bestimmte Geräte zu senden.",
|
||||
"message-key": "Nachrichten-Schlüssel",
|
||||
"parse": "Parse",
|
||||
"attach-images-hint": "Bilder durch Ziehen & Ablegen in den Editor hinzufügen",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Suchst du nach Migrationen?",
|
||||
"import-with-url": "Von URL importieren",
|
||||
"create-recipe": "Rezept erstellen",
|
||||
"create-recipe-description": "Erstelle ein neues Rezept von Grund auf.",
|
||||
"create-recipes": "Rezepte erstellen",
|
||||
"import-with-zip": "Von .zip importieren",
|
||||
"create-recipe-from-an-image": "Rezept von Foto erstellen",
|
||||
"bulk-url-import": "URL Massenimport",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Zusammenfassung des Imports",
|
||||
"partial-backup": "Teilsicherung",
|
||||
"unable-to-delete-backup": "Sicherung kann nicht gelöscht werden.",
|
||||
"experimental-description": "Sichert eine vollständige Momentaufnahme der Datenbank und des Datenverzeichnisses der Webseite. Dies schließt alle Daten ein, es können keine Daten ausgenommen werden. Es handelt sich also um eine Momentaufnahme von Mealie zu einem bestimmten Zeitpunkt. Zur Zeit {not-crossed-version} (es erfolgt keine automatische Datenmigration). Es ist eine Datenbank-unabhängige Möglichkeit, Daten zu exportieren und importieren oder um die Webseite an einem externen Ort zu sichern.",
|
||||
"experimental-description": "Backups sind vollständige Schnappschüsse der Datenbank und des Datenverzeichnisses der Website. Darin sind sämtliche Daten enthalten, es können keine Teile von Daten ausgeschlossen werden. Es ist wie ein Schnappschuss von Mealie zu einem bestimmten Zeitpunkt. Es handelt sich um eine von der Datenbank unabhängige Möglichkeit, Daten zu exportieren und zu importieren oder die Webseite an einem externen Ort zu sichern.",
|
||||
"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.",
|
||||
@@ -721,10 +740,13 @@
|
||||
"server-side-base-url-error-text": "`BASE_URL` ist immer noch der Standardwert auf dem API-Server. Das verursacht Probleme mit Benachrichtigungslinks auf dem Server für E-Mails, etc.",
|
||||
"server-side-base-url-success-text": "Serverseitige URL entspricht nicht der Standardeinstellung",
|
||||
"ldap-ready": "LDAP bereit",
|
||||
"ldap-ready-error-text": "Nicht alle LDAP-Werte sind konfiguriert. Das kann ignoriert werden, wenn du keine LDAP-Authentifizierung verwendest.",
|
||||
"ldap-ready-error-text": "Es sind nicht alle LDAP-Werte konfiguriert. Wenn du keine LDAP-Authentifizierung benutzt, kannst du das ignorieren.",
|
||||
"ldap-ready-success-text": "Alle erforderlichen LDAP-Variablen sind hinterlegt.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Rezept Scraper Version"
|
||||
"recipe-scraper-version": "Rezept Scraper Version",
|
||||
"oidc-ready": "OIDC bereit",
|
||||
"oidc-ready-error-text": "Es sind nicht alle OIDC-Werte konfiguriert. Wenn du keine OIDC-Authentifizierung benutzt, kannst du das ignorieren.",
|
||||
"oidc-ready-success-text": "Alle erforderlichen OIDC-Variablen sind gesetzt."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Alle Listen",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "Linkkennung",
|
||||
"link-name": "Linkname",
|
||||
"login": "Anmeldung",
|
||||
"login-oidc": "Anmelden mit",
|
||||
"or": "oder",
|
||||
"logout": "Abmelden",
|
||||
"manage-users": "Benutzer verwalten",
|
||||
"manage-users-description": "Benutzer erstellen und verwalten.",
|
||||
"new-password": "Neues Passwort",
|
||||
"new-user": "Neuer Benutzer",
|
||||
"password-has-been-reset-to-the-default-password": "Passwort wurde auf das Standardpasswort zurückgesetzt",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Hintergrundaufgaben",
|
||||
"background-tasks-description": "Hier kannst du alle laufenden Hintergrundaufgaben und ihren Status beobachten",
|
||||
"no-logs-found": "Keine Protokolle gefunden",
|
||||
"tasks": "Aufgaben"
|
||||
"tasks": "Aufgaben",
|
||||
"setup": {
|
||||
"first-time-setup": "Erstmalige Einrichtung",
|
||||
"welcome-to-mealie-get-started": "Willkommen bei Mealie! Los geht's",
|
||||
"already-set-up-bring-to-homepage": "Ich habe schon alles eingerichtet, bring mich zur Startseite",
|
||||
"common-settings-for-new-sites": "Hier sind einige allgemeine Einstellungen für neue Seiten",
|
||||
"setup-complete": "Einrichtung abgeschlossen!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Hier sind einige Funktionen, die dich beim Start mit Mealie unterstützen",
|
||||
"restore-from-v1-backup": "Hast du ein Backup von einer früheren v1 Instanz von Mealie? Hier kannst du es wiederherstellen.",
|
||||
"manage-profile-or-get-invite-link": "Verwalte dein eigenes Profil oder erstelle einen Einladungslink, den du an andere weitergeben kannst."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Willkommen, {0}",
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
"apprise-url": "URL Έκπληξης",
|
||||
"database": "Βάση δεδομένων",
|
||||
"delete-event": "Διαγραφή γεγονότος",
|
||||
"event-delete-confirmation": "Σίγουρα θέλετε να διαγράψετε αυτό το γεγονός;",
|
||||
"event-delete-confirmation": "Θέλετε σίγουρα να διαγράψετε αυτό το γεγονός;",
|
||||
"event-deleted": "Το γεγονός Διαγράφηκε",
|
||||
"event-updated": "Το γεγονός ενημερώθηκε",
|
||||
"new-notification-form-description": "Η Mealie χρησιμοποιεί τη βιβλιοθήκη Apprise για τη δημιουργία ειδοποιήσεων. Προσφέρουν πολλές επιλογές για τις υπηρεσίες που θα χρησιμοποιηθούν για ειδοποιήσεις. Ανατρέξτε στο wiki τους για έναν ολοκληρωμένο οδηγό για το πώς να δημιουργήσετε τη διεύθυνση URL για την υπηρεσία σας. Αν είναι διαθέσιμο, η επιλογή του τύπου της ειδοποίησής σας μπορεί να περιλαμβάνει επιπλέον χαρακτηριστικά.",
|
||||
@@ -76,15 +76,17 @@
|
||||
"cookbook-events": "Cookbook Events",
|
||||
"tag-events": "Tag Events",
|
||||
"category-events": "Category Events",
|
||||
"when-a-new-user-joins-your-group": "When a new user joins your group",
|
||||
"when-a-new-user-joins-your-group": "Οταν ένας νέος χρήστης ενταχθεί στην ομάδα σας",
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"add": "Προσθήκη",
|
||||
"cancel": "Άκυρο",
|
||||
"clear": "Εκκαθάριση",
|
||||
"close": "Κλείσιμο",
|
||||
"confirm": "Επιβεβαίωση",
|
||||
"confirm-delete-generic": "Είστε βέβαιοι ότι θέλετε να γίνει διαγραφή;",
|
||||
"confirm-how-does-everything-look": "Πώς φαίνονται τα πράγματα;",
|
||||
"confirm-delete-generic": "Θέλετε σίγουρα να γίνει διαγραφή;",
|
||||
"copied_message": "Αντιγράφηκε!",
|
||||
"create": "Δημιουργία",
|
||||
"created": "Δημιουργήθηκε",
|
||||
@@ -114,10 +116,10 @@
|
||||
"json": "JSON",
|
||||
"keyword": "Λέξη-κλειδί",
|
||||
"link-copied": "Ο Σύνδεσμος Αντιγράφηκε",
|
||||
"loading": "Loading",
|
||||
"loading": "Φόρτωση",
|
||||
"loading-events": "Loading Events",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipe": "Φόρτωση συνταγών...",
|
||||
"loading-ocr-data": "Φόρτωση δεδομένων OCR...",
|
||||
"loading-recipes": "Φόρτωση Συνταγών",
|
||||
"message": "Μήνυμα",
|
||||
"monday": "Δευτέρα",
|
||||
@@ -128,7 +130,7 @@
|
||||
"no-recipe-found": "Δεν βρέθηκαν συνταγές",
|
||||
"ok": "ΟΚ",
|
||||
"options": "Επιλογές:",
|
||||
"plural-name": "Plural Name",
|
||||
"plural-name": "Ονομα στον πληθυντικό",
|
||||
"print": "Εκτύπωση",
|
||||
"print-preferences": "Προτιμήσεις Εκτύπωσης",
|
||||
"random": "Τυχαίο",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Αποθήκευση",
|
||||
"settings": "Ρυθμίσεις",
|
||||
"share": "Κοινοποίηση",
|
||||
"show-all": "Προβολή Ολων",
|
||||
"shuffle": "Τυχαία",
|
||||
"sort": "Ταξινόμηση",
|
||||
"sort-ascending": "Αύξουσα Ταξινόμηση",
|
||||
"sort-descending": "Φθίνουσα Ταξινόμηση",
|
||||
"sort-alphabetically": "Αλφαβητική",
|
||||
"status": "Κατάσταση",
|
||||
"subject": "Θέμα",
|
||||
"submit": "Υποβολή",
|
||||
"success-count": "Επιτυχία: {count}",
|
||||
"sunday": "Κυριακή",
|
||||
"system": "Σύστημα",
|
||||
"templates": "Πρότυπα:",
|
||||
"test": "Δοκιμή",
|
||||
"themes": "Θέματα",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Μονάδες",
|
||||
"back": "Πίσω",
|
||||
"next": "Επόμενο",
|
||||
"start": "Start",
|
||||
"toggle-view": "Εναλλαγή προβολής",
|
||||
"date": "Ημερομηνία",
|
||||
"id": "Αναγνωριστικό",
|
||||
@@ -178,19 +185,19 @@
|
||||
"menu": "Μενού",
|
||||
"a-name-is-required": "Απαιτείται όνομα",
|
||||
"delete-with-name": "Διαγραφή {name}",
|
||||
"confirm-delete-generic-with-name": "Σίγουρα θέλετε να διαγράψετε το εξής: {name};",
|
||||
"confirm-delete-generic-with-name": "Θέλετε σίγουρα να διαγράψετε το εξής: {name};",
|
||||
"confirm-delete-own-admin-account": "Παρακαλώ σημειώστε ότι προσπαθείτε να διαγράψετε το δικό σας λογαριασμό διαχειριστή! Αυτή η ενέργεια δεν μπορεί να αναιρεθεί και θα διαγράψει οριστικά τον λογαριασμό σας;",
|
||||
"organizer": "Μηχανισμός οργάνωσης",
|
||||
"transfer": "Μεταφορά",
|
||||
"copy": "Αντιγραφή",
|
||||
"color": "Χρώμα",
|
||||
"timestamp": "Χρονική σήμανση",
|
||||
"last-made": "Τελευταία Δημιουργία",
|
||||
"last-made": "Τελευταία παρασκευή",
|
||||
"learn-more": "Μάθετε Περισσότερα",
|
||||
"this-feature-is-currently-inactive": "Αυτή η λειτουργία είναι αυτή τη στιγμή απενεργοποιημένη",
|
||||
"clipboard-not-supported": "Δεν υποστηρίζεται το πρόχειρο",
|
||||
"copied-to-clipboard": "Αντιγράφηκε στο πρόχειρο",
|
||||
"your-browser-does-not-support-clipboard": "Your browser does not support clipboard",
|
||||
"your-browser-does-not-support-clipboard": "Το πρόγραμμα περιήγησής σας δεν υποστηρίζει πρόχειρο",
|
||||
"copied-items-to-clipboard": "Κανένα στοιχείο δεν αντιγράφηκε στο πρόχειρο| Ένα στοιχείο αντιγράφηκε στο πρόχειρο|Αντιγράφηκαν {count} στοιχεία στο πρόχειρο",
|
||||
"actions": "Ενέργειες",
|
||||
"selected-count": "Επιλεγμένα: {count}",
|
||||
@@ -198,12 +205,12 @@
|
||||
"refresh": "Ανανέωση",
|
||||
"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.",
|
||||
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||
"unsaved-changes": "Εχετε μη αποθηκευμένες αλλαγές. Θέλετε να κάνετε αποθήκευση πριν από την αποχώρηση; Εντάξει για αποθήκευση, Ακυρο για απόρριψη των αλλαγών.",
|
||||
"clipboard-copy-failure": "Η αντιγραφή στο πρόχειρο απέτυχε.",
|
||||
"confirm-delete-generic-items": "Θέλετε σίγουρα να διαγράψετε τα ακόλουθα αντικείμενα;"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό τον ασφαλή σύνδεσμο <b>{groupName}<b/>;",
|
||||
"are-you-sure-you-want-to-delete-the-group": "Θέλετε σίγουρα να διαγράψετε αυτό τον ασφαλή σύνδεσμο <b>{groupName}<b/>;",
|
||||
"cannot-delete-default-group": "Δεν μπορείς να διαγράψεις την προεπιλεγμένη ομάδα",
|
||||
"cannot-delete-group-with-users": "Δεν είναι δυνατή η διαγραφή ομάδας με χρήστες",
|
||||
"confirm-group-deletion": "Επιβεβαίωση Διαγραφής Ομάδας",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Προτιμήσεις Ομάδας",
|
||||
"private-group": "Ιδιωτική Ομάδα",
|
||||
"private-group-description": "Setting your group to private will default all public view options to default. This overrides an individual recipes public view settings.",
|
||||
"enable-public-access": "Ενεργοποίηση Δημόσιας Πρόσβασης",
|
||||
"enable-public-access-description": "Make group recipes public by default, and allow visitors to view recipes without logging-in",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Allow users outside of your group to see your recipes",
|
||||
"allow-users-outside-of-your-group-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 group or with a pre-generated private link",
|
||||
"show-nutrition-information": "Εμφάνιση διατροφικών πληροφοριών",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Recipe Data Migrations",
|
||||
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "Choose Migration Type",
|
||||
"tag-all-recipes": "Tag all recipes with {tag-name} tag",
|
||||
"nextcloud-text": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below",
|
||||
"chowdown-text": "Το Mealie υποστηρίζει εγγενώς τη μορφή αποθετηρίου. Κατεβάστε το αποθετήριο κώδικα ως αρχείο .zip και ανεβάστε το παρακάτω.",
|
||||
"recipe-1": "Recipe 1",
|
||||
"recipe-2": "Recipe 2",
|
||||
"paprika-text": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.",
|
||||
@@ -360,12 +370,16 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie can import recipies from Plan to Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "Κιβώτιο Συνταγών",
|
||||
"description-long": "Το Mealie μπορεί να εισάγει συνταγές από το Κουτί Συνταγών. Εξάγετε τις συνταγές σας σε μορφή CSV, στη συνέχεια, ανεβάστε το αρχείο .csv παρακάτω."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
"bulk-add": "Μαζική Προσθήκη",
|
||||
"error-details": "Μόνο ιστοσελίδες που περιέχουν ld+json ή μικροδεδομένα μπορούν να εισαχθούν από την Mealie. Οι πιο σημαντικές ιστοσελίδες συνταγών υποστηρίζουν αυτή τη δομή δεδομένων. Αν το site σας δεν μπορεί να εισαχθεί, αλλά υπάρχουν δεδομένα json στο αρχείο καταγραφής, παρακαλούμε να υποβάλετε ένα github πρόβλημα με το URL και τα δεδομένα.",
|
||||
"error-title": "Φαίνεται Όπως Δεν Μπορούσαμε Να βρούμε Οτιδήποτε",
|
||||
"error-title": "Φαίνεται πως δεν μπορέσαμε να βρούμε τίποτα",
|
||||
"from-url": "Εισαγωγή συνταγής",
|
||||
"github-issues": "Σφάλματα GitHub",
|
||||
"google-ld-json-info": "Google ld+json Info",
|
||||
@@ -377,9 +391,9 @@
|
||||
"upload-individual-zip-file": "Ανεβάστε ένα μεμονωμένο αρχείο .zip που εξάγεται από μια άλλη περίπτωση Mealie.",
|
||||
"url-form-hint": "Αντιγράψτε και επικολλήστε έναν σύνδεσμο από την αγαπημένη σας ιστοσελίδα συνταγών",
|
||||
"view-scraped-data": "Προβολή Παραγόμενων Δεδομένων",
|
||||
"trim-whitespace-description": "Περικοπή αιχμής και διαδρομής κενών καθώς και κενών γραμμών",
|
||||
"trim-whitespace-description": "Περικοπή κενών στην αρχή και το τέλος καθώς και των κενών γραμμών",
|
||||
"trim-prefix-description": "Περικοπή πρώτου χαρακτήρα από κάθε γραμμή",
|
||||
"split-by-numbered-line-description": "Προσπάθεια για χωρισμό μιας παραγράφου ταιριάζοντας μοτίβα '1)' ή '1'",
|
||||
"split-by-numbered-line-description": "Προσπάθεια για χωρισμό μιας παραγράφου ταιριάζοντας μοτίβα '1)' ή '1.'",
|
||||
"import-by-url": "Import a recipe by URL",
|
||||
"create-manually": "Create a recipe manually",
|
||||
"make-recipe-image": "Make this the recipe image"
|
||||
@@ -401,7 +415,7 @@
|
||||
},
|
||||
"recipe": {
|
||||
"add-key": "Προσθήκη Κλειδιού",
|
||||
"add-to-favorites": "Προσθήκη στα αγαπημένα",
|
||||
"add-to-favorites": "Προσθήκη στα Aγαπημένα",
|
||||
"api-extras": "API Extras",
|
||||
"calories": "Θερμίδες",
|
||||
"calories-suffix": "θερμίδες",
|
||||
@@ -410,7 +424,7 @@
|
||||
"comment-action": "Σχόλιο",
|
||||
"comment": "Comment",
|
||||
"comments": "Σχόλια",
|
||||
"delete-confirmation": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτή τη συνταγή;",
|
||||
"delete-confirmation": "Θέλετε σίγουρα να διαγράψετε αυτή τη συνταγή;",
|
||||
"delete-recipe": "Διαγραφή Συνταγής",
|
||||
"description": "Περιγραφή",
|
||||
"disable-amount": "Απενεργοποίηση Ποσών Συστατικών",
|
||||
@@ -435,7 +449,7 @@
|
||||
"nutrition": "Διατροφή",
|
||||
"object-key": "Κλειδί Αντικειμένου",
|
||||
"object-value": "Τιμή αντικειμένου",
|
||||
"original-url": "Αρχική URL",
|
||||
"original-url": "Αρχική διεύθυνση URL",
|
||||
"perform-time": "Χρόνος Μαγειρέματος",
|
||||
"prep-time": "Χρόνος Προετοιμασίας",
|
||||
"protein-content": "Πρωτεΐνες",
|
||||
@@ -471,7 +485,7 @@
|
||||
"date-format-hint-yyyy-mm-dd": "YYYY-MM-DD format",
|
||||
"add-to-list": "Add to List",
|
||||
"add-to-plan": "Add to Plan",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"add-to-timeline": "Προσθήκη στο χρονοδιάγραμμα",
|
||||
"recipe-added-to-list": "Recipe added to list",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"successfully-added-to-list": "Successfully added to list",
|
||||
@@ -482,7 +496,7 @@
|
||||
"yield": "Yield",
|
||||
"quantity": "Quantity",
|
||||
"choose-unit": "Choose Unit",
|
||||
"press-enter-to-create": "Press Enter to Create",
|
||||
"press-enter-to-create": "Πατήστε Enter για δημιουργία",
|
||||
"choose-food": "Choose Food",
|
||||
"notes": "Notes",
|
||||
"toggle-section": "Toggle Section",
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Cook Mode",
|
||||
"link-ingredients": "Link Ingredients",
|
||||
"merge-above": "Merge Above",
|
||||
"move-to-bottom": "Move To Bottom",
|
||||
"move-to-top": "Move To Top",
|
||||
"reset-scale": "Reset Scale",
|
||||
"decrease-scale-label": "Decrease Scale by 1",
|
||||
"increase-scale-label": "Increase Scale by 1",
|
||||
@@ -506,29 +522,32 @@
|
||||
"resume-timer": "Resume Timer",
|
||||
"stop-timer": "Stop Timer"
|
||||
},
|
||||
"edit-timeline-event": "Edit Timeline Event",
|
||||
"timeline": "Timeline",
|
||||
"timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!",
|
||||
"edit-timeline-event": "Επεξεργασία συμβάντος χρονοδιαγράμματος",
|
||||
"timeline": "Χρονοδιάγραμμα",
|
||||
"timeline-is-empty": "Δεν υπάρχει τίποτα ακόμα στο χρονοδιάγραμμα. Δοκιμάστε να κάνετε αυτή τη συνταγή!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} Global Timeline",
|
||||
"open-timeline": "Open Timeline",
|
||||
"made-this": "I Made This",
|
||||
"open-timeline": "Ανοιγμα χρονοδιαγράμματος",
|
||||
"made-this": "Το έφτιαξα",
|
||||
"how-did-it-turn-out": "How did it turn out?",
|
||||
"user-made-this": "{user} made this",
|
||||
"last-made-date": "Last Made {date}",
|
||||
"user-made-this": "Ο/η {user} το έφτιαξε αυτό",
|
||||
"last-made-date": "Τελευταία παρασκευή {date}",
|
||||
"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": "Message Key",
|
||||
"parse": "Parse",
|
||||
"parse": "Ανάλυση",
|
||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||
"drop-image": "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": "Parse ingredients",
|
||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Δεν είναι δυνατή η ανάλυση συνταγών με καθορισμένες μονάδες ή φαγητά.",
|
||||
"parse-ingredients": "Ανάλυση συστατικών",
|
||||
"edit-markdown": "Edit Markdown",
|
||||
"recipe-creation": "Recipe Creation",
|
||||
"select-one-of-the-various-ways-to-create-a-recipe": "Select one of the various ways to create a recipe",
|
||||
"looking-for-migrations": "Looking For Migrations?",
|
||||
"import-with-url": "Import with URL",
|
||||
"create-recipe": "Create Recipe",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
@@ -575,11 +594,11 @@
|
||||
"has-all": "Has All",
|
||||
"results": "Αποτελέσματα",
|
||||
"search": "Αναζήτηση",
|
||||
"search-mealie": "Αναζήτηση Mealie (πατήστε /)",
|
||||
"search-mealie": "Αναζήτηση στο Mealie (πατήστε /)",
|
||||
"search-placeholder": "Αναζήτηση...",
|
||||
"tag-filter": "Φίλτρο Ετικέτας",
|
||||
"search-hint": "Press '/'",
|
||||
"advanced": "Advanced",
|
||||
"search-hint": "Πατήστε '/'",
|
||||
"advanced": "Για προχωρημένους",
|
||||
"auto-search": "Auto Search",
|
||||
"no-results": "No results found"
|
||||
},
|
||||
@@ -588,18 +607,18 @@
|
||||
"admin-settings": "Ρυθμίσεις Διαχειριστή",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created-at-response-export_path": "Αντίγραφο ασφαλείας αποθηκεύτηκαν στο: {path}",
|
||||
"backup-deleted": "Το Αντίγραφο διαγράφηκε",
|
||||
"backup-created-at-response-export_path": "Δημιουργήθηκε αντίγραφο ασφαλείας στο: {path}",
|
||||
"backup-deleted": "Το αντίγραφο ασφαλείας διαγράφηκε",
|
||||
"restore-success": "Restore successful",
|
||||
"backup-tag": "Αντίγραφο Ετικέτας",
|
||||
"backup-tag": "Ετικέτα Αντιγράφου Ασφαλείας",
|
||||
"create-heading": "Δημιουργία αντιγράφου ασφαλείας",
|
||||
"delete-backup": "Διαγραφή Αντιγράφου Ασφαλείας",
|
||||
"error-creating-backup-see-log-file": "Σφάλμα Δημιουργίας Αντιγράφου Ασφαλείας. Δείτε Το Αρχείο Καταγραφής",
|
||||
"full-backup": "Πλήρες αντίγραφο ασφαλείας",
|
||||
"full-backup": "Πλήρης Αντίγραφο Ασφαλείας",
|
||||
"import-summary": "Εισαγωγή Περίληψης",
|
||||
"partial-backup": "Μερικό Αντίγραφο Ασφαλείας",
|
||||
"unable-to-delete-backup": "Αδυναμία διαγραφής αντιγράφου ασφαλείας.",
|
||||
"experimental-description": "Backups a total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think off this as a snapshot of Mealie at a specific time. Currently, {not-crossed-version} (data migrations are not done automatically). These serve as a database agnostic way to export and import data or backup the site to an external location.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"backup-restore": "Backup Restore",
|
||||
"back-restore-description": "Restoring this backup will overwrite all the current data in your database and in the data directory and replace them with the contents of this backup. {cannot-be-undone} If the restoration is successful, you will be logged out.",
|
||||
"cannot-be-undone": "This action cannot be undone - use with caution.",
|
||||
@@ -641,14 +660,14 @@
|
||||
"site-settings": "Ρυθμίσεις Ιστοσελίδας",
|
||||
"theme": {
|
||||
"accent": "Έμφαση",
|
||||
"dark": "Σκούρο",
|
||||
"dark": "Σκοτεινό",
|
||||
"default-to-system": "Προεπιλογή στο σύστημα",
|
||||
"error": "Σφάλμα",
|
||||
"error-creating-theme-see-log-file": "Σφάλμα δημιουργίας θέματος. Δείτε το αρχείο καταγραφής.",
|
||||
"error-deleting-theme": "Σφάλμα διαγραφής θέματος",
|
||||
"error-updating-theme": "Σφάλμα ενημέρωσης θέματος",
|
||||
"info": "Πληροφορίες",
|
||||
"light": "Ελαφρύ",
|
||||
"light": "Φωτεινό",
|
||||
"primary": "Πρωτεύον",
|
||||
"secondary": "Δευτερεύων",
|
||||
"success": "Επιτυχής",
|
||||
@@ -660,8 +679,8 @@
|
||||
"theme-saved": "Το Θέμα Αποθηκεύτηκε",
|
||||
"theme-updated": "Το θέμα ενημερώθηκε",
|
||||
"warning": "Προσοχή",
|
||||
"light-mode": "Light Mode",
|
||||
"dark-mode": "Dark Mode"
|
||||
"light-mode": "Φωτεινή Λειτουργία",
|
||||
"dark-mode": "Σκοτεινή Λειτουργία"
|
||||
},
|
||||
"token": {
|
||||
"active-tokens": "ΕΝΕΡΓΑ TOKENS",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.",
|
||||
"ldap-ready-success-text": "Required LDAP variables are all set.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Recipe Scraper Version"
|
||||
"recipe-scraper-version": "Recipe Scraper Version",
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
|
||||
"oidc-ready-success-text": "Required OIDC variables are all set."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Όλες οι λίστες",
|
||||
@@ -771,7 +793,7 @@
|
||||
"language": "Γλώσσα",
|
||||
"maintenance": "Maintenance",
|
||||
"background-tasks": "Background Tasks",
|
||||
"parser": "Parser",
|
||||
"parser": "Αναλυτής",
|
||||
"developer": "Developer",
|
||||
"cookbook": "Cookbook",
|
||||
"create-cookbook": "Create a new cookbook"
|
||||
@@ -801,18 +823,18 @@
|
||||
},
|
||||
"tool": {
|
||||
"tools": "Εργαλεία",
|
||||
"on-hand": "On Hand",
|
||||
"on-hand": "Το έχω στο χέρι",
|
||||
"create-a-tool": "Create a Tool",
|
||||
"tool-name": "Tool Name",
|
||||
"create-new-tool": "Create New Tool",
|
||||
"on-hand-checkbox-label": "Show as On Hand (Checked)",
|
||||
"required-tools": "Required Tools",
|
||||
"on-hand-checkbox-label": "Εμφάνιση ως Στο Χέρι (επιλεγμένο)",
|
||||
"required-tools": "Απαιτούμενα Εργαλεία",
|
||||
"tool": "Tool"
|
||||
},
|
||||
"user": {
|
||||
"admin": "Διαχειριστής",
|
||||
"are-you-sure-you-want-to-delete-the-link": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό τον ασφαλή σύνδεσμο <b>{link}<b/>;",
|
||||
"are-you-sure-you-want-to-delete-the-user": "Είστε βέβαιοι ότι θέλετε να διαγράψετε τον χρήστη <b>{activeName} ID: {activeId}<b/>;",
|
||||
"are-you-sure-you-want-to-delete-the-link": "Θέλετε σίγουρα να διαγράψετε αυτό τον ασφαλή σύνδεσμο <b>{link}<b/>;",
|
||||
"are-you-sure-you-want-to-delete-the-user": "Θέλετε σίγουρα να διαγράψετε τον χρήστη <b>{activeName} ID: {activeId}<b/>;",
|
||||
"auth-method": "Auth Method",
|
||||
"confirm-link-deletion": "Επιβεβαίωση διαγραφής",
|
||||
"confirm-password": "Επιβεβαίωση Κωδικού",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "Σύνδεσμος ID",
|
||||
"link-name": "Όνομα συνδέσμου",
|
||||
"login": "Σύνδεση",
|
||||
"login-oidc": "Login with",
|
||||
"or": "ή",
|
||||
"logout": "Αποσύνδεση",
|
||||
"manage-users": "Διαχείριση χρηστών",
|
||||
"manage-users-description": "Create and manage users.",
|
||||
"new-password": "Νέος Κωδικός",
|
||||
"new-user": "Νέος χρήστης",
|
||||
"password-has-been-reset-to-the-default-password": "Ο κωδικός πρόσβασης έχει επαναφερθεί στον προεπιλεγμένο κωδικό",
|
||||
@@ -842,7 +867,7 @@
|
||||
"password-updated": "Ο κωδικός πρόσβασης ενημερώθηκε",
|
||||
"password": "Κωδικός",
|
||||
"password-strength": "Ο κωδικός είναι {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"please-enter-password": "Παρακαλούμε εισάγετε το νέο κωδικό πρόσβασης.",
|
||||
"register": "Εγγραφή",
|
||||
"reset-password": "Επαναφορά Κωδικού",
|
||||
"sign-in": "Είσοδος",
|
||||
@@ -870,18 +895,18 @@
|
||||
"you-are-not-allowed-to-delete-this-user": "Δεν επιτρέπεται να διαγράψετε αυτόν τον χρήστη",
|
||||
"enable-advanced-content": "Ενεργοποίηση Προηγμένου Περιεχομένου",
|
||||
"enable-advanced-content-description": "Ενεργοποιεί προηγμένες λειτουργίες όπως κλιμάκωση συνταγής, κλειδιά API, Webhooks και διαχείριση δεδομένων. Μην ανησυχείτε, μπορείτε πάντα να το αλλάξετε αργότερα",
|
||||
"favorite-recipes": "Favorite Recipes",
|
||||
"favorite-recipes": "Αγαπημένες Συνταγές",
|
||||
"email-or-username": "Email or Username",
|
||||
"remember-me": "Remember Me",
|
||||
"please-enter-your-email-and-password": "Please enter your email and password",
|
||||
"invalid-credentials": "Invalid Credentials",
|
||||
"account-locked-please-try-again-later": "Account Locked. Please try again later",
|
||||
"user-favorites": "User Favorites",
|
||||
"user-favorites": "Αγαπημένα Χρήστη",
|
||||
"password-strength-values": {
|
||||
"weak": "Weak",
|
||||
"good": "Good",
|
||||
"strong": "Strong",
|
||||
"very-strong": "Very Strong"
|
||||
"weak": "Αδύναμος",
|
||||
"good": "Καλός",
|
||||
"strong": "Ισχυρός",
|
||||
"very-strong": "Πολύ Ισχυρός"
|
||||
},
|
||||
"user-management": "User Management",
|
||||
"reset-locked-users": "Reset Locked Users",
|
||||
@@ -890,13 +915,13 @@
|
||||
"user-details": "User Details",
|
||||
"user-name": "User Name",
|
||||
"authentication-method": "Authentication Method",
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"authentication-method-hint": "Αυτό καθορίζει τον τρόπο με τον οποίο ένας χρήστης θα ταυτοποιηθεί με το Mealie. Αν δεν είστε σίγουροι, επιλέξτε 'Mealie'",
|
||||
"permissions": "Permissions",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "User can invite other to group",
|
||||
"user-can-manage-group": "User can manage group",
|
||||
"user-can-organize-group-data": "User can organize group data",
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
"enable-advanced-features": "Ενεργοποίηση χαρακτηριστικών για προχωρημένους",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!",
|
||||
"forgot-password": "Forgot Password",
|
||||
@@ -943,8 +968,8 @@
|
||||
"unit-data": "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"
|
||||
},
|
||||
@@ -1002,7 +1027,7 @@
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
"user-registration": "Εγγραφή χρήστη",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "Join a Group",
|
||||
"create-a-new-group": "Create a New Group",
|
||||
@@ -1083,7 +1108,7 @@
|
||||
"admin": {
|
||||
"maintenance": {
|
||||
"storage-details": "Storage Details",
|
||||
"page-title": "Site Maintenance",
|
||||
"page-title": "Συντήρηση Ιστοσελίδας",
|
||||
"summary-title": "Summary",
|
||||
"button-label-get-summary": "Get Summary",
|
||||
"button-label-open-details": "Details",
|
||||
@@ -1125,11 +1150,21 @@
|
||||
"ingredient-text": "Ingredient Text",
|
||||
"average-confident": "{0} Confident",
|
||||
"try-an-example": "Try an example",
|
||||
"parser": "Parser",
|
||||
"parser": "Αναλυτής",
|
||||
"background-tasks": "Background Tasks",
|
||||
"background-tasks-description": "Here you can view all the running background tasks and their status",
|
||||
"no-logs-found": "No Logs Found",
|
||||
"tasks": "Tasks"
|
||||
"tasks": "Tasks",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Welcome, {0}",
|
||||
@@ -1145,7 +1180,7 @@
|
||||
"personal": "Personal",
|
||||
"personal-description": "These are settings that are personal to you. Changes here won't affect other users",
|
||||
"user-settings": "User Settings",
|
||||
"user-settings-description": "Manage your preferences, change your password, and update your email",
|
||||
"user-settings-description": "Διαχειριστείτε τις προτιμήσεις σας, αλλάξτε τον κωδικό πρόσβασής σας και ενημερώστε το email σας",
|
||||
"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",
|
||||
@@ -1163,8 +1198,8 @@
|
||||
"email-sent": "Email Sent",
|
||||
"error-sending-email": "Error Sending Email",
|
||||
"personal-information": "Personal Information",
|
||||
"preferences": "Preferences",
|
||||
"show-advanced-description": "Show advanced features (API Keys, Webhooks, and Data Management)",
|
||||
"preferences": "Προτιμήσεις",
|
||||
"show-advanced-description": "Εμφάνιση χαρακτηριστικών για προχωρημένους (Κλειδιά API, Webhooks, και Διαχείριση Δεδομένων)",
|
||||
"back-to-profile": "Back to Profile",
|
||||
"looking-for-privacy-settings": "Looking for Privacy Settings?",
|
||||
"manage-your-api-tokens": "Manage Your API Tokens",
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"add": "Add",
|
||||
"cancel": "Cancel",
|
||||
"clear": "Clear",
|
||||
"close": "Close",
|
||||
"confirm": "Confirm",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "Are you sure you want to delete this?",
|
||||
"copied_message": "Copied!",
|
||||
"create": "Create",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Save",
|
||||
"settings": "Settings",
|
||||
"share": "Share",
|
||||
"show-all": "Show All",
|
||||
"shuffle": "Shuffle",
|
||||
"sort": "Sort",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-alphabetically": "Alphabetical",
|
||||
"status": "Status",
|
||||
"subject": "Subject",
|
||||
"submit": "Submit",
|
||||
"success-count": "Success: {count}",
|
||||
"sunday": "Sunday",
|
||||
"system": "System",
|
||||
"templates": "Templates:",
|
||||
"test": "Test",
|
||||
"themes": "Themes",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Units",
|
||||
"back": "Back",
|
||||
"next": "Next",
|
||||
"start": "Start",
|
||||
"toggle-view": "Toggle View",
|
||||
"date": "Date",
|
||||
"id": "Id",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Group Preferences",
|
||||
"private-group": "Private Group",
|
||||
"private-group-description": "Setting your group to private will default all public view options to default. This overrides an individual recipes 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",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Allow users outside of your group to see your recipes",
|
||||
"allow-users-outside-of-your-group-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 group or with a pre-generated private link",
|
||||
"show-nutrition-information": "Show nutrition information",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Recipe Data Migrations",
|
||||
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "Choose Migration Type",
|
||||
"tag-all-recipes": "Tag all recipes with {tag-name} tag",
|
||||
"nextcloud-text": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "Recipe 1",
|
||||
"recipe-2": "Recipe 2",
|
||||
"paprika-text": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie can import recipies from Plan to Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Cook Mode",
|
||||
"link-ingredients": "Link Ingredients",
|
||||
"merge-above": "Merge Above",
|
||||
"move-to-bottom": "Move To Bottom",
|
||||
"move-to-top": "Move To Top",
|
||||
"reset-scale": "Reset Scale",
|
||||
"decrease-scale-label": "Decrease Scale by 1",
|
||||
"increase-scale-label": "Increase Scale by 1",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "Edit Timeline Event",
|
||||
"timeline": "Timeline",
|
||||
"timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} Global Timeline",
|
||||
"open-timeline": "Open Timeline",
|
||||
"made-this": "I Made This",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Looking For Migrations?",
|
||||
"import-with-url": "Import with URL",
|
||||
"create-recipe": "Create Recipe",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Import Summary",
|
||||
"partial-backup": "Partial Backup",
|
||||
"unable-to-delete-backup": "Unable to Delete Backup.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think off this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"backup-restore": "Backup Restore",
|
||||
"back-restore-description": "Restoring this backup will overwrite all the current data in your database and in the data directory and replace them with the contents of this backup. {cannot-be-undone} If the restoration is successful, you will be logged out.",
|
||||
"cannot-be-undone": "This action cannot be undone - use with caution.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.",
|
||||
"ldap-ready-success-text": "Required LDAP variables are all set.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Recipe Scraper Version"
|
||||
"recipe-scraper-version": "Recipe Scraper Version",
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
|
||||
"oidc-ready-success-text": "Required OIDC variables are all set."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "All Lists",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "Link ID",
|
||||
"link-name": "Link Name",
|
||||
"login": "Login",
|
||||
"login-oidc": "Login with",
|
||||
"or": "or",
|
||||
"logout": "Logout",
|
||||
"manage-users": "Manage Users",
|
||||
"manage-users-description": "Create and manage users.",
|
||||
"new-password": "New Password",
|
||||
"new-user": "New User",
|
||||
"password-has-been-reset-to-the-default-password": "Password has been reset to the default password",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Background Tasks",
|
||||
"background-tasks-description": "Here you can view all the running background tasks and their status",
|
||||
"no-logs-found": "No Logs Found",
|
||||
"tasks": "Tasks"
|
||||
"tasks": "Tasks",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Welcome, {0}",
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"add": "Add",
|
||||
"cancel": "Cancel",
|
||||
"clear": "Clear",
|
||||
"close": "Close",
|
||||
"confirm": "Confirm",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "Are you sure you want to delete this?",
|
||||
"copied_message": "Copied!",
|
||||
"create": "Create",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Save",
|
||||
"settings": "Settings",
|
||||
"share": "Share",
|
||||
"show-all": "Show All",
|
||||
"shuffle": "Shuffle",
|
||||
"sort": "Sort",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-alphabetically": "Alphabetical",
|
||||
"status": "Status",
|
||||
"subject": "Subject",
|
||||
"submit": "Submit",
|
||||
"success-count": "Success: {count}",
|
||||
"sunday": "Sunday",
|
||||
"system": "System",
|
||||
"templates": "Templates:",
|
||||
"test": "Test",
|
||||
"themes": "Themes",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Units",
|
||||
"back": "Back",
|
||||
"next": "Next",
|
||||
"start": "Start",
|
||||
"toggle-view": "Toggle View",
|
||||
"date": "Date",
|
||||
"id": "Id",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Group Preferences",
|
||||
"private-group": "Private Group",
|
||||
"private-group-description": "Setting your group to private will default all public view options to default. This overrides an individual recipes 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",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Allow users outside of your group to see your recipes",
|
||||
"allow-users-outside-of-your-group-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 group or with a pre-generated private link",
|
||||
"show-nutrition-information": "Show nutrition information",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Recipe Data Migrations",
|
||||
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "Choose Migration Type",
|
||||
"tag-all-recipes": "Tag all recipes with {tag-name} tag",
|
||||
"nextcloud-text": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "Recipe 1",
|
||||
"recipe-2": "Recipe 2",
|
||||
"paprika-text": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie can import recipies from Plan to Eat."
|
||||
},
|
||||
"myrecipebox" : {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Cook Mode",
|
||||
"link-ingredients": "Link Ingredients",
|
||||
"merge-above": "Merge Above",
|
||||
"move-to-bottom": "Move To Bottom",
|
||||
"move-to-top": "Move To Top",
|
||||
"reset-scale": "Reset Scale",
|
||||
"decrease-scale-label": "Decrease Scale by 1",
|
||||
"increase-scale-label": "Increase Scale by 1",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "Edit Timeline Event",
|
||||
"timeline": "Timeline",
|
||||
"timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} Global Timeline",
|
||||
"open-timeline": "Open Timeline",
|
||||
"made-this": "I Made This",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Looking For Migrations?",
|
||||
"import-with-url": "Import with URL",
|
||||
"create-recipe": "Create Recipe",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Import Summary",
|
||||
"partial-backup": "Partial Backup",
|
||||
"unable-to-delete-backup": "Unable to Delete Backup.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think off this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"backup-restore": "Backup Restore",
|
||||
"back-restore-description": "Restoring this backup will overwrite all the current data in your database and in the data directory and replace them with the contents of this backup. {cannot-be-undone} If the restoration is successful, you will be logged out.",
|
||||
"cannot-be-undone": "This action cannot be undone - use with caution.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.",
|
||||
"ldap-ready-success-text": "Required LDAP variables are all set.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Recipe Scraper Version"
|
||||
"recipe-scraper-version": "Recipe Scraper Version",
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
|
||||
"oidc-ready-success-text": "Required OIDC variables are all set."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "All Lists",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "Link ID",
|
||||
"link-name": "Link Name",
|
||||
"login": "Login",
|
||||
"login-oidc": "Login with",
|
||||
"or": "or",
|
||||
"logout": "Logout",
|
||||
"manage-users": "Manage Users",
|
||||
"manage-users-description": "Create and manage users.",
|
||||
"new-password": "New Password",
|
||||
"new-user": "New User",
|
||||
"password-has-been-reset-to-the-default-password": "Password has been reset to the default password",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Background Tasks",
|
||||
"background-tasks-description": "Here you can view all the running background tasks and their status",
|
||||
"no-logs-found": "No Logs Found",
|
||||
"tasks": "Tasks"
|
||||
"tasks": "Tasks",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Welcome, {0}",
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
"database-url": "URL de base de datos",
|
||||
"default-group": "Grupo Predeterminado",
|
||||
"demo": "Versión Demo",
|
||||
"demo-status": "Estado Demo",
|
||||
"demo-status": "Modo Demo",
|
||||
"development": "Desarrollo",
|
||||
"docs": "Documentación",
|
||||
"download-log": "Descargar Log",
|
||||
"download-recipe-json": "Último JSON recuperado",
|
||||
"download-recipe-json": "Último JSON extraído",
|
||||
"github": "Github",
|
||||
"log-lines": "Líneas de registro",
|
||||
"not-demo": "No Demo",
|
||||
@@ -33,7 +33,7 @@
|
||||
"pdf": "PDF",
|
||||
"recipe": "Receta",
|
||||
"show-assets": "Mostrar recursos",
|
||||
"error-submitting-form": "Se ha producido un error al enviar el formulario"
|
||||
"error-submitting-form": "Error al enviar el formulario"
|
||||
},
|
||||
"category": {
|
||||
"categories": "Categorías",
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Eventos de receta"
|
||||
},
|
||||
"general": {
|
||||
"add": "Add",
|
||||
"cancel": "Cancelar",
|
||||
"clear": "Eliminar",
|
||||
"close": "Cerrar",
|
||||
"confirm": "Confirmar",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "¿Estás seguro de que quieres eliminarlo?",
|
||||
"copied_message": "¡Copiado!",
|
||||
"create": "Crear",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Guardar",
|
||||
"settings": "Ajustes",
|
||||
"share": "Compartir",
|
||||
"show-all": "Show All",
|
||||
"shuffle": "Aleatorio",
|
||||
"sort": "Ordenar",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-alphabetically": "Alfabéticamente",
|
||||
"status": "Estado",
|
||||
"subject": "Asunto",
|
||||
"submit": "Enviar",
|
||||
"success-count": "Éxito: {count}",
|
||||
"sunday": "Domingo",
|
||||
"system": "System",
|
||||
"templates": "Plantillas:",
|
||||
"test": "Prueba",
|
||||
"themes": "Temas",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Unidades",
|
||||
"back": "Volver",
|
||||
"next": "Siguiente",
|
||||
"start": "Start",
|
||||
"toggle-view": "Cambiar vista",
|
||||
"date": "Fecha",
|
||||
"id": "Id",
|
||||
@@ -200,7 +207,7 @@
|
||||
"created-on-date": "Creado el {0}",
|
||||
"unsaved-changes": "Tienes cambios sin guardar. ¿Quieres guardar antes de salir? Aceptar para guardar, Cancelar para descartar cambios.",
|
||||
"clipboard-copy-failure": "No se pudo copiar al portapapeles.",
|
||||
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||
"confirm-delete-generic-items": "¿Estás seguro que quieres eliminar los siguientes elementos?"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Por favor, confirma que deseas eliminar <b>{groupName}<b/>",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Preferencias de grupo",
|
||||
"private-group": "Grupo privado",
|
||||
"private-group-description": "Establecer el grupo como privado, cambiará todas las opciones de visualización a las opciones predeterminadas. Puede cambiarse individualmente en la configuración de cada receta.",
|
||||
"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",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Permite a los usuarios fuera de tu grupo ver tus recetas",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Cuando esté habilitado, puede utilizar un enlace público para compartir recetas específicas sin autorizar al usuario. Cuando está desactivado, sólo puedes compartir recetas con usuarios que estén en tu grupo o generando un enlace privado de forma previa",
|
||||
"show-nutrition-information": "Mostrar la información nutricional",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Migración de recetas",
|
||||
"recipe-data-migrations-explanation": "Las recetas pueden migrarse desde otra aplicación soportada a Mealie. Esta es una excelente manera de empezar con Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "Elegir tipo de migración",
|
||||
"tag-all-recipes": "Etiqueta todas las recetas con la etiqueta {tag-name}",
|
||||
"nextcloud-text": "Las recetas Nextcloud se pueden importar desde un archivo zip que contiene los datos almacenados en Nextcloud. Consulte la estructura de carpetas de ejemplo a continuación para asegurarse de que sus recetas pueden ser importadas.",
|
||||
"chowdown-text": "Mealie soporta nativamente el formato de repositorio chowdown. Descarga el código del repositorio como un archivo .zip y súbelo a continuación",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "Receta 1",
|
||||
"recipe-2": "Receta 2",
|
||||
"paprika-text": "Mealie puede importar recetas de la aplicación Paprika. Exporta tus recetas de paprika, renombra la extensión del fichero a .zip y súbelo a continuación.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie puede importar recetas de Plan a Comer."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Modo Cocinar",
|
||||
"link-ingredients": "Vincular ingredientes",
|
||||
"merge-above": "Combinar por encima",
|
||||
"move-to-bottom": "Mover al fondo",
|
||||
"move-to-top": "Move To Top",
|
||||
"reset-scale": "Reiniciar",
|
||||
"decrease-scale-label": "Disminuir escala en 1",
|
||||
"increase-scale-label": "Aumentar escala en 1",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "Editar evento en la cronología",
|
||||
"timeline": "Cronología",
|
||||
"timeline-is-empty": "Aún no hay nada en la línea de tiempo. ¡Intenta hacer esta receta!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "Línea de tiempo global de {groupName}",
|
||||
"open-timeline": "Abrir línea de tiempo",
|
||||
"made-this": "Lo hice",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "¿Buscas las Migraciones?",
|
||||
"import-with-url": "Importar por url",
|
||||
"create-recipe": "Crear receta",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Importar desde .zip",
|
||||
"create-recipe-from-an-image": "Crear receta a partir de una imagen",
|
||||
"bulk-url-import": "Importación masiva desde URL",
|
||||
@@ -599,9 +618,9 @@
|
||||
"import-summary": "Importar resumen",
|
||||
"partial-backup": "Copia de seguridad parcial",
|
||||
"unable-to-delete-backup": "No se puede eliminar la copia de seguridad.",
|
||||
"experimental-description": "Backups a total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think off this as a snapshot of Mealie at a specific time. Currently, {not-crossed-version} (data migrations are not done automatically). These serve as a database agnostic way to export and import data or backup the site to an external location.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"backup-restore": "Restaurar Copia de Seguridad",
|
||||
"back-restore-description": "Restoring this backup will overwrite all the current data in your database and in the data directory and replace them with the contents of this backup. {cannot-be-undone} If the restoration is successful, you will be logged out.",
|
||||
"back-restore-description": "Restaurar esta copia de seguridad sobrescribirá todos los datos actuales de su base de datos y del directorio de datos y los sustituirá por el contenido de esta copia. {cannot-be-undone} Si la restauración se realiza correctamente, se cerrará su sesión.",
|
||||
"cannot-be-undone": "Esta acción no se puede deshacer, use con precaución.",
|
||||
"postgresql-note": "Si estás usando PostGreSQL, por favor revisa el {backup-restore-process} antes de restaurar.",
|
||||
"backup-restore-process-in-the-documentation": "copia de seguridad/proceso de restauración en la documentación",
|
||||
@@ -723,8 +742,11 @@
|
||||
"ldap-ready": "LDAP Listo",
|
||||
"ldap-ready-error-text": "No todos los valores LDAP están configurados. Esto puede ignorarse si no está usando autenticación LDAP.",
|
||||
"ldap-ready-success-text": "Las variables LDAP requeridas están todas definidas.",
|
||||
"build": "Compilar",
|
||||
"recipe-scraper-version": "Versión de Analizador de Recetas"
|
||||
"build": "Compilación",
|
||||
"recipe-scraper-version": "Versión de Analizador de Recetas",
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
|
||||
"oidc-ready-success-text": "Required OIDC variables are all set."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Todas las listas",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "ID del enlace",
|
||||
"link-name": "Nombre del enlace",
|
||||
"login": "Iniciar sesión",
|
||||
"login-oidc": "Login with",
|
||||
"or": "or",
|
||||
"logout": "Cerrar Sesión",
|
||||
"manage-users": "Administrar usuarios",
|
||||
"manage-users-description": "Create and manage users.",
|
||||
"new-password": "Nueva contraseña",
|
||||
"new-user": "Nuevo usuario",
|
||||
"password-has-been-reset-to-the-default-password": "La contraseña se ha restablecido a su valor por defecto",
|
||||
@@ -962,9 +987,9 @@
|
||||
"settings-chosen-explanation": "Los ajustes seleccionados aquí, excluyendo la opción bloqueada, se aplicarán a todas las recetas seleccionadas.",
|
||||
"selected-length-recipe-s-settings-will-be-updated": "Se actualizarán los ajustes de {count} receta(s).",
|
||||
"recipe-data": "Datos de la receta",
|
||||
"recipe-data-description": "Use this section to manage the data associated with your recipes. You can perform several bulk actions on your recipes including exporting, deleting, tagging, and assigning categories.",
|
||||
"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.",
|
||||
"recipe-data-description": "Utiliza esta sección para gestionar los datos asociados a tus recetas. Puedes realizar varias acciones de forma masiva en tus recetas, como exportar, eliminar, etiquetar y asignar categorías.",
|
||||
"recipe-columns": "Columnas de Recetas",
|
||||
"data-exports-description": "Esta sección proporciona enlaces a las exportaciones disponibles listas para descargar. Estas exportaciones caducan, así que asegúrate de descargarlas mientras estén disponibles.",
|
||||
"data-exports": "Exportación de datos",
|
||||
"tag": "Etiqueta",
|
||||
"categorize": "Clasificar",
|
||||
@@ -973,14 +998,14 @@
|
||||
"categorize-recipes": "Categorizar recetas",
|
||||
"export-recipes": "Exportar recetas",
|
||||
"delete-recipes": "Borrar Recetas",
|
||||
"source-unit-will-be-deleted": "Source Unit will be deleted"
|
||||
"source-unit-will-be-deleted": "Se eliminará la unidad de origen"
|
||||
},
|
||||
"create-alias": "Crear un Alias",
|
||||
"manage-aliases": "Administrar Alias",
|
||||
"seed-data": "Datos de ejemplo",
|
||||
"seed": "Semilla",
|
||||
"data-management": "Data Management",
|
||||
"data-management-description": "Select which data set you want to make changes to.",
|
||||
"data-management": "Gestión de Datos",
|
||||
"data-management-description": "Selecciona el conjunto de datos al que deseas hacer cambios.",
|
||||
"select-data": "Seleccionar datos",
|
||||
"select-language": "Seleccionar idioma",
|
||||
"columns": "Columnas",
|
||||
@@ -1003,7 +1028,7 @@
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Registro de usuario",
|
||||
"registration-success": "Registration Success",
|
||||
"registration-success": "Registrado con éxito",
|
||||
"join-a-group": "Unirse a un grupo",
|
||||
"create-a-new-group": "Crear un grupo nuevo",
|
||||
"provide-registration-token-description": "Por favor, proporcione el token de registro asociado con el grupo al que desea unirse. Necesitará obtenerlo de un miembro del grupo.",
|
||||
@@ -1050,57 +1075,57 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Editor de OCR",
|
||||
"toolbar": "Toolbar",
|
||||
"toolbar": "Barra de Herramientas",
|
||||
"selection-mode": "Modo de selección",
|
||||
"pan-and-zoom-picture": "Desplazar y hacer zoom en la imagen",
|
||||
"split-text": "Split text",
|
||||
"preserve-line-breaks": "Preserve original line breaks",
|
||||
"split-by-block": "Split by text block",
|
||||
"flatten": "Flatten regardless of original formating",
|
||||
"split-text": "Dividir texto",
|
||||
"preserve-line-breaks": "Mantener los saltos de línea originales",
|
||||
"split-by-block": "División por bloques de texto",
|
||||
"flatten": "Acoplar independientemente del formato original",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "Selection Mode (default)",
|
||||
"selection-mode-desc": "The selection mode is the main mode that can be used to enter data:",
|
||||
"help": "Ayuda",
|
||||
"mouse-modes": "Modos de ratón",
|
||||
"selection-mode": "Modo selección (por defecto)",
|
||||
"selection-mode-desc": "El modo de selección es el modo principal que puede utilizarse para introducir datos:",
|
||||
"selection-mode-steps": {
|
||||
"draw": "Draw a rectangle on the text you want to select.",
|
||||
"draw": "Dibuja un rectángulo sobre el texto que deseas seleccionar.",
|
||||
"click": "Click on any field on the right and then click back on the rectangle above the image.",
|
||||
"result": "The selected text will appear inside the previously selected field."
|
||||
},
|
||||
"pan-and-zoom-mode": "Pan and Zoom Mode",
|
||||
"pan-and-zoom-mode": "Modo Panorámico y Zoom",
|
||||
"pan-and-zoom-desc": "Select pan and zoom by clicking the icon. This mode allows to zoom inside the image and move around to make using big images easier.",
|
||||
"split-text-mode": "Split Text modes",
|
||||
"split-text-mode": "Modos de división de texto",
|
||||
"split-modes": {
|
||||
"line-mode": "Line mode (default)",
|
||||
"line-mode": "Modo de línea (por defecto)",
|
||||
"line-mode-desc": "In line mode, the text will be propagated by keeping the original line breaks. This mode is useful when using bulk add on a list of ingredients where one ingredient is one line.",
|
||||
"block-mode": "Block mode",
|
||||
"block-mode-desc": "In block mode, the text will be split in blocks. This mode is useful when bulk adding instructions that are usually written in paragraphs.",
|
||||
"flat-mode": "Flat mode",
|
||||
"flat-mode-desc": "In flat mode, the text will be added to the selected recipe field with no line breaks."
|
||||
"block-mode": "Modo en bloque",
|
||||
"block-mode-desc": "En el modo de bloque, el texto se dividirá en bloques. Este modo es útil cuando se agregan instrucciones que están escritas en párrafos.",
|
||||
"flat-mode": "Modo texto sin formato",
|
||||
"flat-mode-desc": "En modo texto sin formato, el texto se añadirá al campo de la receta seleccionado sin saltos de línea."
|
||||
}
|
||||
}
|
||||
},
|
||||
"admin": {
|
||||
"maintenance": {
|
||||
"storage-details": "Storage Details",
|
||||
"page-title": "Site Maintenance",
|
||||
"summary-title": "Summary",
|
||||
"button-label-get-summary": "Get Summary",
|
||||
"storage-details": "Detalle del almacenamiento",
|
||||
"page-title": "Mantenimiento del sitio",
|
||||
"summary-title": "Índice",
|
||||
"button-label-get-summary": "Obtener Resumen",
|
||||
"button-label-open-details": "Detalles",
|
||||
"info-description-data-dir-size": "Data Directory Size",
|
||||
"info-description-log-file-size": "Log File Size",
|
||||
"info-description-cleanable-directories": "Cleanable Directories",
|
||||
"info-description-cleanable-images": "Cleanable Images",
|
||||
"info-description-data-dir-size": "Tamaño del directorio de datos",
|
||||
"info-description-log-file-size": "Tamaño del archivo de registro",
|
||||
"info-description-cleanable-directories": "Directorios eliminables",
|
||||
"info-description-cleanable-images": "Imágenes eliminables",
|
||||
"storage": {
|
||||
"title-temporary-directory": "Directorio temporal (.temp)",
|
||||
"title-backups-directory": "Backups Directory (backups)",
|
||||
"title-groups-directory": "Groups Directory (groups)",
|
||||
"title-recipes-directory": "Recipes Directory (recipes)",
|
||||
"title-user-directory": "User Directory (user)"
|
||||
"title-backups-directory": "Directorio de Copias de Seguridad (respaldos)",
|
||||
"title-groups-directory": "Directorio de Grupos (grupos)",
|
||||
"title-recipes-directory": "Directorio de Recetas (recetas)",
|
||||
"title-user-directory": "Directorio de usuario (usuario)"
|
||||
},
|
||||
"action-delete-log-files-name": "Delete Log Files",
|
||||
"action-delete-log-files-description": "Deletes all the log files",
|
||||
"action-clean-directories-name": "Clean Directories",
|
||||
"action-delete-log-files-name": "Borrar archivos de registro",
|
||||
"action-delete-log-files-description": "Elimina todos los archivos de registro",
|
||||
"action-clean-directories-name": "Limpiar directorios",
|
||||
"action-clean-directories-description": "Removes all the recipe folders that are not valid UUIDs",
|
||||
"action-clean-temporary-files-name": "Eliminar archivos temporales",
|
||||
"action-clean-temporary-files-description": "Eliminar todos los archivos y carpetas del directorio .temp",
|
||||
@@ -1119,8 +1144,8 @@
|
||||
"ingredients-natural-language-processor": "Ingredients Natural Language Processor",
|
||||
"ingredients-natural-language-processor-explanation": "Mealie uses Conditional Random Fields (CRFs) for parsing and processing ingredients. The model used for ingredients is based off a data set of over 100,000 ingredients from a dataset compiled by the New York Times. Note that as the model is trained in English only, you may have varied results when using the model in other languages. This page is a playground for testing the model.",
|
||||
"ingredients-natural-language-processor-explanation-2": "It's not perfect, but it yields great results in general and is a good starting point for manually parsing ingredients into individual fields. Alternatively, you can also use the \"Brute\" processor that uses a pattern matching technique to identify ingredients.",
|
||||
"nlp": "NLP",
|
||||
"brute": "Brute",
|
||||
"nlp": "PLN",
|
||||
"brute": "En bruto",
|
||||
"show-individual-confidence": "Mostrar confianza individual",
|
||||
"ingredient-text": "Texto del ingrediente",
|
||||
"average-confident": "{0} Confianza",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Tareas en Segundo Plano",
|
||||
"background-tasks-description": "Aquí puedes ver todas las tareas de fondo en ejecución y su estado",
|
||||
"no-logs-found": "No se encontraron registros",
|
||||
"tasks": "Tareas"
|
||||
"tasks": "Tareas",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Hola, {0}",
|
||||
@@ -1148,31 +1183,31 @@
|
||||
"user-settings-description": "Administrar preferencias, cambiar contraseña y actualizar correo electrónico",
|
||||
"api-tokens-description": "Administra tus API Tokens para acceder desde aplicaciones externas",
|
||||
"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": "Ajustes de grupo",
|
||||
"group-settings-description": "Manage your common group settings like mealplan and privacy settings.",
|
||||
"cookbooks-description": "Manage a collection of recipe categories and generate pages for them.",
|
||||
"members": "Members",
|
||||
"members-description": "See who's in your group and manage their permissions.",
|
||||
"members": "Miembros",
|
||||
"members-description": "Ver quién está en tu grupo y administrar sus permisos.",
|
||||
"webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.",
|
||||
"notifiers": "Notifiers",
|
||||
"notifiers": "Notificaciones",
|
||||
"notifiers-description": "Setup email and push notifications that trigger on specific events.",
|
||||
"manage-data": "Manage Data",
|
||||
"manage-data-description": "Manage your Food and Units (more options coming soon)",
|
||||
"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",
|
||||
"show-advanced-description": "Show advanced features (API Keys, Webhooks, and Data Management)",
|
||||
"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 User Profile",
|
||||
"manage-cookbooks": "Manage Cookbooks",
|
||||
"manage-data": "Administrar datos",
|
||||
"manage-data-description": "Administra tu Comida y Unidades (próximamente más opciones)",
|
||||
"data-migrations": "Migración de datos",
|
||||
"data-migrations-description": "Migrar tus datos existentes de otras aplicaciones como Nextcloud Recipes y Chowdown",
|
||||
"email-sent": "Email enviado",
|
||||
"error-sending-email": "Error enviando email",
|
||||
"personal-information": "Datos Personales",
|
||||
"preferences": "Preferencias",
|
||||
"show-advanced-description": "Mostrar características avanzadas (API Keys, Webhooks y Gestión de Datos)",
|
||||
"back-to-profile": "Volver al perfil",
|
||||
"looking-for-privacy-settings": "¿Buscas los ajustes de privacidad?",
|
||||
"manage-your-api-tokens": "Gestiona tus API tokens",
|
||||
"manage-user-profile": "Administrar Perfil de Usuario",
|
||||
"manage-cookbooks": "Administrar Recetario",
|
||||
"manage-members": "Gestionar miembros",
|
||||
"manage-webhooks": "Manage Webhooks",
|
||||
"manage-notifiers": "Manage Notifiers",
|
||||
"manage-webhooks": "Gestionar Webhooks",
|
||||
"manage-notifiers": "Administrar Notificadores",
|
||||
"manage-data-migrations": "Administrar Migraciones de Datos"
|
||||
},
|
||||
"cookbook": {
|
||||
@@ -1187,7 +1222,7 @@
|
||||
"require-all-tools": "Requiere todos los utensilios",
|
||||
"cookbook-name": "Nombre del recetario",
|
||||
"cookbook-with-name": "Recetario {0}",
|
||||
"create-a-cookbook": "Create a Cookbook",
|
||||
"cookbook": "Cookbook"
|
||||
"create-a-cookbook": "Crear Recetario",
|
||||
"cookbook": "Recetario"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"add": "Add",
|
||||
"cancel": "Peruuta",
|
||||
"clear": "Tyhjennä",
|
||||
"close": "Sulje",
|
||||
"confirm": "Vahvista",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "Haluatko varmasti poistaa tämän?",
|
||||
"copied_message": "Kopioitu!",
|
||||
"create": "Luo",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Tallenna",
|
||||
"settings": "Asetukset",
|
||||
"share": "Jaa",
|
||||
"show-all": "Show All",
|
||||
"shuffle": "Sekoita",
|
||||
"sort": "Järjestä",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-alphabetically": "Aakkosjärjestyksessä",
|
||||
"status": "Tila",
|
||||
"subject": "Aihe",
|
||||
"submit": "Lähetä",
|
||||
"success-count": "Onnistui: {count}",
|
||||
"sunday": "Sunnuntai",
|
||||
"system": "System",
|
||||
"templates": "Mallipohjat:",
|
||||
"test": "Testi",
|
||||
"themes": "Teemat",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Yksiköt",
|
||||
"back": "Takaisin",
|
||||
"next": "Seuraava",
|
||||
"start": "Start",
|
||||
"toggle-view": "Vaihda näkymää",
|
||||
"date": "Päivämäärä",
|
||||
"id": "Id",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Ryhmän oletusasetukset",
|
||||
"private-group": "Yksityinen ryhmä",
|
||||
"private-group-description": "Jos asetat ryhmäsi yksityiseksi, kaikki julkisen näkymän asetukset ovat oletusarvoisia. Tämä ohittaa yksittäisten reseptien julkisen näkymän asetukset.",
|
||||
"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",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Anna muiden kuin ryhmäsi jäsenten nähdä reseptisi",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Kun tämä on käytössä, voit käyttää julkista jakolinkkiä tiettyjen reseptien jakamiseen ilman käyttäjän valtuutusta. Kun se on poistettu käytöstä, voit jakaa reseptejä vain käyttäjien kanssa, jotka ovat ryhmässäsi tai joilla on ennalta luotu yksityinen linkki",
|
||||
"show-nutrition-information": "Näytä ravintotiedot",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Reseptien tietojen migraatiot",
|
||||
"recipe-data-migrations-explanation": "Reseptit voidaan siirtää toisesta tuetusta sovelluksesta Mealie -sovellukseen. Tämä on hyvä tapa päästä alkuun Mealiella.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "Valitse migraatiotyyppi",
|
||||
"tag-all-recipes": "Merkitse kaikki reseptit tunnisteella {tag-name}",
|
||||
"nextcloud-text": "Nextcloud reseptejä voidaan tuoda zip-tiedostosta, joka sisältää Nextcloudiin tallennetut tiedot. Katso esimerkkikansiorakenne alla varmistaaksesi, että reseptisi voidaan tuoda.",
|
||||
"chowdown-text": "Mealie tukee natiivisti chowdown arkiston muotoa. Lataa koodiarkisto .zip tiedostoksi ja lataa se alta",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "Resepti 1",
|
||||
"recipe-2": "Resepti 2",
|
||||
"paprika-text": "Mealie voi tuoda reseptejä Paprika-sovelluksesta. Vie reseptisi ohjelmasta ulos, nimeä tiedoston pääte uudelleen .zip ja lataa se alla.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealieen voi tuoda reseptejä Plan to Eat -sovelluksesta."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Kokkitila",
|
||||
"link-ingredients": "Linkitä Ainesosat",
|
||||
"merge-above": "Yhdistä Yläpuolelle",
|
||||
"move-to-bottom": "Move To Bottom",
|
||||
"move-to-top": "Move To Top",
|
||||
"reset-scale": "Palauta skaala",
|
||||
"decrease-scale-label": "Vähennä mittakaavaa yhdellä",
|
||||
"increase-scale-label": "Suurenna mittakaavaa yhdellä",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "Muokkaa Aikajanan Tapahtumaa",
|
||||
"timeline": "Aikajana",
|
||||
"timeline-is-empty": "Aikajana on tyhjä. Tee resepti.",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} Yleinen Aikajana",
|
||||
"open-timeline": "Avaa aikajana",
|
||||
"made-this": "Tein tämän",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Etsitkö Migraatioita?",
|
||||
"import-with-url": "Tuo URL-osoitteesta",
|
||||
"create-recipe": "Luo Resepti",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Tuo .zip:llä",
|
||||
"create-recipe-from-an-image": "Luo resepti kuvasta",
|
||||
"bulk-url-import": "Massa tuonti URL-osoitteesta",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Tuo yhteenveto",
|
||||
"partial-backup": "Osittainen varmuuskopiointi",
|
||||
"unable-to-delete-backup": "Varmuuskopiota ei voi poistaa.",
|
||||
"experimental-description": "Varmuuskopiot ovat kokonaisia tilannekuvia sivuston tietokannasta ja tietohakemistosta. Tämä sisältää kaikki tiedot, eikä sitä voida asettaa sulkemaan pois tietojen osajoukkoja. Voit ajatella tätä tilannekuvana Mealiesta tiettynä ajankohtana. Nämä toimivat tietokannan agnostisena tapana viedä ja tuoda tietoja tai varmuuskopioida sivusto ulkoiseen sijaintiin.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"backup-restore": "Varmuuskopion palautus",
|
||||
"back-restore-description": "Tämän varmuuskopion palauttaminen korvaa kaikki tietokannassasi ja tietokannassasi olevat tiedot ja korvaa ne tämän varmuuskopion sisällöllä. {cannot-be-undone} Jos palautus onnistuu, sinut kirjataan ulos.",
|
||||
"cannot-be-undone": "Tätä toimintoa ei voi kumota - käytä varoen.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Kaikkia LDAP-arvoja ei ole määritetty. Tämä voidaan ohittaa, jos et käytä LDAP-todennusta.",
|
||||
"ldap-ready-success-text": "Kaikki vaaditut LDAP-muuttujat on asetettu.",
|
||||
"build": "Koonti",
|
||||
"recipe-scraper-version": "Reseptikaappaimen versio"
|
||||
"recipe-scraper-version": "Reseptikaappaimen versio",
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
|
||||
"oidc-ready-success-text": "Required OIDC variables are all set."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Kaikki ostoslistat",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "Linkin ID",
|
||||
"link-name": "Linkin nimi",
|
||||
"login": "Kirjaudu",
|
||||
"login-oidc": "Login with",
|
||||
"or": "or",
|
||||
"logout": "Uloskirjaudu",
|
||||
"manage-users": "Käyttäjien hallinta",
|
||||
"manage-users-description": "Create and manage users.",
|
||||
"new-password": "Uusi salasana",
|
||||
"new-user": "Uusi käyttäjä",
|
||||
"password-has-been-reset-to-the-default-password": "Salasana on palautettu oletussalasanaksi",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Taustatehtävät",
|
||||
"background-tasks-description": "Täältä voit tarkastella kaikkia käynnissä olevia taustatehtäviä ja niiden tilaa",
|
||||
"no-logs-found": "Lokeja Ei Löytynyt",
|
||||
"tasks": "Tehtävät"
|
||||
"tasks": "Tehtävät",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Tervetuloa, {0}",
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Événements de recette"
|
||||
},
|
||||
"general": {
|
||||
"add": "Ajouter",
|
||||
"cancel": "Annuler",
|
||||
"clear": "Effacer",
|
||||
"close": "Fermer",
|
||||
"confirm": "Confirmer",
|
||||
"confirm-how-does-everything-look": "À quoi ressemble le tout ?",
|
||||
"confirm-delete-generic": "Voulez-vous vraiment supprimer ceci?",
|
||||
"copied_message": "Copié!",
|
||||
"create": "Créer",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Sauvegarder",
|
||||
"settings": "Paramètres",
|
||||
"share": "Partager",
|
||||
"show-all": "Tout afficher",
|
||||
"shuffle": "Mélanger",
|
||||
"sort": "Trier",
|
||||
"sort-ascending": "Tri croissant",
|
||||
"sort-descending": "Tri décroissant",
|
||||
"sort-alphabetically": "Alphabétique",
|
||||
"status": "Statut",
|
||||
"subject": "Sujet",
|
||||
"submit": "Soumettre",
|
||||
"success-count": "Succès : {count}",
|
||||
"sunday": "Dimanche",
|
||||
"system": "Système",
|
||||
"templates": "Modèles :",
|
||||
"test": "Tester",
|
||||
"themes": "Thèmes",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Unités",
|
||||
"back": "Précédent",
|
||||
"next": "Suivant",
|
||||
"start": "Démarrer",
|
||||
"toggle-view": "Activer/désactiver la vue",
|
||||
"date": "Date",
|
||||
"id": "Identifiant",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Préférences du groupe",
|
||||
"private-group": "Groupe privé",
|
||||
"private-group-description": "Rendre votre groupe privé va réinitialiser toutes les options de vue publique à leur valeur par défaut. Cela écrase les paramètres de vue publique d'une recette individuelle.",
|
||||
"enable-public-access": "Permettre l'accès public",
|
||||
"enable-public-access-description": "Les recettes de groupes deviennent publiques par défaut, cela permet aux visiteurs de les voir sans s’identifier",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Autoriser les utilisateurs en dehors de votre groupe à voir vos recettes",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Si activé, vous pouvez utiliser un lien de partage public pour partager des recettes spécifiques sans autoriser l'utilisateur. Lorsque cette option est désactivée, vous ne pouvez partager des recettes qu'avec les utilisateurs qui sont dans votre groupe ou avec un lien privé pré-généré",
|
||||
"show-nutrition-information": "Afficher les informations nutritionnelles",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Migration des données de recettes",
|
||||
"recipe-data-migrations-explanation": "Les recettes peuvent être migrées depuis une autre application prise en charge vers Mealie. C'est une excellente façon de commencer avec Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "En provenance d’une autre application une d’une version encore plus vieille de Mealie ? Regardez du côté des migrations pour voir si vos données peuvent être importées.",
|
||||
"choose-migration-type": "Choisissez le type de migration",
|
||||
"tag-all-recipes": "Étiquetez toutes les recettes avec le mot-clé {tag-name}",
|
||||
"nextcloud-text": "Les recettes Nextcloud peuvent être importées depuis un fichier zip qui contient les données stockées dans Nextcloud. Consultez la structure de dossiers d'exemple ci-dessous pour vous assurer que vos recettes peuvent être importées.",
|
||||
"chowdown-text": "Mealie supporte nativement le format du dépôt chowdown. Téléchargez le dépôt de code en tant que fichier .zip et téléchargez-le ci-dessous",
|
||||
"chowdown-text": "Mealie prend en charge nativement le format de dépôt chowdown. Téléchargez le dépôt de code en tant que fichier .zip et téléchargez-le ci-dessous.",
|
||||
"recipe-1": "Recette 1",
|
||||
"recipe-2": "Recette 2",
|
||||
"paprika-text": "Mealie peut importer des recettes depuis l'application Paprika. Exportez vos recettes de paprika, renommez l'extension d'exportation en .zip et téléchargez-les ci-dessous.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie peut importer des recettes depuis Plan to Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie peut importer des recettes depuis My Recipe Box. Exportez vos recettes au format CSV, puis téléchargez le fichier CSV ci-dessous."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Mode Cuisine",
|
||||
"link-ingredients": "Ingrédients du lien",
|
||||
"merge-above": "Fusionner avec au-dessus",
|
||||
"move-to-bottom": "Déplacer à la fin",
|
||||
"move-to-top": "Déplacer au début",
|
||||
"reset-scale": "Réinitialiser échelle",
|
||||
"decrease-scale-label": "Diminuer l'échelle de 1",
|
||||
"increase-scale-label": "Augmenter l'échelle de 1",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "Modifier l’événement dans l’historique",
|
||||
"timeline": "Historique",
|
||||
"timeline-is-empty": "Pas encore d’historique. Essayez de cuisiner cette recette !",
|
||||
"timeline-no-events-found-try-adjusting-filters": "Aucun événement trouvé. Essayez d’ajuster vos filtres de recherche.",
|
||||
"group-global-timeline": "Chronologie globale de {groupName}",
|
||||
"open-timeline": "Ouvrir l’historique",
|
||||
"made-this": "Je l’ai cuisiné",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Vous cherchez les migrations ?",
|
||||
"import-with-url": "Importer depuis une URL",
|
||||
"create-recipe": "Créer une recette",
|
||||
"create-recipe-description": "Créer une nouvelle recette à partir de zéro.",
|
||||
"create-recipes": "Créer des recettes",
|
||||
"import-with-zip": "Importer un .zip",
|
||||
"create-recipe-from-an-image": "Créer une recette à partir d'une image",
|
||||
"bulk-url-import": "Importation en masse d'URL",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Résumé de l'importation",
|
||||
"partial-backup": "Sauvegarde partielle",
|
||||
"unable-to-delete-backup": "Impossible de supprimer la sauvegarde.",
|
||||
"experimental-description": "Sauvegarde une photo complète de la base de données et du répertoire de données du site. Cela inclut toutes les données et ne peut pas être configuré pour exclure des sous-ensembles de données. C'est un peu comme une photo de Mealie à un instant précis. Actuellement, {not-crossed-version} (les migrations de données ne sont pas effectuées automatiquement). Il s'agit d'un moyen indépendant de la base de données pour exporter et importer des données ou de sauvegarder le site vers un emplacement externe.",
|
||||
"experimental-description": "Les sauvegardes sont des instantanés complets de la base de données et du répertoire de données du site. Cela inclue toutes les données et il n’est pas possible d’en exclure un sous-ensemble. Vous pouvez le voir comme un instantané de Mealie à un temps donné. Cela peut servir de moyen d’importer et d’exporter les données indépendamment du moteur de base de données, ou bien de sauvegarder le site vers un emplacement externe.",
|
||||
"backup-restore": "Restaurer la sauvegarde",
|
||||
"back-restore-description": "La restauration de cette sauvegarde écrasera toutes les données actuelles dans votre base de données et dans le répertoire de données et les remplacera par le contenu de cette sauvegarde. {cannot-be-undone} Si la restauration est réussie, vous serez déconnecté.",
|
||||
"cannot-be-undone": "Cette action ne peut pas être annulée - à utiliser avec prudence.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Toutes les valeurs LDAP ne sont pas configurées. Vous pouvez ignorer cet avertissement si vous n'utilisez pas l'authentification LDAP.",
|
||||
"ldap-ready-success-text": "Les variables LDAP obligatoires sont toutes définies.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Version du Scraper de recette"
|
||||
"recipe-scraper-version": "Version du Scraper de recette",
|
||||
"oidc-ready": "Prêt pour OIDC",
|
||||
"oidc-ready-error-text": "Toutes les valeurs OIDC ne sont pas configurées. Vous pouvez ignorer cet avertissement si vous n’utilisez pas l’authentification OIDC.",
|
||||
"oidc-ready-success-text": "Les variables OIDC obligatoires sont toutes définies."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Toutes les listes",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "ID du lien",
|
||||
"link-name": "Nom du lien",
|
||||
"login": "Connexion",
|
||||
"login-oidc": "Se connecter avec",
|
||||
"or": "ou",
|
||||
"logout": "Déconnexion",
|
||||
"manage-users": "Gérer les utilisateurs",
|
||||
"manage-users-description": "Créer et gérer les utilisateurs.",
|
||||
"new-password": "Nouveau mot de passe",
|
||||
"new-user": "Nouvel utilisateur",
|
||||
"password-has-been-reset-to-the-default-password": "Le mot de passe a été réinitialisé à la valeur par défaut",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Tâches en arrière plan",
|
||||
"background-tasks-description": "Ici vous pouvez voir toutes les tâches en arrière-plan en cours et leur statut",
|
||||
"no-logs-found": "Pas de journaux trouvés",
|
||||
"tasks": "Tâches"
|
||||
"tasks": "Tâches",
|
||||
"setup": {
|
||||
"first-time-setup": "Première configuration",
|
||||
"welcome-to-mealie-get-started": "Bienvenue à Mealie ! Commençons",
|
||||
"already-set-up-bring-to-homepage": "J’ai déjà tout configuré, amenez moi à l’écran d’accueil",
|
||||
"common-settings-for-new-sites": "Voici quelques paramètres communs pour les nouveaux sites",
|
||||
"setup-complete": "Configuration terminée!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Voici quelques trucs pour vous aider à commencer avec Mealie",
|
||||
"restore-from-v1-backup": "Vous avez une sauvegarde d’une précédente instance de Mealie v1 ? Vous pouvez la restaurer ici.",
|
||||
"manage-profile-or-get-invite-link": "Gérez votre propre profil, ou récupérez un lien d’invitation à partager avec d’autres."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Bienvenue, {0}",
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Événements de recette"
|
||||
},
|
||||
"general": {
|
||||
"add": "Ajouter",
|
||||
"cancel": "Annuler",
|
||||
"clear": "Effacer",
|
||||
"close": "Fermer",
|
||||
"confirm": "Confirmer",
|
||||
"confirm-how-does-everything-look": "À quoi ressemble le tout ?",
|
||||
"confirm-delete-generic": "Voulez-vous vraiment supprimer ceci ?",
|
||||
"copied_message": "Copié !",
|
||||
"create": "Créer",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Sauvegarder",
|
||||
"settings": "Paramètres",
|
||||
"share": "Partager",
|
||||
"show-all": "Tout afficher",
|
||||
"shuffle": "Aléatoire",
|
||||
"sort": "Trier",
|
||||
"sort-ascending": "Tri croissant",
|
||||
"sort-descending": "Tri décroissant",
|
||||
"sort-alphabetically": "Alphabétique",
|
||||
"status": "Statut",
|
||||
"subject": "Sujet",
|
||||
"submit": "Envoyer",
|
||||
"success-count": "Succès : {count}",
|
||||
"sunday": "Dimanche",
|
||||
"system": "Système",
|
||||
"templates": "Modèles :",
|
||||
"test": "Tester",
|
||||
"themes": "Thèmes",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Unités",
|
||||
"back": "Précédent",
|
||||
"next": "Suivant",
|
||||
"start": "Démarrer",
|
||||
"toggle-view": "Basculer l’affichage",
|
||||
"date": "Date",
|
||||
"id": "Identifiant",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Préférences du groupe",
|
||||
"private-group": "Groupe privé",
|
||||
"private-group-description": "Rendre votre groupe privé va réinitialiser toutes les options de vue publique à leur valeur par défaut. Cela écrase les paramètres de vue publique d'une recette individuelle.",
|
||||
"enable-public-access": "Activer l’accès public",
|
||||
"enable-public-access-description": "Les recettes de groupes deviennent publiques par défaut, cela permet aux visiteurs de les voir sans s’identifier",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Autoriser les utilisateurs en dehors de votre groupe à voir vos recettes",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Si activé, vous pouvez utiliser un lien de partage public pour partager des recettes spécifiques sans autoriser l'utilisateur. Lorsque cette option est désactivée, vous ne pouvez partager des recettes qu'avec les utilisateurs qui sont dans votre groupe ou avec un lien privé pré-généré",
|
||||
"show-nutrition-information": "Afficher les informations nutritionnelles",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Migration des données de recettes",
|
||||
"recipe-data-migrations-explanation": "Les recettes peuvent être migrées depuis une autre application prise en charge vers Mealie. C'est une excellente façon de commencer avec Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "En provenance d’une autre application une d’une version encore plus vieille de Mealie ? Regardez du côté des migrations pour voir si vos données peuvent être importées.",
|
||||
"choose-migration-type": "Choisissez le type de migration",
|
||||
"tag-all-recipes": "Étiquetez toutes les recettes avec le mot-clé {tag-name}",
|
||||
"nextcloud-text": "Les recettes Nextcloud peuvent être importées depuis un fichier zip qui contient les données stockées dans Nextcloud. Consultez la structure de dossiers d'exemple ci-dessous pour vous assurer que vos recettes peuvent être importées.",
|
||||
"chowdown-text": "Mealie supporte nativement le format du dépôt chowdown. Téléchargez le dépôt de code en tant que fichier .zip et téléchargez-le ci-dessous",
|
||||
"chowdown-text": "Mealie prend en charge nativement le format de dépôt chowdown. Téléchargez le dépôt de code en tant que fichier .zip et téléchargez-le ci-dessous.",
|
||||
"recipe-1": "Recette 1",
|
||||
"recipe-2": "Recette 2",
|
||||
"paprika-text": "Mealie peut importer des recettes depuis l'application Paprika. Exportez vos recettes de paprika, renommez l'extension d'exportation en .zip et téléchargez-les ci-dessous.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie peut importer des recettes depuis Plan to Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie peut importer des recettes depuis My Recipe Box. Exportez vos recettes au format CSV, puis téléchargez le fichier CSV ci-dessous."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Mode Cuisine",
|
||||
"link-ingredients": "Lier des ingrédients",
|
||||
"merge-above": "Fusionner avec au-dessus",
|
||||
"move-to-bottom": "Déplacer à la fin",
|
||||
"move-to-top": "Déplacer au début",
|
||||
"reset-scale": "Rétablir l’échelle par défaut",
|
||||
"decrease-scale-label": "Diminuer l’échelle de 1",
|
||||
"increase-scale-label": "Augmenter l’échelle de 1",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "Modifier l’événement dans l’historique",
|
||||
"timeline": "Historique",
|
||||
"timeline-is-empty": "Pas encore d’historique. Essayez de cuisiner cette recette !",
|
||||
"timeline-no-events-found-try-adjusting-filters": "Aucun événement trouvé. Essayez d’ajuster vos filtres de recherche.",
|
||||
"group-global-timeline": "Chronologie globale de {groupName}",
|
||||
"open-timeline": "Ouvrir l’historique",
|
||||
"made-this": "Je l’ai cuisiné",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Vous cherchez les migrations ?",
|
||||
"import-with-url": "Importer depuis une URL",
|
||||
"create-recipe": "Créer une recette",
|
||||
"create-recipe-description": "Créer une nouvelle recette de zéro.",
|
||||
"create-recipes": "Créer des recettes",
|
||||
"import-with-zip": "Importer un .zip",
|
||||
"create-recipe-from-an-image": "Créer une recette à partir d'une image",
|
||||
"bulk-url-import": "Importation en masse d'URL",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Résumé de l’importation",
|
||||
"partial-backup": "Sauvegarde partielle",
|
||||
"unable-to-delete-backup": "Impossible de supprimer la sauvegarde.",
|
||||
"experimental-description": "Sauvegarde une photo complète de la base de données et du répertoire de données du site. Cela inclut toutes les données et ne peut pas être configuré pour exclure des sous-ensembles de données. C'est un peu comme une photo de Mealie à un instant précis. Actuellement, {not-crossed-version} (les migrations de données ne sont pas effectuées automatiquement). Il s'agit d'un moyen indépendant de la base de données pour exporter et importer des données ou de sauvegarder le site vers un emplacement externe.",
|
||||
"experimental-description": "Les sauvegardes sont des instantanés complets de la base de données et du répertoire de données du site. Cela inclue toutes les données et il n’est pas possible d’en exclure un sous-ensemble. Vous pouvez le voir comme un instantané de Mealie à un temps donné. Cela peut servir de moyen d’importer et d’exporter les données indépendamment du moteur de base de données, ou bien de sauvegarder le site vers un emplacement externe.",
|
||||
"backup-restore": "Restaurer la sauvegarde",
|
||||
"back-restore-description": "La restauration de cette sauvegarde écrasera toutes les données actuelles dans votre base de données et dans le répertoire de données et les remplacera par le contenu de cette sauvegarde. {cannot-be-undone} Si la restauration est réussie, vous serez déconnecté.",
|
||||
"cannot-be-undone": "Cette action ne peut pas être annulée - à utiliser avec prudence.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Toutes les valeurs LDAP ne sont pas configurées. Vous pouvez ignorer cet avertissement si vous n'utilisez pas l'authentification LDAP.",
|
||||
"ldap-ready-success-text": "Les variables LDAP obligatoires sont toutes définies.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Version du Scraper de recette"
|
||||
"recipe-scraper-version": "Version du Scraper de recette",
|
||||
"oidc-ready": "Prêt pour OIDC",
|
||||
"oidc-ready-error-text": "Toutes les valeurs OIDC ne sont pas configurées. Vous pouvez ignorer cet avertissement si vous n’utilisez pas l’authentification OIDC.",
|
||||
"oidc-ready-success-text": "Les variables OIDC obligatoires sont toutes définies."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Toutes les listes",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "ID du lien",
|
||||
"link-name": "Nom du lien",
|
||||
"login": "Connexion",
|
||||
"login-oidc": "Se connecter avec",
|
||||
"or": "ou",
|
||||
"logout": "Déconnexion",
|
||||
"manage-users": "Gérer les utilisateurs",
|
||||
"manage-users-description": "Créer et gérer les utilisateurs.",
|
||||
"new-password": "Nouveau mot de passe",
|
||||
"new-user": "Nouvel utilisateur",
|
||||
"password-has-been-reset-to-the-default-password": "Le mot de passe a été réinitialisé à la valeur par défaut",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Tâches en arrière plan",
|
||||
"background-tasks-description": "Ici vous pouvez voir toutes les tâches en arrière-plan en cours et leur statut",
|
||||
"no-logs-found": "Pas de journaux trouvés",
|
||||
"tasks": "Tâches"
|
||||
"tasks": "Tâches",
|
||||
"setup": {
|
||||
"first-time-setup": "Premier démarrage",
|
||||
"welcome-to-mealie-get-started": "Bienvenue dans Mealie ! Nous pouvons commencer",
|
||||
"already-set-up-bring-to-homepage": "J’ai déjà tout configuré, amenez moi à l’écran d’accueil",
|
||||
"common-settings-for-new-sites": "Voici quelques paramètres courants pour les nouveaux sites",
|
||||
"setup-complete": "Configuration terminée !",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Voici quelques trucs pour vous aider à commencer avec Mealie",
|
||||
"restore-from-v1-backup": "Vous avez une sauvegarde d’une précédente instance de Mealie v1 ? Vous pouvez la restaurer ici.",
|
||||
"manage-profile-or-get-invite-link": "Gérez votre propre profil, ou récupérez un lien d’invitation à partager avec d’autres."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Bienvenue, {0}",
|
||||
@@ -1187,7 +1222,7 @@
|
||||
"require-all-tools": "Nécessite tous les ustensiles",
|
||||
"cookbook-name": "Nom du livre de recettes",
|
||||
"cookbook-with-name": "Livre de recettes {0}",
|
||||
"create-a-cookbook": "Create a Cookbook",
|
||||
"cookbook": "Cookbook"
|
||||
"create-a-cookbook": "Créer un livre de cuisine",
|
||||
"cookbook": "Livre de recettes"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"add": "Add",
|
||||
"cancel": "Cancel",
|
||||
"clear": "Clear",
|
||||
"close": "Close",
|
||||
"confirm": "Confirm",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "Are you sure you want to delete this?",
|
||||
"copied_message": "Copied!",
|
||||
"create": "Create",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Gardar",
|
||||
"settings": "Axustes",
|
||||
"share": "Compartir",
|
||||
"show-all": "Show All",
|
||||
"shuffle": "Barallar",
|
||||
"sort": "Ordenar",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-alphabetically": "Alfabético",
|
||||
"status": "Estado",
|
||||
"subject": "Asunto",
|
||||
"submit": "Enviar",
|
||||
"success-count": "Éxito: {count}",
|
||||
"sunday": "Domingo",
|
||||
"system": "System",
|
||||
"templates": "Modelos:",
|
||||
"test": "Probar",
|
||||
"themes": "Temas",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Units",
|
||||
"back": "Back",
|
||||
"next": "Next",
|
||||
"start": "Start",
|
||||
"toggle-view": "Toggle View",
|
||||
"date": "Date",
|
||||
"id": "Id",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Group Preferences",
|
||||
"private-group": "Private Group",
|
||||
"private-group-description": "Setting your group to private will default all public view options to default. This overrides an individual recipes 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",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Allow users outside of your group to see your recipes",
|
||||
"allow-users-outside-of-your-group-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 group or with a pre-generated private link",
|
||||
"show-nutrition-information": "Show nutrition information",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Recipe Data Migrations",
|
||||
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "Choose Migration Type",
|
||||
"tag-all-recipes": "Tag all recipes with {tag-name} tag",
|
||||
"nextcloud-text": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "Recipe 1",
|
||||
"recipe-2": "Recipe 2",
|
||||
"paprika-text": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie can import recipies from Plan to Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Cook Mode",
|
||||
"link-ingredients": "Link Ingredients",
|
||||
"merge-above": "Merge Above",
|
||||
"move-to-bottom": "Move To Bottom",
|
||||
"move-to-top": "Move To Top",
|
||||
"reset-scale": "Reset Scale",
|
||||
"decrease-scale-label": "Decrease Scale by 1",
|
||||
"increase-scale-label": "Increase Scale by 1",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "Edit Timeline Event",
|
||||
"timeline": "Timeline",
|
||||
"timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} Global Timeline",
|
||||
"open-timeline": "Open Timeline",
|
||||
"made-this": "I Made This",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Looking For Migrations?",
|
||||
"import-with-url": "Import with URL",
|
||||
"create-recipe": "Create Recipe",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Import Summary",
|
||||
"partial-backup": "Partial Backup",
|
||||
"unable-to-delete-backup": "Unable to Delete Backup.",
|
||||
"experimental-description": "Backups a total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think off this as a snapshot of Mealie at a specific time. Currently, {not-crossed-version} (data migrations are not done automatically). These serve as a database agnostic way to export and import data or backup the site to an external location.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"backup-restore": "Backup Restore",
|
||||
"back-restore-description": "Restoring this backup will overwrite all the current data in your database and in the data directory and replace them with the contents of this backup. {cannot-be-undone} If the restoration is successful, you will be logged out.",
|
||||
"cannot-be-undone": "This action cannot be undone - use with caution.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.",
|
||||
"ldap-ready-success-text": "Required LDAP variables are all set.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Recipe Scraper Version"
|
||||
"recipe-scraper-version": "Recipe Scraper Version",
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
|
||||
"oidc-ready-success-text": "Required OIDC variables are all set."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "All Lists",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "Link ID",
|
||||
"link-name": "Link Name",
|
||||
"login": "Login",
|
||||
"login-oidc": "Login with",
|
||||
"or": "or",
|
||||
"logout": "Logout",
|
||||
"manage-users": "Manage Users",
|
||||
"manage-users-description": "Create and manage users.",
|
||||
"new-password": "New Password",
|
||||
"new-user": "New User",
|
||||
"password-has-been-reset-to-the-default-password": "Password has been reset to the default password",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Background Tasks",
|
||||
"background-tasks-description": "Here you can view all the running background tasks and their status",
|
||||
"no-logs-found": "No Logs Found",
|
||||
"tasks": "Tasks"
|
||||
"tasks": "Tasks",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Welcome, {0}",
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "אירועי מתכון"
|
||||
},
|
||||
"general": {
|
||||
"add": "Add",
|
||||
"cancel": "ביטול",
|
||||
"clear": "נקה",
|
||||
"close": "סגירה",
|
||||
"confirm": "אישור",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "האם את/ה בטוח/ה שברצונך למחוק את זה?",
|
||||
"copied_message": "הועתק!",
|
||||
"create": "יצירה",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "שמירה",
|
||||
"settings": "הגדרות",
|
||||
"share": "שיתוף",
|
||||
"show-all": "Show All",
|
||||
"shuffle": "אקראי",
|
||||
"sort": "מיון",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-alphabetically": "א-ת",
|
||||
"status": "מצב",
|
||||
"subject": "נושא",
|
||||
"submit": "שמירה",
|
||||
"success-count": "הצליחו: {count}",
|
||||
"sunday": "ראשון",
|
||||
"system": "System",
|
||||
"templates": "תבניות:",
|
||||
"test": "ניסיון",
|
||||
"themes": "ערכות נושא",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "יחידות",
|
||||
"back": "חזרה",
|
||||
"next": "הבא",
|
||||
"start": "Start",
|
||||
"toggle-view": "החלף תצוגה",
|
||||
"date": "תאריך",
|
||||
"id": "מזהה",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "העדפות קבוצה",
|
||||
"private-group": "קבוצה פרטית",
|
||||
"private-group-description": "הגדרת הקבוצה כפרטית תחיל כברירת מחדל את כל התצוגות הפומביות. זה יחול על הגדרות תצוגה פומבית של מתכונים יחידים.",
|
||||
"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",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "אפשר/י למשתמשים מחוץ לקבוצה שלך לצפות במתכונים",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "כאשר מאופשר, ניתן לבצע שיתוף ציבורי עבור מתכונים ספציפיים מבלי לאשר משתמשים.\nכאשר מבוטל, ניתן לשתף מתכונים רק עם משתמשים הנמצאים באותה הקבוצה או באמצעות יצירת קישור פרטי",
|
||||
"show-nutrition-information": "הצג ערכים תזונתיים",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "מגרציית מידע מתכונים",
|
||||
"recipe-data-migrations-explanation": "ניתן לייבא מתכונים מאפליקציות תומכות אחרות אל Mealie. זו דרך מעולה להתחיל במילי.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "בחר סוג מיגרציה",
|
||||
"tag-all-recipes": "תייג את כל המתכונים עם תגית {tag-name}",
|
||||
"nextcloud-text": "ייבוא מתכונים מ- Nextcould יכול להתבצע בקובץ zip שמכיל את המידע מ- Nextcloud. ראה את דוגמת מבנה התיקיות למטה כדי לוודא שניתן לייבא את המתכון.",
|
||||
"chowdown-text": "מילי תומכת באופן טבעי בפורמט Chowndown. הורד את הקוד של הריפוסיטורי כ-zip והעלה אותו",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "מתכון 1",
|
||||
"recipe-2": "מתכון 2",
|
||||
"paprika-text": "מילי יכולה לייבא מתכונים מאפליקציית Paprika. ייצא את המתכונים מהאפליקציה, שנה את סיומת הקובץ ל- zip והעלה אותו למטה.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie יכולה לייבא מתכונים מהאתר- Plan to Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "מצב בישול",
|
||||
"link-ingredients": "קשר בין רכיבים",
|
||||
"merge-above": "מזג למעלה",
|
||||
"move-to-bottom": "Move To Bottom",
|
||||
"move-to-top": "Move To Top",
|
||||
"reset-scale": "איפוס קנה המידה",
|
||||
"decrease-scale-label": "הורד קנה מידה ב-1",
|
||||
"increase-scale-label": "העלה קנה מידה ב-1",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "עריכת אירוע ציר זמן",
|
||||
"timeline": "ציר זמן",
|
||||
"timeline-is-empty": "אין כלום בציר הזמן. נסה לעשות את המתכון הזה!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} ציר זמן גלובלי",
|
||||
"open-timeline": "פתח ציר זמן",
|
||||
"made-this": "הכנתי את זה",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "מחפש מיגרציות?",
|
||||
"import-with-url": "ייבא באמצעות לינק",
|
||||
"create-recipe": "יצירת מתכון",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "ייבא באמצעות zip",
|
||||
"create-recipe-from-an-image": "יצירת מתכון באמצעות תמונה",
|
||||
"bulk-url-import": "ייבוא מספר לינקים",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "ייבא תקציר",
|
||||
"partial-backup": "גיבוי חלקי",
|
||||
"unable-to-delete-backup": "לא ניתן למחוק גיבוי.",
|
||||
"experimental-description": "גיבויים, סנאפשוט מלא של מלא של מסד הנתונים והסיפריות באתר. הגיבוי מכיל את כל המידע ולא ניתן להסיר מידע מהגיבוי. ניתן להתייחס לגיבוי כסנאפשוט של מילי בזמן ספציפי. כרגע {not-crossed-version} (מיגרציית נתונים לא מתבצעות אוטומטית). הם מאפשרים לייבא, לייצא ולגבות את האתר למקום חיצוני.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"backup-restore": "גיבוי / שחזור",
|
||||
"back-restore-description": "שחזור מגיבוי זה ידרוס את המידע הקיים במסד הנתונים ובספריות האתר ויחליף אותם בזה הקיים בגיבוי. {cannot-be-undone} אם השחזור יצליח, המשתמש ינותק מהמערכת.",
|
||||
"cannot-be-undone": "פעולה זו לא בלתי הפיכה - השתמש בזהירות.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "לא כל ערכי ה- LDAP מוגדרים. ניתן להתעלם אם אינך משתמשת באימות LDAP.",
|
||||
"ldap-ready-success-text": "כל משתני ה- LDAP הנחוצים מוגדרים.",
|
||||
"build": "בניה",
|
||||
"recipe-scraper-version": "גרסת מפענך המתכונים"
|
||||
"recipe-scraper-version": "גרסת מפענך המתכונים",
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
|
||||
"oidc-ready-success-text": "Required OIDC variables are all set."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "כל הרשימות",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "מזהה קישור",
|
||||
"link-name": "שם קישור",
|
||||
"login": "התחברות",
|
||||
"login-oidc": "Login with",
|
||||
"or": "or",
|
||||
"logout": "התנתקות",
|
||||
"manage-users": "ניהול משתמשים",
|
||||
"manage-users-description": "Create and manage users.",
|
||||
"new-password": "סיסמה חדשה",
|
||||
"new-user": "משתמש חדש",
|
||||
"password-has-been-reset-to-the-default-password": "הסיסמה אופסה לברירת המחדל",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "משימות רקע",
|
||||
"background-tasks-description": "כאן ניתן לצפות בכל הפעולות הקורות ברקע",
|
||||
"no-logs-found": "לא נמצאו לוגים",
|
||||
"tasks": "משימות"
|
||||
"tasks": "משימות",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 שלום, {0}",
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"add": "Add",
|
||||
"cancel": "Odustani",
|
||||
"clear": "Očisti",
|
||||
"close": "Zatvori",
|
||||
"confirm": "Potvrdi",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "Jeste li sigurni da želite izbrisati ovo?",
|
||||
"copied_message": "Kopirano!",
|
||||
"create": "Kreiraj",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Spremi",
|
||||
"settings": "Postavke",
|
||||
"share": "Podijeli",
|
||||
"show-all": "Show All",
|
||||
"shuffle": "Nasumično",
|
||||
"sort": "Sortiraj",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-alphabetically": "Abecedno",
|
||||
"status": "Status",
|
||||
"subject": "Tema",
|
||||
"submit": "Pošalji",
|
||||
"success-count": "Uspješno: {count}",
|
||||
"sunday": "Nedjelja",
|
||||
"system": "System",
|
||||
"templates": "Predlošci:",
|
||||
"test": "Test",
|
||||
"themes": "Teme",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Mjerne jedinice",
|
||||
"back": "Nazad",
|
||||
"next": "Nastavi",
|
||||
"start": "Start",
|
||||
"toggle-view": "Promijeni Prikaz",
|
||||
"date": "Datum",
|
||||
"id": "Id",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Postavke Grupe",
|
||||
"private-group": "Privatna Grupa",
|
||||
"private-group-description": "Postavljanje vaše grupe na privatno će postaviti zadane opcije za javni prikaz na zadano. To će prebrisati pojedinačne postavke javnog prikaza recepata.",
|
||||
"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",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Dopustite korisnicima izvan vaše grupe da vide vaše recepte",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Kada je omogućeno, možete koristiti javnu povezncu dijeljene veze za dijeljenje određenih recepata bez autorizacije korisnika. Kada je onemogućeno, recepte možete dijeliti samo s korisnicima koji su u vašoj grupi ili s prethodno generiranom privatnom vezom",
|
||||
"show-nutrition-information": "Prikaži prehrambene vrijednosti",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Migracije Podataka Recepata",
|
||||
"recipe-data-migrations-explanation": "Recepti se mogu prenijeti s druge podržane aplikacije na Mealie. To je sjajan način za započetak korištenja Mealieja.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "Odaberi Vrstu Migracije",
|
||||
"tag-all-recipes": "Označi sve recepte s oznakom {tag-name}",
|
||||
"nextcloud-text": "Recepti iz Nextcloud-a mogu se uvesti iz zip datoteke koja sadrži podatke pohranjene u Nextcloud-u. Pogledajte primjer strukture mape u nastavku kako biste osigurali da se vaši recepti mogu uspješno uvesti.",
|
||||
"chowdown-text": "Mealie izvorno podržava format repozitorija \"chowdown\". Preuzmite repozitorij koda kao .zip datoteku i učitajte je u nastavku",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "Recept 1",
|
||||
"recipe-2": "Recept 2",
|
||||
"paprika-text": "Mealie može uvesti recepte iz aplikacije Paprika. Izvezite svoje recepte iz Paprike, preimenujte ekstenziju izvoza u .zip i učitajte je u nastavku.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie can import recipies from Plan to Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Način Kuhanja",
|
||||
"link-ingredients": "Poveži Sastojke",
|
||||
"merge-above": "Spoji prethodni korak",
|
||||
"move-to-bottom": "Move To Bottom",
|
||||
"move-to-top": "Move To Top",
|
||||
"reset-scale": "Vrati skaliranje na stare postavke",
|
||||
"decrease-scale-label": "Smanji skaliranje za 1",
|
||||
"increase-scale-label": "Povećaj skaliranje za 1",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "Uredi Događaj Vremenske Crte",
|
||||
"timeline": "Vremenska Crta",
|
||||
"timeline-is-empty": "Još nema ništa na vremenskoj crti. Pokušajte napraviti ovaj recept!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} Globalna vremenska crta",
|
||||
"open-timeline": "Otvori Vremensku Crtu",
|
||||
"made-this": "Napravio/la sam ovo",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Tražite migracije?",
|
||||
"import-with-url": "Učitaj preko URL-a",
|
||||
"create-recipe": "Kreiraj recept",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Učitaj pomoću .zip-a",
|
||||
"create-recipe-from-an-image": "Kreiraj recept iz slike",
|
||||
"bulk-url-import": "Uvoz više URL-ova",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Uvoz sažetka",
|
||||
"partial-backup": "Djelomična sigurnosna kopija",
|
||||
"unable-to-delete-backup": "Ne Mogu Obrisati Sigurnosnu Kopiju.",
|
||||
"experimental-description": "Sigurnosna kopija predstavlja snimak baze podataka i direktorija podataka web stranice. To uključuje sve podatke i ne može se postaviti da isključuje podskupove podataka. Možete zamisliti sigurnosnu kopiju kao snimak Mealieja u određenom trenutku. Trenutno, verzije {not-crossed-version} (migracija podataka se ne izvode automatski). Sigurnosne kopije služe kao način izvoza i uvoza podataka ili za sigurnosno kopiranje web mjesta na vanjsku lokaciju.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"backup-restore": "Sigurnosno kopiranje/vraćanje",
|
||||
"back-restore-description": "Vraćanje ove sigurnosne kopije će prepisati sve trenutne podatke u vašoj bazi podataka i direktoriju podataka i zamijeniti ih sadržajem ove sigurnosne kopije. Ova radnja je {ne-može-se-povratiti}. Ako se vraćanje uspješno izvrši, bit ćete odjavljeni iz sustava.",
|
||||
"cannot-be-undone": "Ova radnja ne može se poništiti - koristite je oprezno.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Nisu konfigurirane sve vrijednosti za LDAP. Ovo možete zanemariti ako ne koristite LDAP provjeru autentičnosti.",
|
||||
"ldap-ready-success-text": "Tražene LDAP vrijednosti su sve postavljene.",
|
||||
"build": "Izgradnja",
|
||||
"recipe-scraper-version": "Verzija skraper alata za recepte"
|
||||
"recipe-scraper-version": "Verzija skraper alata za recepte",
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
|
||||
"oidc-ready-success-text": "Required OIDC variables are all set."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Svi Popisi",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "Link ID",
|
||||
"link-name": "Ime Poveznice",
|
||||
"login": "Prijava",
|
||||
"login-oidc": "Login with",
|
||||
"or": "or",
|
||||
"logout": "Odjava",
|
||||
"manage-users": "Upravljanje Korisnicima",
|
||||
"manage-users-description": "Create and manage users.",
|
||||
"new-password": "Nova zaporka",
|
||||
"new-user": "Novi Korisnik",
|
||||
"password-has-been-reset-to-the-default-password": "Lozinka je vraćena na zadane postavke",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Pozadinski Zadaci",
|
||||
"background-tasks-description": "Ovdje možete pregledati sve pokrenute zadatke u pozadini i njihov status",
|
||||
"no-logs-found": "Log Zapisi nisu pronađeni",
|
||||
"tasks": "Zadatci"
|
||||
"tasks": "Zadatci",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Dobrodošli, {0}",
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Recept esemény"
|
||||
},
|
||||
"general": {
|
||||
"add": "Hozzáadás",
|
||||
"cancel": "Mégsem",
|
||||
"clear": "Törlés",
|
||||
"close": "Bezár",
|
||||
"confirm": "Megerősítés",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "Biztosan törölni szeretnéd ezt?",
|
||||
"copied_message": "Másolva!",
|
||||
"create": "Létrehozás",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Mentés",
|
||||
"settings": "Beállítások",
|
||||
"share": "Megosztás",
|
||||
"show-all": "Show All",
|
||||
"shuffle": "Véletlenszerű",
|
||||
"sort": "Rendezés",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-alphabetically": "Betűrendben",
|
||||
"status": "Állapot",
|
||||
"subject": "Tárgy",
|
||||
"submit": "Küldés",
|
||||
"success-count": "Sikeres: {count}",
|
||||
"sunday": "Vasárnap",
|
||||
"system": "System",
|
||||
"templates": "Sablonok:",
|
||||
"test": "Teszt",
|
||||
"themes": "Témák",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Mennyiségi egységek",
|
||||
"back": "Vissza",
|
||||
"next": "Következő",
|
||||
"start": "Kezdés",
|
||||
"toggle-view": "Nézet váltása",
|
||||
"date": "Dátum",
|
||||
"id": "Azonosító",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Csoport beállítások",
|
||||
"private-group": "Privát csoport",
|
||||
"private-group-description": "Ha a csoportot privátra állítja, az összes nyilvános nézeti beállítás alapértelmezettre lesz állítva. Ez felülírja az egyes receptek nyilvános nézet beállításait.",
|
||||
"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",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Engedélyezze a csoporton kívüli felhasználók számára a receptek megtekintését",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Ha engedélyezve van, nyilvános megosztási hivatkozással megoszthat adott recepteket a felhasználó felhatalmazása nélkül. Ha le van tiltva, csak olyan felhasználókkal oszthat meg recepteket, akik a csoportjába tartoznak, vagy egy előre generált privát linkkel",
|
||||
"show-nutrition-information": "Táplálkozási információk megjelenítése",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Receptadatok migrációja",
|
||||
"recipe-data-migrations-explanation": "A receptek átemelhetők más támogatott alkalmazásból Mealie-be. Ez egy remek módja a Mealie használatának elkezdésére.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "Válassza ki a migrációs típusát",
|
||||
"tag-all-recipes": "Az összes recept címkézése a {tag-name} címkével",
|
||||
"nextcloud-text": "A Nextcloud-receptek importálhatók a Nextcloudban tárolt adatokat tartalmazó zip-fájlból. Tekintse meg az alábbi példamappaszerkezetet, hogy receptjei biztosan importálhatók legyenek.",
|
||||
"chowdown-text": "Mealie natívan támogatja a chowdown repository formátumot. Töltse le a kódtárat .zip fájlként, és töltse fel alább",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "Recept 1",
|
||||
"recipe-2": "Recept 2",
|
||||
"paprika-text": "Mealie képes recepteket importálni a Paprika alkalmazásból. Exportálja a receptjeit a Paprikából, nevezze át az export kiterjesztést .zip-re, és töltse fel alább.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie képes recepteket importálni a Plan to Eat alkalmazásból."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Főzési mód",
|
||||
"link-ingredients": "Hozzávalók összekapcsolása",
|
||||
"merge-above": "Összevonás a fentivel",
|
||||
"move-to-bottom": "Move To Bottom",
|
||||
"move-to-top": "Move To Top",
|
||||
"reset-scale": "Skála alaphelyzetbe állítása",
|
||||
"decrease-scale-label": "Skála csökkentése 1-gyel",
|
||||
"increase-scale-label": "Skála növelése 1-gyel",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "Idővonal-esemény szerkesztése",
|
||||
"timeline": "Idővonal",
|
||||
"timeline-is-empty": "Az idővonalon még semmi sincs. Próbálja meg elkészíteni ezt a receptet!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} Globális idővonal",
|
||||
"open-timeline": "Idővonal megnyitása",
|
||||
"made-this": "Elkészítettem ezt",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Migrációt keres?",
|
||||
"import-with-url": "Importálás URL-címről",
|
||||
"create-recipe": "Recept létrehozása",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Importálás .zip formátummal",
|
||||
"create-recipe-from-an-image": "Recept létrehozása fotóról",
|
||||
"bulk-url-import": "Tömeges URL importálás",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Import összefoglaló",
|
||||
"partial-backup": "Részleges biztonsági mentés",
|
||||
"unable-to-delete-backup": "Nem lehetett létrehozni a biztonsági mentést.",
|
||||
"experimental-description": "A biztonsági mentések az oldal adatbázisának és adatkönyvtárának teljes pillanatfelvételei. Ez az összes adatot tartalmazza, és nem lehet beállítani, hogy az adatok részhalmazait kizárja. Ezt úgy is elképzelheti, mint a Mealie egy adott időpontban készült pillanatfelvételét. Ezek adatbázis-független módon szolgálnak az adatok exportálására és importálására, vagy a webhely külső helyre történő mentésére.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"backup-restore": "Biztonsági Mentés/Visszaállítás",
|
||||
"back-restore-description": "A biztonsági mentés visszaállítása felülírja az adatbázisban és az adatkönyvtárban lévő összes aktuális adatot, és a biztonsági mentés tartalmával helyettesíti azokat. {cannot-be-undone} Ha a visszaállítás sikeres, akkor a rendszer kilépteti Önt.",
|
||||
"cannot-be-undone": "Ezt a műveletet visszavonható - óvatosan használja.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Nem minden LDAP-érték van beállítva. Ezt figyelmen kívül lehet hagyni, ha nem használ LDAP-hitelesítést.",
|
||||
"ldap-ready-success-text": "A szükséges LDAP-változók mind beállítva.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Receptkinyerő verziója"
|
||||
"recipe-scraper-version": "Receptkinyerő verziója",
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
|
||||
"oidc-ready-success-text": "Required OIDC variables are all set."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Összes lista",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "Hivatkozás ID",
|
||||
"link-name": "Hivatkozás neve",
|
||||
"login": "Bejelentkezés",
|
||||
"login-oidc": "Bejelentkezés",
|
||||
"or": "vagy",
|
||||
"logout": "Kijelentkezés",
|
||||
"manage-users": "Felhasználók kezelése",
|
||||
"manage-users-description": "Felhasználók létrehozása és kezelése.",
|
||||
"new-password": "Új jelszó",
|
||||
"new-user": "Új felhasználó",
|
||||
"password-has-been-reset-to-the-default-password": "Jelsző vissza lett állítva az alapértelmezett jelszóra",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Háttér folyamatok",
|
||||
"background-tasks-description": "Itt megtekintheti az összes futó háttérfeladatot és azok állapotát",
|
||||
"no-logs-found": "Nem található napló",
|
||||
"tasks": "Feladatok"
|
||||
"tasks": "Feladatok",
|
||||
"setup": {
|
||||
"first-time-setup": "Első beállítás",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Beállítás kész!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Üdvözöljük, {0}",
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"add": "Add",
|
||||
"cancel": "Cancel",
|
||||
"clear": "Clear",
|
||||
"close": "Close",
|
||||
"confirm": "Confirm",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "Are you sure you want to delete this?",
|
||||
"copied_message": "Copied!",
|
||||
"create": "Create",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Save",
|
||||
"settings": "Settings",
|
||||
"share": "Share",
|
||||
"show-all": "Show All",
|
||||
"shuffle": "Shuffle",
|
||||
"sort": "Sort",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-alphabetically": "Alphabetical",
|
||||
"status": "Status",
|
||||
"subject": "Subject",
|
||||
"submit": "Submit",
|
||||
"success-count": "Success: {count}",
|
||||
"sunday": "Sunday",
|
||||
"system": "System",
|
||||
"templates": "Templates:",
|
||||
"test": "Test",
|
||||
"themes": "Themes",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Units",
|
||||
"back": "Back",
|
||||
"next": "Next",
|
||||
"start": "Start",
|
||||
"toggle-view": "Toggle View",
|
||||
"date": "Date",
|
||||
"id": "Id",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Group Preferences",
|
||||
"private-group": "Private Group",
|
||||
"private-group-description": "Setting your group to private will default all public view options to default. This overrides an individual recipes 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",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Allow users outside of your group to see your recipes",
|
||||
"allow-users-outside-of-your-group-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 group or with a pre-generated private link",
|
||||
"show-nutrition-information": "Show nutrition information",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Recipe Data Migrations",
|
||||
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "Choose Migration Type",
|
||||
"tag-all-recipes": "Tag all recipes with {tag-name} tag",
|
||||
"nextcloud-text": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "Recipe 1",
|
||||
"recipe-2": "Recipe 2",
|
||||
"paprika-text": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie can import recipies from Plan to Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Cook Mode",
|
||||
"link-ingredients": "Link Ingredients",
|
||||
"merge-above": "Merge Above",
|
||||
"move-to-bottom": "Move To Bottom",
|
||||
"move-to-top": "Move To Top",
|
||||
"reset-scale": "Reset Scale",
|
||||
"decrease-scale-label": "Decrease Scale by 1",
|
||||
"increase-scale-label": "Increase Scale by 1",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "Edit Timeline Event",
|
||||
"timeline": "Timeline",
|
||||
"timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} Global Timeline",
|
||||
"open-timeline": "Open Timeline",
|
||||
"made-this": "I Made This",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Looking For Migrations?",
|
||||
"import-with-url": "Import with URL",
|
||||
"create-recipe": "Create Recipe",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Import Summary",
|
||||
"partial-backup": "Partial Backup",
|
||||
"unable-to-delete-backup": "Unable to Delete Backup.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think off this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"backup-restore": "Backup Restore",
|
||||
"back-restore-description": "Restoring this backup will overwrite all the current data in your database and in the data directory and replace them with the contents of this backup. {cannot-be-undone} If the restoration is successful, you will be logged out.",
|
||||
"cannot-be-undone": "This action cannot be undone - use with caution.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.",
|
||||
"ldap-ready-success-text": "Required LDAP variables are all set.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Recipe Scraper Version"
|
||||
"recipe-scraper-version": "Recipe Scraper Version",
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
|
||||
"oidc-ready-success-text": "Required OIDC variables are all set."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "All Lists",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "Link ID",
|
||||
"link-name": "Link Name",
|
||||
"login": "Login",
|
||||
"login-oidc": "Login with",
|
||||
"or": "or",
|
||||
"logout": "Logout",
|
||||
"manage-users": "Manage Users",
|
||||
"manage-users-description": "Create and manage users.",
|
||||
"new-password": "New Password",
|
||||
"new-user": "New User",
|
||||
"password-has-been-reset-to-the-default-password": "Password has been reset to the default password",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Background Tasks",
|
||||
"background-tasks-description": "Here you can view all the running background tasks and their status",
|
||||
"no-logs-found": "No Logs Found",
|
||||
"tasks": "Tasks"
|
||||
"tasks": "Tasks",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Welcome, {0}",
|
||||
|
||||
@@ -80,10 +80,12 @@
|
||||
"recipe-events": "Eventi di ricette"
|
||||
},
|
||||
"general": {
|
||||
"add": "Aggiungi",
|
||||
"cancel": "Cancella",
|
||||
"clear": "Resetta",
|
||||
"close": "Chiudi",
|
||||
"confirm": "Conferma",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "Sei sicuro di volere eliminare?",
|
||||
"copied_message": "Copiato!",
|
||||
"create": "Crea",
|
||||
@@ -142,14 +144,18 @@
|
||||
"save": "Salva",
|
||||
"settings": "Impostazioni",
|
||||
"share": "Condividi",
|
||||
"show-all": "Mostra tutto",
|
||||
"shuffle": "Casuale",
|
||||
"sort": "Ordina",
|
||||
"sort-ascending": "Ordinamento crescente",
|
||||
"sort-descending": "Ordinamento discendente",
|
||||
"sort-alphabetically": "Alfabetico",
|
||||
"status": "Stato",
|
||||
"subject": "Soggetto",
|
||||
"submit": "Invia",
|
||||
"success-count": "Successo: {count}",
|
||||
"sunday": "Domenica",
|
||||
"system": "Sistema",
|
||||
"templates": "Modelli:",
|
||||
"test": "Test",
|
||||
"themes": "Temi",
|
||||
@@ -168,6 +174,7 @@
|
||||
"units": "Unità",
|
||||
"back": "Indietro",
|
||||
"next": "Avanti",
|
||||
"start": "Start",
|
||||
"toggle-view": "Cambia Vista",
|
||||
"date": "Data",
|
||||
"id": "Id",
|
||||
@@ -236,6 +243,8 @@
|
||||
"group-preferences": "Preferenze Gruppo",
|
||||
"private-group": "Gruppo Privato",
|
||||
"private-group-description": "Impostando il tuo gruppo su privato verranno ripristinate tutte le opzioni di visualizzazione pubblica. Questa opzione sovrascrive le impostazioni di visualizzazione pubblica della singola ricetta.",
|
||||
"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",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Consenti agli utenti al di fuori del tuo gruppo di vedere le tue ricette",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Se abilitato, è possibile utilizzare un link pubblico per condividere ricette specifiche senza autorizzare l'utente. Se disabilitato, puoi condividere ricette solo con gli utenti che sono nel tuo gruppo o con un link privato pre-generato",
|
||||
"show-nutrition-information": "Mostra informazioni nutrizionali",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Migrazione Dati Ricetta",
|
||||
"recipe-data-migrations-explanation": "Le ricette possono essere migrate da un'altra applicazione supportata da Mealie. Questo è un ottimo modo per iniziare con Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "Scegli Il Tipo Di Migrazione",
|
||||
"tag-all-recipes": "Etichetta tutte le ricette con {tag-name} etichetta",
|
||||
"nextcloud-text": "Le ricette di Nextcloud possono essere importate da un file zip che contiene i dati memorizzati in Nextcloud. Osserva la struttura della cartella di esempio qui sotto per assicurarti che le tue ricette siano in grado di essere importate.",
|
||||
"chowdown-text": "Mealie supporta nativamente il formato del repository chowdown. Scarica il repository del codice come file .zip e caricalo qui sotto",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "Ricetta 1",
|
||||
"recipe-2": "Ricetta 2",
|
||||
"paprika-text": "Mealie può importare ricette dall'applicazione Paprika. Esporta le tue ricette da paprika, rinomina l'estensione di esportazione in .zip e caricala qui sotto.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie può importare le ricette da Plan to Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Modalità di Cottura",
|
||||
"link-ingredients": "Link Ingredienti",
|
||||
"merge-above": "Unisci Sopra",
|
||||
"move-to-bottom": "Sposta in fondo",
|
||||
"move-to-top": "Sposta in cima",
|
||||
"reset-scale": "Ripristina la Scala",
|
||||
"decrease-scale-label": "Riduci la Scala di 1",
|
||||
"increase-scale-label": "Aumenta la scala di 1",
|
||||
@@ -509,6 +525,7 @@
|
||||
"edit-timeline-event": "Modifica evento sulla linea temporale",
|
||||
"timeline": "Linea temporale",
|
||||
"timeline-is-empty": "Niente sulla linea temporale. Prova a fare questa ricetta!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "Nessun evento trovato. Prova a modificare i filtri di ricerca.",
|
||||
"group-global-timeline": "{groupName} Linea temporale globale",
|
||||
"open-timeline": "Apri la linea temporale",
|
||||
"made-this": "L'Ho Preparato",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Stai Cercando Le Migrazioni?",
|
||||
"import-with-url": "Importa da URL",
|
||||
"create-recipe": "Crea Ricetta",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Importa da .zip",
|
||||
"create-recipe-from-an-image": "Crea ricetta da un'immagine",
|
||||
"bulk-url-import": "Importazione multipla URL",
|
||||
@@ -599,7 +618,7 @@
|
||||
"import-summary": "Importa Riepilogo",
|
||||
"partial-backup": "Backup Parziale",
|
||||
"unable-to-delete-backup": "Impossibile rimuovere backup.",
|
||||
"experimental-description": "Esegue il backup di un'istantanea totale del database e della directory dati del sito. Questo include tutti i dati e non può essere impostato per escludere sottoinsiemi di dati. Si può pensare a questo come un'istantanea di Mealie in un momento specifico. Attualmente, {not-crossed-version} (le migrazioni dei dati non sono effettuate automaticamente). Questi servono come modo indipendente dal database per esportare e importare i dati o il backup del sito in una posizione esterna.",
|
||||
"experimental-description": "I backup sono immagini complete del database e della cartella dati del sito. Questo include tutti i dati e non è possibile escluderne alcune. Puoi pensare a questo come un'immagine vera e propria di Mealie a uno specifico orario. Questo funge da metodo agnostico per esportare e importare database e relativi dati, o per fare un backup del sito in una posizione esterna.",
|
||||
"backup-restore": "Ripristina backup",
|
||||
"back-restore-description": "Il ripristino di questo backup sovrascriverà tutti i dati correnti nel database e nella directory dei dati e li sostituirà con il contenuto di questo backup. {cannot-be-undone} Se il ripristino avrà successo, sarai disconnesso.",
|
||||
"cannot-be-undone": "Questa azione non può essere annullata - usa con cautela.",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Non tutti i valori LDAP sono configurati. Questo può essere ignorato se non si utilizza l'Autenticazione LDAP.",
|
||||
"ldap-ready-success-text": "Le variabili LDAP richieste sono tutte configurate.",
|
||||
"build": "Versione",
|
||||
"recipe-scraper-version": "Versione Recipe Scraper"
|
||||
"recipe-scraper-version": "Versione Recipe Scraper",
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
|
||||
"oidc-ready-success-text": "Required OIDC variables are all set."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Tutte le Liste",
|
||||
@@ -832,8 +854,11 @@
|
||||
"link-id": "Link ID",
|
||||
"link-name": "Link Nome",
|
||||
"login": "Login",
|
||||
"login-oidc": "Login with",
|
||||
"or": "or",
|
||||
"logout": "Logout",
|
||||
"manage-users": "Gestisci Utenti",
|
||||
"manage-users-description": "Create and manage users.",
|
||||
"new-password": "Nuova Password",
|
||||
"new-user": "Nuovo Utente",
|
||||
"password-has-been-reset-to-the-default-password": "La password è stata reimpostata a quella di default",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Attività in Background",
|
||||
"background-tasks-description": "Qui puoi visualizzare tutte le attività in background in esecuzione e il loro stato",
|
||||
"no-logs-found": "Nessun Log Trovato",
|
||||
"tasks": "Compiti"
|
||||
"tasks": "Compiti",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Benvenuto, {0}",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -41,30 +41,30 @@
|
||||
"category-creation-failed": "카테고리 생성 실패",
|
||||
"category-deleted": "카테고리 삭제됨",
|
||||
"category-deletion-failed": "카테고리 삭제 실패",
|
||||
"category-filter": "Category Filter",
|
||||
"category-filter": "카테고리 필터",
|
||||
"category-update-failed": "Category update failed",
|
||||
"category-updated": "Category updated",
|
||||
"category-updated": "카테고리 업데이트",
|
||||
"uncategorized-count": "Uncategorized {count}",
|
||||
"create-a-category": "Create a Category",
|
||||
"category-name": "Category Name",
|
||||
"category": "Category"
|
||||
"create-a-category": "카테고리 생성",
|
||||
"category-name": "카테고리 이름",
|
||||
"category": "카테고리"
|
||||
},
|
||||
"events": {
|
||||
"apprise-url": "Apprise URL",
|
||||
"database": "Database",
|
||||
"delete-event": "Delete Event",
|
||||
"event-delete-confirmation": "Are you sure you want to delete this event?",
|
||||
"event-deleted": "Event Deleted",
|
||||
"event-updated": "Event Updated",
|
||||
"database": "데이터베이스",
|
||||
"delete-event": "이벤트 삭제",
|
||||
"event-delete-confirmation": "정말로 이 이벤트를 삭제하시겠어요?",
|
||||
"event-deleted": "이벤트 삭제됨",
|
||||
"event-updated": "이벤트 업데이트됨",
|
||||
"new-notification-form-description": "Mealie uses the Apprise library to generate notifications. They offer many options for services to use for notifications. Refer to their wiki for a comprehensive guide on how to create the URL for your service. If available, selecting the type of your notification may include extra features.",
|
||||
"new-version": "New version available!",
|
||||
"notification": "Notification",
|
||||
"refresh": "Refresh",
|
||||
"new-version": "새로운 버전 사용 가능",
|
||||
"notification": "알림",
|
||||
"refresh": "새로고침",
|
||||
"scheduled": "Scheduled",
|
||||
"something-went-wrong": "Something Went Wrong!",
|
||||
"subscribed-events": "Subscribed Events",
|
||||
"subscribed-events": "구독한 이벤트",
|
||||
"test-message-sent": "Test Message Sent",
|
||||
"new-notification": "New Notification",
|
||||
"new-notification": "새 알림",
|
||||
"event-notifiers": "Event Notifiers",
|
||||
"apprise-url-skipped-if-blank": "Apprise URL (skipped if blank)",
|
||||
"enable-notifier": "Enable Notifier",
|
||||
@@ -80,22 +80,24 @@
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"cancel": "Cancel",
|
||||
"clear": "Clear",
|
||||
"close": "Close",
|
||||
"confirm": "Confirm",
|
||||
"add": "추가",
|
||||
"cancel": "취소",
|
||||
"clear": "지우기",
|
||||
"close": "닫기",
|
||||
"confirm": "확인",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "Are you sure you want to delete this?",
|
||||
"copied_message": "Copied!",
|
||||
"create": "Create",
|
||||
"created": "Created",
|
||||
"copied_message": "복사됨!",
|
||||
"create": "만들기",
|
||||
"created": "생성됨",
|
||||
"custom": "Custom",
|
||||
"dashboard": "Dashboard",
|
||||
"delete": "Delete",
|
||||
"disabled": "Disabled",
|
||||
"download": "Download",
|
||||
"dashboard": "대시보드",
|
||||
"delete": "삭제",
|
||||
"disabled": "비활성화됨",
|
||||
"download": "다운로드",
|
||||
"duplicate": "Duplicate",
|
||||
"edit": "Edit",
|
||||
"enabled": "Enabled",
|
||||
"edit": "편집",
|
||||
"enabled": "활성화됨",
|
||||
"exception": "예외",
|
||||
"failed-count": "실패함: {count}",
|
||||
"failure-uploading-file": "파일 업로드 실패",
|
||||
@@ -116,7 +118,7 @@
|
||||
"link-copied": "링크 복사됨",
|
||||
"loading": "Loading",
|
||||
"loading-events": "이벤트를 불러오는 중",
|
||||
"loading-recipe": "Loading recipe...",
|
||||
"loading-recipe": "레시피 로딩 중...",
|
||||
"loading-ocr-data": "Loading OCR data...",
|
||||
"loading-recipes": "레시피 로딩 중",
|
||||
"message": "메시지",
|
||||
@@ -142,61 +144,66 @@
|
||||
"save": "저장",
|
||||
"settings": "설정",
|
||||
"share": "공유",
|
||||
"show-all": "Show All",
|
||||
"shuffle": "섞기",
|
||||
"sort": "정렬",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-alphabetically": "알파벳순",
|
||||
"status": "상태",
|
||||
"subject": "제목",
|
||||
"submit": "제출",
|
||||
"success-count": "성공: {count}",
|
||||
"sunday": "일요일",
|
||||
"system": "System",
|
||||
"templates": "Templates:",
|
||||
"test": "Test",
|
||||
"themes": "Themes",
|
||||
"thursday": "Thursday",
|
||||
"thursday": "목요일",
|
||||
"token": "Token",
|
||||
"tuesday": "Tuesday",
|
||||
"tuesday": "화요일",
|
||||
"type": "Type",
|
||||
"update": "Update",
|
||||
"updated": "Updated",
|
||||
"upload": "Upload",
|
||||
"url": "URL",
|
||||
"view": "View",
|
||||
"wednesday": "Wednesday",
|
||||
"wednesday": "수요일",
|
||||
"yes": "Yes",
|
||||
"foods": "Foods",
|
||||
"units": "Units",
|
||||
"back": "Back",
|
||||
"next": "Next",
|
||||
"start": "Start",
|
||||
"toggle-view": "Toggle View",
|
||||
"date": "Date",
|
||||
"id": "Id",
|
||||
"owner": "Owner",
|
||||
"owner": "작성자",
|
||||
"date-added": "Date Added",
|
||||
"none": "None",
|
||||
"run": "Run",
|
||||
"menu": "Menu",
|
||||
"a-name-is-required": "A Name is Required",
|
||||
"none": "없음",
|
||||
"run": "실행",
|
||||
"menu": "메뉴",
|
||||
"a-name-is-required": "이름은 필수 항목 입니다.",
|
||||
"delete-with-name": "Delete {name}",
|
||||
"confirm-delete-generic-with-name": "Are you sure you want to delete this {name}?",
|
||||
"confirm-delete-own-admin-account": "Please note that you are trying to delete your own admin account! This action cannot be undone and will permanently delete your account?",
|
||||
"organizer": "Organizer",
|
||||
"transfer": "Transfer",
|
||||
"copy": "Copy",
|
||||
"color": "Color",
|
||||
"copy": "복사",
|
||||
"color": "색상",
|
||||
"timestamp": "Timestamp",
|
||||
"last-made": "Last Made",
|
||||
"learn-more": "Learn More",
|
||||
"this-feature-is-currently-inactive": "This feature is currently inactive",
|
||||
"learn-more": "더 알아보기",
|
||||
"this-feature-is-currently-inactive": "이 기능을 현재 사용할 수 없습니다.",
|
||||
"clipboard-not-supported": "Clipboard not supported",
|
||||
"copied-to-clipboard": "Copied to clipboard",
|
||||
"copied-to-clipboard": "클립보드에 복사되었습니다",
|
||||
"your-browser-does-not-support-clipboard": "Your browser does not support clipboard",
|
||||
"copied-items-to-clipboard": "No item copied to clipboard|One item copied to clipboard|Copied {count} items to clipboard",
|
||||
"actions": "Actions",
|
||||
"selected-count": "Selected: {count}",
|
||||
"export-all": "Export All",
|
||||
"refresh": "Refresh",
|
||||
"upload-file": "Upload File",
|
||||
"refresh": "새로고침",
|
||||
"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.",
|
||||
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||
@@ -217,25 +224,27 @@
|
||||
"group-not-found": "그룹을찾을 수 없음",
|
||||
"group-token": "Group Token",
|
||||
"group-with-value": "Group: {groupID}",
|
||||
"groups": "Groups",
|
||||
"manage-groups": "Manage Groups",
|
||||
"user-group": "User Group",
|
||||
"groups": "그룹",
|
||||
"manage-groups": "그룹 관리",
|
||||
"user-group": "사용자 그룹",
|
||||
"user-group-created": "User Group Created",
|
||||
"user-group-creation-failed": "User Group Creation Failed",
|
||||
"settings": {
|
||||
"keep-my-recipes-private": "Keep My Recipes Private",
|
||||
"keep-my-recipes-private-description": "Sets your group and all recipes defaults to private. You can always change this later."
|
||||
},
|
||||
"manage-members": "Manage Members",
|
||||
"manage-members": "회원 관리",
|
||||
"manage-members-description": "Manage the permissions of the members in your groups. {manage} allows the user to access the data-management page {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.",
|
||||
"manage": "Manage",
|
||||
"invite": "Invite",
|
||||
"invite": "초대하기",
|
||||
"looking-to-update-your-profile": "Looking to Update Your Profile?",
|
||||
"default-recipe-preferences-description": "These are the default settings when a new recipe is created in your group. These can be changed for individual recipes in the recipe settings menu.",
|
||||
"default-recipe-preferences": "Default Recipe Preferences",
|
||||
"group-preferences": "Group Preferences",
|
||||
"private-group": "Private Group",
|
||||
"private-group": "비공개 그룹",
|
||||
"private-group-description": "Setting your group to private will default all public view options to default. This overrides an individual recipes 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",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Allow users outside of your group to see your recipes",
|
||||
"allow-users-outside-of-your-group-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 group or with a pre-generated private link",
|
||||
"show-nutrition-information": "Show nutrition information",
|
||||
@@ -252,7 +261,7 @@
|
||||
"group-recipe-preferences": "Group Recipe Preferences",
|
||||
"report": "Report",
|
||||
"report-with-id": "Report ID: {id}",
|
||||
"group-management": "Group Management",
|
||||
"group-management": "그룹 관리",
|
||||
"admin-group-management": "Admin Group Management",
|
||||
"admin-group-management-text": "Changes to this group will be reflected immediately.",
|
||||
"group-id-value": "Group Id: {0}"
|
||||
@@ -266,7 +275,7 @@
|
||||
"edit-meal-plan": "Edit Meal Plan",
|
||||
"end-date": "End Date",
|
||||
"group": "Group (Beta)",
|
||||
"main": "Main",
|
||||
"main": "메인",
|
||||
"meal-planner": "Meal Planner",
|
||||
"meal-plans": "Meal Plans",
|
||||
"mealplan-categories": "MEALPLAN CATEGORIES",
|
||||
@@ -287,12 +296,12 @@
|
||||
"start-date": "Start Date",
|
||||
"rule-day": "Rule Day",
|
||||
"meal-type": "Meal Type",
|
||||
"breakfast": "Breakfast",
|
||||
"lunch": "Lunch",
|
||||
"dinner": "Dinner",
|
||||
"breakfast": "조식",
|
||||
"lunch": "점심",
|
||||
"dinner": "저녁 식사",
|
||||
"type-any": "Any",
|
||||
"day-any": "Any",
|
||||
"editor": "Editor",
|
||||
"editor": "편집기",
|
||||
"meal-recipe": "Meal Recipe",
|
||||
"meal-title": "Meal Title",
|
||||
"meal-note": "Meal Note",
|
||||
@@ -316,7 +325,7 @@
|
||||
},
|
||||
"migration": {
|
||||
"migration-data-removed": "Migration data removed",
|
||||
"new-migration": "New Migration",
|
||||
"new-migration": "새 마이그레이션",
|
||||
"no-file-selected": "No File Selected",
|
||||
"no-migration-data-available": "No Migration Data Available",
|
||||
"previous-migrations": "Previous Migrations",
|
||||
@@ -349,10 +358,11 @@
|
||||
},
|
||||
"recipe-data-migrations": "Recipe Data Migrations",
|
||||
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"choose-migration-type": "Choose Migration Type",
|
||||
"tag-all-recipes": "Tag all recipes with {tag-name} tag",
|
||||
"nextcloud-text": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"recipe-1": "Recipe 1",
|
||||
"recipe-2": "Recipe 2",
|
||||
"paprika-text": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.",
|
||||
@@ -360,6 +370,10 @@
|
||||
"plantoeat": {
|
||||
"title": "Plan to Eat",
|
||||
"description-long": "Mealie can import recipies from Plan to Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -385,8 +399,8 @@
|
||||
"make-recipe-image": "Make this the recipe image"
|
||||
},
|
||||
"page": {
|
||||
"404-page-not-found": "404 Page not found",
|
||||
"all-recipes": "All Recipes",
|
||||
"404-page-not-found": "404. 페이지를 찾을 수 없음",
|
||||
"all-recipes": "모든 레시피",
|
||||
"new-page-created": "New page created",
|
||||
"page": "Page",
|
||||
"page-creation-failed": "Page creation failed",
|
||||
@@ -397,24 +411,24 @@
|
||||
"pages-update-failed": "Pages update failed",
|
||||
"pages-updated": "Pages updated",
|
||||
"404-not-found": "404 Not Found",
|
||||
"an-error-occurred": "An error occurred"
|
||||
"an-error-occurred": "오류가 발생했습니다!"
|
||||
},
|
||||
"recipe": {
|
||||
"add-key": "Add Key",
|
||||
"add-to-favorites": "Add to Favorites",
|
||||
"add-to-favorites": "즐겨찾기에 추가",
|
||||
"api-extras": "API Extras",
|
||||
"calories": "Calories",
|
||||
"calories": "칼로리",
|
||||
"calories-suffix": "calories",
|
||||
"carbohydrate-content": "Carbohydrate",
|
||||
"categories": "Categories",
|
||||
"carbohydrate-content": "탄수화물",
|
||||
"categories": "카테고리",
|
||||
"comment-action": "Comment",
|
||||
"comment": "Comment",
|
||||
"comments": "Comments",
|
||||
"delete-confirmation": "Are you sure you want to delete this recipe?",
|
||||
"delete-confirmation": "이 레시피를 정말 삭제하시겠습니까?",
|
||||
"delete-recipe": "Delete Recipe",
|
||||
"description": "Description",
|
||||
"description": "설명",
|
||||
"disable-amount": "Disable Ingredient Amounts",
|
||||
"disable-comments": "Disable Comments",
|
||||
"disable-comments": "댓글 사용 안 함",
|
||||
"duplicate": "Duplicate recipe",
|
||||
"duplicate-name": "Name of the new recipe",
|
||||
"edit-scale": "Edit Scale",
|
||||
@@ -464,14 +478,14 @@
|
||||
"unable-to-delete-recipe": "Unable to Delete Recipe",
|
||||
"no-recipe": "No Recipe",
|
||||
"locked-by-owner": "Locked by Owner",
|
||||
"join-the-conversation": "Join the Conversation",
|
||||
"join-the-conversation": "대화에 참여하기",
|
||||
"add-recipe-to-mealplan": "Add Recipe to Mealplan",
|
||||
"entry-type": "Entry Type",
|
||||
"date-format-hint": "MM/DD/YYYY format",
|
||||
"date-format-hint-yyyy-mm-dd": "YYYY-MM-DD format",
|
||||
"add-to-list": "Add to List",
|
||||
"add-to-list": "목록에 추가",
|
||||
"add-to-plan": "Add to Plan",
|
||||
"add-to-timeline": "Add to Timeline",
|
||||
"add-to-timeline": "타임라인에 추가하기",
|
||||
"recipe-added-to-list": "Recipe added to list",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"successfully-added-to-list": "Successfully added to list",
|
||||
@@ -494,6 +508,8 @@
|
||||
"cook-mode": "Cook Mode",
|
||||
"link-ingredients": "Link Ingredients",
|
||||
"merge-above": "Merge Above",
|
||||
"move-to-bottom": "맨 아래로 이동",
|
||||
"move-to-top": "맨 위로 이동",
|
||||
"reset-scale": "Reset Scale",
|
||||
"decrease-scale-label": "Decrease Scale by 1",
|
||||
"increase-scale-label": "Increase Scale by 1",
|
||||
@@ -501,14 +517,15 @@
|
||||
"public-link": "Public Link",
|
||||
"timer": {
|
||||
"kitchen-timer": "Kitchen Timer",
|
||||
"start-timer": "Start Timer",
|
||||
"pause-timer": "Pause Timer",
|
||||
"resume-timer": "Resume Timer",
|
||||
"stop-timer": "Stop Timer"
|
||||
"start-timer": "타이머 시작",
|
||||
"pause-timer": "타이머 일시 정지",
|
||||
"resume-timer": "타이머 재개",
|
||||
"stop-timer": "타이머 정지"
|
||||
},
|
||||
"edit-timeline-event": "Edit Timeline Event",
|
||||
"timeline": "Timeline",
|
||||
"timeline": "타임라인",
|
||||
"timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} Global Timeline",
|
||||
"open-timeline": "Open Timeline",
|
||||
"made-this": "I Made This",
|
||||
@@ -529,6 +546,8 @@
|
||||
"looking-for-migrations": "Looking For Migrations?",
|
||||
"import-with-url": "Import with URL",
|
||||
"create-recipe": "Create Recipe",
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
@@ -559,13 +578,13 @@
|
||||
"tree-view": "Tree View",
|
||||
"recipe-yield": "Recipe Yield",
|
||||
"unit": "Unit",
|
||||
"upload-image": "Upload image",
|
||||
"screen-awake": "Keep Screen Awake",
|
||||
"remove-image": "Remove image",
|
||||
"nextStep": "Next step"
|
||||
"upload-image": "이미지 업로드",
|
||||
"screen-awake": "화면을 항상 켠 상태로 유지",
|
||||
"remove-image": "이미지 제거",
|
||||
"nextStep": "다음 단계"
|
||||
},
|
||||
"search": {
|
||||
"advanced-search": "Advanced Search",
|
||||
"advanced-search": "고급 검색",
|
||||
"and": "and",
|
||||
"exclude": "Exclude",
|
||||
"include": "Include",
|
||||
@@ -574,33 +593,33 @@
|
||||
"has-any": "Has Any",
|
||||
"has-all": "Has All",
|
||||
"results": "Results",
|
||||
"search": "Search",
|
||||
"search": "검색",
|
||||
"search-mealie": "Search Mealie (press /)",
|
||||
"search-placeholder": "Search...",
|
||||
"tag-filter": "Tag Filter",
|
||||
"search-placeholder": "검색...",
|
||||
"tag-filter": "태그 필터",
|
||||
"search-hint": "Press '/'",
|
||||
"advanced": "Advanced",
|
||||
"auto-search": "Auto Search",
|
||||
"no-results": "No results found"
|
||||
"auto-search": "자동 검색",
|
||||
"no-results": "검색 결과가 없습니다."
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Add a New Theme",
|
||||
"admin-settings": "Admin Settings",
|
||||
"add-a-new-theme": "새 테마 추가",
|
||||
"admin-settings": "관리자 설정",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created": "백업이 성공적으로 완료되었습니다.",
|
||||
"backup-created-at-response-export_path": "Backup Created at {path}",
|
||||
"backup-deleted": "Backup deleted",
|
||||
"restore-success": "Restore successful",
|
||||
"backup-deleted": "백업 삭제됨",
|
||||
"restore-success": "복원 성공!",
|
||||
"backup-tag": "Backup Tag",
|
||||
"create-heading": "Create a Backup",
|
||||
"delete-backup": "Delete Backup",
|
||||
"delete-backup": "백업 삭제",
|
||||
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
|
||||
"full-backup": "Full Backup",
|
||||
"full-backup": "전체 백업",
|
||||
"import-summary": "Import Summary",
|
||||
"partial-backup": "Partial Backup",
|
||||
"unable-to-delete-backup": "Unable to Delete Backup.",
|
||||
"experimental-description": "Backups a total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think off this as a snapshot of Mealie at a specific time. Currently, {not-crossed-version} (data migrations are not done automatically). These serve as a database agnostic way to export and import data or backup the site to an external location.",
|
||||
"backup-restore": "Backup Restore",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"backup-restore": "백업/복원",
|
||||
"back-restore-description": "Restoring this backup will overwrite all the current data in your database and in the data directory and replace them with the contents of this backup. {cannot-be-undone} If the restoration is successful, you will be logged out.",
|
||||
"cannot-be-undone": "This action cannot be undone - use with caution.",
|
||||
"postgresql-note": "If you are using PostGreSQL, please review the {backup-restore-process} prior to restoring.",
|
||||
@@ -623,22 +642,22 @@
|
||||
"home-page-sections": "Home Page Sections",
|
||||
"show-recent": "Show Recent"
|
||||
},
|
||||
"language": "Language",
|
||||
"language": "언어",
|
||||
"latest": "Latest",
|
||||
"local-api": "Local API",
|
||||
"locale-settings": "Locale settings",
|
||||
"migrations": "Migrations",
|
||||
"migrations": "마이그레이션",
|
||||
"new-page": "New Page",
|
||||
"notify": "Notify",
|
||||
"notify": "알림",
|
||||
"organize": "Organize",
|
||||
"page-name": "Page Name",
|
||||
"pages": "Pages",
|
||||
"profile": "Profile",
|
||||
"profile": "프로필",
|
||||
"remove-existing-entries-matching-imported-entries": "Remove existing entries matching imported entries",
|
||||
"set-new-time": "Set New Time",
|
||||
"settings-update-failed": "Settings update failed",
|
||||
"settings-updated": "Settings updated",
|
||||
"site-settings": "Site Settings",
|
||||
"settings-update-failed": "설정 업데이트 실패",
|
||||
"settings-updated": "설정 업데이트",
|
||||
"site-settings": "사이트 설정",
|
||||
"theme": {
|
||||
"accent": "Accent",
|
||||
"dark": "Dark",
|
||||
@@ -648,20 +667,20 @@
|
||||
"error-deleting-theme": "Error deleting theme",
|
||||
"error-updating-theme": "Error updating theme",
|
||||
"info": "Info",
|
||||
"light": "Light",
|
||||
"light": "라이트",
|
||||
"primary": "Primary",
|
||||
"secondary": "Secondary",
|
||||
"success": "Success",
|
||||
"switch-to-dark-mode": "Switch to dark mode",
|
||||
"switch-to-light-mode": "Switch to light mode",
|
||||
"theme-deleted": "Theme deleted",
|
||||
"theme-name": "Theme Name",
|
||||
"success": "성공",
|
||||
"switch-to-dark-mode": "다크 모드로 전환",
|
||||
"switch-to-light-mode": "라이트 모드로 전환",
|
||||
"theme-deleted": "테마 삭제됨",
|
||||
"theme-name": "테마 이름",
|
||||
"theme-name-is-required": "Theme Name is required.",
|
||||
"theme-saved": "Theme Saved",
|
||||
"theme-updated": "Theme updated",
|
||||
"warning": "Warning",
|
||||
"light-mode": "Light Mode",
|
||||
"dark-mode": "Dark Mode"
|
||||
"light-mode": "라이트 모드",
|
||||
"dark-mode": "다크 모드"
|
||||
},
|
||||
"token": {
|
||||
"active-tokens": "ACTIVE TOKENS",
|
||||
@@ -681,7 +700,7 @@
|
||||
"recipes-affected": "No Recipes Affected|One Recipe Affected|{count} Recipes Affected",
|
||||
"remove-unused": "Remove Unused",
|
||||
"title-case-all": "Title Case All",
|
||||
"toolbox": "Toolbox",
|
||||
"toolbox": "도구 상자",
|
||||
"unorganized": "Unorganized"
|
||||
},
|
||||
"webhooks": {
|
||||
@@ -708,8 +727,8 @@
|
||||
"email-test-results": "Email Test Results",
|
||||
"ready": "Ready",
|
||||
"not-ready": "Not Ready - Check Environmental Variables",
|
||||
"succeeded": "Succeeded",
|
||||
"failed": "Failed",
|
||||
"succeeded": "성공함",
|
||||
"failed": "실패함",
|
||||
"general-about": "General About",
|
||||
"application-version": "Application Version",
|
||||
"application-version-error-text": "Your current version ({0}) does not match the latest release. Considering updating to the latest version ({1}).",
|
||||
@@ -724,7 +743,10 @@
|
||||
"ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.",
|
||||
"ldap-ready-success-text": "Required LDAP variables are all set.",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Recipe Scraper Version"
|
||||
"recipe-scraper-version": "Recipe Scraper Version",
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Not all OIDC Values are configured. This can be ignored if you are not using OIDC Authentication.",
|
||||
"oidc-ready-success-text": "Required OIDC variables are all set."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "All Lists",
|
||||
@@ -742,7 +764,7 @@
|
||||
"toggle-food": "Toggle Food",
|
||||
"manage-labels": "Manage Labels",
|
||||
"are-you-sure-you-want-to-delete-this-item": "Are you sure you want to delete this item?",
|
||||
"copy-as-text": "Copy as Text",
|
||||
"copy-as-text": "텍스트로 복사",
|
||||
"copy-as-markdown": "Copy as Markdown",
|
||||
"delete-checked": "Delete Checked",
|
||||
"toggle-label-sort": "Toggle Label Sort",
|
||||
@@ -755,22 +777,22 @@
|
||||
"completed-on": "Completed on {date}"
|
||||
},
|
||||
"sidebar": {
|
||||
"all-recipes": "All Recipes",
|
||||
"backups": "Backups",
|
||||
"categories": "Categories",
|
||||
"all-recipes": "모든 레시피",
|
||||
"backups": "백업",
|
||||
"categories": "카테고리",
|
||||
"cookbooks": "Cookbooks",
|
||||
"dashboard": "Dashboard",
|
||||
"home-page": "Home Page",
|
||||
"manage-users": "Manage Users",
|
||||
"dashboard": "대시보드",
|
||||
"home-page": "홈페이지",
|
||||
"manage-users": "사용자 관리",
|
||||
"migrations": "Migrations",
|
||||
"profile": "Profile",
|
||||
"search": "Search",
|
||||
"site-settings": "Site Settings",
|
||||
"profile": "프로필",
|
||||
"search": "검색",
|
||||
"site-settings": "사이트 설정",
|
||||
"tags": "Tags",
|
||||
"toolbox": "Toolbox",
|
||||
"language": "Language",
|
||||
"toolbox": "도구 상자",
|
||||
"language": "언어",
|
||||
"maintenance": "Maintenance",
|
||||
"background-tasks": "Background Tasks",
|
||||
"background-tasks": "백그라운드 작업",
|
||||
"parser": "Parser",
|
||||
"developer": "Developer",
|
||||
"cookbook": "Cookbook",
|
||||
@@ -778,7 +800,7 @@
|
||||
},
|
||||
"signup": {
|
||||
"error-signing-up": "Error Signing Up",
|
||||
"sign-up": "Sign Up",
|
||||
"sign-up": "계정 등록",
|
||||
"sign-up-link-created": "Sign up link created",
|
||||
"sign-up-link-creation-failed": "Sign up link creation failed",
|
||||
"sign-up-links": "Sign Up Links",
|
||||
@@ -793,17 +815,17 @@
|
||||
"tag-deletion-failed": "Tag deletion failed",
|
||||
"tag-update-failed": "Tag update failed",
|
||||
"tag-updated": "Tag updated",
|
||||
"tags": "Tags",
|
||||
"tags": "태그",
|
||||
"untagged-count": "Untagged {count}",
|
||||
"create-a-tag": "Create a Tag",
|
||||
"tag-name": "Tag Name",
|
||||
"tag": "Tag"
|
||||
"create-a-tag": "태그 생성",
|
||||
"tag-name": "태그 이름",
|
||||
"tag": "태그"
|
||||
},
|
||||
"tool": {
|
||||
"tools": "Tools",
|
||||
"tools": "도구",
|
||||
"on-hand": "On Hand",
|
||||
"create-a-tool": "Create a Tool",
|
||||
"tool-name": "Tool Name",
|
||||
"tool-name": "도구 이름",
|
||||
"create-new-tool": "Create New Tool",
|
||||
"on-hand-checkbox-label": "Show as On Hand (Checked)",
|
||||
"required-tools": "Required Tools",
|
||||
@@ -831,49 +853,52 @@
|
||||
"invite-only": "Invite Only",
|
||||
"link-id": "Link ID",
|
||||
"link-name": "Link Name",
|
||||
"login": "Login",
|
||||
"logout": "Logout",
|
||||
"manage-users": "Manage Users",
|
||||
"new-password": "New Password",
|
||||
"new-user": "New User",
|
||||
"login": "로그인",
|
||||
"login-oidc": "Login with",
|
||||
"or": "or",
|
||||
"logout": "로그아웃",
|
||||
"manage-users": "사용자 관리",
|
||||
"manage-users-description": "사용자 생성 및 관리",
|
||||
"new-password": "새 비밀번호",
|
||||
"new-user": "새 사용자",
|
||||
"password-has-been-reset-to-the-default-password": "Password has been reset to the default password",
|
||||
"password-must-match": "Password must match",
|
||||
"password-reset-failed": "Password reset failed",
|
||||
"password-updated": "Password updated",
|
||||
"password": "Password",
|
||||
"password-must-match": "비밀번호가 일치해야합니다",
|
||||
"password-reset-failed": "비밀번호 재설정 실패",
|
||||
"password-updated": "비밀번호가 변경되었습니다",
|
||||
"password": "비밀번호",
|
||||
"password-strength": "Password is {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "Register",
|
||||
"reset-password": "Reset Password",
|
||||
"sign-in": "Sign in",
|
||||
"register": "등록",
|
||||
"reset-password": "비밀번호 재설정",
|
||||
"sign-in": "로그인",
|
||||
"total-mealplans": "Total MealPlans",
|
||||
"total-users": "Total Users",
|
||||
"upload-photo": "Upload Photo",
|
||||
"upload-photo": "사진 업로드",
|
||||
"use-8-characters-or-more-for-your-password": "Use 8 characters or more for your password",
|
||||
"user-created": "User created",
|
||||
"user-creation-failed": "User creation failed",
|
||||
"user-deleted": "User deleted",
|
||||
"user-deleted": "사용자 삭제됨",
|
||||
"user-id-with-value": "User ID: {id}",
|
||||
"user-id": "User ID",
|
||||
"user-password": "User Password",
|
||||
"user-successfully-logged-in": "User Successfully Logged In",
|
||||
"user-update-failed": "User update failed",
|
||||
"user-updated": "User updated",
|
||||
"user": "User",
|
||||
"user": "사용자",
|
||||
"username": "Username",
|
||||
"users-header": "USERS",
|
||||
"users": "Users",
|
||||
"user-not-found": "User not found",
|
||||
"webhook-time": "Webhook Time",
|
||||
"webhooks-enabled": "Webhooks Enabled",
|
||||
"webhooks-enabled": "Webhook이 활성화되었습니다",
|
||||
"you-are-not-allowed-to-create-a-user": "You are not allowed to create a user",
|
||||
"you-are-not-allowed-to-delete-this-user": "You are not allowed to delete this user",
|
||||
"enable-advanced-content": "Enable Advanced Content",
|
||||
"enable-advanced-content-description": "Enables advanced features like Recipe Scaling, API keys, Webhooks, and Data Management. Don't worry, you can always change this later",
|
||||
"favorite-recipes": "Favorite Recipes",
|
||||
"email-or-username": "Email or Username",
|
||||
"email-or-username": "이메일 또는 사용자명",
|
||||
"remember-me": "Remember Me",
|
||||
"please-enter-your-email-and-password": "Please enter your email and password",
|
||||
"please-enter-your-email-and-password": "이메일과 비밀번호를 입력하세요.",
|
||||
"invalid-credentials": "Invalid Credentials",
|
||||
"account-locked-please-try-again-later": "Account Locked. Please try again later",
|
||||
"user-favorites": "User Favorites",
|
||||
@@ -883,7 +908,7 @@
|
||||
"strong": "Strong",
|
||||
"very-strong": "Very Strong"
|
||||
},
|
||||
"user-management": "User Management",
|
||||
"user-management": "사용자 관리",
|
||||
"reset-locked-users": "Reset Locked Users",
|
||||
"admin-user-creation": "Admin User Creation",
|
||||
"admin-user-management": "Admin User Management",
|
||||
@@ -905,7 +930,7 @@
|
||||
},
|
||||
"language-dialog": {
|
||||
"translated": "translated",
|
||||
"choose-language": "Choose Language",
|
||||
"choose-language": "언어 선택",
|
||||
"select-description": "Choose the language for the Mealie UI. The setting only applies to you, not other users.",
|
||||
"how-to-contribute-description": "Is something not translated yet, mistranslated, or your language missing from the list? {read-the-docs-link} on how to contribute!",
|
||||
"read-the-docs": "Read the docs"
|
||||
@@ -965,10 +990,10 @@
|
||||
"recipe-data-description": "Use this section to manage the data associated with your recipes. You can perform several bulk actions on your recipes including exporting, deleting, tagging, and assigning categories.",
|
||||
"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",
|
||||
"tag": "Tag",
|
||||
"data-exports": "데이터 내보내기",
|
||||
"tag": "태그",
|
||||
"categorize": "Categorize",
|
||||
"update-settings": "Update Settings",
|
||||
"update-settings": "업데이트 설정",
|
||||
"tag-recipes": "Tag Recipes",
|
||||
"categorize-recipes": "Categorize Recipes",
|
||||
"export-recipes": "Export Recipes",
|
||||
@@ -979,16 +1004,16 @@
|
||||
"manage-aliases": "Manage Aliases",
|
||||
"seed-data": "Seed Data",
|
||||
"seed": "Seed",
|
||||
"data-management": "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",
|
||||
"select-language": "언어 선택",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
"edit-category": "카테고리 수정",
|
||||
"new-category": "새 카테고리",
|
||||
"category-data": "카테고리 데이터"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
@@ -1002,7 +1027,7 @@
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "User Registration",
|
||||
"user-registration": "사용자 등록",
|
||||
"registration-success": "Registration Success",
|
||||
"join-a-group": "Join a Group",
|
||||
"create-a-new-group": "Create a New Group",
|
||||
@@ -1020,9 +1045,9 @@
|
||||
"this-field-is-required": "This Field is Required"
|
||||
},
|
||||
"export": {
|
||||
"export": "Export",
|
||||
"file-name": "File Name",
|
||||
"size": "Size",
|
||||
"export": "내보내기",
|
||||
"file-name": "파일 이름",
|
||||
"size": "크기",
|
||||
"link-expires": "Link Expires"
|
||||
},
|
||||
"recipe-share": {
|
||||
@@ -1050,7 +1075,7 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Ocr editor",
|
||||
"toolbar": "Toolbar",
|
||||
"toolbar": "툴바",
|
||||
"selection-mode": "Selection mode",
|
||||
"pan-and-zoom-picture": "Pan and zoom picture",
|
||||
"split-text": "Split text",
|
||||
@@ -1058,7 +1083,7 @@
|
||||
"split-by-block": "Split by text block",
|
||||
"flatten": "Flatten regardless of original formating",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"help": "도움말",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"selection-mode": "Selection Mode (default)",
|
||||
"selection-mode-desc": "The selection mode is the main mode that can be used to enter data:",
|
||||
@@ -1098,7 +1123,7 @@
|
||||
"title-recipes-directory": "Recipes Directory (recipes)",
|
||||
"title-user-directory": "User Directory (user)"
|
||||
},
|
||||
"action-delete-log-files-name": "Delete Log Files",
|
||||
"action-delete-log-files-name": "로그파일삭제",
|
||||
"action-delete-log-files-description": "Deletes all the log files",
|
||||
"action-clean-directories-name": "Clean Directories",
|
||||
"action-clean-directories-description": "Removes all the recipe folders that are not valid UUIDs",
|
||||
@@ -1129,7 +1154,17 @@
|
||||
"background-tasks": "Background Tasks",
|
||||
"background-tasks-description": "Here you can view all the running background tasks and their status",
|
||||
"no-logs-found": "No Logs Found",
|
||||
"tasks": "Tasks"
|
||||
"tasks": "Tasks",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Welcome, {0}",
|
||||
@@ -1140,23 +1175,23 @@
|
||||
"account-summary-description": "Here's a summary of your group's information",
|
||||
"group-statistics": "Group Statistics",
|
||||
"group-statistics-description": "Your Group Statistics provide some insight how you're using Mealie.",
|
||||
"storage-capacity": "Storage Capacity",
|
||||
"storage-capacity": "저장 공간",
|
||||
"storage-capacity-description": "Your storage capacity is a calculation of the images and assets you have uploaded.",
|
||||
"personal": "Personal",
|
||||
"personal-description": "These are settings that are personal to you. Changes here won't affect other users",
|
||||
"user-settings": "User Settings",
|
||||
"user-settings": "사용자 설정",
|
||||
"user-settings-description": "Manage your preferences, change your password, and update your email",
|
||||
"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 mealplan and privacy settings.",
|
||||
"cookbooks-description": "Manage a collection of recipe categories and generate pages for them.",
|
||||
"members": "Members",
|
||||
"members": "회원",
|
||||
"members-description": "See who's in your group 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": "Manage your Food and Units (more options coming soon)",
|
||||
"data-migrations": "Data Migrations",
|
||||
"data-migrations-description": "Migrate your existing data from other applications like Nextcloud Recipes and Chowdown",
|
||||
@@ -1180,7 +1215,7 @@
|
||||
"description": "Cookbooks are another way to organize recipes by creating cross sections of recipes and tags. Creating a cookbook will add an entry to the side-bar and all the recipes with the tags and categories chosen will be displayed in the cookbook.",
|
||||
"public-cookbook": "Public Cookbook",
|
||||
"public-cookbook-description": "Public Cookbooks can be shared with non-mealie users and will be displayed on your groups page.",
|
||||
"filter-options": "Filter Options",
|
||||
"filter-options": "필터 옵션",
|
||||
"filter-options-description": "When require all is selected the cookbook will only include recipes that have all of the items selected. This applies to each subset of selectors and not a cross section of the selected items.",
|
||||
"require-all-categories": "Require All Categories",
|
||||
"require-all-tags": "Require All Tags",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user