mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-02-26 09:43:19 -05:00
Compare commits
316 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8154ee548a | ||
|
|
591bf9d98f | ||
|
|
f202b1f922 | ||
|
|
17b2e37e4e | ||
|
|
0ec8087ac6 | ||
|
|
e580d6f904 | ||
|
|
56d9cafb68 | ||
|
|
32c864c703 | ||
|
|
37280a3da0 | ||
|
|
7f850fba98 | ||
|
|
b40f201430 | ||
|
|
a0d796551c | ||
|
|
fe3a4ab641 | ||
|
|
9a9fe66ccb | ||
|
|
7fe4b75949 | ||
|
|
de5bea6f73 | ||
|
|
b6d43e8e3d | ||
|
|
18b099b115 | ||
|
|
3831eef508 | ||
|
|
75113cc2c7 | ||
|
|
b81f88dc18 | ||
|
|
756ffc8e90 | ||
|
|
ec7df232ed | ||
|
|
35caef1c39 | ||
|
|
9541137ef7 | ||
|
|
756597324d | ||
|
|
55f009ed9e | ||
|
|
9378c4879f | ||
|
|
19aa572bd8 | ||
|
|
66fdd6c428 | ||
|
|
3f419ad7b6 | ||
|
|
f3305a9074 | ||
|
|
09e3b83933 | ||
|
|
b275aef04d | ||
|
|
69e226a0ed | ||
|
|
aac0d5b6c6 | ||
|
|
b47ee0557d | ||
|
|
97e0796af2 | ||
|
|
733bb77ddb | ||
|
|
eda6821288 | ||
|
|
20fc2d868b | ||
|
|
29d78f52ca | ||
|
|
006d6a6f1d | ||
|
|
a210efd62f | ||
|
|
3ec9b5c34d | ||
|
|
fd17614764 | ||
|
|
98b0f8779b | ||
|
|
940663a22d | ||
|
|
bf06482b29 | ||
|
|
b2eaf1ee02 | ||
|
|
876eff2117 | ||
|
|
e0429f4dc9 | ||
|
|
458ba2964f | ||
|
|
9b5cf36981 | ||
|
|
3e2c9f41cf | ||
|
|
74b1e6236b | ||
|
|
b54a7d4fcc | ||
|
|
8a2ed0bd78 | ||
|
|
7d3983d2ec | ||
|
|
4d853c4ca8 | ||
|
|
98c2138970 | ||
|
|
7187634f18 | ||
|
|
494c28ce6f | ||
|
|
3b99a147fb | ||
|
|
1356043257 | ||
|
|
4bc0333903 | ||
|
|
2e8c50e4ba | ||
|
|
c463ef279a | ||
|
|
7a041759fa | ||
|
|
999d0d4322 | ||
|
|
6320ba7ec5 | ||
|
|
f5faff66d3 | ||
|
|
3220595a83 | ||
|
|
0b0c04ac03 | ||
|
|
95d044b7bb | ||
|
|
eaf4565aa7 | ||
|
|
3714baf5d6 | ||
|
|
4109d02a39 | ||
|
|
12a9110716 | ||
|
|
67563da67b | ||
|
|
b25282aef1 | ||
|
|
387f3ca02c | ||
|
|
93e6c0c41c | ||
|
|
9d64345321 | ||
|
|
8607b9891b | ||
|
|
d272784469 | ||
|
|
71a5de3432 | ||
|
|
cdfb3543dc | ||
|
|
cc2d5ed982 | ||
|
|
b545e75f09 | ||
|
|
1d7c06352c | ||
|
|
e2c7e24224 | ||
|
|
976298c7d6 | ||
|
|
9436dc2d71 | ||
|
|
396d2ccf61 | ||
|
|
ee1a11ea57 | ||
|
|
d475818a9f | ||
|
|
c501553d5e | ||
|
|
db3c8f7b4b | ||
|
|
f5ede73eb6 | ||
|
|
81fd224d88 | ||
|
|
5a8555dd61 | ||
|
|
a7beb683ad | ||
|
|
f2c8e6af26 | ||
|
|
388206f58f | ||
|
|
ff787777ea | ||
|
|
f380f4455d | ||
|
|
d7c883feca | ||
|
|
17a7d0b31e | ||
|
|
ed61ad39be | ||
|
|
8a8756f4c8 | ||
|
|
30892dcb2f | ||
|
|
af41b08a60 | ||
|
|
2dc9c8e843 | ||
|
|
c325a49fc2 | ||
|
|
a5b93630c8 | ||
|
|
27bf3802fe | ||
|
|
d28fe9833d | ||
|
|
e95ca870b1 | ||
|
|
0a927afaa0 | ||
|
|
f0afe67158 | ||
|
|
7d8e2754d7 | ||
|
|
562cea341b | ||
|
|
0e42f7407d | ||
|
|
1209bf4b80 | ||
|
|
e8c0a76051 | ||
|
|
90e28a2d70 | ||
|
|
805f14c9d1 | ||
|
|
870f322efd | ||
|
|
5baaf07405 | ||
|
|
5ff2053524 | ||
|
|
b703dda70e | ||
|
|
e34079673c | ||
|
|
06ed377c00 | ||
|
|
405535a6ff | ||
|
|
702379c0c8 | ||
|
|
d036cbc962 | ||
|
|
ead02737ab | ||
|
|
c175c8e9a0 | ||
|
|
c2ed4a39ac | ||
|
|
a78fbea711 | ||
|
|
3702331630 | ||
|
|
a75de6d1cf | ||
|
|
95b6ab86d0 | ||
|
|
f7f5c97f07 | ||
|
|
59f8b74460 | ||
|
|
d126f74d35 | ||
|
|
de80516722 | ||
|
|
cb8e765a61 | ||
|
|
c8f3d4ba84 | ||
|
|
e01bea1b81 | ||
|
|
22d9309112 | ||
|
|
785ab184af | ||
|
|
2b97af5728 | ||
|
|
6f38fcf81b | ||
|
|
57f7ea3750 | ||
|
|
a50186c70d | ||
|
|
5c035ec644 | ||
|
|
39baca4462 | ||
|
|
8e7a17b1bb | ||
|
|
8461023d43 | ||
|
|
822663905d | ||
|
|
8f8127a5fc | ||
|
|
475cafae49 | ||
|
|
034a21e203 | ||
|
|
fd1b54ae70 | ||
|
|
503fe5cb2e | ||
|
|
eb3d56936e | ||
|
|
ef87f2231d | ||
|
|
4b3fc45c1c | ||
|
|
8d0f0e8ca6 | ||
|
|
da9826dc7c | ||
|
|
53e97c5315 | ||
|
|
dcd9567059 | ||
|
|
2c970b8f92 | ||
|
|
3804e1d52c | ||
|
|
35adc341e6 | ||
|
|
2cabde220f | ||
|
|
5f074fe5d9 | ||
|
|
5a38589a60 | ||
|
|
fc454137ee | ||
|
|
e15fd8a05d | ||
|
|
a1dd6c941b | ||
|
|
145eb9f1ee | ||
|
|
14b6ab7ec7 | ||
|
|
8923c1ecf8 | ||
|
|
466997febc | ||
|
|
96919319b1 | ||
|
|
241c156ccd | ||
|
|
95ec13161f | ||
|
|
f4384167f6 | ||
|
|
1b0de02b71 | ||
|
|
c1370afb16 | ||
|
|
be5ac7a17a | ||
|
|
e13d203524 | ||
|
|
2fc44018ec | ||
|
|
117c1d20ea | ||
|
|
4e3d09ac7a | ||
|
|
5580d177c3 | ||
|
|
f2d2b79a57 | ||
|
|
9205a09d35 | ||
|
|
be378cb20c | ||
|
|
c196445e61 | ||
|
|
52e5e9da5d | ||
|
|
fad2f8da59 | ||
|
|
212ca64e27 | ||
|
|
c0c0c8ca0d | ||
|
|
89729c5eee | ||
|
|
72bc97eb24 | ||
|
|
5e89903b2f | ||
|
|
b302e0ffd8 | ||
|
|
d2e56cf233 | ||
|
|
1dc051f562 | ||
|
|
5dafe8fbb5 | ||
|
|
6536441d22 | ||
|
|
c57c3f5205 | ||
|
|
aa8b0337aa | ||
|
|
3e80947a4c | ||
|
|
7153ff6f25 | ||
|
|
b65555fc2f | ||
|
|
1e5edc7434 | ||
|
|
861020ffe0 | ||
|
|
61e0a52100 | ||
|
|
ee445e7f54 | ||
|
|
04255e285f | ||
|
|
9abb6f10fd | ||
|
|
1b2f7f2675 | ||
|
|
556dfbfe53 | ||
|
|
783542b9ef | ||
|
|
ed582158dc | ||
|
|
846d1eda5b | ||
|
|
f748bbba68 | ||
|
|
d5a340bde1 | ||
|
|
7e6f3c9310 | ||
|
|
df4edf50f9 | ||
|
|
cfbf51072b | ||
|
|
21d2fb4b93 | ||
|
|
b729c0e15a | ||
|
|
a644a9782f | ||
|
|
df1bca6c6a | ||
|
|
8e4b951ecc | ||
|
|
80f8806604 | ||
|
|
048d3d5469 | ||
|
|
fa1671670d | ||
|
|
284df44209 | ||
|
|
a5306c31c6 | ||
|
|
7f23e8606a | ||
|
|
26636c7b12 | ||
|
|
29b9c231d3 | ||
|
|
8e27d0b83f | ||
|
|
197d794ca6 | ||
|
|
62ff74ce9e | ||
|
|
92236b8967 | ||
|
|
edcc7d6a48 | ||
|
|
75193d00df | ||
|
|
5741c55fc9 | ||
|
|
43cabac091 | ||
|
|
bf45856c27 | ||
|
|
484f026772 | ||
|
|
c02b074b07 | ||
|
|
601cd12e9c | ||
|
|
50728a67b4 | ||
|
|
40fb5600b2 | ||
|
|
c2cdc1e8a6 | ||
|
|
f14e1e536c | ||
|
|
4a6805479c | ||
|
|
6190f0fd1c | ||
|
|
d4a9ecd65f | ||
|
|
fbf4282063 | ||
|
|
f48f55b6dc | ||
|
|
a9040cf17e | ||
|
|
26571af9b7 | ||
|
|
335807637a | ||
|
|
a6f89a155e | ||
|
|
4b09497c3d | ||
|
|
2e339ee996 | ||
|
|
a4ed9fc870 | ||
|
|
f3ea467e20 | ||
|
|
2c3fa81227 | ||
|
|
b726c9a886 | ||
|
|
e8c121de04 | ||
|
|
406dae6e97 | ||
|
|
2a158ab290 | ||
|
|
b3b1778890 | ||
|
|
42deb5ad10 | ||
|
|
ed49eb7e80 | ||
|
|
dc0775602c | ||
|
|
1c83cd55bb | ||
|
|
8b75fa68bf | ||
|
|
bb52c78c5b | ||
|
|
1ae063a796 | ||
|
|
e3e8aad749 | ||
|
|
f09960f52c | ||
|
|
1cf95bb3b0 | ||
|
|
a396604520 | ||
|
|
6706918736 | ||
|
|
ab81061cba | ||
|
|
f1c3857f39 | ||
|
|
f33af0a430 | ||
|
|
6d5f3e7496 | ||
|
|
ec7fa6332d | ||
|
|
764f85fb40 | ||
|
|
4c3f751e80 | ||
|
|
95213fa41b | ||
|
|
bc595d5cfa | ||
|
|
fd21777990 | ||
|
|
94cda5bb83 | ||
|
|
786ddae05b | ||
|
|
1379529df5 | ||
|
|
6e15a8c439 | ||
|
|
c61906e480 | ||
|
|
4799fffc93 | ||
|
|
049c269f6f | ||
|
|
30510202df | ||
|
|
f612680a46 | ||
|
|
7c7e062b6e |
@@ -1,3 +1,27 @@
|
|||||||
|
.git
|
||||||
|
.github
|
||||||
|
.dockerignore
|
||||||
|
.gitignore
|
||||||
|
|
||||||
|
.idea
|
||||||
|
.vscode
|
||||||
|
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
*.so
|
||||||
|
htmlcov/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.pytest_cache/
|
||||||
|
.venv
|
||||||
|
venv
|
||||||
|
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
._*
|
||||||
|
|
||||||
*/node_modules
|
*/node_modules
|
||||||
*/dist
|
*/dist
|
||||||
*/data/db
|
*/data/db
|
||||||
|
|||||||
52
.github/ISSUE_TEMPLATE/bug-report.yaml
vendored
Normal file
52
.github/ISSUE_TEMPLATE/bug-report.yaml
vendored
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
---
|
||||||
|
name: Bug Report
|
||||||
|
description: "submit a bug report for the current release"
|
||||||
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
id: checks
|
||||||
|
attributes:
|
||||||
|
label: First Check
|
||||||
|
description: Please confirm and check all the following options.
|
||||||
|
options:
|
||||||
|
- label: This is not a feature request
|
||||||
|
required: true
|
||||||
|
- label: I added a very descriptive title to this issue.
|
||||||
|
required: true
|
||||||
|
- label: I used the GitHub search to find a similar issue and didn't find it.
|
||||||
|
required: true
|
||||||
|
- label: I searched the Mealie documentation, with the integrated search.
|
||||||
|
required: true
|
||||||
|
- label: I already read the docs and didn't find an answer.
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: What is the issue you are experiencing?
|
||||||
|
placeholder: A clear and concise description of what the bug is.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: os
|
||||||
|
attributes:
|
||||||
|
label: Deployment
|
||||||
|
description: What Deployment system are you using?
|
||||||
|
multiple: true
|
||||||
|
options:
|
||||||
|
- Docker (Linux)
|
||||||
|
- Docker (Windows)
|
||||||
|
- Docker (Synology)
|
||||||
|
- Unraid
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: os-details
|
||||||
|
attributes:
|
||||||
|
label: Deployment Details
|
||||||
|
description: You can add more details about your operating system here, in particular if you chose "Other". If you are experiencing issues with deployment, please provide your docker-compose or docker commands
|
||||||
|
- type: input
|
||||||
|
id: mealie-version
|
||||||
|
attributes:
|
||||||
|
label: Mealie Version
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
38
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,38 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug Report
|
|
||||||
about: Create a bug report to help us improve
|
|
||||||
title: ''
|
|
||||||
labels: bug
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Describe the bug**
|
|
||||||
<!-- A clear and concise description of what the bug is. -->
|
|
||||||
|
|
||||||
**Steps To Reproduce**
|
|
||||||
Please be specific!
|
|
||||||
1. Go to '...'
|
|
||||||
2. Click on '....'
|
|
||||||
3. etc.
|
|
||||||
|
|
||||||
**Sample Code**
|
|
||||||
<!-- If applicable, please include Sample code to reproduce the issue. -->
|
|
||||||
|
|
||||||
**Expected behavior**
|
|
||||||
<!-- A clear and concise description of what you expected to happen. -->
|
|
||||||
|
|
||||||
**Actual Behavior**
|
|
||||||
<!-- A clear and concise description of what actually happens. -->
|
|
||||||
|
|
||||||
**Screenshots**
|
|
||||||
<!-- If applicable, add screenshots to help explain your problem. -->
|
|
||||||
|
|
||||||
**Device Information (please complete the following information):**
|
|
||||||
- OS: [e.g., WSL2 on Win10, Mac]
|
|
||||||
- Deployment: [e.g., Docker-version, docker-compose, Python application]
|
|
||||||
- Browser: [e.g., chrome, safari]
|
|
||||||
- Version: [e.g., 0.2.0-dev]
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
<!-- Add any other context about the problem here. If applicable, please include why you think the bug is occurring and/or troubleshooting you have already performed. -->
|
|
||||||
47
.github/ISSUE_TEMPLATE/v1-bug-report.yaml
vendored
Normal file
47
.github/ISSUE_TEMPLATE/v1-bug-report.yaml
vendored
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
---
|
||||||
|
name: v1.0.0b Bug Report
|
||||||
|
description: "submit a bug report for the v1 beta"
|
||||||
|
title: "[v1.0.0b] - YOUR TITLE"
|
||||||
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
id: checks
|
||||||
|
attributes:
|
||||||
|
label: First Check
|
||||||
|
description: Please confirm and check all the following options.
|
||||||
|
options:
|
||||||
|
- label: This is not a feature request
|
||||||
|
required: true
|
||||||
|
- label: I added a very descriptive title to this issue.
|
||||||
|
required: true
|
||||||
|
- label: I used the GitHub search to find a similar issue and didn't find it.
|
||||||
|
required: true
|
||||||
|
- label: I searched the Mealie documentation, with the integrated search.
|
||||||
|
required: true
|
||||||
|
- label: I already read the docs and didn't find an answer.
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: description
|
||||||
|
attributes:
|
||||||
|
label: What is the issue you are experiencing?
|
||||||
|
placeholder: A clear and concise description of what the bug is.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: os
|
||||||
|
attributes:
|
||||||
|
label: Deployment
|
||||||
|
description: What Deployment system are you using?
|
||||||
|
multiple: true
|
||||||
|
options:
|
||||||
|
- Docker (Linux)
|
||||||
|
- Docker (Windows)
|
||||||
|
- Docker (Synology)
|
||||||
|
- Unraid
|
||||||
|
- Other
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: os-details
|
||||||
|
attributes:
|
||||||
|
label: Deployment Details
|
||||||
|
description: You can add more details about your operating system here, in particular if you chose "Other". If you are experiencing issues with deployment, please provide your docker-compose or docker commands
|
||||||
38
.github/ISSUE_TEMPLATE/v1-task.yaml
vendored
Normal file
38
.github/ISSUE_TEMPLATE/v1-task.yaml
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
name: v1.0.0b Task
|
||||||
|
description: "CONTRIBUTORS ONLY: Submit a Task that needs to be completed"
|
||||||
|
title: "[v1.0.0b] [Task] - TASK DESCRIPTION"
|
||||||
|
labels:
|
||||||
|
- task
|
||||||
|
- v1
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
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.
|
||||||
|
|
||||||
|
**DO NOT** create a task unless
|
||||||
|
- You are a contributors 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.
|
||||||
|
- type: textarea
|
||||||
|
id: problem
|
||||||
|
attributes:
|
||||||
|
label: What is the problem this task addresses?
|
||||||
|
placeholder: A clear and concise description of what the problem this task will address.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
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
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
17
.github/stale.yaml
vendored
Normal file
17
.github/stale.yaml
vendored
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# Number of days of inactivity before an issue becomes stale
|
||||||
|
daysUntilStale: 60
|
||||||
|
# Number of days of inactivity before a stale issue is closed
|
||||||
|
daysUntilClose: 7
|
||||||
|
# Issues with these labels will never be considered stale
|
||||||
|
exemptLabels:
|
||||||
|
- pinned
|
||||||
|
- security
|
||||||
|
# Label to use when marking an issue as stale
|
||||||
|
staleLabel: wontfix
|
||||||
|
# Comment to post when marking an issue as stale. Set to `false` to disable
|
||||||
|
markComment: >
|
||||||
|
This issue has been automatically marked as stale because it has not had
|
||||||
|
recent activity. It will be closed if no further activity occurs. Thank you
|
||||||
|
for your contributions.
|
||||||
|
# Comment to post when closing a stale issue. Set to `false` to disable
|
||||||
|
closeComment: false
|
||||||
7
.github/workflows/build-docs.yml
vendored
7
.github/workflows/build-docs.yml
vendored
@@ -1,8 +1,7 @@
|
|||||||
name: Publish docs via GitHub Pages
|
name: Publish docs via GitHub Pages
|
||||||
on:
|
on:
|
||||||
push:
|
release:
|
||||||
branches:
|
types: [published]
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
@@ -10,7 +9,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout main
|
- name: Checkout main
|
||||||
uses: actions/checkout@v1
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Deploy docs
|
- name: Deploy docs
|
||||||
uses: mhausenblas/mkdocs-deploy-gh-pages@master
|
uses: mhausenblas/mkdocs-deploy-gh-pages@master
|
||||||
|
|||||||
3
.github/workflows/test-all.yml
vendored
3
.github/workflows/test-all.yml
vendored
@@ -39,7 +39,7 @@ jobs:
|
|||||||
# ----- install & configure poetry -----
|
# ----- install & configure poetry -----
|
||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
- name: Install Poetry
|
- name: Install Poetry
|
||||||
uses: snok/install-poetry@v1.1.1
|
uses: snok/install-poetry@v1
|
||||||
with:
|
with:
|
||||||
virtualenvs-create: true
|
virtualenvs-create: true
|
||||||
virtualenvs-in-project: true
|
virtualenvs-in-project: true
|
||||||
@@ -57,6 +57,7 @@ jobs:
|
|||||||
#----------------------------------------------
|
#----------------------------------------------
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
|
sudo apt-get install libsasl2-dev libldap2-dev libssl-dev
|
||||||
poetry install
|
poetry install
|
||||||
poetry add "psycopg2-binary==2.8.6"
|
poetry add "psycopg2-binary==2.8.6"
|
||||||
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'
|
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true'
|
||||||
|
|||||||
8
.gitignore
vendored
8
.gitignore
vendored
@@ -55,6 +55,7 @@ eggs/
|
|||||||
lib/
|
lib/
|
||||||
lib64/
|
lib64/
|
||||||
parts/
|
parts/
|
||||||
|
!frontend/src/components/Recipe/Parts/
|
||||||
sdist/
|
sdist/
|
||||||
var/
|
var/
|
||||||
wheels/
|
wheels/
|
||||||
@@ -148,4 +149,9 @@ dev/data/backups/dev_sample_data*.zip
|
|||||||
!dev/data/backups/test*.zip
|
!dev/data/backups/test*.zip
|
||||||
dev/data/recipes/*
|
dev/data/recipes/*
|
||||||
dev/scripts/output/app_routes.py
|
dev/scripts/output/app_routes.py
|
||||||
dev/scripts/output/javascriptAPI/*
|
dev/scripts/output/javascriptAPI/*
|
||||||
|
mealie/services/scraper/ingredient_nlp/model.crfmodel
|
||||||
|
.gitignore
|
||||||
|
frontend/.nuxt/**
|
||||||
|
frontend/static/sw.js
|
||||||
|
dev/code-generation/generated/*
|
||||||
|
|||||||
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -15,5 +15,6 @@
|
|||||||
"i18n-ally.keystyle": "nested",
|
"i18n-ally.keystyle": "nested",
|
||||||
"cSpell.words": ["compression", "hkotel", "performant", "postgres", "webp"],
|
"cSpell.words": ["compression", "hkotel", "performant", "postgres", "webp"],
|
||||||
"search.mode": "reuseEditor",
|
"search.mode": "reuseEditor",
|
||||||
"python.linting.flake8Enabled": true
|
"python.linting.flake8Enabled": true,
|
||||||
|
"conventionalCommits.scopes": ["frontend"]
|
||||||
}
|
}
|
||||||
|
|||||||
53
Caddyfile
53
Caddyfile
@@ -1,35 +1,34 @@
|
|||||||
{
|
{
|
||||||
auto_https off
|
auto_https off
|
||||||
admin off
|
admin off
|
||||||
}
|
}
|
||||||
|
|
||||||
:80 {
|
:80 {
|
||||||
@proxied path /api/* /docs /openapi.json
|
@proxied path /api/* /docs /openapi.json
|
||||||
|
|
||||||
@static {
|
@static {
|
||||||
file
|
file
|
||||||
path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.woff2 *.webp
|
path *.ico *.css *.js *.gif *.jpg *.jpeg *.png *.svg *.woff *.woff2 *.webp
|
||||||
}
|
}
|
||||||
|
|
||||||
encode gzip zstd
|
|
||||||
|
|
||||||
|
|
||||||
# Handles Recipe Images / Assets
|
|
||||||
handle_path /api/media/recipes/* {
|
|
||||||
header @static Cache-Control max-age=31536000
|
|
||||||
root * /app/data/recipes/
|
|
||||||
file_server
|
|
||||||
}
|
|
||||||
|
|
||||||
handle @proxied {
|
encode gzip zstd
|
||||||
uri strip_suffix /
|
|
||||||
reverse_proxy http://127.0.0.1:9000
|
|
||||||
}
|
|
||||||
|
|
||||||
handle {
|
# Handles Recipe Images / Assets
|
||||||
header @static Cache-Control max-age=31536000
|
handle_path /api/media/recipes/* {
|
||||||
root * /app/dist
|
header @static Cache-Control max-age=31536000
|
||||||
try_files {path}.html {path} /
|
root * /app/data/recipes/
|
||||||
file_server
|
file_server
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
handle @proxied {
|
||||||
|
uri strip_suffix /
|
||||||
|
reverse_proxy http://127.0.0.1:9000
|
||||||
|
}
|
||||||
|
|
||||||
|
handle {
|
||||||
|
header @static Cache-Control max-age=31536000
|
||||||
|
root * /app/dist
|
||||||
|
try_files {path}.html {path} /
|
||||||
|
file_server
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
151
Dockerfile
151
Dockerfile
@@ -1,59 +1,142 @@
|
|||||||
# build
|
###############################################
|
||||||
FROM node:lts-alpine as build-stage
|
# Frontend Builder Image
|
||||||
|
###############################################
|
||||||
|
FROM node:lts-alpine as frontend-build
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY ./frontend/package*.json ./
|
COPY ./frontend/package*.json ./
|
||||||
RUN npm install
|
RUN npm install
|
||||||
COPY ./frontend/ .
|
COPY ./frontend/ .
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# Base Image
|
||||||
|
###############################################
|
||||||
|
FROM python:3.9-slim as python-base
|
||||||
|
|
||||||
FROM python:3.9-slim-buster
|
ENV MEALIE_HOME="/app"
|
||||||
|
|
||||||
ENV PRODUCTION true
|
ENV PYTHONUNBUFFERED=1 \
|
||||||
ENV POETRY_VERSION 1.1.6
|
PYTHONDONTWRITEBYTECODE=1 \
|
||||||
|
PIP_NO_CACHE_DIR=off \
|
||||||
|
PIP_DISABLE_PIP_VERSION_CHECK=on \
|
||||||
|
PIP_DEFAULT_TIMEOUT=100 \
|
||||||
|
POETRY_HOME="/opt/poetry" \
|
||||||
|
POETRY_VIRTUALENVS_IN_PROJECT=true \
|
||||||
|
POETRY_NO_INTERACTION=1 \
|
||||||
|
PYSETUP_PATH="/opt/pysetup" \
|
||||||
|
VENV_PATH="/opt/pysetup/.venv"
|
||||||
|
|
||||||
|
# prepend poetry and venv to path
|
||||||
|
ENV PATH="$POETRY_HOME/bin:$VENV_PATH/bin:$PATH"
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
# create user account
|
||||||
gcc g++ \
|
RUN useradd -u 911 -U -d $MEALIE_HOME -s /bin/bash abc \
|
||||||
|
&& usermod -G users abc \
|
||||||
|
&& mkdir $MEALIE_HOME
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
# Builder Image
|
||||||
|
###############################################
|
||||||
|
FROM python-base as builder-base
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install --no-install-recommends -y \
|
||||||
curl \
|
curl \
|
||||||
gnupg gnupg2 gnupg1 \
|
build-essential \
|
||||||
apt-transport-https \
|
|
||||||
debian-archive-keyring \
|
|
||||||
debian-keyring \
|
|
||||||
libpq-dev \
|
libpq-dev \
|
||||||
libwebp-dev \
|
libwebp-dev \
|
||||||
|
# LDAP Dependencies
|
||||||
|
libsasl2-dev libldap2-dev libssl-dev \
|
||||||
|
gnupg gnupg2 gnupg1 \
|
||||||
|
debian-keyring \
|
||||||
|
debian-archive-keyring \
|
||||||
|
apt-transport-https \
|
||||||
&& curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | apt-key add - \
|
&& curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | apt-key add - \
|
||||||
&& curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee -a /etc/apt/sources.list.d/caddy-stable.list \
|
&& curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-stable.list \
|
||||||
&& apt-get update && apt-get install -y --no-install-recommends \
|
&& apt-get update \
|
||||||
|
&& apt-get install --no-install-recommends -y \
|
||||||
caddy \
|
caddy \
|
||||||
&& apt autoremove \
|
&& pip install -U --no-cache-dir pip
|
||||||
&& rm -rf /var/lib/apt/lists/* \
|
|
||||||
&& apt-get remove -y curl apt-transport-https debian-keyring g++ gnupg gnupg2 gnupg1
|
|
||||||
|
|
||||||
|
# install poetry - respects $POETRY_VERSION & $POETRY_HOME
|
||||||
|
ENV POETRY_VERSION=1.1.6
|
||||||
|
RUN curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python -
|
||||||
|
|
||||||
RUN pip install --no-cache-dir "poetry==$POETRY_VERSION"
|
# copy project requirement files here to ensure they will be cached.
|
||||||
|
WORKDIR $PYSETUP_PATH
|
||||||
|
COPY ./poetry.lock ./pyproject.toml ./
|
||||||
|
|
||||||
# project dependencies
|
# install runtime deps - uses $POETRY_VIRTUALENVS_IN_PROJECT internally
|
||||||
WORKDIR /app
|
RUN poetry install -E pgsql --no-dev
|
||||||
COPY pyproject.toml poetry.lock /app/
|
|
||||||
RUN poetry config virtualenvs.create false
|
|
||||||
RUN poetry install -E pgsql --no-dev --no-interaction --no-ansi
|
|
||||||
|
|
||||||
COPY ./mealie /app/mealie
|
###############################################
|
||||||
RUN poetry config virtualenvs.create false \
|
# Development Image
|
||||||
&& poetry install -E pgsql --no-dev
|
###############################################
|
||||||
|
FROM python-base as development
|
||||||
|
ENV PRODUCTION=false
|
||||||
|
|
||||||
|
# copying poetry and venv into image
|
||||||
|
COPY --from=builder-base $POETRY_HOME $POETRY_HOME
|
||||||
|
COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH
|
||||||
|
|
||||||
|
# copy backend
|
||||||
|
COPY ./mealie $MEALIE_HOME/mealie
|
||||||
|
COPY ./poetry.lock ./pyproject.toml $MEALIE_HOME/
|
||||||
|
|
||||||
#! Future
|
#! Future
|
||||||
# COPY ./alembic /app
|
# COPY ./alembic ./alembic.ini $MEALIE_HOME/
|
||||||
# COPY alembic.ini /app
|
|
||||||
COPY ./Caddyfile /app
|
|
||||||
COPY ./dev/data/templates /app/data/templates
|
|
||||||
|
|
||||||
# frontend build
|
# venv already has runtime deps installed we get a quicker install
|
||||||
COPY --from=build-stage /app/dist /app/dist
|
WORKDIR $MEALIE_HOME
|
||||||
|
RUN . $VENV_PATH/bin/activate && poetry install
|
||||||
|
WORKDIR /
|
||||||
|
|
||||||
VOLUME [ "/app/data/" ]
|
RUN chmod +x $MEALIE_HOME/mealie/run.sh
|
||||||
|
ENTRYPOINT $MEALIE_HOME/mealie/run.sh "reload"
|
||||||
|
|
||||||
EXPOSE 80
|
###############################################
|
||||||
|
# Production Image
|
||||||
|
###############################################
|
||||||
|
FROM python-base as production
|
||||||
|
ENV PRODUCTION=true
|
||||||
|
|
||||||
CMD /app/mealie/run.sh
|
# curl for used by healthcheck
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install --no-install-recommends -y \
|
||||||
|
curl \
|
||||||
|
&& apt-get autoremove \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# copying poetry and venv into image
|
||||||
|
COPY --from=builder-base $POETRY_HOME $POETRY_HOME
|
||||||
|
COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH
|
||||||
|
|
||||||
|
# copying caddy into image
|
||||||
|
COPY --from=builder-base /usr/bin/caddy /usr/bin/caddy
|
||||||
|
|
||||||
|
# copy backend
|
||||||
|
COPY ./mealie $MEALIE_HOME/mealie
|
||||||
|
COPY ./poetry.lock ./pyproject.toml $MEALIE_HOME/
|
||||||
|
COPY ./gunicorn_conf.py $MEALIE_HOME
|
||||||
|
|
||||||
|
#! Future
|
||||||
|
# COPY ./alembic ./alembic.ini $MEALIE_HOME/
|
||||||
|
|
||||||
|
# venv already has runtime deps installed we get a quicker install
|
||||||
|
WORKDIR $MEALIE_HOME
|
||||||
|
RUN . $VENV_PATH/bin/activate && poetry install -E pgsql --no-dev
|
||||||
|
WORKDIR /
|
||||||
|
|
||||||
|
# copy frontend
|
||||||
|
COPY --from=frontend-build /app/dist $MEALIE_HOME/dist
|
||||||
|
COPY ./dev/data/templates $MEALIE_HOME/data/templates
|
||||||
|
COPY ./Caddyfile $MEALIE_HOME
|
||||||
|
|
||||||
|
VOLUME [ "$MEALIE_HOME/data/" ]
|
||||||
|
ENV APP_PORT=80
|
||||||
|
|
||||||
|
EXPOSE ${APP_PORT}
|
||||||
|
|
||||||
|
HEALTHCHECK CMD curl -fs http://localhost:${APP_PORT} || exit 1
|
||||||
|
|
||||||
|
RUN chmod +x $MEALIE_HOME/mealie/run.sh
|
||||||
|
ENTRYPOINT $MEALIE_HOME/mealie/run.sh
|
||||||
|
|||||||
@@ -1,33 +0,0 @@
|
|||||||
FROM python:3.9-slim-buster
|
|
||||||
|
|
||||||
|
|
||||||
ENV PRODUCTION false
|
|
||||||
ENV POETRY_VERSION 1.1.6
|
|
||||||
|
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
||||||
gcc g++ \
|
|
||||||
curl \
|
|
||||||
gnupg gnupg2 gnupg1 \
|
|
||||||
apt-transport-https \
|
|
||||||
debian-archive-keyring \
|
|
||||||
debian-keyring \
|
|
||||||
libwebp-dev \
|
|
||||||
&& curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | apt-key add - \
|
|
||||||
&& curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | tee -a /etc/apt/sources.list.d/caddy-stable.list \
|
|
||||||
&& apt-get update && apt-get install -y --no-install-recommends \
|
|
||||||
&& apt autoremove \
|
|
||||||
&& rm -rf /var/lib/apt/lists/* \
|
|
||||||
&& apt-get remove -y curl apt-transport-https debian-keyring g++ gnupg gnupg2 gnupg1
|
|
||||||
|
|
||||||
RUN pip install --no-cache-dir "poetry==$POETRY_VERSION"
|
|
||||||
|
|
||||||
WORKDIR /app/
|
|
||||||
|
|
||||||
# Copy poetry.lock* in case it doesn't exist in the repo
|
|
||||||
COPY ./pyproject.toml /app/
|
|
||||||
COPY ./mealie /app/mealie
|
|
||||||
RUN poetry config virtualenvs.create false \
|
|
||||||
&& poetry install
|
|
||||||
|
|
||||||
RUN chmod +x /app/mealie/run.sh
|
|
||||||
CMD ["/app/mealie/run.sh", "reload"]
|
|
||||||
@@ -6,9 +6,9 @@
|
|||||||
[![Docker Pulls][docker-pull]][docker-pull]
|
[![Docker Pulls][docker-pull]][docker-pull]
|
||||||
[](https://www.codefactor.io/repository/github/hay-kot/mealie)
|
[](https://www.codefactor.io/repository/github/hay-kot/mealie)
|
||||||
[](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.release.yml)
|
[](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.release.yml)
|
||||||
[](https://github.com/hay-kot/mealie/actions/workflows/pytest.yml)
|
[](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml)
|
||||||
[](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.dev.yml)
|
[](https://github.com/hay-kot/mealie/actions/workflows/dockerbuild.dev.yml)
|
||||||
[](https://github.com/hay-kot/mealie/actions/workflows/pytest.yml)
|
[](https://github.com/hay-kot/mealie/actions/workflows/test-all.yml)
|
||||||
|
|
||||||
<!-- PROJECT LOGO -->
|
<!-- PROJECT LOGO -->
|
||||||
<br />
|
<br />
|
||||||
|
|||||||
32
dev/scripts/github_get_release_fixes.py
Normal file
32
dev/scripts/github_get_release_fixes.py
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import json
|
||||||
|
|
||||||
|
import requests
|
||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
|
||||||
|
class GithubIssue(BaseModel):
|
||||||
|
url: str
|
||||||
|
number: int
|
||||||
|
title: str
|
||||||
|
|
||||||
|
|
||||||
|
def get_issues_by_label(label="fixed-pending-release") -> list[GithubIssue]:
|
||||||
|
|
||||||
|
issues_url = f"https://api.github.com/repos/hay-kot/mealie/issues?labels={label}"
|
||||||
|
|
||||||
|
response = requests.get(issues_url)
|
||||||
|
issues = json.loads(response.text)
|
||||||
|
return [GithubIssue(**issue) for issue in issues]
|
||||||
|
|
||||||
|
|
||||||
|
def format_markdown_list(issues: list[GithubIssue]) -> str:
|
||||||
|
return "\n".join(f"- [{issue.number}]({issue.url}) - {issue.title}" for issue in issues)
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> None:
|
||||||
|
issues = get_issues_by_label()
|
||||||
|
print(format_markdown_list(issues))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -8,6 +8,7 @@ class AppRoutes:
|
|||||||
self.about_events = "/api/about/events"
|
self.about_events = "/api/about/events"
|
||||||
self.about_events_notifications = "/api/about/events/notifications"
|
self.about_events_notifications = "/api/about/events/notifications"
|
||||||
self.about_events_notifications_test = "/api/about/events/notifications/test"
|
self.about_events_notifications_test = "/api/about/events/notifications/test"
|
||||||
|
self.about_recipes_defaults = "/api/about/recipes/defaults"
|
||||||
self.auth_refresh = "/api/auth/refresh"
|
self.auth_refresh = "/api/auth/refresh"
|
||||||
self.auth_token = "/api/auth/token"
|
self.auth_token = "/api/auth/token"
|
||||||
self.auth_token_long = "/api/auth/token/long"
|
self.auth_token_long = "/api/auth/token/long"
|
||||||
@@ -31,6 +32,7 @@ class AppRoutes:
|
|||||||
self.migrations = "/api/migrations"
|
self.migrations = "/api/migrations"
|
||||||
self.recipes_category = "/api/recipes/category"
|
self.recipes_category = "/api/recipes/category"
|
||||||
self.recipes_create = "/api/recipes/create"
|
self.recipes_create = "/api/recipes/create"
|
||||||
|
self.recipes_create_from_zip = "/api/recipes/create-from-zip"
|
||||||
self.recipes_create_url = "/api/recipes/create-url"
|
self.recipes_create_url = "/api/recipes/create-url"
|
||||||
self.recipes_summary = "/api/recipes/summary"
|
self.recipes_summary = "/api/recipes/summary"
|
||||||
self.recipes_summary_uncategorized = "/api/recipes/summary/uncategorized"
|
self.recipes_summary_uncategorized = "/api/recipes/summary/uncategorized"
|
||||||
@@ -108,6 +110,9 @@ class AppRoutes:
|
|||||||
def recipes_recipe_slug_image(self, recipe_slug):
|
def recipes_recipe_slug_image(self, recipe_slug):
|
||||||
return f"{self.prefix}/recipes/{recipe_slug}/image"
|
return f"{self.prefix}/recipes/{recipe_slug}/image"
|
||||||
|
|
||||||
|
def recipes_recipe_slug_zip(self, recipe_slug):
|
||||||
|
return f"{self.prefix}/recipes/{recipe_slug}/zip"
|
||||||
|
|
||||||
def recipes_slug_comments(self, slug):
|
def recipes_slug_comments(self, slug):
|
||||||
return f"{self.prefix}/recipes/{slug}/comments"
|
return f"{self.prefix}/recipes/{slug}/comments"
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Use root/example as user/password credentials
|
# Use changeme@email.com/MyPassword as user/password credentials
|
||||||
version: "3.1"
|
version: "3.1"
|
||||||
services:
|
services:
|
||||||
# Vue Frontend
|
# Vue Frontend
|
||||||
@@ -23,7 +23,8 @@ services:
|
|||||||
image: mealie-api:dev
|
image: mealie-api:dev
|
||||||
build:
|
build:
|
||||||
context: ./
|
context: ./
|
||||||
dockerfile: Dockerfile.dev
|
target: development
|
||||||
|
dockerfile: Dockerfile
|
||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
- 9921:9000
|
- 9921:9000
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ services:
|
|||||||
mealie:
|
mealie:
|
||||||
build:
|
build:
|
||||||
context: ./
|
context: ./
|
||||||
|
target: production
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
container_name: mealie
|
container_name: mealie
|
||||||
restart: always
|
restart: always
|
||||||
@@ -17,6 +18,9 @@ services:
|
|||||||
POSTGRES_SERVER: postgres
|
POSTGRES_SERVER: postgres
|
||||||
POSTGRES_PORT: 5432
|
POSTGRES_PORT: 5432
|
||||||
POSTGRES_DB: mealie
|
POSTGRES_DB: mealie
|
||||||
|
# WORKERS_PER_CORE: 0.5
|
||||||
|
# MAX_WORKERS: 8
|
||||||
|
# WEB_CONCURRENCY: 2
|
||||||
postgres:
|
postgres:
|
||||||
container_name: postgres
|
container_name: postgres
|
||||||
image: postgres
|
image: postgres
|
||||||
|
|||||||
BIN
docs/docs/assets/img/ios-shortcut-host.jpg
Normal file
BIN
docs/docs/assets/img/ios-shortcut-host.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 28 KiB |
BIN
docs/docs/assets/img/ios-shortcut-username.jpg
Normal file
BIN
docs/docs/assets/img/ios-shortcut-username.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 43 KiB |
11
docs/docs/assets/js/extra.js
Normal file
11
docs/docs/assets/js/extra.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
/* Add target="_blank" to external links */
|
||||||
|
/* Source: https://html.com/attributes/a-target/#:~:text=browser */
|
||||||
|
function externalLinks() {
|
||||||
|
for (var c = document.getElementsByTagName("a"), a = 0; a < c.length; a++) {
|
||||||
|
var b = c[a];
|
||||||
|
b.getAttribute("href") &&
|
||||||
|
b.hostname !== location.hostname &&
|
||||||
|
(b.target = "_blank");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
externalLinks();
|
||||||
@@ -33,6 +33,12 @@ a.md-button.md-button:hover {
|
|||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add icon after external links */
|
||||||
|
/* Ignore auto-generated material theme links */
|
||||||
|
a[target="_blank"]:not([class*="md-"]):after {
|
||||||
|
content: " " url("../svg/open-in-new.svg");
|
||||||
|
}
|
||||||
|
|
||||||
/* Site width etc.*/
|
/* Site width etc.*/
|
||||||
.md-grid {
|
.md-grid {
|
||||||
max-width: 64rem !important;
|
max-width: 64rem !important;
|
||||||
|
|||||||
3
docs/docs/assets/svg/open-in-new.svg
Normal file
3
docs/docs/assets/svg/open-in-new.svg
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24">
|
||||||
|
<path fill="rgb(229,131,37)" d="M14,3V5H17.59L7.76,14.83L9.17,16.24L19,6.41V10H21V3M19,19H5V5H12V3H5C3.89,3 3,3.9 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V12H19V19Z" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 259 B |
@@ -18,7 +18,7 @@
|
|||||||
If you have been using the API directly, many of the routes and status codes have changed. You may experience issues with directly consuming the API.
|
If you have been using the API directly, many of the routes and status codes have changed. You may experience issues with directly consuming the API.
|
||||||
|
|
||||||
#### Arm/v7 Support
|
#### Arm/v7 Support
|
||||||
Mealie will no longer build in CI/CD due to a issue with the rust compiler on 32 bit devices. You can reference [this issue on the matrix-org/synapse](https://github.com/matrix-org/synapse/issues/9403){:target="_blank"} Github page that are facing a similar issue. You may still be able to build the docker image you-self.
|
Mealie will no longer build in CI/CD due to a issue with the rust compiler on 32 bit devices. You can reference [this issue on the matrix-org/synapse](https://github.com/matrix-org/synapse/issues/9403) Github page that are facing a similar issue. You may still be able to build the docker image you-self.
|
||||||
|
|
||||||
!!! warning "Potential Data Loss"
|
!!! warning "Potential Data Loss"
|
||||||
With this release comes a major rework of how files are stored on disk and where things belong. Migration of files should be done automatically. We have tested extensively with many different backups and user bases and have found that no one experienced data-loss. HOWEVER, with all the major changes that have occurred, it is vital that to prevent any data-loss you must create a backup and store that backup outside of your mealie instance. If you do not do this, you may lose your data.
|
With this release comes a major rework of how files are stored on disk and where things belong. Migration of files should be done automatically. We have tested extensively with many different backups and user bases and have found that no one experienced data-loss. HOWEVER, with all the major changes that have occurred, it is vital that to prevent any data-loss you must create a backup and store that backup outside of your mealie instance. If you do not do this, you may lose your data.
|
||||||
@@ -44,7 +44,7 @@
|
|||||||
### Highlights
|
### Highlights
|
||||||
- Recipe Parser
|
- Recipe Parser
|
||||||
- Recipes can now be imported with a bookmarklet!
|
- Recipes can now be imported with a bookmarklet!
|
||||||
- Significant improvement in supported sites with the new [Recipe Scraper Library](https://github.com/hhursev/recipe-scrapers){:target="_blank"}
|
- Significant improvement in supported sites with the new [Recipe Scraper Library](https://github.com/hhursev/recipe-scrapers)
|
||||||
- UI Debugging now available at `/recipes/debugger`
|
- UI Debugging now available at `/recipes/debugger`
|
||||||
- Better error messages on failure
|
- Better error messages on failure
|
||||||
- ⚠️ last_recipe.json is now depreciated
|
- ⚠️ last_recipe.json is now depreciated
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# vx.x.x COOL TITLE GOES HERE
|
# v0.5.1
|
||||||
|
|
||||||
**App Version: v0.5.1**
|
**App Version: v0.5.1**
|
||||||
|
|
||||||
|
|||||||
65
docs/docs/changelog/v0.5.2.md
Normal file
65
docs/docs/changelog/v0.5.2.md
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
# v0.5.2 - DRAFT
|
||||||
|
|
||||||
|
**App Version: v0.5.2**
|
||||||
|
|
||||||
|
**Database Version: v0.5.0**
|
||||||
|
|
||||||
|
## Bug Fixes
|
||||||
|
- Fixed #617 - Section behavior when adding a step
|
||||||
|
- Fixed #615 - Recipe Settings are not available when creating new recipe
|
||||||
|
- Fixed #625 - API of today's image returns strange characters
|
||||||
|
- Fixed [#590](https://github.com/hay-kot/mealie/issues/590) - Duplicate Events when using Gunicorn Workers
|
||||||
|
|
||||||
|
## Features and Improvements
|
||||||
|
|
||||||
|
### General
|
||||||
|
- Recipe Instructions now collapse when checked
|
||||||
|
- Default recipe settings can be set through ENV variables
|
||||||
|
- Recipe Ingredient lists can now container ingredient sections.
|
||||||
|
- You can now download and upload individual recipes
|
||||||
|
|
||||||
|
|
||||||
|
### Localization
|
||||||
|
|
||||||
|
Huge thanks to [@sephrat](https://github.com/sephrat) for all his work on the project. He's very consistent in his contributions to the project and nearly every release has had some of his code in it! Here's some highlights from this release
|
||||||
|
|
||||||
|
- Lazy Load Translations (Huge Performance Increase!)
|
||||||
|
- Tons of localization additions all around the site.
|
||||||
|
- All of the work that goes into managing and making Crowdin a great feature the application
|
||||||
|
|
||||||
|
#### Here a list of contributors on Crowding who make Mealie possible in different locals
|
||||||
|
|
||||||
|
| Name | Languages | Translated (Words) | Target Words |
|
||||||
|
| ---------------------------- | ------------------ | :----------------: | :----------: |
|
||||||
|
| retmas-gh | Polish | 550 | 625 |
|
||||||
|
| startos | Italian | 310 | 322 |
|
||||||
|
| CMBoii | Spanish | 256 | 291 |
|
||||||
|
| sephrat | French | 255 | 296 |
|
||||||
|
| Daniel Tildeman (tildeman) | Swedish | 233 | 228 |
|
||||||
|
| Rourke | Dutch | 216 | 214 |
|
||||||
|
| Andreas Waschinski (Wascha) | German | 207 | 202 |
|
||||||
|
| wengtad | Chinese Simplified | 176 | 343 |
|
||||||
|
| Matthias Borremans (MrBorri) | Dutch | 96 | 89 |
|
||||||
|
| Adam Syndoman (pypckompsite) | Polish | 68 | 65 |
|
||||||
|
| JonasSchubert | German | 22 | 23 |
|
||||||
|
| ThrawnJL | Danish | 7 | 7 |
|
||||||
|
| NicholasBrody | Dutch | 7 | 7 |
|
||||||
|
| Giel Janssens (gieljnssns) | Dutch | 4 | 4 |
|
||||||
|
| kentora | Danish | 3 | 2 |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
|
||||||
|
#### Huge thanks to [@wengtad](https://github.com/wengtad) for all his work on improving the deployment with docker.
|
||||||
|
|
||||||
|
- Optimize Docker Dev Size (Frontend: from ~1.52GB to ~429MB | API: from ~657MB to ~380MB)
|
||||||
|
- Optimize Docker Prod Size (from ~542MB to ~373MB)
|
||||||
|
- Add Gunicorn
|
||||||
|
- Add Gunicorn and Webworkers to Dockerfile #550
|
||||||
|
- Add Docs for Gunicorn
|
||||||
|
- Add PUID/PGID to Docker. Fixes Initialization scripts fail to run when not executing as root user inside container #350,
|
||||||
|
- Not able to run correctly in docker if user permissions are specified #429
|
||||||
|
- Merge Dockerfile.dev into Dockerfile (dev shared same base together with prod)
|
||||||
|
- Add Docs for PUID/PGID
|
||||||
|
- Add Docker healthcheck (for this is not necessary, I could remove if you want)
|
||||||
31
docs/docs/changelog/v0.5.3.md
Normal file
31
docs/docs/changelog/v0.5.3.md
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# v0.5.3 - Bug Fixes
|
||||||
|
|
||||||
|
**App Version: v0.5.3**
|
||||||
|
|
||||||
|
**Database Version: v0.5.0**
|
||||||
|
|
||||||
|
## Breaking Changes
|
||||||
|
|
||||||
|
!!! error "Breaking Changes"
|
||||||
|
#### None
|
||||||
|
|
||||||
|
|
||||||
|
## Bug Fixes
|
||||||
|
- [755](https://api.github.com/repos/hay-kot/mealie/issues/755) - Mealie Categories Not Displaying Until After Settings Opened
|
||||||
|
- [748](https://api.github.com/repos/hay-kot/mealie/issues/748) - categories - Internal Server Error
|
||||||
|
- [689](https://api.github.com/repos/hay-kot/mealie/issues/689) - Importing a recipe with time information
|
||||||
|
- [671](https://api.github.com/repos/hay-kot/mealie/issues/671) - Localization not loading on upgrade to v0.5.2
|
||||||
|
- [655](https://api.github.com/repos/hay-kot/mealie/issues/655) - Clicking on "tags" on a mobile phone doesn't work (Wrong link, "Internal server error")
|
||||||
|
- [654](https://api.github.com/repos/hay-kot/mealie/issues/654) - Ram Usage
|
||||||
|
- Fixed Missing minus in shopping list UI [688](https://github.com/hay-kot/mealie/pull/688)
|
||||||
|
|
||||||
|
## Features and Improvements
|
||||||
|
|
||||||
|
### General
|
||||||
|
- Recipe Images are no clickable [678](https://github.com/hay-kot/mealie/pull/678)
|
||||||
|
- Additional Translations
|
||||||
|
- Improved Recipe Parser thanks to [@cadamswaite](https://github.com/hay-kot/mealie/pulls?q=is%3Apr+author%3Acadamswaite)
|
||||||
|
- URL Scraper will now choose the best image from the list provided by the site
|
||||||
|
- Fixed the debugger to provide more meaningful data
|
||||||
|
- Fix issues parsing time formats
|
||||||
|
- Added support for parsing scraped nutrition details
|
||||||
28
docs/docs/changelog/v0.5.4.md
Normal file
28
docs/docs/changelog/v0.5.4.md
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# v0.5.4 - Bug Fixes
|
||||||
|
|
||||||
|
**App Version: v0.5.4**
|
||||||
|
|
||||||
|
**Database Version: v0.5.0**
|
||||||
|
|
||||||
|
## Breaking Changes
|
||||||
|
|
||||||
|
!!! error "Breaking Changes"
|
||||||
|
|
||||||
|
None
|
||||||
|
|
||||||
|
## What's Changed
|
||||||
|
* Add support for new languages by @sephrat in https://github.com/hay-kot/mealie/pull/781
|
||||||
|
* Allow arrow keys to function when SearchDialog is not open by @asymworks in https://github.com/hay-kot/mealie/pull/777
|
||||||
|
* Use firefox user agent when making requests by @cadamswaite in https://github.com/hay-kot/mealie/pull/780
|
||||||
|
* Improve the SWAG Community Guide by @BryceStevenWilley in https://github.com/hay-kot/mealie/pull/793
|
||||||
|
* New Crowdin updates by @hay-kot in https://github.com/hay-kot/mealie/pull/818
|
||||||
|
* Add LDAP authentication support (v2, onto dev) by @dvdkon in https://github.com/hay-kot/mealie/pull/803
|
||||||
|
* Auto backup is now disabled by default. Enable it by setting the AUTO_BACKUP_ENABLED env variable to true.
|
||||||
|
|
||||||
|
|
||||||
|
## New Contributors
|
||||||
|
* @asymworks made their first contribution in https://github.com/hay-kot/mealie/pull/777
|
||||||
|
* @dvdkon made their first contribution in https://github.com/hay-kot/mealie/pull/803
|
||||||
|
|
||||||
|
**Full Changelog**: https://github.com/hay-kot/mealie/compare/v0.5.3...v0.5.4
|
||||||
|
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
# Contributing to Mealie
|
# Contributing to Mealie
|
||||||
|
|
||||||
[Please Join the Discord](https://discord.gg/QuStdQGSGK){:target="_blank"}. We are building a community of developers working on the project.
|
[Please Join the Discord](https://discord.gg/QuStdQGSGK). We are building a community of developers working on the project.
|
||||||
|
|
||||||
## We Develop with Github
|
## 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 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){:target="_blank"}, So All Code Changes Happen Through 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){:target="_blank"}). We actively welcome your 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:
|
||||||
|
|
||||||
1. Fork the repo and create your branch from `dev`.
|
1. Fork the repo and create your branch from `dev`.
|
||||||
2. Checkout the Discord, the PRs page, or the Projects page to get an idea of what's already being worked on.
|
2. Checkout the Discord, the PRs page, or the Projects page to get an idea of what's already being worked on.
|
||||||
@@ -17,10 +17,10 @@ Pull requests are the best way to propose changes to the codebase (we use [Githu
|
|||||||
7. If you make changes to the dev branch reflect those changes in the active changelog to keep track of changes. Don't forget to add your name/handle/identifier!
|
7. If you make changes to the dev branch reflect those changes in the active changelog to keep track of changes. Don't forget to add your name/handle/identifier!
|
||||||
|
|
||||||
## Any contributions you make will be under the MIT Software License
|
## Any contributions you make will be under the MIT Software License
|
||||||
In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/){:target="_blank"} that covers the project. Feel free to contact the maintainers if that's a concern.
|
In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/) that covers the project. Feel free to contact the maintainers if that's a concern.
|
||||||
|
|
||||||
## Report bugs using Github's [issues](https://github.com/hay-kot/mealie/issues){:target="_blank"}
|
## Report bugs using Github's [issues](https://github.com/hay-kot/mealie/issues)
|
||||||
We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/hay-kot/mealie/issues/new){:target="_blank"}; it's that easy!
|
We use GitHub issues to track public bugs. Report a bug by [opening a new issue](https://github.com/hay-kot/mealie/issues/new); it's that easy!
|
||||||
|
|
||||||
## Write bug reports with detail, background, and sample code
|
## Write bug reports with detail, background, and sample code
|
||||||
**Great Bug Reports** tend to have:
|
**Great Bug Reports** tend to have:
|
||||||
@@ -28,7 +28,7 @@ We use GitHub issues to track public bugs. Report a bug by [opening a new issue]
|
|||||||
- A quick summary and/or background
|
- A quick summary and/or background
|
||||||
- Steps to reproduce
|
- Steps to reproduce
|
||||||
- Be specific!
|
- Be specific!
|
||||||
- Give sample code if you can. [This stackoverflow question](http://stackoverflow.com/q/12488905/180626){:target="_blank"} includes sample code that *anyone* with a base R setup can run to reproduce what I was seeing
|
- 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 you expected would happen
|
||||||
- What actually happens
|
- What actually happens
|
||||||
- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
|
- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
|
||||||
@@ -40,4 +40,4 @@ People *love* thorough bug reports. I'm not even kidding.
|
|||||||
By contributing, you agree that your contributions will be licensed under its MIT License.
|
By contributing, you agree that your contributions will be licensed under its MIT License.
|
||||||
|
|
||||||
## References
|
## 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){:target="_blank"}
|
This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md)
|
||||||
|
|||||||
@@ -48,4 +48,4 @@ code-gen 🤖 Run Code-Gen Scripts
|
|||||||
|
|
||||||
Before you commit any changes on the backend/python side you'll want to run `make format` to format all the code with black. `make lint` to check with flake8, and `make test` to run pytests. You can also use `make test-all` to run both `lint` and `test`.
|
Before you commit any changes on the backend/python side you'll want to run `make format` to format all the code with black. `make lint` to check with flake8, and `make test` to run pytests. You can also use `make test-all` to run both `lint` and `test`.
|
||||||
|
|
||||||
Run into another issue? [Ask for help on discord](https://discord.gg/QuStdQGSGK){:target="_blank"}
|
Run into another issue? [Ask for help on discord](https://discord.gg/QuStdQGSGK)
|
||||||
@@ -9,7 +9,7 @@ We love your input! We want to make contributing to this project as easy and tra
|
|||||||
- Becoming a maintainer
|
- Becoming a maintainer
|
||||||
- Help translate to a new language or improve current translations
|
- Help translate to a new language or improve current translations
|
||||||
|
|
||||||
[Remember to join the Discord and stay in touch with other developers working on the project](https://discord.gg/QuStdQGSGK){:target="_blank"}!
|
[Remember to join the Discord and stay in touch with other developers working on the project](https://discord.gg/QuStdQGSGK)!
|
||||||
|
|
||||||
Additionally, you can buy me a coffee and support the project. When I get financial support it helps me know that there's real interest in the project and that it's worth the time to keep developing.
|
Additionally, you can buy me a coffee and support the project. When I get financial support it helps me know that there's real interest in the project and that it's worth the time to keep developing.
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
# Contributing with Translations
|
# Contributing with Translations
|
||||||
Translations can be a great way **for non-coders** to contribute to project.
|
Translations can be a great way **for non-coders** to contribute to project.
|
||||||
We use **[Crowdin](https://crowdin.com/project/mealie){:target="_blank"}** to allow several contributors to work on translating Mealie.
|
We use **[Crowdin](https://crowdin.com/project/mealie)** to allow several contributors to work on translating Mealie.
|
||||||
You can simply help by voting for your preferred translations, or even by completely translating Mealie into a new language.
|
You can simply help by voting for your preferred translations, or even by completely translating Mealie into a new language.
|
||||||
|
|
||||||
Translations are regularly pulled from Crowdin and included in each new release.
|
Translations are regularly pulled from Crowdin and included in each new release.
|
||||||
|
|
||||||
Please use Crowdin as much as possible if you have any question/issue regarding a particular string. You can take a look at [Crowdin Knowledge base](https://support.crowdin.com/for-volunteer-translators/){:target="_blank"} if you want to know more about how to use this tool.
|
Please use Crowdin as much as possible if you have any question/issue regarding a particular string. You can take a look at [Crowdin Knowledge base](https://support.crowdin.com/for-volunteer-translators/) if you want to know more about how to use this tool.
|
||||||
|
|
||||||
## My language is missing in Mealie
|
## My language is missing in Mealie
|
||||||
Once your language is translated on Crowdin, we need to manually add it in Mealie. If you believe your language is ready for use, please create an issue on GitHub.
|
Once your language is translated on Crowdin, we need to manually add it in Mealie. If you believe your language is ready for use, please create an issue on GitHub.
|
||||||
@@ -13,9 +13,9 @@ Once your language is translated on Crowdin, we need to manually add it in Meali
|
|||||||
## I can't find a particular text in Crowdin
|
## I can't find a particular text in Crowdin
|
||||||
There can be several reasons:
|
There can be several reasons:
|
||||||
- The text you're looking for is outdated: someone has already changed it or it will be removed/changed in the next release.
|
- The text you're looking for is outdated: someone has already changed it or it will be removed/changed in the next release.
|
||||||
- It is possible some texts are not translatable (yet) for technical reasons. If you spot one, please reach out to us on [Discord](https://discord.gg/QuStdQGSGK){:target="_blank"} or raise an issue on GitHub.
|
- It is possible some texts are not translatable (yet) for technical reasons. If you spot one, please reach out to us on [Discord](https://discord.gg/QuStdQGSGK) or raise an issue on GitHub.
|
||||||
|
|
||||||
## Technical information
|
## Technical information
|
||||||
We use vue-i18n package for internationalization. Translations are stored in json format located in [frontend/src/locales/messages](https://github.com/hay-kot/mealie/tree/master/frontend/src/locales/messages){:target="_blank"}.
|
We use vue-i18n package for internationalization. Translations are stored in json format located in [frontend/src/locales/messages](https://github.com/hay-kot/mealie/tree/master/frontend/src/locales/messages).
|
||||||
|
|
||||||
[i18n Ally for VScode](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally){:target="_blank"} is helpful for generating new strings to translate. It also has a nice feature, which shows translations in-place when editing code.
|
[i18n Ally for VScode](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally) is helpful for generating new strings to translate. It also has a nice feature, which shows translations in-place when editing code.
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
All recipe data can be imported and exported as necessary from the UI. Under the admin page you'll find the section for using Backups and Exports.
|
All recipe data can be imported and exported as necessary from the UI. Under the admin page you'll find the section for using Backups and Exports.
|
||||||
|
|
||||||
!!! danger
|
!!! danger
|
||||||
As this is still a **BETA** It is recommended that you backup your data often and store in more than one place. Ad-hear to backup best practices with the [3-2-1 Backup Rule](https://en.wikipedia.org/wiki/Backup){:target="_blank"}. Prior to upgrading you **should** perform a backup to limit any data loss.
|
As this is still a **BETA** it is recommended that you backup your data often and store in more than one place. Adhere to backup best practices with the [3-2-1 Backup Rule](https://en.wikipedia.org/wiki/Backup). Prior to upgrading you **should** perform a backup to limit any data loss.
|
||||||
|
|
||||||
!!! tip "Mealie data that is saved on backups"
|
!!! tip "Mealie data that is saved on backups"
|
||||||
- [x] Recipe Data
|
- [x] Recipe Data
|
||||||
@@ -15,7 +15,7 @@ All recipe data can be imported and exported as necessary from the UI. Under the
|
|||||||
|
|
||||||
To create an export simply add the tag and the markdown template and click "Create" and your backup will be created on the server. The backup is a standard zipfile containing all the images, json files, and rendered jinaj2 templates for each recipe. To view the available variables, open a recipe in the json editor.
|
To create an export simply add the tag and the markdown template and click "Create" and your backup will be created on the server. The backup is a standard zipfile containing all the images, json files, and rendered jinaj2 templates for each recipe. To view the available variables, open a recipe in the json editor.
|
||||||
|
|
||||||
To import a backup it must be in your backups folder. If it is in the backup folder it will automatically show up as a source to restore from. Selected the desired backup and import the backup file. Backups can be uploaded from the UI as well as added on the file system
|
To import a backup it must be in your backups folder. If it is in the backup folder it will automatically show up as a source to restore from. Selected the desired backup and import the backup file. Backups can be uploaded from the UI as well as added on the file system.
|
||||||
|
|
||||||
## Demo
|
## Demo
|
||||||
|
|
||||||
@@ -60,7 +60,7 @@ wget http://localhost:9000/api/utils/download?token={fileToken}
|
|||||||
|
|
||||||
|
|
||||||
## Jinja2 Templating
|
## Jinja2 Templating
|
||||||
On export you can select a template to use to render files using the jinja2 syntax. This can be done to export recipes in other formats besides regular .json.Look at this example for rendering a markdown recipe using the jinja2 syntax.
|
On export you can select a template to use to render files using the jinja2 syntax. This can be done to export recipes in other formats besides regular .json. Look at this example for rendering a markdown recipe using the jinja2 syntax.
|
||||||
|
|
||||||
### Input
|
### Input
|
||||||
```jinja2
|
```jinja2
|
||||||
@@ -128,4 +128,4 @@ Categories: []
|
|||||||
Original URL: https://www.bonappetit.com/recipe/five-spice-popcorn-chicken#intcid=_bon-appetit-recipe-bottom-recirc_3cad5ce9-734a-46f8-b503-78c33d2e7279_similar2-3
|
Original URL: https://www.bonappetit.com/recipe/five-spice-popcorn-chicken#intcid=_bon-appetit-recipe-bottom-recirc_3cad5ce9-734a-46f8-b503-78c33d2e7279_similar2-3
|
||||||
```
|
```
|
||||||
|
|
||||||
If you decide you don't like mealie. This is a good way to export into a format that can be imported into another.
|
If you decide you don't like mealie: This is a good way to export into a format that can be imported into another.
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
# Building Pages
|
# Building Pages
|
||||||
|
|
||||||
!!! warning
|
!!! warning
|
||||||
The page building is still experimental and may change. You can provide feedback on any changes you'd like to see on [github](https://github.com/hay-kot/mealie/discussions/229){:target="_blank"}
|
The page building is still experimental and may change. You can provide feedback on any changes you'd like to see on [github](https://github.com/hay-kot/mealie/discussions/229)
|
||||||
|
|
||||||
Custom pages can be created to organize multiple categories into a single page. Links to your custom pages are displayed on the home page sidebar and accessible by all users, however only Administrators can create or update pages.
|
Custom pages can be created to organize multiple categories into a single page. Links to your custom pages are displayed on the home page sidebar and accessible by all users, however only Administrators can create or update pages.
|
||||||

|

|
||||||
|
|
||||||
To create a new page. Navigate to the settings page at `/admin/settings` and scroll down to the custom pages section. Here you can create, view, and edit your custom pages. To reorder how they are displayed on the sidebar you can drag and drop the pages into the preferred order.
|
To create a new page navigate to the settings page at `/admin/settings` and scroll down to the custom pages section. Here you can create, view, and edit your custom pages. To reorder how they are displayed on the sidebar you can drag and drop the pages into the preferred order.
|
||||||

|

|
||||||
|
|
||||||
!!! tip
|
!!! tip
|
||||||
To save the order of pages you must click the save button displayed on the bottom of the Custom Page section. This is not necessary for updating individual page data.
|
To save the order of pages you must click the save button displayed on the bottom of the Custom Page section. This is not necessary for updating individual page data.
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ To migrate recipes from a Chowdown
|
|||||||
3. Select import on the newly available migration.
|
3. Select import on the newly available migration.
|
||||||
|
|
||||||
## Nextcloud Recipes
|
## Nextcloud Recipes
|
||||||
Nextcloud recipes can be imported from a zip file the contains the data stored in Nextcloud. The zip file can be uploaded from the frontend or placed in the data/migrations/nextcloud directory. See the example folder structure below to ensure your recipes are able to be imported.
|
Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. The zip file can be uploaded from the frontend or placed in the data/migrations/nextcloud directory. See the example folder structure below to ensure your recipes are able to be imported.
|
||||||
|
|
||||||
```
|
```
|
||||||
nextcloud_recipes.zip
|
nextcloud_recipes.zip
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Site Settings
|
# Site Settings
|
||||||
Your sites settings panel can only be accessed by administrators. This where you can customize your site for all users.
|
Your sites settings panel can only be accessed by administrators. This is where you can customize your site for all users.
|
||||||
|
|
||||||
## Home Page Settings
|
## Home Page Settings
|
||||||
| Option | Description |
|
| Option | Description |
|
||||||
@@ -13,7 +13,3 @@ Your sites settings panel can only be accessed by administrators. This where you
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# User Managemenet
|
# User Management
|
||||||
|
|
||||||
As of version v0.4.0 users have limited functionality, but they will offer more permissions and structure as time goes on. To understand the different systems, see each section below. Note, that by default all users will be assigned the default group. If you're only managing one household you won't need to do anything to set up a new group.
|
As of version v0.4.0 users have limited functionality, but they will offer more permissions and structure as time goes on. To understand the different systems, see each section below. Note, that by default all users will be assigned the default group. If you're only managing one household you won't need to do anything to set up a new group.
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ As of version v0.4.0 users have limited functionality, but they will offer more
|
|||||||
On the first startup you'll need to login to Mealie using the default username and password `changeme@email.com` and `MyPassword` or the default set through the env variable. On first login you'll be required to reset your password. After resetting your password you should also change your email address as appropriate. This will be used for logins on all future requests.
|
On the first startup you'll need to login to Mealie using the default username and password `changeme@email.com` and `MyPassword` or the default set through the env variable. On first login you'll be required to reset your password. After resetting your password you should also change your email address as appropriate. This will be used for logins on all future requests.
|
||||||
|
|
||||||
!!! tip
|
!!! tip
|
||||||
Your default password environmental variable will be the default password for all new users that are created. This is stored in plain text and should not be used **any where** else.
|
Your default password environment variable will be the default password for all new users that are created. This is stored in plain text and should not be used **anywhere** else.
|
||||||
|
|
||||||
|
|
||||||
## Creating and Editing Users
|
## Creating and Editing Users
|
||||||
@@ -80,7 +80,7 @@ You can easily create and manage groups via the frontend in the admin panel unde
|
|||||||

|

|
||||||
|
|
||||||
!!! tip
|
!!! tip
|
||||||
User Groups can only be deleted if no users are apart of the group. If you want to delete a group, you must assign the users to another group before removing.
|
User Groups can only be deleted if no users are a part of the group. If you want to delete a group, you must assign the users to another group before removing.
|
||||||
|
|
||||||
## Password Reset
|
## Password Reset
|
||||||
If a user forgets their password an administrator is able to reset their password through the user management page. In the user table, select edit. In the popup windows click the "Reset Password" to reset a user's password to the default. This is either 'MyPassword' or set through an environment variable. See the [Installation Page](../getting-started/install.md) for more details on environmental variables
|
If a user forgets their password an administrator is able to reset their password through the user management page. In the user table, select edit. In the popup window click the "Reset Password" to reset a user's password to the default. This is either 'MyPassword' or set through an environment variable. See the [Installation Page](../getting-started/install.md) for more details on environment variables.
|
||||||
|
|||||||
@@ -2,10 +2,10 @@
|
|||||||
This guide was submitted by a community member. Find something wrong? Submit a PR to get it fixed!
|
This guide was submitted by a community member. Find something wrong? Submit a PR to get it fixed!
|
||||||
|
|
||||||
|
|
||||||
In a lot of ways, Home Assistant is why this project exists! Since it Mealie has a robust API it makes it a great fit for interacting with Home Assistant and pulling information into your dashboard.
|
In a lot of ways, Home Assistant is why this project exists! Since Mealie has a robust API it makes it a great fit for interacting with Home Assistant and pulling information into your dashboard.
|
||||||
|
|
||||||
### Get Todays Meal in Lovelace
|
### Get Todays Meal in Lovelace
|
||||||
Starting in v0.4.1 you are now able to use the uri `/api/meal-plans/today/image?group_name=Home` to directly access the image to todays meal. This makes it incredible easy to include the image into your Home Assistant Dashboard using the picture entity.
|
Starting in v0.4.1 you are now able to use the uri `/api/meal-plans/today/image?group_name=Home` to directly access the image to todays meal. This makes it incredibly easy to include the image into your Home Assistant Dashboard using the picture entity.
|
||||||
|
|
||||||
Here's an example where `sensor.mealie_todays_meal` is pulling in the meal-plan name and I'm using the url to get the image.
|
Here's an example where `sensor.mealie_todays_meal` is pulling in the meal-plan name and I'm using the url to get the image.
|
||||||
|
|
||||||
@@ -29,6 +29,19 @@ style:
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
The sensor that gets the name of the meal can be achieved using the following REST sensor in Home Assistant
|
||||||
|
```yaml
|
||||||
|
sensor:
|
||||||
|
- platform: rest
|
||||||
|
resource: 'http://localhost:9000/api/meal-plans/today'
|
||||||
|
method: GET
|
||||||
|
name: Mealie todays meal
|
||||||
|
headers:
|
||||||
|
Authorization: Bearer MySuperSecretBearerCode
|
||||||
|
value_template: "{{ value_json.name }}"
|
||||||
|
```
|
||||||
|
The Bearer token can be created from the User Settings page (https://hay-kot.github.io/mealie/documentation/users-groups/user-settings/#api-key-generation)
|
||||||
|
|
||||||
|
|
||||||
!!! tip
|
!!! tip
|
||||||
Due to how Home Assistant works with images, I had to include the additional styling to get the images to not appear distorted. This includes and [additional installation](https://github.com/thomasloven/lovelace-card-mod){:target="_blank"} from HACS.
|
Due to how Home Assistant works with images, I had to include the additional styling to get the images to not appear distorted. This includes and [additional installation](https://github.com/thomasloven/lovelace-card-mod) from HACS.
|
||||||
|
|||||||
@@ -1,40 +1,22 @@
|
|||||||
# Using iOS Shortcuts with Mealie
|
# Using iOS Shortcuts with Mealie
|
||||||
|

|
||||||
!!! info
|
|
||||||
This guide was submitted by a community member. Find something wrong? Submit a PR to get it fixed!
|
|
||||||
|
|
||||||
|
|
||||||
{: align=right style="height:400px;width:400px"}
|
User [brasilikum](https://github.com/brasilikum) opened an issue on the main repo about how they had created an [iOS shortcut](https://github.com/hay-kot/mealie/issues/103) for interested users. This is a useful utility for iOS users who browse for recipes in their web browser from their devices. Recent updates to Mealie has made this original shortcut break. Reddit user [BooNooBooNooB](https://www.reddit.com/user/BooNooBooNooB/) has helped to create a new working version.
|
||||||
|
|
||||||
|
|
||||||
User [brasilikum](https://github.com/brasilikum){:target="_blank"} opened an issue on the main repo about how they had created an [iOS shortcut](https://github.com/hay-kot/mealie/issues/103){:target="_blank"} for interested users. This is a useful utility for iOS users who browse for recipes in their web browser from their devices.
|
|
||||||
|
|
||||||
Don't know what an iOS shortcut is? Neither did I! Experienced iOS users may already be familiar with this utility but for the uninitiated, here is the official Apple explanation:
|
Don't know what an iOS shortcut is? Neither did I! Experienced iOS users may already be familiar with this utility but for the uninitiated, here is the official Apple explanation:
|
||||||
|
|
||||||
|
|
||||||
> A shortcut is a quick way to get one or more tasks done with your apps. The Shortcuts app lets you create your own shortcuts with multiple steps. For example, build a “Surf Time” shortcut that grabs the surf report, gives an ETA to the beach, and launches your surf music playlist.
|
> A shortcut is a quick way to get one or more tasks done with your apps. The Shortcuts app lets you create your own shortcuts with multiple steps. For example, build a “Surf Time” shortcut that grabs the surf report, gives an ETA to the beach, and launches your surf music playlist.
|
||||||
|
>
|
||||||
|
|
||||||
|
Basically it is a visual scripting language that lets a user build an automation in a guided fashion. The automation can be [shared with anyone](https://www.icloud.com/shortcuts/9d8827cabde44b379e673a60f27fe4bb) but if it is a user creation, you'll have to jump through a few hoops to make an untrusted automation work on your device.
|
||||||
|
|
||||||
Basically it is a visual scripting language that lets a user build an automation in a guided fashion. The automation can be [shared with anyone](https://www.icloud.com/shortcuts/6ae356d5fc644cfa8983a3c90f242fbb){:target="_blank"} but if it is a user creation, you'll have to jump through a few hoops to make an untrusted automation work on your device. In brasilikum's shortcut, you need to make changes for it to work. Recent updates to the project have changed some of the syntax and folder structure since its original creation.
|
You need to replace `username` and `password` with the login information for your mealie instance.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
{: align=right style="height:500;width:400px"}
|
Then, you need to put in your mealie domain. The API port of `:9000` is not needed when putting your domain in the text field.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
You should now be able to share a website to the shortcut and have mealie grab all the necessary information!
|
||||||
!!! tip
|
|
||||||
You may need to change the url depending on which version you're using. Recipe is now plural and there is no trailing "/" at the end of the string.
|
|
||||||
|
|
||||||
```
|
|
||||||
api/recipe/create-url/
|
|
||||||
```
|
|
||||||
|
|
||||||
to
|
|
||||||
|
|
||||||
```
|
|
||||||
api/recipes/create-url
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Having made those changes, you should now be able to share a website to the shortcut and have mealie grab all the necessary information!
|
|
||||||
|
|||||||
@@ -4,89 +4,96 @@
|
|||||||
This guide was submitted by a community member. Find something wrong? Submit a PR to get it fixed!
|
This guide was submitted by a community member. Find something wrong? Submit a PR to get it fixed!
|
||||||
|
|
||||||
|
|
||||||
|
To make the setup of a Reverse Proxy much easier, Linuxserver.io developed [SWAG](https://github.com/linuxserver/docker-swag)
|
||||||
To make the setup of a Reverse Proxy much easier, Linuxserver.io developed [SWAG](https://github.com/linuxserver/docker-swag){:target="_blank"}
|
SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let's Encrypt™) sets up an Nginx web server and reverse proxy with PHP support and a built-in certbot client that automates free TLS server certificate generation and renewal processes (Let's Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention.
|
||||||
SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let's Encrypt™) sets up an Nginx web server and reverse proxy with PHP support and a built-in certbot client that automates free SSL server certificate generation and renewal processes (Let's Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention.
|
|
||||||
|
|
||||||
## Step 1: Get a domain
|
## Step 1: Get a domain
|
||||||
|
|
||||||
The first step is to grab a dynamic DNS if you don't have your own subdomain already. You can get this from for example [DuckDNS](https://www.duckdns.org){:target="_blank"}.
|
The first step is to grab a dynamic DNS if you don't have your own subdomain already. You can get this from for example [DuckDNS](https://www.duckdns.org).
|
||||||
|
If you already own a domain, you'll need to create an `A` record that points to the machine that SWAG is running on. See
|
||||||
|
the [SWAG documentation](https://docs.linuxserver.io/general/swag#create-container-via-http-validation) for more details.
|
||||||
|
|
||||||
## Step 2: Set-up SWAG
|
## Step 2: Set-up SWAG
|
||||||
|
|
||||||
Then you will need to set up SWAG, the variables of the docker-compose are explained on the Github page of [SWAG](https://github.com/linuxserver/docker-swag){:target="_blank"}.
|
Then you will need to set up SWAG, the variables of the docker-compose are explained on the Github page of [SWAG](https://github.com/linuxserver/docker-swag).
|
||||||
This is an example of how to set it up using duckdns and docker-compose.
|
This is an example of how to set it up using DuckDNS and docker-compose.
|
||||||
|
|
||||||
!!! example "docker-compose.yml"
|
!!! example "docker-compose.yml"
|
||||||
```yaml
|
```yaml
|
||||||
version: "2.1"
|
version: "2.1"
|
||||||
services:
|
services:
|
||||||
swag:
|
swag:
|
||||||
image: ghcr.io/linuxserver/swag
|
image: ghcr.io/linuxserver/swag
|
||||||
container_name: swag
|
container_name: swag
|
||||||
cap_add:
|
cap_add:
|
||||||
- NET_ADMIN
|
- NET_ADMIN
|
||||||
environment:
|
environment:
|
||||||
- PUID=1000
|
- PUID=1000
|
||||||
- PGID=1000
|
- PGID=1000
|
||||||
- TZ=Europe/Brussels
|
# valid TZs at https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||||
- URL=<mydomain.duckdns>
|
- TZ=Europe/Brussels
|
||||||
- SUBDOMAINS=wildcard
|
- URL=<mydomain.duckdns>
|
||||||
- VALIDATION=duckdns
|
- SUBDOMAINS=wildcard
|
||||||
- CERTPROVIDER= #optional
|
- VALIDATION=duckdns
|
||||||
- DNSPLUGIN= #optional
|
- CERTPROVIDER= #optional
|
||||||
- DUCKDNSTOKEN=<duckdnstoken>
|
- DNSPLUGIN= #optional
|
||||||
- EMAIL=<e-mail> #optional
|
- DUCKDNSTOKEN=<duckdnstoken>
|
||||||
- ONLY_SUBDOMAINS=false #optional
|
- EMAIL=<e-mail> #optional
|
||||||
- EXTRA_DOMAINS=<extradomains> #optional
|
- ONLY_SUBDOMAINS=false #optional
|
||||||
- STAGING=false #optional
|
- EXTRA_DOMAINS=<extradomains> #optional
|
||||||
volumes:
|
- STAGING=false #optional
|
||||||
- /etc/config/swag:/config
|
volumes:
|
||||||
ports:
|
- /etc/config/swag:/config
|
||||||
- 443:443
|
ports:
|
||||||
restart: unless-stopped
|
- 443:443
|
||||||
|
# required if VALIDATION=http above, if you aren't using DuckDNS
|
||||||
|
- 80:80
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Don't forget to change the <code>mydomain.duckns</code> into your personal domain and the <code>duckdnstoken</code> into your token and remove the brackets.
|
Don't forget to change the `mydomain.duckns` into your personal domain and the `duckdnstoken` into your token and remove the brackets.
|
||||||
|
|
||||||
|
You can also include the contents of the [mealie docker-compose](mealie/documentation/getting-started/install/#docker-compose-with-sqlite) in the SWAG
|
||||||
|
docker-compose, without the `ports` section under mealie. This allows SWAG and mealie to communicate on the same docker network, without
|
||||||
|
making mealie visible to other applications on your machine.
|
||||||
|
|
||||||
## Step 3: Change the config files
|
## Step 3: Change the config files
|
||||||
|
|
||||||
Navigate to the config folder of SWAG and head to <code>proxy-confs</code>. If you used the example above, you should navigate to: <code>/etc/config/swag/nginx/proxy-confs/</code>.
|
Navigate to the config folder of SWAG and head to `proxy-confs`. If you used the example above, you should navigate to: `/etc/config/swag/nginx/proxy-confs/`.
|
||||||
There are a lot of preconfigured files to use for different apps such as radarr,sonarr,overseerr,...
|
There are a lot of preconfigured files to use for different apps such as radarr, sonarr, overseerr, ...
|
||||||
|
|
||||||
To use the bundled configuration file, simply rename <code>mealie.subdomain.conf.sample</code> in the proxy-confs folder to <code>mealie.subdomain.conf</code>.
|
To use the bundled configuration file, simply rename `mealie.subdomain.conf.sample` in the proxy-confs folder to `mealie.subdomain.conf`.
|
||||||
Alternatively, you can create a new file <code>mealie.subdomain.conf</code> in proxy-confs with the following configuration:
|
Alternatively, you can create a new file `mealie.subdomain.conf` in proxy-confs with the following configuration:
|
||||||
|
|
||||||
!!! example "mealie.subdomain.conf"
|
!!! example "mealie.subdomain.conf"
|
||||||
```yaml
|
```nginx
|
||||||
server {
|
server {
|
||||||
listen 443 ssl http2;
|
listen 443 ssl http2;
|
||||||
listen [::]:443 ssl http2;
|
listen [::]:443 ssl http2;
|
||||||
|
|
||||||
server_name mealie.*;
|
server_name mealie.*;
|
||||||
|
|
||||||
include /config/nginx/ssl.conf;
|
include /config/nginx/ssl.conf;
|
||||||
|
|
||||||
client_max_body_size 0;
|
client_max_body_size 0;
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
include /config/nginx/proxy.conf;
|
include /config/nginx/proxy.conf;
|
||||||
include /config/nginx/resolver.conf;
|
include /config/nginx/resolver.conf;
|
||||||
set $upstream_app mealie;
|
set $upstream_app mealie;
|
||||||
set $upstream_port 80;
|
set $upstream_port 80;
|
||||||
set $upstream_proto http;
|
set $upstream_proto http;
|
||||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Step 4: Port-forward port 443
|
## Step 4: Port-forward port 443
|
||||||
|
|
||||||
Since SWAG allows you to set up a secure connection, you will need to open port 443 on your router for encrypted traffic. This is way more secure than port 80 for http.
|
Since SWAG allows you to set up a secure connection, you will need to open port 443 on your router for encrypted traffic. This is way more secure than port 80 for http. For more information about using TLS on port 443, see [SWAG's documentation](https://docs.linuxserver.io/general/swag#cert-provider-lets-encrypt-vs-zerossl) on cert providers and port forwarding.
|
||||||
|
|
||||||
## Step 5: Restart SWAG
|
## Step 5: Restart SWAG
|
||||||
|
|
||||||
When you change anything in the config of Nginx, you will need to restart the container using <code>docker restart swag</code>.
|
When you change anything in the config of Nginx, you will need to restart the container using `docker restart swag`.
|
||||||
If everything went well, you can now access mealie on the subdomain you configured: mealie.mydomain.duckdns.org
|
If everything went well, you can now access mealie on the subdomain you configured: `mealie.mydomain.duckdns.org`
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ Mealie supports long-live api tokens in the user frontend. See [user settings pa
|
|||||||
## Key Components
|
## Key Components
|
||||||
|
|
||||||
### Exploring Your Local API
|
### Exploring Your Local API
|
||||||
On your local installation you can access interactive API documentation that provides `curl` examples and expected results. This allows you to easily test and interact with your API to identify places to include your own functionality. You can visit the documentation at `http://mealie.yourdomain.com/docs` or see the example at the [Demo Site](https://mealie-demo.hay-kot.dev/docs){:target="_blank"}
|
On your local installation you can access interactive API documentation that provides `curl` examples and expected results. This allows you to easily test and interact with your API to identify places to include your own functionality. You can visit the documentation at `http://mealie.yourdomain.com/docs` or see the example at the [Demo Site](https://mealie-demo.hay-kot.dev/docs)
|
||||||
|
|
||||||
### Recipe Extras
|
### Recipe Extras
|
||||||
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 part applications. You can use these keys to contain information to trigger automation or custom messages to relay to your desired device.
|
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 part applications. You can use these keys to contain information to trigger automation or custom messages to relay to your desired device.
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
# Installation
|
# Installation
|
||||||
To deploy mealie on your local network it is highly recommended to use docker to deploy the image straight from dockerhub. Using the docker-compose below you should be able to get a stack up and running easily by changing a few default values and deploying. You can deploy with either SQLite (default) or Postgres. SQLite is sufficient for most use cases. Additionally, with mealies automated backup and restore functionality, you can easily move between SQLite and Postgres as you wish.
|
|
||||||
|
|
||||||
|
To deploy mealie on your local network it is highly recommended to use docker to deploy the image straight from dockerhub. Using the docker-compose below you should be able to get a stack up and running easily by changing a few default values and deploying. You can deploy with either SQLite (default) or Postgres. SQLite is sufficient for most use cases. Additionally, with mealies automated backup and restore functionality, you can easily move between SQLite and Postgres as you wish.
|
||||||
|
|
||||||
[Get Docker](https://docs.docker.com/get-docker/){:target="_blank"}
|
[Get Docker](https://docs.docker.com/get-docker/)
|
||||||
|
|
||||||
[Mealie on Dockerhub](https://hub.docker.com/r/hkotel/mealie){:target="_blank"}
|
[Mealie on Dockerhub](https://hub.docker.com/r/hkotel/mealie)
|
||||||
|
|
||||||
- linux/amd64
|
|
||||||
- linux/arm64
|
|
||||||
|
|
||||||
|
- linux/amd64
|
||||||
|
- linux/arm64
|
||||||
|
|
||||||
## Quick Start - Docker CLI
|
## Quick Start - Docker CLI
|
||||||
Deployment with the Docker CLI can be done with `docker run` and specify the database type, in this case `sqlite`, setting the exposed port `9925`, mounting the current directory, and pull the latest image. After the image is up an running you can navigate to http://your.ip.addres:9925 and you'll should see mealie up and running!
|
|
||||||
|
Deployment with the Docker CLI can be done with `docker run` and specify the database type, in this case `sqlite`, setting the exposed port `9925`, mounting the current directory, and pull the latest image. After the image is up and running you can navigate to http://your.ip.address:9925 and you'll should see mealie up and running!
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
docker run \
|
docker run \
|
||||||
@@ -22,12 +22,14 @@ docker run \
|
|||||||
```
|
```
|
||||||
|
|
||||||
!!! tip "Default Credentials"
|
!!! tip "Default Credentials"
|
||||||
**Username:** changeme@email.com
|
|
||||||
|
**Username:** changeme@email.com
|
||||||
|
|
||||||
**Password:** MyPassword
|
**Password:** MyPassword
|
||||||
|
|
||||||
## Docker Compose with SQLite
|
## Docker Compose with SQLite
|
||||||
Deployment with docker-compose is the recommended method for deployment. The example below will create an instance of mealie available on port `9925` with the data volume mounted from the local directory. To use, create a docker-compose.yml file, paste the contents below and save. In the terminal run `docker-compose up -d` to start the container.
|
|
||||||
|
Deployment with docker-compose is the recommended method for deployment. The example below will create an instance of mealie available on port `9925` with the data volume mounted from the local directory. To use, create a docker-compose.yml file, paste the contents below and save. In the terminal run `docker-compose up -d` to start the container.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
version: "3.1"
|
version: "3.1"
|
||||||
@@ -39,14 +41,29 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- 9925:80
|
- 9925:80
|
||||||
environment:
|
environment:
|
||||||
|
PUID: 1000
|
||||||
|
PGID: 1000
|
||||||
TZ: America/Anchorage
|
TZ: America/Anchorage
|
||||||
|
|
||||||
|
# Default Recipe Settings
|
||||||
|
RECIPE_PUBLIC: 'true'
|
||||||
|
RECIPE_SHOW_NUTRITION: 'true'
|
||||||
|
RECIPE_SHOW_ASSETS: 'true'
|
||||||
|
RECIPE_LANDSCAPE_VIEW: 'true'
|
||||||
|
RECIPE_DISABLE_COMMENTS: 'false'
|
||||||
|
RECIPE_DISABLE_AMOUNT: 'false'
|
||||||
|
|
||||||
|
# Gunicorn
|
||||||
|
# WEB_CONCURRENCY: 2
|
||||||
|
# WORKERS_PER_CORE: 0.5
|
||||||
|
# MAX_WORKERS: 8
|
||||||
volumes:
|
volumes:
|
||||||
- ./mealie/data/:/app/data
|
- ./mealie/data/:/app/data
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Docker Compose with Postgres *(BETA)*
|
## Docker Compose with Postgres _(BETA)_
|
||||||
Postgres support was introduced in v0.5.0. At this point it should be used with caution and frequent backups.
|
|
||||||
|
Postgres support was introduced in v0.5.0. At this point it should be used with caution and frequent backups.
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
version: "3.1"
|
version: "3.1"
|
||||||
@@ -57,13 +74,35 @@ services:
|
|||||||
restart: always
|
restart: always
|
||||||
ports:
|
ports:
|
||||||
- 9090:80
|
- 9090:80
|
||||||
|
depends_on:
|
||||||
|
- postgres
|
||||||
environment:
|
environment:
|
||||||
|
PUID: 1000
|
||||||
|
PGID: 1000
|
||||||
|
TZ: America/Anchorage
|
||||||
|
|
||||||
|
# Database Settings
|
||||||
DB_ENGINE: postgres # Optional: 'sqlite', 'postgres'
|
DB_ENGINE: postgres # Optional: 'sqlite', 'postgres'
|
||||||
POSTGRES_USER: mealie
|
POSTGRES_USER: mealie
|
||||||
POSTGRES_PASSWORD: mealie
|
POSTGRES_PASSWORD: mealie
|
||||||
POSTGRES_SERVER: postgres
|
POSTGRES_SERVER: postgres
|
||||||
POSTGRES_PORT: 5432
|
POSTGRES_PORT: 5432
|
||||||
POSTGRES_DB: mealie
|
POSTGRES_DB: mealie
|
||||||
|
|
||||||
|
# Default Recipe Settings
|
||||||
|
RECIPE_PUBLIC: 'true'
|
||||||
|
RECIPE_SHOW_NUTRITION: 'true'
|
||||||
|
RECIPE_SHOW_ASSETS: 'true'
|
||||||
|
RECIPE_LANDSCAPE_VIEW: 'true'
|
||||||
|
RECIPE_DISABLE_COMMENTS: 'false'
|
||||||
|
RECIPE_DISABLE_AMOUNT: 'false'
|
||||||
|
|
||||||
|
# Gunicorn
|
||||||
|
# WEB_CONCURRENCY: 2
|
||||||
|
# WORKERS_PER_CORE: 0.5
|
||||||
|
# MAX_WORKERS: 8
|
||||||
|
volumes:
|
||||||
|
- ./mealie/data/:/app/data
|
||||||
postgres:
|
postgres:
|
||||||
container_name: postgres
|
container_name: postgres
|
||||||
image: postgres
|
image: postgres
|
||||||
@@ -75,79 +114,98 @@ services:
|
|||||||
|
|
||||||
## Env Variables
|
## Env Variables
|
||||||
|
|
||||||
| Variables | Default | Description |
|
| Variables | Default | Description |
|
||||||
| ----------------- | --------------------- | ----------------------------------------------------------------------------------- |
|
| ----------------------- | --------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
|
||||||
| DEFAULT_GROUP | Home | The default group for users |
|
| PUID | 911 | UserID permissions between host OS and container |
|
||||||
| DEFAULT_EMAIL | changeme@email.com | The default username for the superuser |
|
| PGID | 911 | GroupID permissions between host OS and container |
|
||||||
| BASE_URL | http://localhost:8080 | Used for Notifications |
|
| DEFAULT_GROUP | Home | The default group for users |
|
||||||
| DB_ENGINE | sqlite | Optional: 'sqlite', 'postgres' |
|
| DEFAULT_EMAIL | changeme@email.com | The default username for the superuser |
|
||||||
| POSTGRES_USER | mealie | Postgres database user |
|
| BASE_URL | http://localhost:8080 | Used for Notifications |
|
||||||
| POSTGRES_PASSWORD | mealie | Postgres database password |
|
| DB_ENGINE | sqlite | Optional: 'sqlite', 'postgres' |
|
||||||
| POSTGRES_SERVER | postgres | Postgres database server address |
|
| POSTGRES_USER | mealie | Postgres database user |
|
||||||
| POSTGRES_PORT | 5432 | Postgres database port |
|
| POSTGRES_PASSWORD | mealie | Postgres database password |
|
||||||
| POSTGRES_DB | mealie | Postgres database name |
|
| POSTGRES_SERVER | postgres | Postgres database server address |
|
||||||
| TOKEN_TIME | 2 | The time in hours that a login/auth token is valid |
|
| POSTGRES_PORT | 5432 | Postgres database port |
|
||||||
| API_PORT | 9000 | The port exposed by backend API. **do not change this if you're running in docker** |
|
| POSTGRES_DB | mealie | Postgres database name |
|
||||||
| API_DOCS | True | Turns on/off access to the API documentation locally. |
|
| TOKEN_TIME | 2 | The time in hours that a login/auth token is valid |
|
||||||
| TZ | UTC | Must be set to get correct date/time on the server |
|
| LDAP_AUTH_ENABLED | False | Authenticate via an external LDAP server in addidion to built-in Mealie auth |
|
||||||
|
| LDAP_SERVER_URL | None | LDAP server URL (e.g. ldap://ldap.example.com) |
|
||||||
|
| LDAP_BIND_TEMPLATE | None | Templated DN for users, `{}` will be replaced with the username (e.g. `cn={},dc=example,dc=com`) |
|
||||||
|
| LDAP_ADMIN_FILTER | None | Optional LDAP filter, which tells Mealie the LDAP user is an admin (e.g. `(memberOf=cn=admins,dc=example,dc=com)`) |
|
||||||
|
| RECIPE_PUBLIC | True | Default Recipe Settings - Make Recipe Public |
|
||||||
|
| RECIPE_SHOW_NUTRITION | True | Default Recipe Settings - Show Recipe Nutrition |
|
||||||
|
| RECIPE_SHOW_ASSETS | True | Default Recipe Settings - Show Recipe Assets |
|
||||||
|
| RECIPE_LANDSCAPE_VIEW | True | Default Recipe Settings - Set Landscape View |
|
||||||
|
| RECIPE_DISABLE_COMMENTS | False | Default Recipe Settings - Disable Comments |
|
||||||
|
| RECIPE_DISABLE_AMOUNT | False | Default Recipe Settings - Disable Amount |
|
||||||
|
| AUTO_BACKUP_ENABLED | False | Disable/Enable Mealie's Auto Backup Function |
|
||||||
|
| 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 |
|
||||||
|
| 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 | | 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] |
|
||||||
|
|
||||||
|
|
||||||
## Raspberry Pi 4
|
## Raspberry Pi 4
|
||||||
|
|
||||||
!!! tip "Fatal Python error: init_interp_main: can't initialize time"
|
!!! tip "Fatal Python error: init_interp_main: can't initialize time"
|
||||||
|
|
||||||
Some users experience an problem with running the linux/arm/v7 container on Raspberry Pi 4. This is not a problem with the Mealie container, but with a bug in the hosts Docker installation.
|
Some users experience an problem with running the linux/arm/v7 container on Raspberry Pi 4. This is not a problem with the Mealie container, but with a bug in the hosts Docker installation.
|
||||||
|
|
||||||
Update the host RP4 using [instructions](https://github.com/linuxserver/docker-papermerge/issues/4#issuecomment-735236388){:target="_blank"}, summarized here:
|
Update the host RP4 using [instructions](https://github.com/linuxserver/docker-papermerge/issues/4#issuecomment-735236388), summarized here:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
wget http://ftp.us.debian.org/debian/pool/main/libs/libseccomp/libseccomp2_2.5.1-1_armhf.deb
|
wget http://ftp.us.debian.org/debian/pool/main/libs/libseccomp/libseccomp2_2.5.1-1_armhf.deb
|
||||||
sudo dpkg -i libseccomp2_2.5.1-1_armhf.deb
|
sudo dpkg -i libseccomp2_2.5.1-1_armhf.deb
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Advanced
|
||||||
|
|
||||||
|
|
||||||
## Advanced
|
|
||||||
!!! warning "Not Required"
|
!!! warning "Not Required"
|
||||||
The items below are completely optional and are not required to manage or install your Mealie instance.
|
|
||||||
|
The items below are completely optional and are not required to manage or install your Mealie instance.
|
||||||
|
|
||||||
### Custom Caddy File
|
### Custom Caddy File
|
||||||
The Docker image provided by Mealie contains both the API and the html bundle in one convenient image. This is done by using a proxy server to serve different parts of the application depending on the URL/URI. Requests sent to `/api/*` or `/docs` will be directed to the API, anything else will be served the static web files. Below is the default Caddyfile that is used to proxy requests. You can override this file by mounting an alternative Caddyfile to `/app/Caddyfile`.
|
|
||||||
|
The Docker image provided by Mealie contains both the API and the html bundle in one convenient image. This is done by using a proxy server to serve different parts of the application depending on the URL/URI. Requests sent to `/api/*` or `/docs` will be directed to the API, anything else will be served the static web files. Below is the default Caddyfile that is used to proxy requests. You can override this file by mounting an alternative Caddyfile to `/app/Caddyfile`.
|
||||||
|
|
||||||
```
|
```
|
||||||
{
|
{
|
||||||
auto_https off
|
auto_https off
|
||||||
admin off
|
admin off
|
||||||
}
|
}
|
||||||
|
|
||||||
:80 {
|
:80 {
|
||||||
@proxied path /api/* /docs /openapi.json
|
@proxied path /api/* /docs /openapi.json
|
||||||
|
|
||||||
root * /app/dist
|
root * /app/dist
|
||||||
encode gzip
|
encode gzip
|
||||||
uri strip_suffix /
|
uri strip_suffix /
|
||||||
|
|
||||||
handle_path /api/recipes/image/* {
|
handle_path /api/recipes/image/* {
|
||||||
root * /app/data/img/
|
root * /app/data/img/
|
||||||
file_server
|
file_server
|
||||||
}
|
}
|
||||||
|
|
||||||
handle @proxied {
|
handle @proxied {
|
||||||
reverse_proxy http://127.0.0.1:9000
|
reverse_proxy http://127.0.0.1:9000
|
||||||
}
|
}
|
||||||
|
|
||||||
handle {
|
handle {
|
||||||
try_files {path}.html {path} /
|
try_files {path}.html {path} /
|
||||||
file_server
|
file_server
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Deployed without Docker
|
## Deployed without Docker
|
||||||
!!! error "Unsupported Deployment"
|
|
||||||
If you are experiencing a problem with manual deployment, please do not submit a github issue unless it is related to an aspect of the application. For deployment help, the [discord server](https://discord.gg/QuStdQGSGK){:target="_blank"} is a better place to find support.
|
|
||||||
|
|
||||||
Alternatively, this project is built on Python and SQLite so you may run it as a python application on your server. This is not a supported options for deployment and is only here as a reference for those who would like to do this on their own. To get started you can clone this repository into a directory of your choice and use the instructions below as a reference for how to get started.
|
!!! error "Unsupported Deployment"
|
||||||
|
|
||||||
|
If you are experiencing a problem with manual deployment, please do not submit a github issue unless it is related to an aspect of the application. For deployment help, the [discord server](https://discord.gg/QuStdQGSGK) is a better place to find support.
|
||||||
|
|
||||||
|
Alternatively, this project is built on Python and SQLite so you may run it as a python application on your server. This is not a supported options for deployment and is only here as a reference for those who would like to do this on their own. To get started you can clone this repository into a directory of your choice and use the instructions below as a reference for how to get started.
|
||||||
|
|
||||||
There are three parts to the Mealie application
|
There are three parts to the Mealie application
|
||||||
|
|
||||||
@@ -156,14 +214,19 @@ There are three parts to the Mealie application
|
|||||||
- Proxy Server
|
- Proxy Server
|
||||||
|
|
||||||
### Frontend/ Static Files
|
### Frontend/ Static Files
|
||||||
|
|
||||||
The frontend static files are generated with `npm run build`. This is done during the build process with docker. If you choose to deploy this as a system application you must do this process yourself. In the project directory run `cd frontend` to change directories into the frontend directory and run `npm install` and then `npm run build`. This will generate the static files in a `dist` folder in the frontend directory.
|
The frontend static files are generated with `npm run build`. This is done during the build process with docker. If you choose to deploy this as a system application you must do this process yourself. In the project directory run `cd frontend` to change directories into the frontend directory and run `npm install` and then `npm run build`. This will generate the static files in a `dist` folder in the frontend directory.
|
||||||
|
|
||||||
### Backend API
|
### Backend API
|
||||||
|
|
||||||
The backend API is build with Python, FastAPI, and SQLite and requires Python 3.9, and Poetry. Once the requirements are installed, in the project directory you can run the command `poetry install` to create a python virtual environment and install the python dependencies.
|
The backend API is build with Python, FastAPI, and SQLite and requires Python 3.9, and Poetry. Once the requirements are installed, in the project directory you can run the command `poetry install` to create a python virtual environment and install the python dependencies.
|
||||||
|
|
||||||
Once the dependencies are installed you should be ready to run the server. To initialize that database you need to first run `python mealie/db/init_db.py`. Then to start The web server, you run the command `uvicorn mealie.app:app --host 0.0.0.0 --port 9000`
|
Once the dependencies are installed you should be ready to run the server. To initialize that database you need to first run `python mealie/db/init_db.py`. Then to start The web server, you run the command `uvicorn mealie.app:app --host 0.0.0.0 --port 9000`
|
||||||
|
|
||||||
|
|
||||||
### Proxy Server
|
### Proxy Server
|
||||||
You must use a proxy server to server up the static files created with `npm run build` and proxy requests to the API. In the docker build this is done with Caddy. You can use the CaddyFile in the section above as a reference. One important thing to keep in mind is that you should drop any trailing `/` in the url. Not doing this may result in failed API requests.
|
|
||||||
|
|
||||||
|
You must use a proxy server to server up the static files created with `npm run build` and proxy requests to the API. In the docker build this is done with Caddy. You can use the CaddyFile in the section above as a reference. One important thing to keep in mind is that you should drop any trailing `/` in the url. Not doing this may result in failed API requests.
|
||||||
|
|
||||||
|
[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
|
||||||
|
|||||||
@@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
Mealie is a self hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. Easily add recipes into your database by providing the url and Mealie will automatically import the relevant data or add a family recipe with the UI editor. Mealie also provides an API for interactions from 3rd party applications.
|
Mealie is a self hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. Easily add recipes into your database by providing the url and Mealie will automatically import the relevant data or add a family recipe with the UI editor. Mealie also provides an API for interactions from 3rd party applications.
|
||||||
|
|
||||||
[Remember to join the Discord](https://discord.gg/QuStdQGSGK){:target="_blank"}!
|
[Remember to join the Discord](https://discord.gg/QuStdQGSGK)!
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
In some of the demo gifs the styling may be different than the finale application. demos were done during development prior to finale styling.
|
In some of the demo gifs the styling may be different than the finale application. demos were done during development prior to finale styling.
|
||||||
|
|
||||||
!!! warning
|
!!! warning
|
||||||
This is a **BETA** release and that means things may break and or change down the line. I'll do my best to make sure that any API changes are thoughtful and necessary in order not to break things. Additionally, I'll do my best to provide a migration path if the database schema ever changes. Do not use programs like watchtower to auto update your container. You **WILL** run into issues if you do this,
|
This is a **BETA** release and that means things may break and or change down the line. I'll do my best to make sure that any API changes are thoughtful and necessary in order not to break things. Additionally, I'll do my best to provide a migration path if the database schema ever changes. Do not use programs like watchtower to auto update your container. You **WILL** run into issues if you do this!
|
||||||
|
|
||||||
|
|
||||||
## Key Features
|
## Key Features
|
||||||
@@ -26,7 +26,7 @@ Mealie is a self hosted recipe manager and meal planner with a RestAPI backend a
|
|||||||
- Flexible API
|
- Flexible API
|
||||||
- Custom key/value pairs for recipes
|
- Custom key/value pairs for recipes
|
||||||
- Webhook support
|
- Webhook support
|
||||||
- Interactive API Documentation thanks to [FastAPI](https://fastapi.tiangolo.com/){:target="_blank"} and [Swagger](https://petstore.swagger.io/){:target="_blank"}
|
- Interactive API Documentation thanks to [FastAPI](https://fastapi.tiangolo.com/) and [Swagger](https://petstore.swagger.io/)
|
||||||
- Raw JSON Recipe Editor
|
- Raw JSON Recipe Editor
|
||||||
- Migration from other platforms
|
- Migration from other platforms
|
||||||
- Chowdown
|
- Chowdown
|
||||||
@@ -36,7 +36,7 @@ Mealie is a self hosted recipe manager and meal planner with a RestAPI backend a
|
|||||||
## FAQ
|
## FAQ
|
||||||
|
|
||||||
### Why An API?
|
### Why An API?
|
||||||
An API allows integration into applications like [Home Assistant](https://www.home-assistant.io/){:target="_blank"} that can act as notification engines to provide custom notifications based of Meal Plan data to remind you to defrost the chicken, marinade the steak, or start the CrockPot. Additionally, you can access nearly any backend service via the API giving you total control to extend the application. To explore the API spin up your server and navigate to http://yourserver.com/docs for interactive API documentation.
|
An API allows integration into applications like [Home Assistant](https://www.home-assistant.io/) that can act as notification engines to provide custom notifications based of Meal Plan data to remind you to defrost the chicken, marinade the steak, or start the CrockPot. Additionally, you can access nearly any backend service via the API giving you total control to extend the application. To explore the API spin up your server and navigate to http://yourserver.com/docs for interactive API documentation.
|
||||||
|
|
||||||
### Why a Database?
|
### Why a Database?
|
||||||
Some users of static-site generator applications like ChowDown have expressed concerns about their data being stuck in a database. Considering this is a new project it is a valid concern to be worried about your data. Mealie specifically addresses this concern by provided automatic daily backups that export your data in json, plain-text markdown files, and/or custom Jinja2 templates. **This puts you in controls of how your data is represented** when exported from Mealie, which means you can easily migrate to any other service provided Mealie doesn't work for you.
|
Some users of static-site generator applications like ChowDown have expressed concerns about their data being stuck in a database. Considering this is a new project it is a valid concern to be worried about your data. Mealie specifically addresses this concern by provided automatic daily backups that export your data in json, plain-text markdown files, and/or custom Jinja2 templates. **This puts you in controls of how your data is represented** when exported from Mealie, which means you can easily migrate to any other service provided Mealie doesn't work for you.
|
||||||
@@ -48,10 +48,10 @@ As to why we need a database?
|
|||||||
|
|
||||||
## Built With
|
## Built With
|
||||||
|
|
||||||
* [Vue.js](https://vuejs.org/){:target="_blank"}
|
* [Vue.js](https://vuejs.org/)
|
||||||
* [Vuetify](https://vuetifyjs.com/en/){:target="_blank"}
|
* [Vuetify](https://vuetifyjs.com/en/)
|
||||||
* [FastAPI](https://fastapi.tiangolo.com/){:target="_blank"}
|
* [FastAPI](https://fastapi.tiangolo.com/)
|
||||||
* [Docker](https://www.docker.com/){:target="_blank"}
|
* [Docker](https://www.docker.com/)
|
||||||
|
|
||||||
<!-- ROADMAP -->
|
<!-- ROADMAP -->
|
||||||
## Road Map
|
## Road Map
|
||||||
@@ -62,9 +62,9 @@ As to why we need a database?
|
|||||||
<!-- CONTRIBUTING -->
|
<!-- CONTRIBUTING -->
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Contributions are what make the open source community such an amazing place to be learn, develop, and create. Any contributions you make are **greatly appreciated**. See the [Contributors Guide](../../contributors/non-coders.md) for help getting started.
|
Contributions are what make the open source community such an amazing place to learn, develop, and create. Any contributions you make are **greatly appreciated**. See the [Contributors Guide](../../contributors/non-coders.md) for help getting started.
|
||||||
|
|
||||||
If you are not a coder, you can still contribute financially. financial contributions help me prioritize working on this project over others and helps me know that there is a real demand for project development.
|
If you are not a coder, you can still contribute financially. Financial contributions help me prioritize working on this project over others and help me to know that there is a real demand for project development.
|
||||||
|
|
||||||
<a href="https://www.buymeacoffee.com/haykot" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-green.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>
|
<a href="https://www.buymeacoffee.com/haykot" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-green.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;" ></a>
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Updating Mealie
|
# Updating Mealie
|
||||||
|
|
||||||
!!! warning "Read The Release Notes"
|
!!! warning "Read The Release Notes"
|
||||||
You MUST read the release notes prior to upgrading your container. Currently Mealie provides no database migrations as doing such would slow down development and hinder major changes that may need to happen prior to v1.0.0. Mealie has a robust backup and restore system for managing your data.
|
You MUST read the release notes prior to upgrading your container. Currently Mealie provides no database migrations as doing so would slow down development and hinder major changes that may need to happen prior to v1.0.0. Mealie has a robust backup and restore system for managing your data.
|
||||||
|
|
||||||
### Before Upgrading
|
### Before Upgrading
|
||||||
- Read The Release Notes
|
- Read The Release Notes
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
[See Backups and Restore Section](../admin/backups-and-exports.md) for details on backing up your data
|
[See Backups and Restore Section](../admin/backups-and-exports.md) for details on backing up your data
|
||||||
|
|
||||||
## Docker
|
## Docker
|
||||||
For all setups using Docker the updating process look something like this
|
For all setups using Docker the updating process looks something like this
|
||||||
|
|
||||||
- Stop the container using docker-compose down
|
- Stop the container using docker-compose down
|
||||||
- Pull the latest image using docker-compose pull
|
- Pull the latest image using docker-compose pull
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ Below are some general guidelines that were considered when creating the organiz
|
|||||||
>
|
>
|
||||||
> My tags are for picking the exact type of meal I'm looking for, based on my mood or my guests' diet, like gluten-free, vegetarian, sweet-sour or casserole. They can also act as sub-categories, like "alcohol" for beverages or "hot meal" for a main course.
|
> My tags are for picking the exact type of meal I'm looking for, based on my mood or my guests' diet, like gluten-free, vegetarian, sweet-sour or casserole. They can also act as sub-categories, like "alcohol" for beverages or "hot meal" for a main course.
|
||||||
>
|
>
|
||||||
> User: [sephrat](https://github.com/sephrat){:target="_blank"}
|
> User: [sephrat](https://github.com/sephrat)
|
||||||
|
|
||||||
|
|
||||||
## Structure
|
## Structure
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Recipes
|
# Recipes
|
||||||
|
|
||||||
## URL Import
|
## URL Import
|
||||||
Adding a recipe can be as easy as clicking in the bottom-right corner, copying the recipe URL into Mealie and letting the web scrapper organize information. Currently this scraper is implemented with [recipe-scrapers](https://github.com/hhursev/recipe-scrapers){:target="_blank"}. You may have mixed results on some websites, especially with blogs or non-specific recipe websites. See the bulk import Option below for another a convenient way to add blog style recipes into Mealie.
|
Adding a recipe can be as easy as clicking in the bottom-right corner, copying the recipe URL into Mealie and letting the web scraper organize information. Currently this scraper is implemented with [recipe-scrapers](https://github.com/hhursev/recipe-scrapers). You may have mixed results on some websites, especially with blogs or non-specific recipe websites. See the bulk import Option below for another a convenient way to add blog style recipes into Mealie.
|
||||||
|
|
||||||
!!! tip
|
!!! tip
|
||||||
You can find a list of some of the supported sites in the recipe-scrapers repo. If you're site isn't supported, you can work with the recipe-scrapers team to implement it and we can down-stream those changes into Mealie.
|
You can find a list of some of the supported sites in the recipe-scrapers repo. If you're site isn't supported, you can work with the recipe-scrapers team to implement it and we can down-stream those changes into Mealie.
|
||||||
@@ -12,7 +12,7 @@ Adding a recipe can be as easy as clicking in the bottom-right corner, copying t
|
|||||||
|
|
||||||
You can use bookmarklets to generate a bookmark that will take your current location, and open a new tab that will try to import that URL into Mealie.
|
You can use bookmarklets to generate a bookmark that will take your current location, and open a new tab that will try to import that URL into Mealie.
|
||||||
|
|
||||||
You can use a [bookmarklet generator site](https://caiorss.github.io/bookmarklet-maker/){:target="_blank"} and the code below to generate a bookmark for your site. Just change the `http://localhost:8080` to your sites web address and follow the instructions. Note that there is no trailing `/`.
|
You can use a [bookmarklet generator site](https://caiorss.github.io/bookmarklet-maker/) and the code below to generate a bookmark for your site. Just change the `http://localhost:8080` to your sites web address and follow the instructions. Note that there is no trailing `/`.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
var url = document.URL ;
|
var url = document.URL ;
|
||||||
@@ -54,7 +54,7 @@ Mealie also supports bulk import of recipe instructions and ingredients. Select
|
|||||||

|

|
||||||
|
|
||||||
## Schema
|
## Schema
|
||||||
Recipes are stored in the json-like format in mongoDB and then sent and edited in json format on the frontend. Each recipes uses [Recipe Schema](https://schema.org/Recipe){:target="_blank"} as a general guide with some additional properties specific to Mealie.
|
Recipes are stored in the json-like format in mongoDB and then sent and edited in json format on the frontend. Each recipes uses [Recipe Schema](https://schema.org/Recipe) as a general guide with some additional properties specific to Mealie.
|
||||||
|
|
||||||
### Example
|
### Example
|
||||||
```json
|
```json
|
||||||
|
|||||||
@@ -2,15 +2,15 @@
|
|||||||
|
|
||||||
## Apprise
|
## Apprise
|
||||||
|
|
||||||
Using the [Apprise](https://github.com/caronc/apprise/){:target="_blank"} library Mealie is able to provided notification services for nearly every popular service. Some of our favorites are...
|
Using the [Apprise](https://github.com/caronc/apprise/) library Mealie is able to provide notification services for nearly every popular service. Some of our favorites are...
|
||||||
|
|
||||||
- [Gotify](https://github.com/caronc/apprise/wiki/Notify_gotify){:target="_blank"}
|
- [Gotify](https://github.com/caronc/apprise/wiki/Notify_gotify)
|
||||||
- [Discord](https://github.com/caronc/apprise/wiki/Notify_discord){:target="_blank"}
|
- [Discord](https://github.com/caronc/apprise/wiki/Notify_discord)
|
||||||
- [Home Assistant](https://github.com/caronc/apprise/wiki/Notify_homeassistant){:target="_blank"}
|
- [Home Assistant](https://github.com/caronc/apprise/wiki/Notify_homeassistant)
|
||||||
- [Matrix](https://github.com/caronc/apprise/wiki/Notify_matrix){:target="_blank"}
|
- [Matrix](https://github.com/caronc/apprise/wiki/Notify_matrix)
|
||||||
- [Pushover](https://github.com/caronc/apprise/wiki/Notify_pushover){:target="_blank"}
|
- [Pushover](https://github.com/caronc/apprise/wiki/Notify_pushover)
|
||||||
|
|
||||||
But there are some many to choose from! Take a look at their wiki for information on how to create their URL formats and that you can use to create a notification integration in Mealie.
|
But there are many more to choose from! Take a look at their wiki for information on how to create their URL formats that you can use to create a notification integration in Mealie.
|
||||||
|
|
||||||
|
|
||||||
## Subscribe Events
|
## Subscribe Events
|
||||||
@@ -45,7 +45,7 @@ In most cases the events will also provide details on which user performed the a
|
|||||||
New events can be created and viewed in admin Toolbox `/admin/toolbox?tab=event-notifications`. Select the "+ Notification" button and you'll be provided with a dialog. Complete the form using the URL for the service you'd like to connect to. Before saving be sure to use the test feature.
|
New events can be created and viewed in admin Toolbox `/admin/toolbox?tab=event-notifications`. Select the "+ Notification" button and you'll be provided with a dialog. Complete the form using the URL for the service you'd like to connect to. Before saving be sure to use the test feature.
|
||||||
|
|
||||||
!!! tip
|
!!! tip
|
||||||
The feedback provided from the test feature is only an indicated of if the URL you provided is valid, not if the message was successfully sent. Be sure to check the notification feed for the test message.
|
The feedback provided from the test feature indicates only if the URL you provided is valid, not if the message was successfully sent. Be sure to check the notification feed for the test message.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@@ -56,4 +56,4 @@ New events can be created and viewed in admin Toolbox `/admin/toolbox?tab=event-
|
|||||||

|

|
||||||
|
|
||||||
#### Gotify
|
#### Gotify
|
||||||

|

|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## Working with Planner
|
## Working with Planner
|
||||||
|
|
||||||
In Mealie you can create a meal plan based off the calendar inputs on the meal planner page. There is no limit to how long or how short a meal plan is. You may also create duplicate meal plans for the same date range. After selecting your date range, click on the card for each day and search through recipes to find your choice. Add a side-dish if you prefer to. After selecting a recipe for all meals, save the plan. Selecting the 'No Recipe' button will allow you to add an entry without a recipe by providing a title and description
|
In Mealie you can create a meal plan based off the calendar inputs on the meal planner page. There is no limit to how long or how short a meal plan is. You may also create duplicate meal plans for the same date range. After selecting your date range, click on the card for each day and search through recipes to find your choice. Add a side-dish if you prefer to. After selecting a recipe for all meals, save the plan. Selecting the 'No Recipe' button will allow you to add an entry without a recipe by providing a title and description.
|
||||||
|
|
||||||
You can also randomly generate meal plans with the dice-button at the bottom.
|
You can also randomly generate meal plans with the dice-button at the bottom.
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -1,7 +1,7 @@
|
|||||||
# Development Road Map
|
# Development Road Map
|
||||||
|
|
||||||
## Feature Requests
|
## Feature Requests
|
||||||
See the [Github META issue for tracking feature requests](https://github.com/hay-kot/mealie/issues/122){:target="_blank"}
|
See the [Github META issue for tracking feature requests](https://github.com/hay-kot/mealie/issues/122)
|
||||||
|
|
||||||
## Progress
|
## Progress
|
||||||
See the [Github Projects](https://github.com/hay-kot/mealie/projects){:target="_blank"} to see what is currently being worked on
|
See the [Github Projects](https://github.com/hay-kot/mealie/projects) to see what is currently being worked on
|
||||||
@@ -45,6 +45,8 @@ markdown_extensions:
|
|||||||
|
|
||||||
extra_css:
|
extra_css:
|
||||||
- assets/stylesheets/custom.css
|
- assets/stylesheets/custom.css
|
||||||
|
extra_javascript:
|
||||||
|
- assets/js/extra.js
|
||||||
repo_url: https://github.com/hay-kot/mealie
|
repo_url: https://github.com/hay-kot/mealie
|
||||||
repo_name: hay-kot/mealie
|
repo_name: hay-kot/mealie
|
||||||
|
|
||||||
@@ -92,6 +94,8 @@ nav:
|
|||||||
- Style Guide: "contributors/developers-guide/style-guide.md"
|
- Style Guide: "contributors/developers-guide/style-guide.md"
|
||||||
- Development Road Map: "roadmap.md"
|
- Development Road Map: "roadmap.md"
|
||||||
- Change Log:
|
- Change Log:
|
||||||
|
- v0.5.3 - Bug Fixes: "changelog/v0.5.3.md"
|
||||||
|
- v0.5.2 Misc Updates: "changelog/v0.5.2.md"
|
||||||
- v0.5.1 Bug Fixes: "changelog/v0.5.1.md"
|
- v0.5.1 Bug Fixes: "changelog/v0.5.1.md"
|
||||||
- v0.5.0 General Upgrades: "changelog/v0.5.0.md"
|
- v0.5.0 General Upgrades: "changelog/v0.5.0.md"
|
||||||
- v0.4.3 Hot Fix: "changelog/v0.4.3.md"
|
- v0.4.3 Hot Fix: "changelog/v0.4.3.md"
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM node:latest
|
FROM node:lts-alpine
|
||||||
|
|
||||||
# # install simple http server for serving static content
|
# # install simple http server for serving static content
|
||||||
# RUN npm install -g http-server
|
# RUN npm install -g http-server
|
||||||
@@ -13,7 +13,7 @@ COPY package*.json ./
|
|||||||
RUN npm install
|
RUN npm install
|
||||||
|
|
||||||
# copy project files and folders to the current working directory (i.e. 'app' folder)
|
# copy project files and folders to the current working directory (i.e. 'app' folder)
|
||||||
COPY . .
|
# COPY . .
|
||||||
|
|
||||||
# build app for production with minification
|
# build app for production with minification
|
||||||
# RUN npm run build
|
# RUN npm run build
|
||||||
|
|||||||
18369
frontend/package-lock.json
generated
18369
frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -14,7 +14,6 @@
|
|||||||
"core-js": "^3.14.0",
|
"core-js": "^3.14.0",
|
||||||
"fuse.js": "^6.4.6",
|
"fuse.js": "^6.4.6",
|
||||||
"register-service-worker": "^1.7.1",
|
"register-service-worker": "^1.7.1",
|
||||||
"typeface-roboto": "^1.1.13",
|
|
||||||
"v-jsoneditor": "^1.4.4",
|
"v-jsoneditor": "^1.4.4",
|
||||||
"vue": "^2.6.14",
|
"vue": "^2.6.14",
|
||||||
"vue-i18n": "^8.24.1",
|
"vue-i18n": "^8.24.1",
|
||||||
@@ -25,6 +24,7 @@
|
|||||||
"vuex-persistedstate": "^4.0.0-beta.3"
|
"vuex-persistedstate": "^4.0.0-beta.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"typeface-roboto": "^1.1.13",
|
||||||
"@intlify/vue-i18n-loader": "^1.1.0",
|
"@intlify/vue-i18n-loader": "^1.1.0",
|
||||||
"@mdi/font": "^5.9.55",
|
"@mdi/font": "^5.9.55",
|
||||||
"@mdi/js": "^5.9.55",
|
"@mdi/js": "^5.9.55",
|
||||||
@@ -32,9 +32,12 @@
|
|||||||
"@vue/cli-plugin-eslint": "^4.5.13",
|
"@vue/cli-plugin-eslint": "^4.5.13",
|
||||||
"@vue/cli-plugin-pwa": "~4.5.0",
|
"@vue/cli-plugin-pwa": "~4.5.0",
|
||||||
"@vue/cli-service": "^4.5.13",
|
"@vue/cli-service": "^4.5.13",
|
||||||
|
"@vue/preload-webpack-plugin": "^2.0.0",
|
||||||
"babel-eslint": "^10.1.0",
|
"babel-eslint": "^10.1.0",
|
||||||
"eslint": "^6.7.2",
|
"eslint": "^6.7.2",
|
||||||
"eslint-plugin-vue": "^6.2.2",
|
"eslint-plugin-vue": "^6.2.2",
|
||||||
|
"html-webpack-plugin": "^5.3.1",
|
||||||
|
"preload-webpack-plugin": "^2.3.0",
|
||||||
"sass": "^1.34.1",
|
"sass": "^1.34.1",
|
||||||
"sass-loader": "^8.0.2",
|
"sass-loader": "^8.0.2",
|
||||||
"vue-cli-plugin-i18n": "~1.0.1",
|
"vue-cli-plugin-i18n": "~1.0.1",
|
||||||
@@ -69,4 +72,4 @@
|
|||||||
"last 2 versions",
|
"last 2 versions",
|
||||||
"not dead"
|
"not dead"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -8,8 +8,6 @@
|
|||||||
<meta name="description" content="Mealie is a self hosted recipe manager and meal planner.">
|
<meta name="description" content="Mealie is a self hosted recipe manager and meal planner.">
|
||||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
|
||||||
<title> Mealie </title>
|
<title> Mealie </title>
|
||||||
<!-- <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"> -->
|
|
||||||
<!-- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css"> -->
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
|||||||
@@ -78,5 +78,13 @@
|
|||||||
"start_url": ".",
|
"start_url": ".",
|
||||||
"display": "standalone",
|
"display": "standalone",
|
||||||
"background_color": "#FFFFFF",
|
"background_color": "#FFFFFF",
|
||||||
"theme_color": "#E58325"
|
"theme_color": "#E58325",
|
||||||
}
|
"share_target": {
|
||||||
|
"action": "/",
|
||||||
|
"method": "GET",
|
||||||
|
"params": {
|
||||||
|
"title": "title",
|
||||||
|
"text": "recipe_import_url"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<v-main>
|
<v-main>
|
||||||
<v-banner v-if="demo" sticky>
|
<v-banner v-if="demo" sticky>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<b> This is a Demo of the v0.5.0 (BETA) </b> | Username: changeme@email.com | Password: demo
|
<b> This is a Demo of the v0.5.4 (BETA) </b> | Username: changeme@email.com | Password: demo
|
||||||
</div>
|
</div>
|
||||||
</v-banner>
|
</v-banner>
|
||||||
<GlobalSnackbar />
|
<GlobalSnackbar />
|
||||||
@@ -48,32 +48,17 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
async mounted() {
|
async created() {
|
||||||
|
// Initial API Requests
|
||||||
this.$store.dispatch("initTheme");
|
this.$store.dispatch("initTheme");
|
||||||
this.$store.dispatch("requestRecentRecipes");
|
|
||||||
this.$store.dispatch("refreshToken");
|
this.$store.dispatch("refreshToken");
|
||||||
this.$store.dispatch("requestCurrentGroup");
|
|
||||||
this.$store.dispatch("requestUserData");
|
this.$store.dispatch("requestUserData");
|
||||||
this.$store.dispatch("requestCategories");
|
this.$store.dispatch("requestCurrentGroup");
|
||||||
this.$store.dispatch("requestTags");
|
this.$store.dispatch("requestTags");
|
||||||
this.darkModeSystemCheck();
|
this.$store.dispatch("requestCategories");
|
||||||
this.darkModeAddEventListener();
|
|
||||||
this.$store.dispatch("requestAppInfo");
|
this.$store.dispatch("requestAppInfo");
|
||||||
this.$store.dispatch("requestCustomPages");
|
|
||||||
this.$store.dispatch("requestSiteSettings");
|
this.$store.dispatch("requestSiteSettings");
|
||||||
},
|
|
||||||
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
refreshing: false,
|
|
||||||
registration: null,
|
|
||||||
snackBtnText: "",
|
|
||||||
snackWithBtnText: "",
|
|
||||||
snackWithButtons: false,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
created() {
|
|
||||||
// Listen for swUpdated event and display refresh snackbar as required.
|
// Listen for swUpdated event and display refresh snackbar as required.
|
||||||
document.addEventListener("swUpdated", this.showRefreshUI, { once: true });
|
document.addEventListener("swUpdated", this.showRefreshUI, { once: true });
|
||||||
// Refresh all open app tabs when a new service worker is installed.
|
// Refresh all open app tabs when a new service worker is installed.
|
||||||
@@ -86,6 +71,21 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
mounted() {
|
||||||
|
this.darkModeSystemCheck();
|
||||||
|
this.darkModeAddEventListener();
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
refreshing: false,
|
||||||
|
registration: null,
|
||||||
|
snackBtnText: "",
|
||||||
|
snackWithBtnText: "",
|
||||||
|
snackWithButtons: false,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
// For Later!
|
// For Later!
|
||||||
|
|
||||||
@@ -136,3 +136,4 @@ export default {
|
|||||||
scrollbar-color: transparent transparent;
|
scrollbar-color: transparent transparent;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ export const API_ROUTES = {
|
|||||||
aboutEvents: `${prefix}/about/events`,
|
aboutEvents: `${prefix}/about/events`,
|
||||||
aboutEventsNotifications: `${prefix}/about/events/notifications`,
|
aboutEventsNotifications: `${prefix}/about/events/notifications`,
|
||||||
aboutEventsNotificationsTest: `${prefix}/about/events/notifications/test`,
|
aboutEventsNotificationsTest: `${prefix}/about/events/notifications/test`,
|
||||||
|
aboutRecipesDefaults: `${prefix}/about/recipes/defaults`,
|
||||||
authRefresh: `${prefix}/auth/refresh`,
|
authRefresh: `${prefix}/auth/refresh`,
|
||||||
authToken: `${prefix}/auth/token`,
|
authToken: `${prefix}/auth/token`,
|
||||||
authTokenLong: `${prefix}/auth/token/long`,
|
authTokenLong: `${prefix}/auth/token/long`,
|
||||||
@@ -27,6 +28,7 @@ export const API_ROUTES = {
|
|||||||
migrations: `${prefix}/migrations`,
|
migrations: `${prefix}/migrations`,
|
||||||
recipesCategory: `${prefix}/recipes/category`,
|
recipesCategory: `${prefix}/recipes/category`,
|
||||||
recipesCreate: `${prefix}/recipes/create`,
|
recipesCreate: `${prefix}/recipes/create`,
|
||||||
|
recipesCreateFromZip: `${prefix}/recipes/create-from-zip`,
|
||||||
recipesCreateUrl: `${prefix}/recipes/create-url`,
|
recipesCreateUrl: `${prefix}/recipes/create-url`,
|
||||||
recipesSummary: `${prefix}/recipes/summary`,
|
recipesSummary: `${prefix}/recipes/summary`,
|
||||||
recipesSummaryUncategorized: `${prefix}/recipes/summary/uncategorized`,
|
recipesSummaryUncategorized: `${prefix}/recipes/summary/uncategorized`,
|
||||||
@@ -70,6 +72,7 @@ export const API_ROUTES = {
|
|||||||
recipesRecipeSlug: recipe_slug => `${prefix}/recipes/${recipe_slug}`,
|
recipesRecipeSlug: recipe_slug => `${prefix}/recipes/${recipe_slug}`,
|
||||||
recipesRecipeSlugAssets: recipe_slug => `${prefix}/recipes/${recipe_slug}/assets`,
|
recipesRecipeSlugAssets: recipe_slug => `${prefix}/recipes/${recipe_slug}/assets`,
|
||||||
recipesRecipeSlugImage: recipe_slug => `${prefix}/recipes/${recipe_slug}/image`,
|
recipesRecipeSlugImage: recipe_slug => `${prefix}/recipes/${recipe_slug}/image`,
|
||||||
|
recipesRecipeSlugZip: recipe_slug => `${prefix}/recipes/${recipe_slug}/zip`,
|
||||||
recipesSlugComments: slug => `${prefix}/recipes/${slug}/comments`,
|
recipesSlugComments: slug => `${prefix}/recipes/${slug}/comments`,
|
||||||
recipesSlugCommentsId: (slug, id) => `${prefix}/recipes/${slug}/comments/${id}`,
|
recipesSlugCommentsId: (slug, id) => `${prefix}/recipes/${slug}/comments/${id}`,
|
||||||
shoppingListsId: id => `${prefix}/shopping-lists/${id}`,
|
shoppingListsId: id => `${prefix}/shopping-lists/${id}`,
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ export const metaAPI = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
async getLogText(num) {
|
async getLogText(num) {
|
||||||
const response = await apiReq.get(API_ROUTES.debugLog(num));
|
const response = await apiReq.get(API_ROUTES.debugLogNum(num));
|
||||||
return response.data;
|
return response.data;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,15 @@ import { store } from "../store";
|
|||||||
import i18n from "@/i18n.js";
|
import i18n from "@/i18n.js";
|
||||||
|
|
||||||
export const recipeAPI = {
|
export const recipeAPI = {
|
||||||
|
/**
|
||||||
|
* Returns the Default Recipe Settings for the Site
|
||||||
|
* @returns {AxoisResponse} Axois Response Object
|
||||||
|
*/
|
||||||
|
async getDefaultSettings() {
|
||||||
|
const response = await apiReq.get(API_ROUTES.aboutRecipesDefaults);
|
||||||
|
return response;
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a Recipe by URL
|
* Create a Recipe by URL
|
||||||
* @param {string} recipeURL
|
* @param {string} recipeURL
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import i18n from "@/i18n.js";
|
|||||||
export const utilsAPI = {
|
export const utilsAPI = {
|
||||||
// import { api } from "@/api";
|
// import { api } from "@/api";
|
||||||
uploadFile(url, fileObject) {
|
uploadFile(url, fileObject) {
|
||||||
console.log("API Called");
|
|
||||||
|
|
||||||
return apiReq.post(
|
return apiReq.post(
|
||||||
url,
|
url,
|
||||||
fileObject,
|
fileObject,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<The404>
|
<The404>
|
||||||
<h1 class="mx-auto">No Recipe Found</h1>
|
<h1 class="mx-auto">{{ $t('general.no-recipe-found') }}</h1>
|
||||||
</The404>
|
</The404>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<v-card-title>
|
<v-card-title>
|
||||||
<slot>
|
<slot>
|
||||||
<h1 class="mx-auto">{{ $t("404.page-not-found") }}</h1>
|
<h1 class="mx-auto">{{ $t('page.404-page-not-found') }}</h1>
|
||||||
</slot>
|
</slot>
|
||||||
</v-card-title>
|
</v-card-title>
|
||||||
<div class="d-flex justify-space-around">
|
<div class="d-flex justify-space-around">
|
||||||
@@ -29,15 +29,15 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
export default {
|
export default {
|
||||||
data() {
|
computed: {
|
||||||
return {
|
buttons() {
|
||||||
buttons: [
|
return[
|
||||||
{ icon: this.$globals.icons.home, to: "/", text: "Home" },
|
{ icon: this.$globals.icons.home, to: "/", text: this.$t('general.home') },
|
||||||
{ icon: this.$globals.icons.primary, to: "/recipes/all", text: "All Recipes" },
|
{ icon: this.$globals.icons.primary, to: "/recipes/all", text: this.$t('page.all-recipes') },
|
||||||
{ icon: this.$globals.icons.search, to: "/search", text: "Search" },
|
{ icon: this.$globals.icons.search, to: "/search", text: this.$t('search.search') },
|
||||||
],
|
];
|
||||||
};
|
},
|
||||||
},
|
}
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -72,6 +72,13 @@ export default {
|
|||||||
selected: [],
|
selected: [],
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
async created() {
|
||||||
|
if (this.tagSelector) {
|
||||||
|
this.$store.dispatch("requestTags");
|
||||||
|
} else {
|
||||||
|
this.$store.dispatch("requestCategories");
|
||||||
|
}
|
||||||
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.$emit(MOUNTED_EVENT);
|
this.$emit(MOUNTED_EVENT);
|
||||||
this.setInit(this.value);
|
this.setInit(this.value);
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ export default {
|
|||||||
],
|
],
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
created() {
|
||||||
this.selectedItem = this.$store.getters.getActiveLang;
|
this.selectedItem = this.$store.getters.getActiveLang;
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
|||||||
@@ -18,14 +18,16 @@
|
|||||||
<v-hover v-slot="{ hover }" :open-delay="50">
|
<v-hover v-slot="{ hover }" :open-delay="50">
|
||||||
<v-card :class="{ 'on-hover': hover }" :elevation="hover ? 12 : 2">
|
<v-card :class="{ 'on-hover': hover }" :elevation="hover ? 12 : 2">
|
||||||
<CardImage large :slug="planDay.meals[0].slug" icon-size="200" @click="openSearch(index, modes.primary)">
|
<CardImage large :slug="planDay.meals[0].slug" icon-size="200" @click="openSearch(index, modes.primary)">
|
||||||
<v-fade-transition>
|
<div>
|
||||||
<v-btn v-if="hover" small color="info" class="ma-1" @click.stop="addCustomItem(index, modes.primary)">
|
<v-fade-transition>
|
||||||
<v-icon left>
|
<v-btn v-if="hover" small color="info" class="ma-1" @click.stop="addCustomItem(index, modes.primary)">
|
||||||
{{ $globals.icons.edit }}
|
<v-icon left>
|
||||||
</v-icon>
|
{{ $globals.icons.edit }}
|
||||||
{{ $t('reicpe.no-recipe') }}
|
</v-icon>
|
||||||
</v-btn>
|
{{ $t("reicpe.no-recipe") }}
|
||||||
</v-fade-transition>
|
</v-btn>
|
||||||
|
</v-fade-transition>
|
||||||
|
</div>
|
||||||
</CardImage>
|
</CardImage>
|
||||||
|
|
||||||
<v-card-title class="my-n3 mb-n6">
|
<v-card-title class="my-n3 mb-n6">
|
||||||
@@ -40,14 +42,14 @@
|
|||||||
<v-icon left>
|
<v-icon left>
|
||||||
{{ $globals.icons.edit }}
|
{{ $globals.icons.edit }}
|
||||||
</v-icon>
|
</v-icon>
|
||||||
{{ $t('reicpe.no-recipe') }}
|
{{ $t("reicpe.no-recipe") }}
|
||||||
</v-btn>
|
</v-btn>
|
||||||
</v-fade-transition>
|
</v-fade-transition>
|
||||||
<v-btn color="info" outlined small @click="openSearch(index, modes.sides)">
|
<v-btn color="info" outlined small @click="openSearch(index, modes.sides)">
|
||||||
<v-icon small class="mr-1">
|
<v-icon small class="mr-1">
|
||||||
{{ $globals.icons.create }}
|
{{ $globals.icons.create }}
|
||||||
</v-icon>
|
</v-icon>
|
||||||
{{ $t('meal-plan.side') }}
|
{{ $t("meal-plan.side") }}
|
||||||
</v-btn>
|
</v-btn>
|
||||||
</v-card-actions>
|
</v-card-actions>
|
||||||
</v-hover>
|
</v-hover>
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
async mounted() {
|
async created() {
|
||||||
await this.$store.dispatch("requestCurrentGroup");
|
await this.$store.dispatch("requestCurrentGroup");
|
||||||
await this.$store.dispatch("requestAllRecipes");
|
await this.$store.dispatch("requestAllRecipes");
|
||||||
await this.buildMealStore();
|
await this.buildMealStore();
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<v-icon color="primary" class="icon-position" :size="iconSize">
|
<v-icon color="primary" class="icon-position" :size="iconSize">
|
||||||
{{ $globals.icons.primary }}
|
{{ $globals.icons.primary }}
|
||||||
</v-icon>
|
</v-icon>
|
||||||
<slot> </slot>
|
<slot> </slot>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -85,6 +85,7 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.icon-slot > div {
|
.icon-slot > div {
|
||||||
|
top: 0;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
allow-overflow
|
allow-overflow
|
||||||
close-delay="125"
|
close-delay="125"
|
||||||
open-on-hover
|
open-on-hover
|
||||||
|
content-class="d-print-none"
|
||||||
>
|
>
|
||||||
<template v-slot:activator="{ on, attrs }">
|
<template v-slot:activator="{ on, attrs }">
|
||||||
<v-btn :fab="fab" :small="fab" :color="color" :icon="!fab" dark v-bind="attrs" v-on="on" @click.prevent>
|
<v-btn :fab="fab" :small="fab" :color="color" :icon="!fab" dark v-bind="attrs" v-on="on" @click.prevent>
|
||||||
@@ -25,11 +26,7 @@
|
|||||||
</v-btn>
|
</v-btn>
|
||||||
</template>
|
</template>
|
||||||
<v-list dense>
|
<v-list dense>
|
||||||
<v-list-item
|
<v-list-item v-for="(item, index) in displayedMenu" :key="index" @click="menuAction(item.action)">
|
||||||
v-for="(item, index) in loggedIn && cardMenu ? userMenu : defaultMenu"
|
|
||||||
:key="index"
|
|
||||||
@click="menuAction(item.action)"
|
|
||||||
>
|
|
||||||
<v-list-item-icon>
|
<v-list-item-icon>
|
||||||
<v-icon v-text="item.icon" :color="item.color"></v-icon>
|
<v-icon v-text="item.icon" :color="item.color"></v-icon>
|
||||||
</v-list-item-icon>
|
</v-list-item-icon>
|
||||||
@@ -53,6 +50,10 @@ export default {
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: true,
|
default: true,
|
||||||
},
|
},
|
||||||
|
showPrint: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
fab: {
|
fab: {
|
||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
@@ -88,20 +89,28 @@ export default {
|
|||||||
recipeURL() {
|
recipeURL() {
|
||||||
return `${this.baseURL}/recipe/${this.slug}`;
|
return `${this.baseURL}/recipe/${this.slug}`;
|
||||||
},
|
},
|
||||||
|
printerMenu() {
|
||||||
|
return {
|
||||||
|
title: this.$t("general.print"),
|
||||||
|
icon: this.$globals.icons.printer,
|
||||||
|
color: "accent",
|
||||||
|
action: "print",
|
||||||
|
};
|
||||||
|
},
|
||||||
defaultMenu() {
|
defaultMenu() {
|
||||||
return [
|
return [
|
||||||
{
|
|
||||||
title: this.$t("general.print"),
|
|
||||||
icon: this.$globals.icons.printer,
|
|
||||||
color: "accent",
|
|
||||||
action: "print",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
title: this.$t("general.share"),
|
title: this.$t("general.share"),
|
||||||
icon: this.$globals.icons.shareVariant,
|
icon: this.$globals.icons.shareVariant,
|
||||||
color: "accent",
|
color: "accent",
|
||||||
action: "share",
|
action: "share",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: this.$t("general.download"),
|
||||||
|
icon: this.$globals.icons.download,
|
||||||
|
color: "accent",
|
||||||
|
action: "download",
|
||||||
|
},
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
userMenu() {
|
userMenu() {
|
||||||
@@ -118,9 +127,18 @@ export default {
|
|||||||
color: "accent",
|
color: "accent",
|
||||||
action: "edit",
|
action: "edit",
|
||||||
},
|
},
|
||||||
...this.defaultMenu,
|
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
|
displayedMenu() {
|
||||||
|
let menu = this.defaultMenu;
|
||||||
|
if (this.loggedIn && this.cardMenu) {
|
||||||
|
menu = [...this.userMenu, ...menu];
|
||||||
|
}
|
||||||
|
if (this.showPrint) {
|
||||||
|
menu = [this.printerMenu, ...menu];
|
||||||
|
}
|
||||||
|
return menu;
|
||||||
|
},
|
||||||
recipeText() {
|
recipeText() {
|
||||||
return this.$t("recipe.share-recipe-message", [this.name]);
|
return this.$t("recipe.share-recipe-message", [this.name]);
|
||||||
},
|
},
|
||||||
@@ -159,6 +177,9 @@ export default {
|
|||||||
case "print":
|
case "print":
|
||||||
this.$router.push(`/recipe/${this.slug}` + "?print=true");
|
this.$router.push(`/recipe/${this.slug}` + "?print=true");
|
||||||
break;
|
break;
|
||||||
|
case "download":
|
||||||
|
window.open(`/api/recipes/${this.slug}/zip`);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
<template>
|
<template>
|
||||||
<v-tooltip bottom nudge-right="50" :color="buttonStyle ? 'primary' : 'secondary'">
|
<v-tooltip bottom nudge-right="50" :color="buttonStyle ? 'info' : 'secondary'">
|
||||||
<template v-slot:activator="{ on, attrs }">
|
<template v-slot:activator="{ on, attrs }">
|
||||||
<v-btn
|
<v-btn
|
||||||
small
|
small
|
||||||
@click.prevent="toggleFavorite"
|
@click.prevent="toggleFavorite"
|
||||||
v-if="isFavorite || showAlways"
|
v-if="isFavorite || showAlways"
|
||||||
:color="buttonStyle ? 'primary' : 'secondary'"
|
:color="buttonStyle ? 'info' : 'secondary'"
|
||||||
:icon="!buttonStyle"
|
:icon="!buttonStyle"
|
||||||
:fab="buttonStyle"
|
:fab="buttonStyle"
|
||||||
v-bind="attrs"
|
v-bind="attrs"
|
||||||
v-on="on"
|
v-on="on"
|
||||||
>
|
>
|
||||||
<v-icon :small="!buttonStyle" color="secondary">
|
<v-icon :small="!buttonStyle" :color="buttonStyle ? 'white' : 'secondary'">
|
||||||
{{ isFavorite ? $globals.icons.heart : $globals.icons.heartOutline }}
|
{{ isFavorite ? $globals.icons.heart : $globals.icons.heartOutline }}
|
||||||
</v-icon>
|
</v-icon>
|
||||||
</v-btn>
|
</v-btn>
|
||||||
|
|||||||
@@ -2,13 +2,18 @@
|
|||||||
<div v-if="value.length > 0 || edit">
|
<div v-if="value.length > 0 || edit">
|
||||||
<v-card class="mt-2">
|
<v-card class="mt-2">
|
||||||
<v-card-title class="py-2">
|
<v-card-title class="py-2">
|
||||||
{{ $t("recipe.assets") }}
|
{{ $t("asset.assets") }}
|
||||||
</v-card-title>
|
</v-card-title>
|
||||||
<v-divider class="mx-2"></v-divider>
|
<v-divider class="mx-2"></v-divider>
|
||||||
<v-list :flat="!edit" v-if="value.length > 0">
|
<v-list :flat="!edit" v-if="value.length > 0">
|
||||||
<v-list-item v-for="(item, i) in value" :key="i">
|
<v-list-item v-for="(item, i) in value" :key="i">
|
||||||
<v-list-item-icon class="ma-auto">
|
<v-list-item-icon class="ma-auto">
|
||||||
<v-icon v-text="getIcon(item.icon)"></v-icon>
|
<v-tooltip bottom>
|
||||||
|
<template v-slot:activator="{ on, attrs }">
|
||||||
|
<v-icon v-text="getIconDefinition(item.icon).icon" v-bind="attrs" v-on="on"></v-icon>
|
||||||
|
</template>
|
||||||
|
<span>{{ getIconDefinition(item.icon).title }}</span>
|
||||||
|
</v-tooltip>
|
||||||
</v-list-item-icon>
|
</v-list-item-icon>
|
||||||
<v-list-item-content>
|
<v-list-item-content>
|
||||||
<v-list-item-title class="pl-2" v-text="item.name"></v-list-item-title>
|
<v-list-item-title class="pl-2" v-text="item.name"></v-list-item-title>
|
||||||
@@ -29,7 +34,7 @@
|
|||||||
</v-card>
|
</v-card>
|
||||||
<div class="d-flex ml-auto mt-2">
|
<div class="d-flex ml-auto mt-2">
|
||||||
<v-spacer></v-spacer>
|
<v-spacer></v-spacer>
|
||||||
<base-dialog @submit="addAsset" :title="$t('recipe.new-asset')" :title-icon="getIcon(newAsset.icon)">
|
<base-dialog @submit="addAsset" :title="$t('asset.new-asset')" :title-icon="getIconDefinition(newAsset.icon).icon">
|
||||||
<template v-slot:open="{ open }">
|
<template v-slot:open="{ open }">
|
||||||
<v-btn color="secondary" dark @click="open" v-if="edit">
|
<v-btn color="secondary" dark @click="open" v-if="edit">
|
||||||
<v-icon>{{ $globals.icons.create }}</v-icon>
|
<v-icon>{{ $globals.icons.create }}</v-icon>
|
||||||
@@ -40,18 +45,20 @@
|
|||||||
<div class="d-flex justify-space-between">
|
<div class="d-flex justify-space-between">
|
||||||
<v-select
|
<v-select
|
||||||
dense
|
dense
|
||||||
:prepend-icon="getIcon(newAsset.icon)"
|
:prepend-icon="getIconDefinition(newAsset.icon).icon"
|
||||||
v-model="newAsset.icon"
|
v-model="newAsset.icon"
|
||||||
:items="iconOptions"
|
:items="iconOptions"
|
||||||
|
item-text="title"
|
||||||
|
item-value="name"
|
||||||
class="mr-2"
|
class="mr-2"
|
||||||
>
|
>
|
||||||
<template v-slot:item="{ item }">
|
<template v-slot:item="{ item }">
|
||||||
<v-list-item-avatar>
|
<v-list-item-avatar>
|
||||||
<v-icon class="mr-auto">
|
<v-icon class="mr-auto">
|
||||||
{{ getIcon(item) }}
|
{{ item.icon }}
|
||||||
</v-icon>
|
</v-icon>
|
||||||
</v-list-item-avatar>
|
</v-list-item-avatar>
|
||||||
{{ item }}
|
{{ item.title }}
|
||||||
</template>
|
</template>
|
||||||
</v-select>
|
</v-select>
|
||||||
<TheUploadBtn @uploaded="setFileObject" :post="false" file-name="file" :text-btn="false" />
|
<TheUploadBtn @uploaded="setFileObject" :post="false" file-name="file" :text-btn="false" />
|
||||||
@@ -91,30 +98,45 @@ export default {
|
|||||||
name: "",
|
name: "",
|
||||||
icon: "mdi-file",
|
icon: "mdi-file",
|
||||||
},
|
},
|
||||||
iconOptions: ["mdi-file", "mdi-file-pdf-box", "mdi-file-image", "mdi-code-json", "mdi-silverware-fork-knife"],
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
baseURL() {
|
baseURL() {
|
||||||
return window.location.origin;
|
return window.location.origin;
|
||||||
},
|
},
|
||||||
|
iconOptions() {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
name: "mdi-file",
|
||||||
|
title: this.$i18n.t('asset.file'),
|
||||||
|
icon: this.$globals.icons.file
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "mdi-file-pdf-box",
|
||||||
|
title: this.$i18n.t('asset.pdf'),
|
||||||
|
icon: this.$globals.icons.filePDF
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "mdi-file-image",
|
||||||
|
title: this.$i18n.t('asset.image'),
|
||||||
|
icon: this.$globals.icons.fileImage
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "mdi-code-json",
|
||||||
|
title: this.$i18n.t('asset.code'),
|
||||||
|
icon: this.$globals.icons.codeJson
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "mdi-silverware-fork-knife",
|
||||||
|
title: this.$i18n.t('asset.recipe'),
|
||||||
|
icon: this.$globals.icons.primary
|
||||||
|
},
|
||||||
|
];
|
||||||
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
getIcon(val) {
|
getIconDefinition(val) {
|
||||||
switch (val) {
|
return this.iconOptions.find(({ name }) => name === val );
|
||||||
case "mdi-file":
|
|
||||||
return this.$globals.icons.file;
|
|
||||||
case "mdi-file-pdf-box":
|
|
||||||
return this.$globals.icons.filePDF;
|
|
||||||
case "mdi-file-image":
|
|
||||||
return this.$globals.icons.fileImage;
|
|
||||||
case "mdi-code-json":
|
|
||||||
return this.$globals.icons.codeJson;
|
|
||||||
case "mdi-silverware-fork-knife":
|
|
||||||
return this.$globals.icons.primary;
|
|
||||||
default:
|
|
||||||
return this.$globals.icons.file;
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
assetURL(assetName) {
|
assetURL(assetName) {
|
||||||
return api.recipes.recipeAssetPath(this.slug, assetName);
|
return api.recipes.recipeAssetPath(this.slug, assetName);
|
||||||
|
|||||||
@@ -25,9 +25,9 @@
|
|||||||
</v-card-title>
|
</v-card-title>
|
||||||
<v-card-text class="mt-n5">
|
<v-card-text class="mt-n5">
|
||||||
<div>
|
<div>
|
||||||
<v-text-field :label="$t('general.url')" class="pt-5" clearable v-model="url">
|
<v-text-field :label="$t('general.url')" class="pt-5" clearable v-model="url" :messages="getMessages()">
|
||||||
<template v-slot:append-outer>
|
<template v-slot:append-outer>
|
||||||
<v-btn class="ml-2" color="primary" @click="getImageFromURL" :loading="loading" :disabled="slug">
|
<v-btn class="ml-2" color="primary" @click="getImageFromURL" :loading="loading" :disabled="!slug">
|
||||||
{{ $t("general.get") }}
|
{{ $t("general.get") }}
|
||||||
</v-btn>
|
</v-btn>
|
||||||
</template>
|
</template>
|
||||||
@@ -66,6 +66,9 @@ export default {
|
|||||||
}
|
}
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
},
|
},
|
||||||
|
getMessages() {
|
||||||
|
return this.slug ? [""] : [this.$i18n.t("recipe.save-recipe-before-use")];
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
public: this.$t("recipe.public-recipe"),
|
public: this.$t("recipe.public-recipe"),
|
||||||
showNutrition: this.$t("recipe.show-nutrition-values"),
|
showNutrition: this.$t("recipe.show-nutrition-values"),
|
||||||
showAssets: this.$t("recipe.show-assets"),
|
showAssets: this.$t("asset.show-assets"),
|
||||||
landscapeView: this.$t("recipe.landscape-view-coming-soon"),
|
landscapeView: this.$t("recipe.landscape-view-coming-soon"),
|
||||||
disableComments: this.$t("recipe.disable-comments"),
|
disableComments: this.$t("recipe.disable-comments"),
|
||||||
disableAmount: this.$t("recipe.disable-amount"),
|
disableAmount: this.$t("recipe.disable-amount"),
|
||||||
|
|||||||
@@ -1,11 +1,20 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-if="edit || ( value && value.length > 0 )">
|
<div v-if="edit || (value && value.length > 0)">
|
||||||
<h2 class="mb-4">{{ $t("recipe.ingredients") }}</h2>
|
<h2 class="mb-4">{{ $t("recipe.ingredients") }}</h2>
|
||||||
<div v-if="edit">
|
<div v-if="edit">
|
||||||
<draggable :value="value" @input="updateIndex" @start="drag = true" @end="drag = false" handle=".handle">
|
<draggable :value="value" @input="updateIndex" @start="drag = true" @end="drag = false" handle=".handle">
|
||||||
<transition-group type="transition" :name="!drag ? 'flip-list' : null">
|
<transition-group type="transition" :name="!drag ? 'flip-list' : null">
|
||||||
<div v-for="(ingredient, index) in value" :key="generateKey('ingredient', index)">
|
<div v-for="(ingredient, index) in value" :key="generateKey('ingredient', index)">
|
||||||
<v-row align="center">
|
<v-row align="center">
|
||||||
|
<v-text-field
|
||||||
|
v-if="edit && showTitleEditor[index]"
|
||||||
|
class="mx-3 mt-3"
|
||||||
|
v-model="value[index].title"
|
||||||
|
dense
|
||||||
|
:label="$t('recipe.section-title')"
|
||||||
|
>
|
||||||
|
</v-text-field>
|
||||||
|
|
||||||
<v-textarea
|
<v-textarea
|
||||||
class="mr-2"
|
class="mr-2"
|
||||||
:label="$t('recipe.ingredient')"
|
:label="$t('recipe.ingredient')"
|
||||||
@@ -15,6 +24,18 @@
|
|||||||
dense
|
dense
|
||||||
rows="1"
|
rows="1"
|
||||||
>
|
>
|
||||||
|
<template slot="append">
|
||||||
|
<v-tooltip right nudge-right="10">
|
||||||
|
<template v-slot:activator="{ on, attrs }">
|
||||||
|
<v-btn icon small class="mt-n1" v-bind="attrs" v-on="on" @click="toggleShowTitle(index)">
|
||||||
|
<v-icon>{{ showTitleEditor[index] ? $globals.icons.minus : $globals.icons.createAlt }}</v-icon>
|
||||||
|
</v-btn>
|
||||||
|
</template>
|
||||||
|
<span>{{
|
||||||
|
showTitleEditor[index] ? $t("recipe.remove-section") : $t("recipe.insert-section")
|
||||||
|
}}</span>
|
||||||
|
</v-tooltip>
|
||||||
|
</template>
|
||||||
<template slot="append-outer">
|
<template slot="append-outer">
|
||||||
<v-icon class="handle">{{ $globals.icons.arrowUpDown }}</v-icon>
|
<v-icon class="handle">{{ $globals.icons.arrowUpDown }}</v-icon>
|
||||||
</template>
|
</template>
|
||||||
@@ -35,18 +56,16 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<v-list-item
|
<div v-for="(ingredient, index) in value" :key="generateKey('ingredient', index)">
|
||||||
dense
|
<h3 class="mt-2" v-if="showTitleEditor[index]">{{ ingredient.title }}</h3>
|
||||||
v-for="(ingredient, index) in value"
|
<v-divider v-if="showTitleEditor[index]"></v-divider>
|
||||||
:key="generateKey('ingredient', index)"
|
<v-list-item dense @click="toggleChecked(index)">
|
||||||
@click="toggleChecked(index)"
|
<v-checkbox hide-details :value="checked[index]" class="pt-0 my-auto py-auto" color="secondary"> </v-checkbox>
|
||||||
>
|
<v-list-item-content>
|
||||||
<v-checkbox hide-details :value="checked[index]" class="pt-0 my-auto py-auto" color="secondary"> </v-checkbox>
|
<vue-markdown class="ma-0 pa-0 text-subtitle-1 dense-markdown" :source="ingredient.note"> </vue-markdown>
|
||||||
|
</v-list-item-content>
|
||||||
<v-list-item-content>
|
</v-list-item>
|
||||||
<vue-markdown class="ma-0 pa-0 text-subtitle-1 dense-markdown" :source="ingredient.note"> </vue-markdown>
|
</div>
|
||||||
</v-list-item-content>
|
|
||||||
</v-list-item>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -76,10 +95,19 @@ export default {
|
|||||||
return {
|
return {
|
||||||
drag: false,
|
drag: false,
|
||||||
checked: [],
|
checked: [],
|
||||||
|
showTitleEditor: [],
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
this.checked = this.value.map(() => false);
|
this.checked = this.value.map(() => false);
|
||||||
|
this.showTitleEditor = this.value.map(x => this.validateTitle(x.title));
|
||||||
|
},
|
||||||
|
watch: {
|
||||||
|
value: {
|
||||||
|
handler() {
|
||||||
|
this.showTitleEditor = this.value.map(x => this.validateTitle(x.title));
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
addIngredient(ingredients = null) {
|
addIngredient(ingredients = null) {
|
||||||
@@ -118,6 +146,16 @@ export default {
|
|||||||
removeByIndex(list, index) {
|
removeByIndex(list, index) {
|
||||||
list.splice(index, 1);
|
list.splice(index, 1);
|
||||||
},
|
},
|
||||||
|
validateTitle(title) {
|
||||||
|
return !(title === null || title === "");
|
||||||
|
},
|
||||||
|
toggleShowTitle(index) {
|
||||||
|
const newVal = !this.showTitleEditor[index];
|
||||||
|
if (!newVal) {
|
||||||
|
this.value[index].title = "";
|
||||||
|
}
|
||||||
|
this.$set(this.showTitleEditor, index, newVal);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -2,74 +2,97 @@
|
|||||||
<div>
|
<div>
|
||||||
<h2 class="mb-4">{{ $t("recipe.instructions") }}</h2>
|
<h2 class="mb-4">{{ $t("recipe.instructions") }}</h2>
|
||||||
<div>
|
<div>
|
||||||
<div v-for="(step, index) in value" :key="index">
|
<draggable
|
||||||
<v-app-bar v-if="showTitleEditor[index]" class="primary mx-1 mt-6" dark dense rounded>
|
:disabled="!edit"
|
||||||
<v-toolbar-title class="headline" v-if="!edit">
|
:value="value"
|
||||||
<v-app-bar-title v-text="step.title"> </v-app-bar-title>
|
@input="updateIndex"
|
||||||
</v-toolbar-title>
|
@start="drag = true"
|
||||||
<v-text-field
|
@end="drag = false"
|
||||||
v-if="edit"
|
handle=".handle"
|
||||||
class="headline pa-0 mt-5"
|
>
|
||||||
v-model="step.title"
|
<div v-for="(step, index) in value" :key="index">
|
||||||
dense
|
<v-app-bar v-if="showTitleEditor[index]" class="primary mx-1 mt-6" dark dense rounded>
|
||||||
solo
|
<v-toolbar-title class="headline" v-if="!edit">
|
||||||
flat
|
<v-app-bar-title v-text="step.title"> </v-app-bar-title>
|
||||||
:placeholder="$t('recipe.section-title')"
|
</v-toolbar-title>
|
||||||
background-color="primary"
|
<v-text-field
|
||||||
>
|
v-if="edit"
|
||||||
</v-text-field>
|
class="headline pa-0 mt-5"
|
||||||
</v-app-bar>
|
v-model="step.title"
|
||||||
<v-hover v-slot="{ hover }">
|
dense
|
||||||
<v-card
|
solo
|
||||||
class="ma-1"
|
flat
|
||||||
:class="[{ 'on-hover': hover }, isDisabled(index)]"
|
:placeholder="$t('recipe.section-title')"
|
||||||
:elevation="hover ? 12 : 2"
|
background-color="primary"
|
||||||
:ripple="!edit"
|
>
|
||||||
@click="toggleDisabled(index)"
|
</v-text-field>
|
||||||
>
|
</v-app-bar>
|
||||||
<v-card-title>
|
<v-hover v-slot="{ hover }">
|
||||||
<v-btn
|
<v-card
|
||||||
v-if="edit"
|
class="ma-1"
|
||||||
fab
|
:class="[{ 'on-hover': hover }, isChecked(index)]"
|
||||||
x-small
|
:elevation="hover ? 12 : 2"
|
||||||
color="white"
|
:ripple="!edit"
|
||||||
class="mr-2"
|
@click="toggleDisabled(index)"
|
||||||
elevation="0"
|
>
|
||||||
@click="removeByIndex(value, index)"
|
<v-card-title :class="{ 'pb-0': !isChecked(index) }">
|
||||||
>
|
<v-btn
|
||||||
<v-icon size="24" color="error">{{ $globals.icons.delete }}</v-icon>
|
v-if="edit"
|
||||||
</v-btn>
|
fab
|
||||||
{{ $t("recipe.step-index", { step: index + 1 }) }}
|
x-small
|
||||||
<v-btn v-if="edit" text color="primary" class="ml-auto" @click="toggleShowTitle(index)">
|
color="white"
|
||||||
{{ !showTitleEditor[index] ? $t('recipe.insert-section') : $t('recipe.remove-section') }}
|
class="mr-2"
|
||||||
</v-btn>
|
elevation="0"
|
||||||
</v-card-title>
|
@click="removeByIndex(value, index)"
|
||||||
<v-card-text v-if="edit">
|
>
|
||||||
<v-textarea
|
<v-icon size="24" color="error">{{ $globals.icons.delete }}</v-icon>
|
||||||
auto-grow
|
</v-btn>
|
||||||
dense
|
|
||||||
v-model="value[index]['text']"
|
{{ $t("recipe.step-index", { step: index + 1 }) }}
|
||||||
:key="generateKey('instructions', index)"
|
|
||||||
rows="4"
|
<v-btn v-if="edit" text color="primary" class="ml-auto" @click="toggleShowTitle(index)">
|
||||||
>
|
{{ !showTitleEditor[index] ? $t("recipe.insert-section") : $t("recipe.remove-section") }}
|
||||||
</v-textarea>
|
</v-btn>
|
||||||
</v-card-text>
|
<v-icon v-if="edit" class="handle">{{ $globals.icons.arrowUpDown }}</v-icon>
|
||||||
<v-card-text v-else>
|
<v-fade-transition>
|
||||||
<vue-markdown :source="step.text"> </vue-markdown>
|
<v-icon v-show="isChecked(index)" size="24" class="ml-auto" color="success">
|
||||||
</v-card-text>
|
{{ $globals.icons.checkboxMarkedCircle }}
|
||||||
</v-card>
|
</v-icon>
|
||||||
</v-hover>
|
</v-fade-transition>
|
||||||
</div>
|
</v-card-title>
|
||||||
|
<v-card-text v-if="edit">
|
||||||
|
<v-textarea
|
||||||
|
auto-grow
|
||||||
|
dense
|
||||||
|
v-model="value[index]['text']"
|
||||||
|
:key="generateKey('instructions', index)"
|
||||||
|
rows="4"
|
||||||
|
>
|
||||||
|
</v-textarea>
|
||||||
|
</v-card-text>
|
||||||
|
<v-expand-transition>
|
||||||
|
<div class="m-0 p-0" v-show="!isChecked(index) && !edit">
|
||||||
|
<v-card-text>
|
||||||
|
<vue-markdown :source="step.text"> </vue-markdown>
|
||||||
|
</v-card-text>
|
||||||
|
</div>
|
||||||
|
</v-expand-transition>
|
||||||
|
</v-card>
|
||||||
|
</v-hover>
|
||||||
|
</div>
|
||||||
|
</draggable>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import draggable from "vuedraggable";
|
||||||
import VueMarkdown from "@adapttive/vue-markdown";
|
import VueMarkdown from "@adapttive/vue-markdown";
|
||||||
import { utils } from "@/utils";
|
import { utils } from "@/utils";
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
VueMarkdown,
|
VueMarkdown,
|
||||||
|
draggable,
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
value: {
|
||||||
@@ -94,12 +117,13 @@ export default {
|
|||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
value: {
|
value: {
|
||||||
handler() {
|
handler() {
|
||||||
this.disabledSteps = [];
|
this.disabledSteps = [];
|
||||||
}
|
this.showTitleEditor = this.value.map(x => this.validateTitle(x.title));
|
||||||
}
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
generateKey(item, index) {
|
generateKey(item, index) {
|
||||||
return utils.generateUniqueKey(item, index);
|
return utils.generateUniqueKey(item, index);
|
||||||
@@ -121,7 +145,7 @@ export default {
|
|||||||
this.disabledSteps.push(stepIndex);
|
this.disabledSteps.push(stepIndex);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
isDisabled(stepIndex) {
|
isChecked(stepIndex) {
|
||||||
if (this.disabledSteps.includes(stepIndex) && !this.edit) {
|
if (this.disabledSteps.includes(stepIndex) && !this.edit) {
|
||||||
return "disabled-card";
|
return "disabled-card";
|
||||||
} else {
|
} else {
|
||||||
@@ -135,8 +159,11 @@ export default {
|
|||||||
}
|
}
|
||||||
this.$set(this.showTitleEditor, index, newVal);
|
this.$set(this.showTitleEditor, index, newVal);
|
||||||
},
|
},
|
||||||
|
updateIndex(data) {
|
||||||
|
this.$emit("input", data);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped></style>
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ export default {
|
|||||||
return utils.generateUniqueKey(item, index);
|
return utils.generateUniqueKey(item, index);
|
||||||
},
|
},
|
||||||
addNote() {
|
addNote() {
|
||||||
this.value.push({ text: "" });
|
this.value.push({ title: "", text: "" });
|
||||||
},
|
},
|
||||||
removeByIndex(list, index) {
|
removeByIndex(list, index) {
|
||||||
list.splice(index, 1);
|
list.splice(index, 1);
|
||||||
|
|||||||
@@ -125,12 +125,13 @@ export default {
|
|||||||
appendSteps(steps) {
|
appendSteps(steps) {
|
||||||
this.value.recipeInstructions.push(
|
this.value.recipeInstructions.push(
|
||||||
...steps.map(x => ({
|
...steps.map(x => ({
|
||||||
|
title: "",
|
||||||
text: x,
|
text: x,
|
||||||
}))
|
}))
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
addStep() {
|
addStep() {
|
||||||
this.value.recipeInstructions.push({ text: "" });
|
this.value.recipeInstructions.push({ title: "", text: "" });
|
||||||
},
|
},
|
||||||
saveExtras(extras) {
|
saveExtras(extras) {
|
||||||
this.value.extras = extras;
|
this.value.extras = extras;
|
||||||
|
|||||||
@@ -18,15 +18,26 @@
|
|||||||
/>
|
/>
|
||||||
<v-spacer></v-spacer>
|
<v-spacer></v-spacer>
|
||||||
<div v-if="!value" class="custom-btn-group ma-1">
|
<div v-if="!value" class="custom-btn-group ma-1">
|
||||||
|
<FavoriteBadge class="mx-1" color="info" button-style v-if="loggedIn" :slug="slug" show-always />
|
||||||
<v-tooltip bottom color="info">
|
<v-tooltip bottom color="info">
|
||||||
<template v-slot:activator="{ on, attrs }">
|
<template v-slot:activator="{ on, attrs }">
|
||||||
<v-btn fab small class="mx-1" color="info" v-bind="attrs" v-on="on" @click="$emit('input', true)">
|
<v-btn
|
||||||
|
v-if="loggedIn"
|
||||||
|
fab
|
||||||
|
small
|
||||||
|
class="mx-1"
|
||||||
|
color="info"
|
||||||
|
v-bind="attrs"
|
||||||
|
v-on="on"
|
||||||
|
@click="$emit('input', true)"
|
||||||
|
>
|
||||||
<v-icon> {{ $globals.icons.edit }} </v-icon>
|
<v-icon> {{ $globals.icons.edit }} </v-icon>
|
||||||
</v-btn>
|
</v-btn>
|
||||||
</template>
|
</template>
|
||||||
<span>{{ $t("general.edit") }}</span>
|
<span>{{ $t("general.edit") }}</span>
|
||||||
</v-tooltip>
|
</v-tooltip>
|
||||||
<ContextMenu
|
<ContextMenu
|
||||||
|
show-print
|
||||||
:menu-top="false"
|
:menu-top="false"
|
||||||
:slug="slug"
|
:slug="slug"
|
||||||
:name="name"
|
:name="name"
|
||||||
@@ -56,13 +67,15 @@
|
|||||||
<script>
|
<script>
|
||||||
import ConfirmationDialog from "@/components/UI/Dialogs/ConfirmationDialog.vue";
|
import ConfirmationDialog from "@/components/UI/Dialogs/ConfirmationDialog.vue";
|
||||||
import ContextMenu from "@/components/Recipe/ContextMenu.vue";
|
import ContextMenu from "@/components/Recipe/ContextMenu.vue";
|
||||||
|
import FavoriteBadge from "@/components/Recipe/FavoriteBadge.vue";
|
||||||
|
|
||||||
const SAVE_EVENT = "save";
|
const SAVE_EVENT = "save";
|
||||||
const DELETE_EVENT = "delete";
|
const DELETE_EVENT = "delete";
|
||||||
const CLOSE_EVENT = "close";
|
const CLOSE_EVENT = "close";
|
||||||
const JSON_EVENT = "json";
|
const JSON_EVENT = "json";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: { ConfirmationDialog, ContextMenu },
|
components: { ConfirmationDialog, ContextMenu, FavoriteBadge },
|
||||||
props: {
|
props: {
|
||||||
slug: {
|
slug: {
|
||||||
type: String,
|
type: String,
|
||||||
@@ -74,6 +87,10 @@ export default {
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
|
loggedIn: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -120,7 +137,6 @@ export default {
|
|||||||
break;
|
break;
|
||||||
case SAVE_EVENT:
|
case SAVE_EVENT:
|
||||||
this.$emit(SAVE_EVENT);
|
this.$emit(SAVE_EVENT);
|
||||||
this.$emit("input", false);
|
|
||||||
break;
|
break;
|
||||||
case JSON_EVENT:
|
case JSON_EVENT:
|
||||||
this.$emit(JSON_EVENT);
|
this.$emit(JSON_EVENT);
|
||||||
|
|||||||
@@ -58,8 +58,10 @@ export default {
|
|||||||
let formData = new FormData();
|
let formData = new FormData();
|
||||||
formData.append(this.fileName, this.file);
|
formData.append(this.fileName, this.file);
|
||||||
|
|
||||||
if (await api.utils.uploadFile(this.url, formData)) {
|
const response = await api.utils.uploadFile(this.url, formData);
|
||||||
this.$emit(UPLOAD_EVENT);
|
|
||||||
|
if (response) {
|
||||||
|
this.$emit(UPLOAD_EVENT, response);
|
||||||
}
|
}
|
||||||
this.isSelecting = false;
|
this.isSelecting = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
<template v-slot:activator="{ on, attrs }">
|
<template v-slot:activator="{ on, attrs }">
|
||||||
<v-btn text :icon="$vuetify.breakpoint.xsOnly" v-bind="attrs" v-on="on" :loading="sortLoading">
|
<v-btn text :icon="$vuetify.breakpoint.xsOnly" v-bind="attrs" v-on="on" :loading="sortLoading">
|
||||||
<v-icon :left="!$vuetify.breakpoint.xsOnly">
|
<v-icon :left="!$vuetify.breakpoint.xsOnly">
|
||||||
{{ $globals.icons.diceMultiple }}
|
{{ $globals.icons.sort }}
|
||||||
</v-icon>
|
</v-icon>
|
||||||
{{ $vuetify.breakpoint.xsOnly ? null : $t("general.sort") }}
|
{{ $vuetify.breakpoint.xsOnly ? null : $t("general.sort") }}
|
||||||
</v-btn>
|
</v-btn>
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ export default {
|
|||||||
} else return this.$t("settings.backup.partial-backup");
|
} else return this.$t("settings.backup.partial-backup");
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
created() {
|
||||||
this.resetData();
|
this.resetData();
|
||||||
this.getAvailableBackups();
|
this.getAvailableBackups();
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import i18n from "@/i18n";
|
import i18n from "@/i18n.js";
|
||||||
export default {
|
export default {
|
||||||
props: {
|
props: {
|
||||||
color: {
|
color: {
|
||||||
@@ -65,12 +65,14 @@ export default {
|
|||||||
},
|
},
|
||||||
top: {
|
top: {
|
||||||
default: null,
|
default: null,
|
||||||
|
type: Boolean,
|
||||||
},
|
},
|
||||||
submitText: {
|
submitText: {
|
||||||
default: () => i18n.t("general.create"),
|
default: () => i18n.t("general.create"),
|
||||||
},
|
},
|
||||||
keepOpen: {
|
keepOpen: {
|
||||||
default: false,
|
default: false,
|
||||||
|
type: Boolean,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@@ -101,16 +103,17 @@ export default {
|
|||||||
this.$emit("submit");
|
this.$emit("submit");
|
||||||
this.submitted = true;
|
this.submitted = true;
|
||||||
},
|
},
|
||||||
|
deleteEvent() {
|
||||||
|
this.$emit("delete");
|
||||||
|
this.submitted = true;
|
||||||
|
},
|
||||||
open() {
|
open() {
|
||||||
|
console.log("Open Dialog");
|
||||||
this.dialog = true;
|
this.dialog = true;
|
||||||
},
|
},
|
||||||
close() {
|
close() {
|
||||||
this.dialog = false;
|
this.dialog = false;
|
||||||
},
|
},
|
||||||
deleteEvent() {
|
|
||||||
this.$emit("delete");
|
|
||||||
this.submitted = true;
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -136,16 +136,18 @@ export default {
|
|||||||
this.$emit(SELECTED_EVENT, recipe);
|
this.$emit(SELECTED_EVENT, recipe);
|
||||||
},
|
},
|
||||||
onUpDown(e) {
|
onUpDown(e) {
|
||||||
if (e.keyCode === 38) {
|
if (this.dialog) {
|
||||||
e.preventDefault();
|
if (e.keyCode === 38) {
|
||||||
this.selectedIndex--;
|
e.preventDefault();
|
||||||
} else if (e.keyCode === 40) {
|
this.selectedIndex--;
|
||||||
e.preventDefault();
|
} else if (e.keyCode === 40) {
|
||||||
this.selectedIndex++;
|
e.preventDefault();
|
||||||
} else {
|
this.selectedIndex++;
|
||||||
return;
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.selectRecipe();
|
||||||
}
|
}
|
||||||
this.selectRecipe();
|
|
||||||
},
|
},
|
||||||
resetSelected() {
|
resetSelected() {
|
||||||
this.searchString = "";
|
this.searchString = "";
|
||||||
@@ -169,4 +171,4 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style >
|
<style >
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -7,14 +7,14 @@
|
|||||||
</v-icon>
|
</v-icon>
|
||||||
<div v-if="large" class="text-small">
|
<div v-if="large" class="text-small">
|
||||||
<slot>
|
<slot>
|
||||||
{{ small ? "" : "Loading Recipes" }}
|
{{ small ? "" : waitingText }}
|
||||||
</slot>
|
</slot>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</v-progress-circular>
|
</v-progress-circular>
|
||||||
<div v-if="!large" class="text-small">
|
<div v-if="!large" class="text-small">
|
||||||
<slot>
|
<slot>
|
||||||
{{ small ? "" : "Loading Recipes" }}
|
{{ small ? "" : waitingText }}
|
||||||
</slot>
|
</slot>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -60,6 +60,9 @@ export default {
|
|||||||
size: 125,
|
size: 125,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
waitingText() {
|
||||||
|
return this.$t("general.loading-recipes");
|
||||||
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -44,13 +44,13 @@
|
|||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noreferrer nofollow"
|
rel="noreferrer nofollow"
|
||||||
>
|
>
|
||||||
Google ld+json Info
|
{{ $t('new-recipe.google-ld-json-info') }}
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/hay-kot/mealie/issues" target="_blank" rel="noreferrer nofollow">
|
<a href="https://github.com/hay-kot/mealie/issues" target="_blank" rel="noreferrer nofollow">
|
||||||
GitHub Issues
|
{{ $t('new-recipe.github-issues') }}
|
||||||
</a>
|
</a>
|
||||||
<a href="https://schema.org/Recipe" target="_blank" rel="noreferrer nofollow">
|
<a href="https://schema.org/Recipe" target="_blank" rel="noreferrer nofollow">
|
||||||
Recipe Markup Specification
|
{{ $t('new-recipe.recipe-markup-specification') }}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex justify-end">
|
<div class="d-flex justify-end">
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
@click="addRecipe = false"
|
@click="addRecipe = false"
|
||||||
>
|
>
|
||||||
<v-icon left> {{ $globals.icons.externalLink }} </v-icon>
|
<v-icon left> {{ $globals.icons.externalLink }} </v-icon>
|
||||||
View Scraped Data
|
{{ $t('new-recipe.view-scraped-data') }}
|
||||||
</v-btn>
|
</v-btn>
|
||||||
</div>
|
</div>
|
||||||
</v-alert>
|
</v-alert>
|
||||||
@@ -84,6 +84,26 @@
|
|||||||
</v-form>
|
</v-form>
|
||||||
</v-card>
|
</v-card>
|
||||||
</v-dialog>
|
</v-dialog>
|
||||||
|
<BaseDialog
|
||||||
|
:title="$t('new-recipe.upload-a-recipe')"
|
||||||
|
:titleIcon="$globals.icons.zip"
|
||||||
|
:submit-text="$t('general.import')"
|
||||||
|
ref="uploadZipDialog"
|
||||||
|
@submit="uploadZip"
|
||||||
|
:loading="processing"
|
||||||
|
>
|
||||||
|
<v-card-text class="mt-1 pb-0">
|
||||||
|
{{ $t("new-recipe.upload-individual-zip-file") }}
|
||||||
|
|
||||||
|
<div class="headline mx-auto mb-0 pb-0 text-center">
|
||||||
|
{{ this.fileName }}
|
||||||
|
</div>
|
||||||
|
</v-card-text>
|
||||||
|
|
||||||
|
<v-card-actions>
|
||||||
|
<TheUploadBtn class="mx-auto" :text-btn="false" @uploaded="setFile" :post="false"> </TheUploadBtn>
|
||||||
|
</v-card-actions>
|
||||||
|
</BaseDialog>
|
||||||
<v-speed-dial v-model="fab" :open-on-hover="absolute" :fixed="absolute" :bottom="absolute" :right="absolute">
|
<v-speed-dial v-model="fab" :open-on-hover="absolute" :fixed="absolute" :bottom="absolute" :right="absolute">
|
||||||
<template v-slot:activator>
|
<template v-slot:activator>
|
||||||
<v-btn v-model="fab" :color="absolute ? 'accent' : 'white'" dark :icon="!absolute" :fab="absolute">
|
<v-btn v-model="fab" :color="absolute ? 'accent' : 'white'" dark :icon="!absolute" :fab="absolute">
|
||||||
@@ -106,13 +126,27 @@
|
|||||||
</template>
|
</template>
|
||||||
<span>{{ $t("general.new") }}</span>
|
<span>{{ $t("general.new") }}</span>
|
||||||
</v-tooltip>
|
</v-tooltip>
|
||||||
|
<v-tooltip left dark color="info">
|
||||||
|
<template v-slot:activator="{ on, attrs }">
|
||||||
|
<v-btn fab dark small color="info" v-bind="attrs" v-on="on" @click="openZipUploader">
|
||||||
|
<v-icon>{{ $globals.icons.zip }}</v-icon>
|
||||||
|
</v-btn>
|
||||||
|
</template>
|
||||||
|
<span>{{ $t("general.upload") }}</span>
|
||||||
|
</v-tooltip>
|
||||||
</v-speed-dial>
|
</v-speed-dial>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { api } from "@/api";
|
import { api } from "@/api";
|
||||||
|
import TheUploadBtn from "@/components/UI/Buttons/TheUploadBtn.vue";
|
||||||
|
import BaseDialog from "@/components/UI/Dialogs/BaseDialog.vue";
|
||||||
export default {
|
export default {
|
||||||
|
components: {
|
||||||
|
TheUploadBtn,
|
||||||
|
BaseDialog,
|
||||||
|
},
|
||||||
props: {
|
props: {
|
||||||
absolute: {
|
absolute: {
|
||||||
default: false,
|
default: false,
|
||||||
@@ -124,14 +158,20 @@ export default {
|
|||||||
fab: false,
|
fab: false,
|
||||||
addRecipe: false,
|
addRecipe: false,
|
||||||
processing: false,
|
processing: false,
|
||||||
|
uploadData: {
|
||||||
|
fileName: "archive",
|
||||||
|
file: null,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
mounted() {
|
mounted() {
|
||||||
if (this.$route.query.recipe_import_url) {
|
this.$router.onReady(() => {
|
||||||
this.addRecipe = true;
|
if (this.$route.query.recipe_import_url) {
|
||||||
this.createRecipe();
|
this.addRecipe = true;
|
||||||
}
|
this.createRecipe();
|
||||||
|
}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
@@ -143,9 +183,34 @@ export default {
|
|||||||
return this.$route.query.recipe_import_url || "";
|
return this.$route.query.recipe_import_url || "";
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
fileName() {
|
||||||
|
return this.uploadData.file?.name || "";
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
resetVars() {
|
||||||
|
this.uploadData = {
|
||||||
|
fileName: "archive",
|
||||||
|
file: null,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
setFile(file) {
|
||||||
|
this.uploadData.file = file;
|
||||||
|
console.log("Uploaded");
|
||||||
|
},
|
||||||
|
openZipUploader() {
|
||||||
|
this.resetVars();
|
||||||
|
this.$refs.uploadZipDialog.open();
|
||||||
|
},
|
||||||
|
async uploadZip() {
|
||||||
|
let formData = new FormData();
|
||||||
|
formData.append(this.uploadData.fileName, this.uploadData.file);
|
||||||
|
|
||||||
|
const response = await api.utils.uploadFile("/api/recipes/create-from-zip", formData);
|
||||||
|
|
||||||
|
this.$router.push(`/recipe/${response.data.slug}`);
|
||||||
|
},
|
||||||
async createRecipe() {
|
async createRecipe() {
|
||||||
this.error = false;
|
this.error = false;
|
||||||
if (this.$refs.urlForm === undefined || this.$refs.urlForm.validate()) {
|
if (this.$refs.urlForm === undefined || this.$refs.urlForm.validate()) {
|
||||||
@@ -161,7 +226,6 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
reset() {
|
reset() {
|
||||||
this.fab = false;
|
this.fab = false;
|
||||||
this.error = false;
|
this.error = false;
|
||||||
@@ -171,11 +235,7 @@ export default {
|
|||||||
},
|
},
|
||||||
isValidWebUrl(url) {
|
isValidWebUrl(url) {
|
||||||
let regEx = /^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,256}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/gm;
|
let regEx = /^https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,256}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/gm;
|
||||||
return regEx.test(url) ? true : "Must be a Valid URL";
|
return regEx.test(url) ? true : this.$t('new-recipe.must-be-a-valid-url');
|
||||||
},
|
|
||||||
|
|
||||||
bookmark() {
|
|
||||||
return `javascript:(function()%7Bvar url %3D document.URL %3B%0Avar mealie %3D "http%3A%2F%2Flocalhost%3A8080%2F%23"%0Avar dest %3D mealie %2B "%2F%3Frecipe_import_url%3D" %2B url%0Awindow.open(dest%2C '_blank')%7D)()%3B`;
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -78,15 +78,21 @@ export default {
|
|||||||
hideImage: false,
|
hideImage: false,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
mounted() {
|
created() {
|
||||||
this.getVersion();
|
|
||||||
|
|
||||||
this.showSidebar = !this.isMobile;
|
this.showSidebar = !this.isMobile;
|
||||||
},
|
},
|
||||||
|
|
||||||
watch: {
|
watch: {
|
||||||
user() {
|
user() {
|
||||||
this.hideImage = false;
|
this.hideImage = false;
|
||||||
},
|
},
|
||||||
|
isMain(val) {
|
||||||
|
if (val) {
|
||||||
|
this.$store.dispatch("requestCustomPages");
|
||||||
|
} else {
|
||||||
|
this.getVersion();
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
computed: {
|
computed: {
|
||||||
@@ -101,27 +107,27 @@ export default {
|
|||||||
{
|
{
|
||||||
icon: this.$globals.icons.home,
|
icon: this.$globals.icons.home,
|
||||||
to: "/",
|
to: "/",
|
||||||
title: this.$t("page.home-page"),
|
title: this.$t("sidebar.home-page"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: this.$globals.icons.search,
|
icon: this.$globals.icons.search,
|
||||||
to: "/search",
|
to: "/search",
|
||||||
title: this.$t("search.search"),
|
title: this.$t("sidebar.search"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: this.$globals.icons.viewModule,
|
icon: this.$globals.icons.viewModule,
|
||||||
to: "/recipes/all",
|
to: "/recipes/all",
|
||||||
title: this.$t("page.all-recipes"),
|
title: this.$t("sidebar.all-recipes"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: this.$globals.icons.tags,
|
icon: this.$globals.icons.tags,
|
||||||
to: "/recipes/category",
|
to: "/recipes/category",
|
||||||
title: this.$t("recipe.categories"),
|
title: this.$t("sidebar.categories"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: this.$globals.icons.tags,
|
icon: this.$globals.icons.tags,
|
||||||
to: "/recipes/tag",
|
to: "/recipes/tag",
|
||||||
title: this.$t("tag.tags"),
|
title: this.$t("sidebar.tags"),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
@@ -145,7 +151,7 @@ export default {
|
|||||||
{
|
{
|
||||||
icon: this.$globals.icons.user,
|
icon: this.$globals.icons.user,
|
||||||
to: "/admin/profile",
|
to: "/admin/profile",
|
||||||
title: this.$t("settings.profile"),
|
title: this.$t("sidebar.profile"),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
@@ -154,27 +160,27 @@ export default {
|
|||||||
{
|
{
|
||||||
icon: this.$globals.icons.viewDashboard,
|
icon: this.$globals.icons.viewDashboard,
|
||||||
to: "/admin/dashboard",
|
to: "/admin/dashboard",
|
||||||
title: this.$t("general.dashboard"),
|
title: this.$t("sidebar.dashboard"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: this.$globals.icons.cog,
|
icon: this.$globals.icons.cog,
|
||||||
to: "/admin/settings",
|
to: "/admin/settings",
|
||||||
title: this.$t("settings.site-settings"),
|
title: this.$t("sidebar.site-settings"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: this.$globals.icons.tools,
|
icon: this.$globals.icons.tools,
|
||||||
to: "/admin/toolbox",
|
to: "/admin/toolbox",
|
||||||
title: this.$t("settings.toolbox.toolbox"),
|
title: this.$t("sidebar.toolbox"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: this.$globals.icons.group,
|
icon: this.$globals.icons.group,
|
||||||
to: "/admin/manage-users",
|
to: "/admin/manage-users",
|
||||||
title: this.$t("user.manage-users"),
|
title: this.$t("sidebar.manage-users"),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: this.$globals.icons.import,
|
icon: this.$globals.icons.import,
|
||||||
to: "/admin/migrations",
|
to: "/admin/migrations",
|
||||||
title: this.$t("settings.migrations"),
|
title: this.$t("sidebar.migrations"),
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,33 +1,38 @@
|
|||||||
import Vue from "vue";
|
import Vue from "vue";
|
||||||
import VueI18n from "vue-i18n";
|
import VueI18n from "vue-i18n";
|
||||||
|
import Vuetify from "@/plugins/vuetify";
|
||||||
|
import axios from 'axios';
|
||||||
|
|
||||||
Vue.use(VueI18n);
|
Vue.use(VueI18n);
|
||||||
|
|
||||||
function parseLocaleFiles(locales) {
|
const i18n = new VueI18n();
|
||||||
const messages = {};
|
|
||||||
locales.keys().forEach(key => {
|
export default i18n;
|
||||||
const matched = key.match(/([A-Za-z0-9-_]+)\./i);
|
|
||||||
if (matched && matched.length > 1) {
|
const loadedLanguages = [];
|
||||||
const locale = matched[1];
|
|
||||||
messages[locale] = locales(key);
|
function setI18nLanguage (lang) {
|
||||||
}
|
i18n.locale = lang;
|
||||||
});
|
Vuetify.framework.lang.current = lang;
|
||||||
return messages;
|
axios.defaults.headers.common['Accept-Language'] = lang
|
||||||
|
document.querySelector('html').setAttribute('lang', lang)
|
||||||
|
return lang
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadLocaleMessages() {
|
export function loadLanguageAsync(lang) {
|
||||||
const locales = require.context("./locales/messages", true, /[A-Za-z0-9-_,\s]+\.json$/i);
|
|
||||||
return parseLocaleFiles(locales);
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadDateTimeFormats() {
|
if ( ! loadedLanguages.includes(lang)) {
|
||||||
const locales = require.context("./locales/dateTimeFormats", true, /[A-Za-z0-9-_,\s]+\.json$/i);
|
const messages = import(`./locales/messages/${lang}.json`);
|
||||||
return parseLocaleFiles(locales);
|
const dateTimeFormats = import(`./locales/dateTimeFormats/${lang}.json`);
|
||||||
}
|
|
||||||
|
return Promise.all([messages, dateTimeFormats]).then(
|
||||||
export default new VueI18n({
|
values => {
|
||||||
locale: "en-US",
|
i18n.setLocaleMessage(lang, values[0].default)
|
||||||
fallbackLocale: process.env.VUE_APP_I18N_FALLBACK_LOCALE || "en-US",
|
i18n.setDateTimeFormat(lang, values[1].default)
|
||||||
messages: loadLocaleMessages(),
|
loadedLanguages.push(lang)
|
||||||
dateTimeFormats: loadDateTimeFormats(),
|
return setI18nLanguage(lang)
|
||||||
});
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return Promise.resolve(setI18nLanguage(lang))
|
||||||
|
}
|
||||||
21
frontend/src/locales/dateTimeFormats/en-GB.json
Normal file
21
frontend/src/locales/dateTimeFormats/en-GB.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"short": {
|
||||||
|
"month": "short",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long"
|
||||||
|
},
|
||||||
|
"medium": {
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"year": "numeric"
|
||||||
|
},
|
||||||
|
"long": {
|
||||||
|
"year": "numeric",
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"hour": "numeric",
|
||||||
|
"minute": "numeric"
|
||||||
|
}
|
||||||
|
}
|
||||||
21
frontend/src/locales/dateTimeFormats/fr-CA.json
Normal file
21
frontend/src/locales/dateTimeFormats/fr-CA.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"short": {
|
||||||
|
"month": "short",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long"
|
||||||
|
},
|
||||||
|
"medium": {
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"year": "numeric"
|
||||||
|
},
|
||||||
|
"long": {
|
||||||
|
"year": "numeric",
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"hour": "numeric",
|
||||||
|
"minute": "numeric"
|
||||||
|
}
|
||||||
|
}
|
||||||
21
frontend/src/locales/dateTimeFormats/sk-SK.json
Normal file
21
frontend/src/locales/dateTimeFormats/sk-SK.json
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"short": {
|
||||||
|
"month": "short",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long"
|
||||||
|
},
|
||||||
|
"medium": {
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"year": "numeric"
|
||||||
|
},
|
||||||
|
"long": {
|
||||||
|
"year": "numeric",
|
||||||
|
"month": "long",
|
||||||
|
"day": "numeric",
|
||||||
|
"weekday": "long",
|
||||||
|
"hour": "numeric",
|
||||||
|
"minute": "numeric"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,4 @@
|
|||||||
{
|
{
|
||||||
"404": {
|
|
||||||
"page-not-found": "404 Page Not Found",
|
|
||||||
"take-me-home": "Take me Home"
|
|
||||||
},
|
|
||||||
"about": {
|
"about": {
|
||||||
"about": "About",
|
"about": "About",
|
||||||
"about-mealie": "About Mealie",
|
"about-mealie": "About Mealie",
|
||||||
@@ -26,8 +22,17 @@
|
|||||||
"support": "Support",
|
"support": "Support",
|
||||||
"version": "Version"
|
"version": "Version"
|
||||||
},
|
},
|
||||||
|
"asset": {
|
||||||
|
"assets": "Assets",
|
||||||
|
"code": "Code",
|
||||||
|
"file": "File",
|
||||||
|
"image": "Image",
|
||||||
|
"new-asset": "New Asset",
|
||||||
|
"pdf": "PDF",
|
||||||
|
"recipe": "Recipe",
|
||||||
|
"show-assets": "Show Assets"
|
||||||
|
},
|
||||||
"category": {
|
"category": {
|
||||||
"category": "Category",
|
|
||||||
"category-created": "Category created",
|
"category-created": "Category created",
|
||||||
"category-creation-failed": "Category creation failed",
|
"category-creation-failed": "Category creation failed",
|
||||||
"category-deleted": "Category Deleted",
|
"category-deleted": "Category Deleted",
|
||||||
@@ -40,17 +45,17 @@
|
|||||||
"events": {
|
"events": {
|
||||||
"apprise-url": "Apprise URL",
|
"apprise-url": "Apprise URL",
|
||||||
"database": "Database",
|
"database": "Database",
|
||||||
|
"delete-event": "Delete Event",
|
||||||
"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-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",
|
"notification": "Notification",
|
||||||
|
"refresh": "Refresh",
|
||||||
"scheduled": "Scheduled",
|
"scheduled": "Scheduled",
|
||||||
"something-went-wrong": "Something Went Wrong!",
|
"something-went-wrong": "Something Went Wrong!",
|
||||||
"subscribed-events": "Subscribed Events",
|
"subscribed-events": "Subscribed Events",
|
||||||
"test-message-sent": "Test Message Sent",
|
"test-message-sent": "Test Message Sent"
|
||||||
"refresh": "Refresh",
|
|
||||||
"new-version": "New version available!"
|
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"apply": "Apply",
|
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"clear": "Clear",
|
"clear": "Clear",
|
||||||
"close": "Close",
|
"close": "Close",
|
||||||
@@ -59,7 +64,6 @@
|
|||||||
"copied": "Copied",
|
"copied": "Copied",
|
||||||
"create": "Create",
|
"create": "Create",
|
||||||
"created": "Created",
|
"created": "Created",
|
||||||
"current-parenthesis": "(Current)",
|
|
||||||
"custom": "Custom",
|
"custom": "Custom",
|
||||||
"dashboard": "Dashboard",
|
"dashboard": "Dashboard",
|
||||||
"delete": "Delete",
|
"delete": "Delete",
|
||||||
@@ -78,18 +82,19 @@
|
|||||||
"friday": "Friday",
|
"friday": "Friday",
|
||||||
"general": "General",
|
"general": "General",
|
||||||
"get": "Get",
|
"get": "Get",
|
||||||
|
"home": "Home",
|
||||||
"image": "Image",
|
"image": "Image",
|
||||||
"image-upload-failed": "Image upload failed",
|
"image-upload-failed": "Image upload failed",
|
||||||
"import": "Import",
|
"import": "Import",
|
||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Keyword",
|
"keyword": "Keyword",
|
||||||
"link": "Link",
|
|
||||||
"link-copied": "Link Copied",
|
"link-copied": "Link Copied",
|
||||||
|
"loading-recipes": "Loading Recipes",
|
||||||
"monday": "Monday",
|
"monday": "Monday",
|
||||||
"more": "More",
|
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"new": "New",
|
"new": "New",
|
||||||
"no": "No",
|
"no": "No",
|
||||||
|
"no-recipe-found": "No Recipe Found",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"options": "Options:",
|
"options": "Options:",
|
||||||
"print": "Print",
|
"print": "Print",
|
||||||
@@ -139,8 +144,8 @@
|
|||||||
"group-id-with-value": "Group ID: {groupID}",
|
"group-id-with-value": "Group ID: {groupID}",
|
||||||
"group-name": "Group Name",
|
"group-name": "Group Name",
|
||||||
"group-not-found": "Group not found",
|
"group-not-found": "Group not found",
|
||||||
|
"group-with-value": "Group: {groupID}",
|
||||||
"groups": "Groups",
|
"groups": "Groups",
|
||||||
"groups-can-only-be-set-by-administrators": "Groups can only be set by administrators",
|
|
||||||
"manage-groups": "Manage Groups",
|
"manage-groups": "Manage Groups",
|
||||||
"user-group": "User Group",
|
"user-group": "User Group",
|
||||||
"user-group-created": "User Group Created",
|
"user-group-created": "User Group Created",
|
||||||
@@ -192,13 +197,20 @@
|
|||||||
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
||||||
"error-title": "Looks Like We Couldn't Find Anything",
|
"error-title": "Looks Like We Couldn't Find Anything",
|
||||||
"from-url": "Import a Recipe",
|
"from-url": "Import a Recipe",
|
||||||
|
"github-issues": "GitHub Issues",
|
||||||
|
"google-ld-json-info": "Google ld+json Info",
|
||||||
|
"must-be-a-valid-url": "Must be a Valid URL",
|
||||||
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
|
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
|
||||||
|
"recipe-markup-specification": "Recipe Markup Specification",
|
||||||
"recipe-url": "Recipe URL",
|
"recipe-url": "Recipe URL",
|
||||||
"url-form-hint": "Copy and paste a link from your favorite recipe website"
|
"upload-a-recipe": "Upload a Recipe",
|
||||||
|
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
|
||||||
|
"url-form-hint": "Copy and paste a link from your favorite recipe website",
|
||||||
|
"view-scraped-data": "View Scraped Data"
|
||||||
},
|
},
|
||||||
"page": {
|
"page": {
|
||||||
|
"404-page-not-found": "404 Page not found",
|
||||||
"all-recipes": "All Recipes",
|
"all-recipes": "All Recipes",
|
||||||
"home-page": "Home Page",
|
|
||||||
"new-page-created": "New page created",
|
"new-page-created": "New page created",
|
||||||
"page": "Page",
|
"page": "Page",
|
||||||
"page-creation-failed": "Page creation failed",
|
"page-creation-failed": "Page creation failed",
|
||||||
@@ -207,14 +219,12 @@
|
|||||||
"page-update-failed": "Page update failed",
|
"page-update-failed": "Page update failed",
|
||||||
"page-updated": "Page updated",
|
"page-updated": "Page updated",
|
||||||
"pages-update-failed": "Pages update failed",
|
"pages-update-failed": "Pages update failed",
|
||||||
"pages-updated": "Pages updated",
|
"pages-updated": "Pages updated"
|
||||||
"recent": "Recent"
|
|
||||||
},
|
},
|
||||||
"recipe": {
|
"recipe": {
|
||||||
"add-key": "Add Key",
|
"add-key": "Add Key",
|
||||||
"add-to-favorites": "Add to Favorites",
|
"add-to-favorites": "Add to Favorites",
|
||||||
"api-extras": "API Extras",
|
"api-extras": "API Extras",
|
||||||
"assets": "Assets",
|
|
||||||
"calories": "Calories",
|
"calories": "Calories",
|
||||||
"calories-suffix": "calories",
|
"calories-suffix": "calories",
|
||||||
"carbohydrate-content": "Carbohydrate",
|
"carbohydrate-content": "Carbohydrate",
|
||||||
@@ -236,11 +246,9 @@
|
|||||||
"key-name-required": "Key Name Required",
|
"key-name-required": "Key Name Required",
|
||||||
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
|
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
|
||||||
"milligrams": "milligrams",
|
"milligrams": "milligrams",
|
||||||
"new-asset": "New Asset",
|
|
||||||
"new-key-name": "New Key Name",
|
"new-key-name": "New Key Name",
|
||||||
"no-white-space-allowed": "No White Space Allowed",
|
"no-white-space-allowed": "No White Space Allowed",
|
||||||
"note": "Note",
|
"note": "Note",
|
||||||
"notes": "Notes",
|
|
||||||
"nutrition": "Nutrition",
|
"nutrition": "Nutrition",
|
||||||
"object-key": "Object Key",
|
"object-key": "Object Key",
|
||||||
"object-value": "Object Value",
|
"object-value": "Object Value",
|
||||||
@@ -260,18 +268,17 @@
|
|||||||
"recipe-updated": "Recipe updated",
|
"recipe-updated": "Recipe updated",
|
||||||
"remove-from-favorites": "Remove from Favorites",
|
"remove-from-favorites": "Remove from Favorites",
|
||||||
"remove-section": "Remove Section",
|
"remove-section": "Remove Section",
|
||||||
|
"save-recipe-before-use": "Save recipe before use",
|
||||||
"section-title": "Section Title",
|
"section-title": "Section Title",
|
||||||
"servings": "Servings",
|
"servings": "Servings",
|
||||||
"share-recipe-message": "I wanted to share my {0} recipe with you.",
|
"share-recipe-message": "I wanted to share my {0} recipe with you.",
|
||||||
"show-assets": "Show Assets",
|
|
||||||
"show-nutrition-values": "Show Nutrition Values",
|
"show-nutrition-values": "Show Nutrition Values",
|
||||||
"sodium-content": "Sodium",
|
"sodium-content": "Sodium",
|
||||||
"step-index": "Step: {step}",
|
"step-index": "Step: {step}",
|
||||||
"sugar-content": "Sugar",
|
"sugar-content": "Sugar",
|
||||||
"title": "Title",
|
"title": "Title",
|
||||||
"total-time": "Total Time",
|
"total-time": "Total Time",
|
||||||
"unable-to-delete-recipe": "Unable to Delete Recipe",
|
"unable-to-delete-recipe": "Unable to Delete Recipe"
|
||||||
"view-recipe": "View Recipe"
|
|
||||||
},
|
},
|
||||||
"reicpe": {
|
"reicpe": {
|
||||||
"no-recipe": "No Recipe"
|
"no-recipe": "No Recipe"
|
||||||
@@ -292,12 +299,12 @@
|
|||||||
"settings": {
|
"settings": {
|
||||||
"add-a-new-theme": "Add a New Theme",
|
"add-a-new-theme": "Add a New Theme",
|
||||||
"admin-settings": "Admin Settings",
|
"admin-settings": "Admin Settings",
|
||||||
"available-backups": "Available Backups",
|
|
||||||
"backup": {
|
"backup": {
|
||||||
"backup-created-at-response-export_path": "Backup Created at {path}",
|
"backup-created-at-response-export_path": "Backup Created at {path}",
|
||||||
"backup-deleted": "Backup deleted",
|
"backup-deleted": "Backup deleted",
|
||||||
"backup-tag": "Backup Tag",
|
"backup-tag": "Backup Tag",
|
||||||
"create-heading": "Create a Backup",
|
"create-heading": "Create a Backup",
|
||||||
|
"delete-backup": "Delete Backup",
|
||||||
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
|
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
|
||||||
"full-backup": "Full Backup",
|
"full-backup": "Full Backup",
|
||||||
"import-summary": "Import Summary",
|
"import-summary": "Import Summary",
|
||||||
@@ -305,7 +312,6 @@
|
|||||||
"unable-to-delete-backup": "Unable to Delete Backup."
|
"unable-to-delete-backup": "Unable to Delete Backup."
|
||||||
},
|
},
|
||||||
"backup-and-exports": "Backups",
|
"backup-and-exports": "Backups",
|
||||||
"backup-info": "Backups are exported in standard JSON format along with all the images stored on the file system. In your backup folder you'll find a .zip file that contains all of the recipe JSON and images from the database. Additionally, if you selected a markdown file, those will also be stored in the .zip file. To import a backup, it must be located in your backups folder. Automated backups are done each day at 3:00 AM.",
|
|
||||||
"change-password": "Change Password",
|
"change-password": "Change Password",
|
||||||
"current": "Version:",
|
"current": "Version:",
|
||||||
"custom-pages": "Custom Pages",
|
"custom-pages": "Custom Pages",
|
||||||
@@ -338,12 +344,8 @@
|
|||||||
"site-settings": "Site Settings",
|
"site-settings": "Site Settings",
|
||||||
"theme": {
|
"theme": {
|
||||||
"accent": "Accent",
|
"accent": "Accent",
|
||||||
"are-you-sure-you-want-to-delete-this-theme": "Are you sure you want to delete this theme?",
|
|
||||||
"choose-how-mealie-looks-to-you-set-your-theme-preference-to-follow-your-system-settings-or-choose-to-use-the-light-or-dark-theme": "Choose how Mealie looks to you. Set your theme preference to follow your system settings, or choose to use the light or dark theme.",
|
|
||||||
"dark": "Dark",
|
"dark": "Dark",
|
||||||
"dark-mode": "Dark Mode",
|
|
||||||
"default-to-system": "Default to system",
|
"default-to-system": "Default to system",
|
||||||
"delete-theme": "Delete Theme",
|
|
||||||
"error": "Error",
|
"error": "Error",
|
||||||
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
|
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
|
||||||
"error-deleting-theme": "Error deleting theme",
|
"error-deleting-theme": "Error deleting theme",
|
||||||
@@ -352,16 +354,13 @@
|
|||||||
"light": "Light",
|
"light": "Light",
|
||||||
"primary": "Primary",
|
"primary": "Primary",
|
||||||
"secondary": "Secondary",
|
"secondary": "Secondary",
|
||||||
"select-a-theme-from-the-dropdown-or-create-a-new-theme-note-that-the-default-theme-will-be-served-to-all-users-who-have-not-set-a-theme-preference": "Select a theme from the dropdown or create a new theme. Note that the default theme will be served to all users who have not set a theme preference.",
|
|
||||||
"success": "Success",
|
"success": "Success",
|
||||||
"switch-to-dark-mode": "Switch to dark mode",
|
"switch-to-dark-mode": "Switch to dark mode",
|
||||||
"switch-to-light-mode": "Switch to light mode",
|
"switch-to-light-mode": "Switch to light mode",
|
||||||
"theme": "Theme",
|
|
||||||
"theme-deleted": "Theme deleted",
|
"theme-deleted": "Theme deleted",
|
||||||
"theme-name": "Theme Name",
|
"theme-name": "Theme Name",
|
||||||
"theme-name-is-required": "Theme Name is required.",
|
"theme-name-is-required": "Theme Name is required.",
|
||||||
"theme-saved": "Theme Saved",
|
"theme-saved": "Theme Saved",
|
||||||
"theme-settings": "Theme Settings",
|
|
||||||
"theme-updated": "Theme updated",
|
"theme-updated": "Theme updated",
|
||||||
"warning": "Warning"
|
"warning": "Warning"
|
||||||
},
|
},
|
||||||
@@ -385,7 +384,6 @@
|
|||||||
"unorganized": "Unorganized"
|
"unorganized": "Unorganized"
|
||||||
},
|
},
|
||||||
"webhooks": {
|
"webhooks": {
|
||||||
"meal-planner-webhooks": "Meal Planner Webhooks",
|
|
||||||
"test-webhooks": "Test Webhooks",
|
"test-webhooks": "Test Webhooks",
|
||||||
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "The URLs listed below will receive webhooks containing the recipe data for the meal plan on it's scheduled day. Currently Webhooks will execute at",
|
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "The URLs listed below will receive webhooks containing the recipe data for the meal plan on it's scheduled day. Currently Webhooks will execute at",
|
||||||
"webhook-url": "Webhook URL",
|
"webhook-url": "Webhook URL",
|
||||||
@@ -402,8 +400,20 @@
|
|||||||
"shopping-list": "Shopping List",
|
"shopping-list": "Shopping List",
|
||||||
"shopping-lists": "Shopping Lists"
|
"shopping-lists": "Shopping Lists"
|
||||||
},
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"all-recipes": "All Recipes",
|
||||||
|
"categories": "Categories",
|
||||||
|
"dashboard": "Dashboard",
|
||||||
|
"home-page": "Home Page",
|
||||||
|
"manage-users": "Manage Users",
|
||||||
|
"migrations": "Migrations",
|
||||||
|
"profile": "Profile",
|
||||||
|
"search": "Search",
|
||||||
|
"site-settings": "Site Settings",
|
||||||
|
"tags": "Tags",
|
||||||
|
"toolbox": "Toolbox"
|
||||||
|
},
|
||||||
"signup": {
|
"signup": {
|
||||||
"display-name": "Display Name",
|
|
||||||
"error-signing-up": "Error Signing Up",
|
"error-signing-up": "Error Signing Up",
|
||||||
"sign-up": "Sign Up",
|
"sign-up": "Sign Up",
|
||||||
"sign-up-link-created": "Sign up link created",
|
"sign-up-link-created": "Sign up link created",
|
||||||
@@ -440,7 +450,6 @@
|
|||||||
"error-cannot-delete-super-user": "Error! Cannot Delete Super User",
|
"error-cannot-delete-super-user": "Error! Cannot Delete Super User",
|
||||||
"existing-password-does-not-match": "Existing password does not match",
|
"existing-password-does-not-match": "Existing password does not match",
|
||||||
"full-name": "Full Name",
|
"full-name": "Full Name",
|
||||||
"incorrect-username-or-password": "Incorrect username or password",
|
|
||||||
"link-id": "Link ID",
|
"link-id": "Link ID",
|
||||||
"link-name": "Link Name",
|
"link-name": "Link Name",
|
||||||
"login": "Login",
|
"login": "Login",
|
||||||
|
|||||||
@@ -1,56 +1,61 @@
|
|||||||
{
|
{
|
||||||
"404": {
|
|
||||||
"page-not-found": "404 Page Not Found",
|
|
||||||
"take-me-home": "Take me Home"
|
|
||||||
},
|
|
||||||
"about": {
|
"about": {
|
||||||
"about": "About",
|
"about": "حول",
|
||||||
"about-mealie": "About Mealie",
|
"about-mealie": "حول Mealie",
|
||||||
"api-docs": "API Docs",
|
"api-docs": "مستندات API",
|
||||||
"api-port": "API Port",
|
"api-port": "API Port",
|
||||||
"application-mode": "Application Mode",
|
"application-mode": "وضع التطبيق",
|
||||||
"database-type": "Database Type",
|
"database-type": "نوع قاعدة البيانات",
|
||||||
"database-url": "Database URL",
|
"database-url": "رابط قاعدة البيانات",
|
||||||
"default-group": "Default Group",
|
"default-group": "المجموعة الافتراضية",
|
||||||
"demo": "Demo",
|
"demo": "عرض تجريبي",
|
||||||
"demo-status": "Demo Status",
|
"demo-status": "حالة العرض تجريبي",
|
||||||
"development": "Development",
|
"development": "تطوير",
|
||||||
"docs": "Docs",
|
"docs": "المستندات",
|
||||||
"download-log": "Download Log",
|
"download-log": "تحميل السجل",
|
||||||
"download-recipe-json": "Last Scraped JSON",
|
"download-recipe-json": "Last Scraped JSON",
|
||||||
"github": "Github",
|
"github": "Github",
|
||||||
"log-lines": "Log Lines",
|
"log-lines": "Log Lines",
|
||||||
"not-demo": "Not Demo",
|
"not-demo": "ليس عرض تجريبي",
|
||||||
"portfolio": "Portfolio",
|
"portfolio": "Portfolio",
|
||||||
"production": "Production",
|
"production": "الإنتاج",
|
||||||
"support": "Support",
|
"support": "الدعم",
|
||||||
"version": "Version"
|
"version": "الإصدار"
|
||||||
|
},
|
||||||
|
"asset": {
|
||||||
|
"assets": "الأصول",
|
||||||
|
"code": "الكود",
|
||||||
|
"file": "ملف",
|
||||||
|
"image": "صورة",
|
||||||
|
"new-asset": "أصول جديدة",
|
||||||
|
"pdf": "PDF",
|
||||||
|
"recipe": "وصفة",
|
||||||
|
"show-assets": "إظهار الأصول"
|
||||||
},
|
},
|
||||||
"category": {
|
"category": {
|
||||||
"category": "Category",
|
"category-created": "تم انشاء الفئة",
|
||||||
"category-created": "Category created",
|
"category-creation-failed": "فشل إنشاء الفئة",
|
||||||
"category-creation-failed": "Category creation failed",
|
"category-deleted": "تم حذف الفئة",
|
||||||
"category-deleted": "Category Deleted",
|
"category-deletion-failed": "فشل حذف الفئة",
|
||||||
"category-deletion-failed": "Category deletion failed",
|
|
||||||
"category-filter": "Category Filter",
|
"category-filter": "Category Filter",
|
||||||
"category-update-failed": "Category update failed",
|
"category-update-failed": "فشل تحديث الفئة",
|
||||||
"category-updated": "Category updated",
|
"category-updated": "تم تحديث الفئة",
|
||||||
"uncategorized-count": "Uncategorized {count}"
|
"uncategorized-count": "Uncategorized {count}"
|
||||||
},
|
},
|
||||||
"events": {
|
"events": {
|
||||||
"apprise-url": "Apprise URL",
|
"apprise-url": "Apprise URL",
|
||||||
"database": "Database",
|
"database": "Database",
|
||||||
|
"delete-event": "Delete Event",
|
||||||
"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-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",
|
"notification": "Notification",
|
||||||
|
"refresh": "Refresh",
|
||||||
"scheduled": "Scheduled",
|
"scheduled": "Scheduled",
|
||||||
"something-went-wrong": "Something Went Wrong!",
|
"something-went-wrong": "Something Went Wrong!",
|
||||||
"subscribed-events": "Subscribed Events",
|
"subscribed-events": "Subscribed Events",
|
||||||
"test-message-sent": "Test Message Sent",
|
"test-message-sent": "Test Message Sent"
|
||||||
"refresh": "Refresh",
|
|
||||||
"new-version": "New version available!"
|
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"apply": "Apply",
|
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"clear": "Clear",
|
"clear": "Clear",
|
||||||
"close": "Close",
|
"close": "Close",
|
||||||
@@ -59,7 +64,6 @@
|
|||||||
"copied": "Copied",
|
"copied": "Copied",
|
||||||
"create": "Create",
|
"create": "Create",
|
||||||
"created": "Created",
|
"created": "Created",
|
||||||
"current-parenthesis": "(Current)",
|
|
||||||
"custom": "Custom",
|
"custom": "Custom",
|
||||||
"dashboard": "Dashboard",
|
"dashboard": "Dashboard",
|
||||||
"delete": "Delete",
|
"delete": "Delete",
|
||||||
@@ -78,18 +82,19 @@
|
|||||||
"friday": "Friday",
|
"friday": "Friday",
|
||||||
"general": "General",
|
"general": "General",
|
||||||
"get": "Get",
|
"get": "Get",
|
||||||
|
"home": "Home",
|
||||||
"image": "Image",
|
"image": "Image",
|
||||||
"image-upload-failed": "Image upload failed",
|
"image-upload-failed": "Image upload failed",
|
||||||
"import": "Import",
|
"import": "Import",
|
||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Keyword",
|
"keyword": "Keyword",
|
||||||
"link": "Link",
|
|
||||||
"link-copied": "Link Copied",
|
"link-copied": "Link Copied",
|
||||||
|
"loading-recipes": "Loading Recipes",
|
||||||
"monday": "Monday",
|
"monday": "Monday",
|
||||||
"more": "More",
|
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"new": "New",
|
"new": "New",
|
||||||
"no": "No",
|
"no": "No",
|
||||||
|
"no-recipe-found": "No Recipe Found",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"options": "Options:",
|
"options": "Options:",
|
||||||
"print": "Print",
|
"print": "Print",
|
||||||
@@ -139,8 +144,8 @@
|
|||||||
"group-id-with-value": "Group ID: {groupID}",
|
"group-id-with-value": "Group ID: {groupID}",
|
||||||
"group-name": "Group Name",
|
"group-name": "Group Name",
|
||||||
"group-not-found": "Group not found",
|
"group-not-found": "Group not found",
|
||||||
|
"group-with-value": "Group: {groupID}",
|
||||||
"groups": "Groups",
|
"groups": "Groups",
|
||||||
"groups-can-only-be-set-by-administrators": "Groups can only be set by administrators",
|
|
||||||
"manage-groups": "Manage Groups",
|
"manage-groups": "Manage Groups",
|
||||||
"user-group": "User Group",
|
"user-group": "User Group",
|
||||||
"user-group-created": "User Group Created",
|
"user-group-created": "User Group Created",
|
||||||
@@ -192,13 +197,20 @@
|
|||||||
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
||||||
"error-title": "Looks Like We Couldn't Find Anything",
|
"error-title": "Looks Like We Couldn't Find Anything",
|
||||||
"from-url": "Import a Recipe",
|
"from-url": "Import a Recipe",
|
||||||
|
"github-issues": "GitHub Issues",
|
||||||
|
"google-ld-json-info": "Google ld+json Info",
|
||||||
|
"must-be-a-valid-url": "Must be a Valid URL",
|
||||||
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
|
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
|
||||||
|
"recipe-markup-specification": "Recipe Markup Specification",
|
||||||
"recipe-url": "Recipe URL",
|
"recipe-url": "Recipe URL",
|
||||||
"url-form-hint": "Copy and paste a link from your favorite recipe website"
|
"upload-a-recipe": "Upload a Recipe",
|
||||||
|
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
|
||||||
|
"url-form-hint": "Copy and paste a link from your favorite recipe website",
|
||||||
|
"view-scraped-data": "View Scraped Data"
|
||||||
},
|
},
|
||||||
"page": {
|
"page": {
|
||||||
|
"404-page-not-found": "404 Page not found",
|
||||||
"all-recipes": "All Recipes",
|
"all-recipes": "All Recipes",
|
||||||
"home-page": "Home Page",
|
|
||||||
"new-page-created": "New page created",
|
"new-page-created": "New page created",
|
||||||
"page": "Page",
|
"page": "Page",
|
||||||
"page-creation-failed": "Page creation failed",
|
"page-creation-failed": "Page creation failed",
|
||||||
@@ -207,14 +219,12 @@
|
|||||||
"page-update-failed": "Page update failed",
|
"page-update-failed": "Page update failed",
|
||||||
"page-updated": "Page updated",
|
"page-updated": "Page updated",
|
||||||
"pages-update-failed": "Pages update failed",
|
"pages-update-failed": "Pages update failed",
|
||||||
"pages-updated": "Pages updated",
|
"pages-updated": "Pages updated"
|
||||||
"recent": "Recent"
|
|
||||||
},
|
},
|
||||||
"recipe": {
|
"recipe": {
|
||||||
"add-key": "Add Key",
|
"add-key": "Add Key",
|
||||||
"add-to-favorites": "Add to Favorites",
|
"add-to-favorites": "Add to Favorites",
|
||||||
"api-extras": "API Extras",
|
"api-extras": "API Extras",
|
||||||
"assets": "Assets",
|
|
||||||
"calories": "Calories",
|
"calories": "Calories",
|
||||||
"calories-suffix": "calories",
|
"calories-suffix": "calories",
|
||||||
"carbohydrate-content": "Carbohydrate",
|
"carbohydrate-content": "Carbohydrate",
|
||||||
@@ -236,11 +246,9 @@
|
|||||||
"key-name-required": "Key Name Required",
|
"key-name-required": "Key Name Required",
|
||||||
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
|
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
|
||||||
"milligrams": "milligrams",
|
"milligrams": "milligrams",
|
||||||
"new-asset": "New Asset",
|
|
||||||
"new-key-name": "New Key Name",
|
"new-key-name": "New Key Name",
|
||||||
"no-white-space-allowed": "No White Space Allowed",
|
"no-white-space-allowed": "No White Space Allowed",
|
||||||
"note": "Note",
|
"note": "Note",
|
||||||
"notes": "Notes",
|
|
||||||
"nutrition": "Nutrition",
|
"nutrition": "Nutrition",
|
||||||
"object-key": "Object Key",
|
"object-key": "Object Key",
|
||||||
"object-value": "Object Value",
|
"object-value": "Object Value",
|
||||||
@@ -260,18 +268,17 @@
|
|||||||
"recipe-updated": "Recipe updated",
|
"recipe-updated": "Recipe updated",
|
||||||
"remove-from-favorites": "Remove from Favorites",
|
"remove-from-favorites": "Remove from Favorites",
|
||||||
"remove-section": "Remove Section",
|
"remove-section": "Remove Section",
|
||||||
|
"save-recipe-before-use": "Save recipe before use",
|
||||||
"section-title": "Section Title",
|
"section-title": "Section Title",
|
||||||
"servings": "Servings",
|
"servings": "Servings",
|
||||||
"share-recipe-message": "I wanted to share my {0} recipe with you.",
|
"share-recipe-message": "I wanted to share my {0} recipe with you.",
|
||||||
"show-assets": "Show Assets",
|
|
||||||
"show-nutrition-values": "Show Nutrition Values",
|
"show-nutrition-values": "Show Nutrition Values",
|
||||||
"sodium-content": "Sodium",
|
"sodium-content": "Sodium",
|
||||||
"step-index": "Step: {step}",
|
"step-index": "Step: {step}",
|
||||||
"sugar-content": "Sugar",
|
"sugar-content": "Sugar",
|
||||||
"title": "Title",
|
"title": "Title",
|
||||||
"total-time": "Total Time",
|
"total-time": "Total Time",
|
||||||
"unable-to-delete-recipe": "Unable to Delete Recipe",
|
"unable-to-delete-recipe": "Unable to Delete Recipe"
|
||||||
"view-recipe": "View Recipe"
|
|
||||||
},
|
},
|
||||||
"reicpe": {
|
"reicpe": {
|
||||||
"no-recipe": "No Recipe"
|
"no-recipe": "No Recipe"
|
||||||
@@ -292,12 +299,12 @@
|
|||||||
"settings": {
|
"settings": {
|
||||||
"add-a-new-theme": "Add a New Theme",
|
"add-a-new-theme": "Add a New Theme",
|
||||||
"admin-settings": "Admin Settings",
|
"admin-settings": "Admin Settings",
|
||||||
"available-backups": "Available Backups",
|
|
||||||
"backup": {
|
"backup": {
|
||||||
"backup-created-at-response-export_path": "Backup Created at {path}",
|
"backup-created-at-response-export_path": "Backup Created at {path}",
|
||||||
"backup-deleted": "Backup deleted",
|
"backup-deleted": "Backup deleted",
|
||||||
"backup-tag": "Backup Tag",
|
"backup-tag": "Backup Tag",
|
||||||
"create-heading": "Create a Backup",
|
"create-heading": "Create a Backup",
|
||||||
|
"delete-backup": "Delete Backup",
|
||||||
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
|
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
|
||||||
"full-backup": "Full Backup",
|
"full-backup": "Full Backup",
|
||||||
"import-summary": "Import Summary",
|
"import-summary": "Import Summary",
|
||||||
@@ -305,7 +312,6 @@
|
|||||||
"unable-to-delete-backup": "Unable to Delete Backup."
|
"unable-to-delete-backup": "Unable to Delete Backup."
|
||||||
},
|
},
|
||||||
"backup-and-exports": "Backups",
|
"backup-and-exports": "Backups",
|
||||||
"backup-info": "Backups are exported in standard JSON format along with all the images stored on the file system. In your backup folder you'll find a .zip file that contains all of the recipe JSON and images from the database. Additionally, if you selected a markdown file, those will also be stored in the .zip file. To import a backup, it must be located in your backups folder. Automated backups are done each day at 3:00 AM.",
|
|
||||||
"change-password": "Change Password",
|
"change-password": "Change Password",
|
||||||
"current": "Version:",
|
"current": "Version:",
|
||||||
"custom-pages": "Custom Pages",
|
"custom-pages": "Custom Pages",
|
||||||
@@ -338,12 +344,8 @@
|
|||||||
"site-settings": "Site Settings",
|
"site-settings": "Site Settings",
|
||||||
"theme": {
|
"theme": {
|
||||||
"accent": "Accent",
|
"accent": "Accent",
|
||||||
"are-you-sure-you-want-to-delete-this-theme": "Are you sure you want to delete this theme?",
|
|
||||||
"choose-how-mealie-looks-to-you-set-your-theme-preference-to-follow-your-system-settings-or-choose-to-use-the-light-or-dark-theme": "Choose how Mealie looks to you. Set your theme preference to follow your system settings, or choose to use the light or dark theme.",
|
|
||||||
"dark": "Dark",
|
"dark": "Dark",
|
||||||
"dark-mode": "Dark Mode",
|
|
||||||
"default-to-system": "Default to system",
|
"default-to-system": "Default to system",
|
||||||
"delete-theme": "Delete Theme",
|
|
||||||
"error": "Error",
|
"error": "Error",
|
||||||
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
|
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
|
||||||
"error-deleting-theme": "Error deleting theme",
|
"error-deleting-theme": "Error deleting theme",
|
||||||
@@ -352,16 +354,13 @@
|
|||||||
"light": "Light",
|
"light": "Light",
|
||||||
"primary": "Primary",
|
"primary": "Primary",
|
||||||
"secondary": "Secondary",
|
"secondary": "Secondary",
|
||||||
"select-a-theme-from-the-dropdown-or-create-a-new-theme-note-that-the-default-theme-will-be-served-to-all-users-who-have-not-set-a-theme-preference": "Select a theme from the dropdown or create a new theme. Note that the default theme will be served to all users who have not set a theme preference.",
|
|
||||||
"success": "Success",
|
"success": "Success",
|
||||||
"switch-to-dark-mode": "Switch to dark mode",
|
"switch-to-dark-mode": "Switch to dark mode",
|
||||||
"switch-to-light-mode": "Switch to light mode",
|
"switch-to-light-mode": "Switch to light mode",
|
||||||
"theme": "Theme",
|
|
||||||
"theme-deleted": "Theme deleted",
|
"theme-deleted": "Theme deleted",
|
||||||
"theme-name": "Theme Name",
|
"theme-name": "Theme Name",
|
||||||
"theme-name-is-required": "Theme Name is required.",
|
"theme-name-is-required": "Theme Name is required.",
|
||||||
"theme-saved": "Theme Saved",
|
"theme-saved": "Theme Saved",
|
||||||
"theme-settings": "Theme Settings",
|
|
||||||
"theme-updated": "Theme updated",
|
"theme-updated": "Theme updated",
|
||||||
"warning": "Warning"
|
"warning": "Warning"
|
||||||
},
|
},
|
||||||
@@ -385,7 +384,6 @@
|
|||||||
"unorganized": "Unorganized"
|
"unorganized": "Unorganized"
|
||||||
},
|
},
|
||||||
"webhooks": {
|
"webhooks": {
|
||||||
"meal-planner-webhooks": "Meal Planner Webhooks",
|
|
||||||
"test-webhooks": "Test Webhooks",
|
"test-webhooks": "Test Webhooks",
|
||||||
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "The URLs listed below will receive webhooks containing the recipe data for the meal plan on it's scheduled day. Currently Webhooks will execute at",
|
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "The URLs listed below will receive webhooks containing the recipe data for the meal plan on it's scheduled day. Currently Webhooks will execute at",
|
||||||
"webhook-url": "Webhook URL",
|
"webhook-url": "Webhook URL",
|
||||||
@@ -402,8 +400,20 @@
|
|||||||
"shopping-list": "Shopping List",
|
"shopping-list": "Shopping List",
|
||||||
"shopping-lists": "Shopping Lists"
|
"shopping-lists": "Shopping Lists"
|
||||||
},
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"all-recipes": "All Recipes",
|
||||||
|
"categories": "Categories",
|
||||||
|
"dashboard": "Dashboard",
|
||||||
|
"home-page": "Home Page",
|
||||||
|
"manage-users": "Manage Users",
|
||||||
|
"migrations": "Migrations",
|
||||||
|
"profile": "Profile",
|
||||||
|
"search": "Search",
|
||||||
|
"site-settings": "Site Settings",
|
||||||
|
"tags": "Tags",
|
||||||
|
"toolbox": "Toolbox"
|
||||||
|
},
|
||||||
"signup": {
|
"signup": {
|
||||||
"display-name": "Display Name",
|
|
||||||
"error-signing-up": "Error Signing Up",
|
"error-signing-up": "Error Signing Up",
|
||||||
"sign-up": "Sign Up",
|
"sign-up": "Sign Up",
|
||||||
"sign-up-link-created": "Sign up link created",
|
"sign-up-link-created": "Sign up link created",
|
||||||
@@ -440,7 +450,6 @@
|
|||||||
"error-cannot-delete-super-user": "Error! Cannot Delete Super User",
|
"error-cannot-delete-super-user": "Error! Cannot Delete Super User",
|
||||||
"existing-password-does-not-match": "Existing password does not match",
|
"existing-password-does-not-match": "Existing password does not match",
|
||||||
"full-name": "Full Name",
|
"full-name": "Full Name",
|
||||||
"incorrect-username-or-password": "Incorrect username or password",
|
|
||||||
"link-id": "Link ID",
|
"link-id": "Link ID",
|
||||||
"link-name": "Link Name",
|
"link-name": "Link Name",
|
||||||
"login": "Login",
|
"login": "Login",
|
||||||
|
|||||||
@@ -1,480 +1,489 @@
|
|||||||
{
|
{
|
||||||
"404": {
|
|
||||||
"page-not-found": "404 No s'ha trobat la pàgina",
|
|
||||||
"take-me-home": "Take me Home"
|
|
||||||
},
|
|
||||||
"about": {
|
"about": {
|
||||||
"about": "About",
|
"about": "Quant a",
|
||||||
"about-mealie": "Quant a Mealie",
|
"about-mealie": "Quant a Mealie",
|
||||||
"api-docs": "Documentació de l'API",
|
"api-docs": "Documentació de l'API",
|
||||||
"api-port": "Port de l'API",
|
"api-port": "Port de l'API",
|
||||||
"application-mode": "Application Mode",
|
"application-mode": "Mode",
|
||||||
"database-type": "Database Type",
|
"database-type": "Tipus de base de dades",
|
||||||
"database-url": "Database URL",
|
"database-url": "URL del servidor de base de dades",
|
||||||
"default-group": "Default Group",
|
"default-group": "Grup per defecte",
|
||||||
"demo": "Demo",
|
"demo": "Demo",
|
||||||
"demo-status": "Demo Status",
|
"demo-status": "Estat",
|
||||||
"development": "Development",
|
"development": "Desenvolupament",
|
||||||
"docs": "Docs",
|
"docs": "Documentació",
|
||||||
"download-log": "Download Log",
|
"download-log": "Descarregueu el registre",
|
||||||
"download-recipe-json": "Last Scraped JSON",
|
"download-recipe-json": "Últim JSON recuperat",
|
||||||
"github": "Github",
|
"github": "Github",
|
||||||
"log-lines": "Log Lines",
|
"log-lines": "Registre Línies",
|
||||||
"not-demo": "Not Demo",
|
"not-demo": "No Demo",
|
||||||
"portfolio": "Portfolio",
|
"portfolio": "Projectes",
|
||||||
"production": "Production",
|
"production": "Producció",
|
||||||
"support": "Support",
|
"support": "Suport",
|
||||||
"version": "Version"
|
"version": "Versió"
|
||||||
|
},
|
||||||
|
"asset": {
|
||||||
|
"assets": "Adjunts",
|
||||||
|
"code": "Codi font",
|
||||||
|
"file": "Arxiu",
|
||||||
|
"image": "Imatge",
|
||||||
|
"new-asset": "Afegiu un adjunt",
|
||||||
|
"pdf": "PDF",
|
||||||
|
"recipe": "Recepta",
|
||||||
|
"show-assets": "Mostra els adjunts"
|
||||||
},
|
},
|
||||||
"category": {
|
"category": {
|
||||||
"category": "Category",
|
"category-created": "S'ha creat la categoria",
|
||||||
"category-created": "Category created",
|
"category-creation-failed": "S'ha produït un error al crear la categoria",
|
||||||
"category-creation-failed": "Category creation failed",
|
"category-deleted": "S'ha suprimit la categoria",
|
||||||
"category-deleted": "Category Deleted",
|
"category-deletion-failed": "S'ha produït un error al eliminar la categoria",
|
||||||
"category-deletion-failed": "Category deletion failed",
|
"category-filter": "Filtre per categoria",
|
||||||
"category-filter": "Category Filter",
|
"category-update-failed": "S'ha produït un error a l'actualitzar la categoria",
|
||||||
"category-update-failed": "Category update failed",
|
"category-updated": "S'ha actualitzat la categoria",
|
||||||
"category-updated": "Category updated",
|
"uncategorized-count": "{count} sense categoritzar"
|
||||||
"uncategorized-count": "Uncategorized {count}"
|
|
||||||
},
|
},
|
||||||
"events": {
|
"events": {
|
||||||
"apprise-url": "Apprise URL",
|
"apprise-url": "Apprise URL",
|
||||||
"database": "Database",
|
"database": "Base de Dades",
|
||||||
"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.",
|
"delete-event": "Suprimiu l'esdeveniment",
|
||||||
"notification": "Notification",
|
"new-notification-form-description": "Mealie utilitza la llibreria Apprise per a generar notificacions. Ofereix moltes opcions de serveis de notificació. A la seua wiki, disposeu de guies d'ús i informació per a crear l'URL al vostre servei. Si està disponible, al seleccionar el tipus de notificació, pot incloure funcions adicionals.",
|
||||||
"scheduled": "Scheduled",
|
"new-version": "Hi ha una nova versió disponible!",
|
||||||
"something-went-wrong": "Something Went Wrong!",
|
"notification": "Notificacions",
|
||||||
"subscribed-events": "Subscribed Events",
|
"refresh": "Recarrega",
|
||||||
"test-message-sent": "Test Message Sent",
|
"scheduled": "Programat",
|
||||||
"refresh": "Refresh",
|
"something-went-wrong": "Alguna cosa ha anat malament!",
|
||||||
"new-version": "New version available!"
|
"subscribed-events": "Esdeveniments subscrits",
|
||||||
|
"test-message-sent": "S'ha enviat el missatge"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"apply": "Apply",
|
"cancel": "Anuŀla",
|
||||||
"cancel": "Cancel",
|
"clear": "Neteja",
|
||||||
"clear": "Clear",
|
"close": "Tanca",
|
||||||
"close": "Close",
|
"confirm": "Confirma",
|
||||||
"confirm": "Confirm",
|
"confirm-delete-generic": "Esteu segur de voler suprimir-lo?",
|
||||||
"confirm-delete-generic": "Are you sure you want to delete this?",
|
"copied": "S'ha copiat",
|
||||||
"copied": "Copied",
|
"create": "Crea",
|
||||||
"create": "Create",
|
"created": "S'ha creat",
|
||||||
"created": "Created",
|
"custom": "Personalitzat",
|
||||||
"current-parenthesis": "(Current)",
|
"dashboard": "Tauler de control",
|
||||||
"custom": "Custom",
|
"delete": "Suprimeix",
|
||||||
"dashboard": "Dashboard",
|
"disabled": "Desactivat",
|
||||||
"delete": "Delete",
|
"download": "Baixa’l",
|
||||||
"disabled": "Disabled",
|
"edit": "Edita",
|
||||||
"download": "Download",
|
"enabled": "Activat",
|
||||||
"edit": "Edit",
|
"exception": "Excepció",
|
||||||
"enabled": "Enabled",
|
"failed-count": "Han fallat: {count}",
|
||||||
"exception": "Exception",
|
"failure-uploading-file": "No s'ha pogut pujar l'arxiu",
|
||||||
"failed-count": "Failed: {count}",
|
"favorites": "Preferides",
|
||||||
"failure-uploading-file": "Failure uploading file",
|
"field-required": "Camp obligatori",
|
||||||
"favorites": "Favorites",
|
"file-folder-not-found": "No s'ha trobat la carpeta o l'arxiu",
|
||||||
"field-required": "Field Required",
|
"file-uploaded": "S'ha pujat l'arxiu",
|
||||||
"file-folder-not-found": "File/folder not found",
|
"filter": "Filtre",
|
||||||
"file-uploaded": "File uploaded",
|
"friday": "Divendres",
|
||||||
"filter": "Filter",
|
|
||||||
"friday": "Friday",
|
|
||||||
"general": "General",
|
"general": "General",
|
||||||
"get": "Get",
|
"get": "Obté",
|
||||||
"image": "Image",
|
"home": "Inici",
|
||||||
"image-upload-failed": "Image upload failed",
|
"image": "Imatge",
|
||||||
"import": "Import",
|
"image-upload-failed": "No s'ha pogut pujar la imatge",
|
||||||
|
"import": "Importa",
|
||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Keyword",
|
"keyword": "Paraula clau",
|
||||||
"link": "Link",
|
"link-copied": "S'ha copiat l'enllaç",
|
||||||
"link-copied": "Link Copied",
|
"loading-recipes": "Carregant les receptes",
|
||||||
"monday": "Monday",
|
"monday": "Dilluns",
|
||||||
"more": "More",
|
"name": "Nom",
|
||||||
"name": "Name",
|
"new": "Nou",
|
||||||
"new": "New",
|
|
||||||
"no": "No",
|
"no": "No",
|
||||||
"ok": "OK",
|
"no-recipe-found": "No s'han trobat receptes",
|
||||||
"options": "Options:",
|
"ok": "D'acord",
|
||||||
"print": "Print",
|
"options": "Opcions:",
|
||||||
"random": "Random",
|
"print": "Imprimiu",
|
||||||
"rating": "Rating",
|
"random": "Aleatori",
|
||||||
|
"rating": "Valoració",
|
||||||
"recent": "Recent",
|
"recent": "Recent",
|
||||||
"recipe": "Recipe",
|
"recipe": "Recepta",
|
||||||
"recipes": "Recipes",
|
"recipes": "Receptes",
|
||||||
"rename-object": "Rename {0}",
|
"rename-object": "Canvia de nom {0}",
|
||||||
"reset": "Reset",
|
"reset": "Restableix",
|
||||||
"saturday": "Saturday",
|
"saturday": "Dissabte",
|
||||||
"save": "Save",
|
"save": "Desa",
|
||||||
"settings": "Settings",
|
"settings": "Configuració",
|
||||||
"share": "Share",
|
"share": "Compartiu",
|
||||||
"shuffle": "Shuffle",
|
"shuffle": "Barreja",
|
||||||
"sort": "Sort",
|
"sort": "Ordena",
|
||||||
"sort-alphabetically": "Alphabetical",
|
"sort-alphabetically": "Alfabèticament",
|
||||||
"status": "Status",
|
"status": "Estat",
|
||||||
"submit": "Submit",
|
"submit": "Envia",
|
||||||
"success-count": "Success: {count}",
|
"success-count": "Amb èxit: {count}",
|
||||||
"sunday": "Sunday",
|
"sunday": "Diumenge",
|
||||||
"templates": "Templates:",
|
"templates": "Plantilles:",
|
||||||
"test": "Test",
|
"test": "Prova",
|
||||||
"themes": "Themes",
|
"themes": "Temes",
|
||||||
"thursday": "Thursday",
|
"thursday": "Dijous",
|
||||||
"token": "Token",
|
"token": "Token",
|
||||||
"tuesday": "Tuesday",
|
"tuesday": "Dimarts",
|
||||||
"type": "Type",
|
"type": "Tipus",
|
||||||
"update": "Update",
|
"update": "Actualitza",
|
||||||
"updated": "Updated",
|
"updated": "S'ha actualitzat",
|
||||||
"upload": "Upload",
|
"upload": "Puja",
|
||||||
"url": "URL",
|
"url": "Adreça",
|
||||||
"view": "View",
|
"view": "Mostra",
|
||||||
"wednesday": "Wednesday",
|
"wednesday": "Dimecres",
|
||||||
"yes": "Yes"
|
"yes": "Sí"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Are you sure you want to delete <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Esteu segur de voler suprimir el grup <b>{groupName}<b/>?",
|
||||||
"cannot-delete-default-group": "Cannot delete default group",
|
"cannot-delete-default-group": "No s'ha pogut suprimir el grup",
|
||||||
"cannot-delete-group-with-users": "Cannot delete group with users",
|
"cannot-delete-group-with-users": "No es pot suprimir un grup amb usuaris",
|
||||||
"confirm-group-deletion": "Confirm Group Deletion",
|
"confirm-group-deletion": "Confirma l'eliminació del grup",
|
||||||
"create-group": "Create Group",
|
"create-group": "Crea un grup",
|
||||||
"error-updating-group": "Error updating group",
|
"error-updating-group": "S’ha produït un error a l'actualitzar el grup",
|
||||||
"group": "Group",
|
"group": "Grup",
|
||||||
"group-deleted": "Group deleted",
|
"group-deleted": "S'ha suprimir el grup",
|
||||||
"group-deletion-failed": "Group deletion failed",
|
"group-deletion-failed": "S'ha produït un error al suprimir el grup",
|
||||||
"group-id-with-value": "Group ID: {groupID}",
|
"group-id-with-value": "Identificador del grup: {groupID}",
|
||||||
"group-name": "Group Name",
|
"group-name": "Nom del grup",
|
||||||
"group-not-found": "Group not found",
|
"group-not-found": "No s'ha trobat el grup",
|
||||||
"groups": "Groups",
|
"group-with-value": "Grup: {groupID}",
|
||||||
"groups-can-only-be-set-by-administrators": "Groups can only be set by administrators",
|
"groups": "Grups",
|
||||||
"manage-groups": "Manage Groups",
|
"manage-groups": "Gestiona els grups",
|
||||||
"user-group": "User Group",
|
"user-group": "Grup",
|
||||||
"user-group-created": "User Group Created",
|
"user-group-created": "S'ha creat el grup de l'usuari",
|
||||||
"user-group-creation-failed": "User Group Creation Failed"
|
"user-group-creation-failed": "Ha fallat la creación del grup de l'usuari"
|
||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Create a New Meal Plan",
|
"create-a-new-meal-plan": "Crea un nou menú",
|
||||||
"dinner-this-week": "Dinner This Week",
|
"dinner-this-week": "Sopar d'esta setmana",
|
||||||
"dinner-today": "Dinner Today",
|
"dinner-today": "Sopar per a hui",
|
||||||
"dinner-tonight": "DINNER TONIGHT",
|
"dinner-tonight": "Sopar d'esta nit",
|
||||||
"edit-meal-plan": "Edit Meal Plan",
|
"edit-meal-plan": "Edita el menú",
|
||||||
"end-date": "End Date",
|
"end-date": "Data de finalització",
|
||||||
"group": "Group (Beta)",
|
"group": "Agrupa (en proves)",
|
||||||
"main": "Main",
|
"main": "Principal",
|
||||||
"meal-planner": "Meal Planner",
|
"meal-planner": "Planificador de menús",
|
||||||
"meal-plans": "Meal Plans",
|
"meal-plans": "Menús",
|
||||||
"mealplan-categories": "MEALPLAN CATEGORIES",
|
"mealplan-categories": "Categories dels menús",
|
||||||
"mealplan-created": "Mealplan created",
|
"mealplan-created": "S'ha actualitzat el menú",
|
||||||
"mealplan-creation-failed": "Mealplan creation failed",
|
"mealplan-creation-failed": "S'ha produït un error al crear el menú",
|
||||||
"mealplan-deleted": "Mealplan Deleted",
|
"mealplan-deleted": "S'ha suprimir el menú",
|
||||||
"mealplan-deletion-failed": "Mealplan deletion failed",
|
"mealplan-deletion-failed": "S'ha produït un error al suprimir el menú",
|
||||||
"mealplan-settings": "Mealplan Settings",
|
"mealplan-settings": "Configuració del menú",
|
||||||
"mealplan-update-failed": "Mealplan update failed",
|
"mealplan-update-failed": "S'ha produït un error a l'actualitzar el menú",
|
||||||
"mealplan-updated": "Mealplan Updated",
|
"mealplan-updated": "S'ha actualitzat el menú",
|
||||||
"no-meal-plan-defined-yet": "No meal plan defined yet",
|
"no-meal-plan-defined-yet": "No hi ha cap menú planificat",
|
||||||
"no-meal-planned-for-today": "No meal planned for today",
|
"no-meal-planned-for-today": "No hi han cap menú per a hui",
|
||||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Only recipes with these categories will be used in Meal Plans",
|
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Només s'utilitzaran aquestes categories per als menús",
|
||||||
"planner": "Planner",
|
"planner": "Planificador",
|
||||||
"quick-week": "Quick Week",
|
"quick-week": "Pla ràpid",
|
||||||
"side": "Side",
|
"side": "Guarnició",
|
||||||
"sides": "Sides",
|
"sides": "Guarnicions",
|
||||||
"start-date": "Start Date"
|
"start-date": "Data d'inici"
|
||||||
},
|
},
|
||||||
"migration": {
|
"migration": {
|
||||||
"chowdown": {
|
"chowdown": {
|
||||||
"description": "Migrate data from Chowdown",
|
"description": "Migreu les dades de Chowdown",
|
||||||
"title": "Chowdown"
|
"title": "Chowdown"
|
||||||
},
|
},
|
||||||
"migration-data-removed": "Migration data removed",
|
"migration-data-removed": "S'han suprimit les dades migrades",
|
||||||
"nextcloud": {
|
"nextcloud": {
|
||||||
"description": "Migrate data from a Nextcloud Cookbook instance",
|
"description": "Migreu les dades del Cookbook de Nextcloud",
|
||||||
"title": "Nextcloud Cookbook"
|
"title": "Nextcloud Cookbook"
|
||||||
},
|
},
|
||||||
"no-migration-data-available": "No Migration Data Available",
|
"no-migration-data-available": "No hi han dades disponibles",
|
||||||
"recipe-migration": "Recipe Migration"
|
"recipe-migration": "Migració de receptes"
|
||||||
},
|
},
|
||||||
"new-recipe": {
|
"new-recipe": {
|
||||||
"bulk-add": "Bulk Add",
|
"bulk-add": "Afegiu tot d'una",
|
||||||
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
"error-details": "Mealie només pot importar els llocs web amb Id+json o microdata. Els principals llocs de receptes suporten aquesta estructura de les dades. Si no pot importar-les però hi ha dades json al registre, per favor, obriu un problema (issue) a GitHub amb l'URL i les dades. A GitHub només obriu problemes en anglés.",
|
||||||
"error-title": "Looks Like We Couldn't Find Anything",
|
"error-title": "No hem pout trobar res",
|
||||||
"from-url": "Import a Recipe",
|
"from-url": "Importa una recepta",
|
||||||
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
|
"github-issues": "GitHub Issues",
|
||||||
"recipe-url": "Recipe URL",
|
"google-ld-json-info": "Google ld+json Info",
|
||||||
"url-form-hint": "Copy and paste a link from your favorite recipe website"
|
"must-be-a-valid-url": "Ha de ser una URL vàlida",
|
||||||
|
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Copieu en la recepta. Cada línia serà tractada com un element de la llista",
|
||||||
|
"recipe-markup-specification": "Especificació Markup de la recepta",
|
||||||
|
"recipe-url": "URL de la recepta",
|
||||||
|
"upload-a-recipe": "Puja una recepta",
|
||||||
|
"upload-individual-zip-file": "Puja només un arxiu zip, exportat d'altre Mealie.",
|
||||||
|
"url-form-hint": "Copia i enganxa l'enllaç del teu lloc web de receptes preferit",
|
||||||
|
"view-scraped-data": "Visualitza les dades recuperades"
|
||||||
},
|
},
|
||||||
"page": {
|
"page": {
|
||||||
"all-recipes": "All Recipes",
|
"404-page-not-found": "Error 404 - No s'ha trobat la pàgina",
|
||||||
"home-page": "Home Page",
|
"all-recipes": "Totes les receptes",
|
||||||
"new-page-created": "New page created",
|
"new-page-created": "S'ha creat una nova pàgina",
|
||||||
"page": "Page",
|
"page": "Pàgina",
|
||||||
"page-creation-failed": "Page creation failed",
|
"page-creation-failed": "S'ha produït un error al crear la pàgina",
|
||||||
"page-deleted": "Page deleted",
|
"page-deleted": "S'ha suprimit la pàgina",
|
||||||
"page-deletion-failed": "Page deletion failed",
|
"page-deletion-failed": "S'ha produït un error al suprimir la pàgina",
|
||||||
"page-update-failed": "Page update failed",
|
"page-update-failed": "S'ha produït un error a l'actualitzar la pàgina",
|
||||||
"page-updated": "Page updated",
|
"page-updated": "S'ha actualitzat la pàgina",
|
||||||
"pages-update-failed": "Pages update failed",
|
"pages-update-failed": "S'ha produït un error a l'actualitzar les pàgines",
|
||||||
"pages-updated": "Pages updated",
|
"pages-updated": "S'han actualitzat les pàgines"
|
||||||
"recent": "Recent"
|
|
||||||
},
|
},
|
||||||
"recipe": {
|
"recipe": {
|
||||||
"add-key": "Add Key",
|
"add-key": "Afegeix clau",
|
||||||
"add-to-favorites": "Add to Favorites",
|
"add-to-favorites": "Afegeix a preferides",
|
||||||
"api-extras": "API Extras",
|
"api-extras": "API Extras",
|
||||||
"assets": "Assets",
|
|
||||||
"calories": "Calories",
|
"calories": "Calories",
|
||||||
"calories-suffix": "calories",
|
"calories-suffix": "calories",
|
||||||
"carbohydrate-content": "Carbohydrate",
|
"carbohydrate-content": "Carbohidrats",
|
||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"comment-action": "Comment",
|
"comment-action": "Comentari",
|
||||||
"comments": "Comments",
|
"comments": "Comentaris",
|
||||||
"delete-confirmation": "Are you sure you want to delete this recipe?",
|
"delete-confirmation": "Estàs segur que vols suprimir-la?",
|
||||||
"delete-recipe": "Delete Recipe",
|
"delete-recipe": "Suprimeix la recepta",
|
||||||
"description": "Description",
|
"description": "Descripció",
|
||||||
"disable-amount": "Disable Ingredient Amounts",
|
"disable-amount": "Oculta les quantitats",
|
||||||
"disable-comments": "Disable Comments",
|
"disable-comments": "Oculta els comentaris",
|
||||||
"fat-content": "Fat",
|
"fat-content": "Greixos",
|
||||||
"fiber-content": "Fiber",
|
"fiber-content": "Fibra",
|
||||||
"grams": "grams",
|
"grams": "grams",
|
||||||
"ingredient": "Ingredient",
|
"ingredient": "Ingredient",
|
||||||
"ingredients": "Ingredients",
|
"ingredients": "Ingredients",
|
||||||
"insert-section": "Insert Section",
|
"insert-section": "Insereix una secció",
|
||||||
"instructions": "Instructions",
|
"instructions": "Instruccions",
|
||||||
"key-name-required": "Key Name Required",
|
"key-name-required": "Es requereix un nom de clau",
|
||||||
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
|
"landscape-view-coming-soon": "Vista apaïsada (aviat)",
|
||||||
"milligrams": "milligrams",
|
"milligrams": "mil·ligrams",
|
||||||
"new-asset": "New Asset",
|
"new-key-name": "Nou nom de la clau",
|
||||||
"new-key-name": "New Key Name",
|
"no-white-space-allowed": "No es permeten espais en blanc",
|
||||||
"no-white-space-allowed": "No White Space Allowed",
|
"note": "Nota",
|
||||||
"note": "Note",
|
"nutrition": "Valors nutricionals",
|
||||||
"notes": "Notes",
|
"object-key": "Nom de la clau",
|
||||||
"nutrition": "Nutrition",
|
"object-value": "Valor",
|
||||||
"object-key": "Object Key",
|
"original-url": "Adreça URL original",
|
||||||
"object-value": "Object Value",
|
"perform-time": "Temps de cocció",
|
||||||
"original-url": "Original URL",
|
"prep-time": "Temps de preparació",
|
||||||
"perform-time": "Cook Time",
|
"protein-content": "Proteïnes",
|
||||||
"prep-time": "Prep Time",
|
"public-recipe": "Recepta pública",
|
||||||
"protein-content": "Protein",
|
"recipe-created": "S'ha creat la recepta",
|
||||||
"public-recipe": "Public Recipe",
|
"recipe-creation-failed": "S'ha produït un error al crear la recepta",
|
||||||
"recipe-created": "Recipe created",
|
"recipe-deleted": "S'ha suprimit la recepta",
|
||||||
"recipe-creation-failed": "Recipe creation failed",
|
"recipe-image": "Imatge de la recepta",
|
||||||
"recipe-deleted": "Recipe deleted",
|
"recipe-image-updated": "S'ha actualitzat la imatge de la recepta",
|
||||||
"recipe-image": "Recipe Image",
|
"recipe-name": "Nom de la recepta",
|
||||||
"recipe-image-updated": "Recipe image updated",
|
"recipe-settings": "Opcions de la recepta",
|
||||||
"recipe-name": "Recipe Name",
|
"recipe-update-failed": "S'ha produït un error a l'actualitzar la recepta",
|
||||||
"recipe-settings": "Recipe Settings",
|
"recipe-updated": "S'ha actualitzat la recepta",
|
||||||
"recipe-update-failed": "Recipe update failed",
|
"remove-from-favorites": "S'ha eliminat de les receptes preferides",
|
||||||
"recipe-updated": "Recipe updated",
|
"remove-section": "Suprimeix la sel·lecció",
|
||||||
"remove-from-favorites": "Remove from Favorites",
|
"save-recipe-before-use": "Desa la recepta abans d'utilitzar-la",
|
||||||
"remove-section": "Remove Section",
|
"section-title": "Secció",
|
||||||
"section-title": "Section Title",
|
"servings": "Porcions",
|
||||||
"servings": "Servings",
|
"share-recipe-message": "Vull compartir la meua recepta {0} amb tú.",
|
||||||
"share-recipe-message": "I wanted to share my {0} recipe with you.",
|
"show-nutrition-values": "Mostra els valors nutricionals",
|
||||||
"show-assets": "Show Assets",
|
"sodium-content": "Sodi",
|
||||||
"show-nutrition-values": "Show Nutrition Values",
|
"step-index": "Pas: {step}",
|
||||||
"sodium-content": "Sodium",
|
"sugar-content": "Sucres",
|
||||||
"step-index": "Step: {step}",
|
"title": "Títol",
|
||||||
"sugar-content": "Sugar",
|
"total-time": "Temps total",
|
||||||
"title": "Title",
|
"unable-to-delete-recipe": "No s'ha pogut suprimir la recepta"
|
||||||
"total-time": "Total Time",
|
|
||||||
"unable-to-delete-recipe": "Unable to Delete Recipe",
|
|
||||||
"view-recipe": "View Recipe"
|
|
||||||
},
|
},
|
||||||
"reicpe": {
|
"reicpe": {
|
||||||
"no-recipe": "No Recipe"
|
"no-recipe": "Cap recepta"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Advanced Search",
|
"advanced-search": "Cerca avançada",
|
||||||
"and": "and",
|
"and": "i",
|
||||||
"exclude": "Exclude",
|
"exclude": "Exclou",
|
||||||
"include": "Include",
|
"include": "Inclou",
|
||||||
"max-results": "Max Results",
|
"max-results": "No mostreu més de",
|
||||||
"or": "Or",
|
"or": "O",
|
||||||
"results": "Results",
|
"results": "Resultats",
|
||||||
"search": "Search",
|
"search": "Cerca",
|
||||||
"search-mealie": "Search Mealie (press /)",
|
"search-mealie": "Cerca a Melie (prem /)",
|
||||||
"search-placeholder": "Search...",
|
"search-placeholder": "Cerca...",
|
||||||
"tag-filter": "Tag Filter"
|
"tag-filter": "Filtra per etiqueta"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"add-a-new-theme": "Add a New Theme",
|
"add-a-new-theme": "Afegiu un nou tema",
|
||||||
"admin-settings": "Admin Settings",
|
"admin-settings": "Opcions de l'administrador",
|
||||||
"available-backups": "Available Backups",
|
|
||||||
"backup": {
|
"backup": {
|
||||||
"backup-created-at-response-export_path": "Backup Created at {path}",
|
"backup-created-at-response-export_path": "S'ha creat una còpia de seguretat a {path}",
|
||||||
"backup-deleted": "Backup deleted",
|
"backup-deleted": "Còpia de seguretat suprimida",
|
||||||
"backup-tag": "Backup Tag",
|
"backup-tag": "Etiqueta de la còpia de seguretat",
|
||||||
"create-heading": "Create a Backup",
|
"create-heading": "Crea una còpia de seguretat",
|
||||||
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
|
"delete-backup": "Esborra la còpia de seguretat",
|
||||||
"full-backup": "Full Backup",
|
"error-creating-backup-see-log-file": "S'ha produït un error al crear la còpia de seguritat. Disposa de més informació a l'arxiu de registre",
|
||||||
"import-summary": "Import Summary",
|
"full-backup": "Còpia de seguretat completa",
|
||||||
"partial-backup": "Partial Backup",
|
"import-summary": "Resum de la importació",
|
||||||
"unable-to-delete-backup": "Unable to Delete Backup."
|
"partial-backup": "Còpia de seguretat parcial",
|
||||||
|
"unable-to-delete-backup": "No s'ha pogut suprimir la còpia."
|
||||||
},
|
},
|
||||||
"backup-and-exports": "Backups",
|
"backup-and-exports": "Còpies de seguretat",
|
||||||
"backup-info": "Backups are exported in standard JSON format along with all the images stored on the file system. In your backup folder you'll find a .zip file that contains all of the recipe JSON and images from the database. Additionally, if you selected a markdown file, those will also be stored in the .zip file. To import a backup, it must be located in your backups folder. Automated backups are done each day at 3:00 AM.",
|
"change-password": "Canvia la contrasenya",
|
||||||
"change-password": "Change Password",
|
"current": "Versió:",
|
||||||
"current": "Version:",
|
"custom-pages": "Pàgines personalitzades",
|
||||||
"custom-pages": "Custom Pages",
|
"edit-page": "Edita la Pàgina",
|
||||||
"edit-page": "Edit Page",
|
"events": "Esdeveniments",
|
||||||
"events": "Events",
|
"first-day-of-week": "Primer dia de la setmana",
|
||||||
"first-day-of-week": "First day of the week",
|
"group-settings-updated": "S'ha actualitzat la configuració del grup",
|
||||||
"group-settings-updated": "Group Settings Updated",
|
|
||||||
"homepage": {
|
"homepage": {
|
||||||
"all-categories": "All Categories",
|
"all-categories": "Totes les categories",
|
||||||
"card-per-section": "Card Per Section",
|
"card-per-section": "Receptes per secció",
|
||||||
"home-page": "Home Page",
|
"home-page": "Pàgina d'inici",
|
||||||
"home-page-sections": "Home Page Sections",
|
"home-page-sections": "Seccions de la pàgina d'inici",
|
||||||
"show-recent": "Show Recent"
|
"show-recent": "Mostra receptes recients"
|
||||||
},
|
},
|
||||||
"language": "Language",
|
"language": "Idioma",
|
||||||
"latest": "Latest",
|
"latest": "Darrera",
|
||||||
"local-api": "Local API",
|
"local-api": "API local",
|
||||||
"locale-settings": "Locale settings",
|
"locale-settings": "Opcions d'idioma",
|
||||||
"migrations": "Migrations",
|
"migrations": "Migracions",
|
||||||
"new-page": "New Page",
|
"new-page": "Pàgina nova",
|
||||||
"notify": "Notify",
|
"notify": "Notifica",
|
||||||
"organize": "Organize",
|
"organize": "Organitzador",
|
||||||
"page-name": "Page Name",
|
"page-name": "Nom de la pàgina",
|
||||||
"pages": "Pages",
|
"pages": "Pàgines",
|
||||||
"profile": "Profile",
|
"profile": "Perfil",
|
||||||
"remove-existing-entries-matching-imported-entries": "Remove existing entries matching imported entries",
|
"remove-existing-entries-matching-imported-entries": "Elimina les entrades existents que coincideixen amb les importades",
|
||||||
"set-new-time": "Set New Time",
|
"set-new-time": "Defineix l'hora",
|
||||||
"settings-update-failed": "Settings update failed",
|
"settings-update-failed": "S'ha produït un error a l'actualitzar la configuració",
|
||||||
"settings-updated": "Settings updated",
|
"settings-updated": "S'ha actualitzat la configuració",
|
||||||
"site-settings": "Site Settings",
|
"site-settings": "Configuració del portal",
|
||||||
"theme": {
|
"theme": {
|
||||||
"accent": "Accent",
|
"accent": "Èmfasi",
|
||||||
"are-you-sure-you-want-to-delete-this-theme": "Are you sure you want to delete this theme?",
|
"dark": "Fosc",
|
||||||
"choose-how-mealie-looks-to-you-set-your-theme-preference-to-follow-your-system-settings-or-choose-to-use-the-light-or-dark-theme": "Choose how Mealie looks to you. Set your theme preference to follow your system settings, or choose to use the light or dark theme.",
|
"default-to-system": "Gestionat pel sistema",
|
||||||
"dark": "Dark",
|
"error": "S'ha produït un error",
|
||||||
"dark-mode": "Dark Mode",
|
"error-creating-theme-see-log-file": "S'ha produït un error creant el tema. Disposa de més informació a l'arxiu de registre.",
|
||||||
"default-to-system": "Default to system",
|
"error-deleting-theme": "S'ha produït un error suprimint el tema",
|
||||||
"delete-theme": "Delete Theme",
|
"error-updating-theme": "S'ha produït un error actualitzant el tema",
|
||||||
"error": "Error",
|
"info": "Informació",
|
||||||
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
|
"light": "Clar",
|
||||||
"error-deleting-theme": "Error deleting theme",
|
"primary": "Primari",
|
||||||
"error-updating-theme": "Error updating theme",
|
"secondary": "Secundari",
|
||||||
"info": "Info",
|
"success": "Correcte",
|
||||||
"light": "Light",
|
"switch-to-dark-mode": "Canvia al mode fosc",
|
||||||
"primary": "Primary",
|
"switch-to-light-mode": "Canvia al mode clar",
|
||||||
"secondary": "Secondary",
|
"theme-deleted": "S'ha suprimit el tema",
|
||||||
"select-a-theme-from-the-dropdown-or-create-a-new-theme-note-that-the-default-theme-will-be-served-to-all-users-who-have-not-set-a-theme-preference": "Select a theme from the dropdown or create a new theme. Note that the default theme will be served to all users who have not set a theme preference.",
|
"theme-name": "Nom del tema",
|
||||||
"success": "Success",
|
"theme-name-is-required": "Es requereix nom per al tema.",
|
||||||
"switch-to-dark-mode": "Switch to dark mode",
|
"theme-saved": "S'ha desat el tema",
|
||||||
"switch-to-light-mode": "Switch to light mode",
|
"theme-updated": "S'ha actualitzat el tema",
|
||||||
"theme": "Theme",
|
"warning": "Advertència"
|
||||||
"theme-deleted": "Theme deleted",
|
|
||||||
"theme-name": "Theme Name",
|
|
||||||
"theme-name-is-required": "Theme Name is required.",
|
|
||||||
"theme-saved": "Theme Saved",
|
|
||||||
"theme-settings": "Theme Settings",
|
|
||||||
"theme-updated": "Theme updated",
|
|
||||||
"warning": "Warning"
|
|
||||||
},
|
},
|
||||||
"token": {
|
"token": {
|
||||||
"active-tokens": "ACTIVE TOKENS",
|
"active-tokens": "TOKENS ACTIUS",
|
||||||
"api-token": "API Token",
|
"api-token": "Token de l'API",
|
||||||
"api-tokens": "API Tokens",
|
"api-tokens": "Tokens de l'API",
|
||||||
"copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Copy this token for use with an external application. This token will not be viewable again.",
|
"copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Còpia aquest token per a utilitzar-lo en una aplicació externa. Aquest token, no es tornarà a mostrar.",
|
||||||
"create-an-api-token": "Create an API Token",
|
"create-an-api-token": "Crea un token d'API",
|
||||||
"token-name": "Token Name"
|
"token-name": "Nom del token"
|
||||||
},
|
},
|
||||||
"toolbox": {
|
"toolbox": {
|
||||||
"assign-all": "Assign All",
|
"assign-all": "Asigna tots",
|
||||||
"bulk-assign": "Bulk Assign",
|
"bulk-assign": "Assigna en grup",
|
||||||
"new-name": "New Name",
|
"new-name": "Nou nom",
|
||||||
"no-unused-items": "No Unused Items",
|
"no-unused-items": "No hi han elements sense utilitzar",
|
||||||
"recipes-affected": "No Recipes Affected|One Recipe Affected|{count} Recipes Affected",
|
"recipes-affected": "Cap recepta afectada|Una recepta afectada|{count} receptes afectades",
|
||||||
"remove-unused": "Remove Unused",
|
"remove-unused": "Elimina els no utilitzats",
|
||||||
"title-case-all": "Title Case All",
|
"title-case-all": "Totes en majúscules",
|
||||||
"toolbox": "Toolbox",
|
"toolbox": "Eines",
|
||||||
"unorganized": "Unorganized"
|
"unorganized": "Sense organitzar"
|
||||||
},
|
},
|
||||||
"webhooks": {
|
"webhooks": {
|
||||||
"meal-planner-webhooks": "Meal Planner Webhooks",
|
"test-webhooks": "Prova els Webhooks",
|
||||||
"test-webhooks": "Test Webhooks",
|
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "Les URLs mostrades a continuació rebran webhooks amb les dades de la recepta per al menú del dia programat. Actaualment els webhooks s'executaran a les",
|
||||||
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "The URLs listed below will receive webhooks containing the recipe data for the meal plan on it's scheduled day. Currently Webhooks will execute at",
|
"webhook-url": "URL del webhook",
|
||||||
"webhook-url": "Webhook URL",
|
|
||||||
"webhooks-caps": "WEBHOOKS"
|
"webhooks-caps": "WEBHOOKS"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"shopping-list": {
|
"shopping-list": {
|
||||||
"all-lists": "All Lists",
|
"all-lists": "Totes les llistes",
|
||||||
"create-shopping-list": "Create Shopping List",
|
"create-shopping-list": "Crea una llista de la compra",
|
||||||
"from-recipe": "From Recipe",
|
"from-recipe": "Des de la recepta",
|
||||||
"list-name": "List Name",
|
"list-name": "Nom de la llista",
|
||||||
"new-list": "New List",
|
"new-list": "Llista nova",
|
||||||
"quantity": "Quantity: {0}",
|
"quantity": "Quantitat: {0}",
|
||||||
"shopping-list": "Shopping List",
|
"shopping-list": "Llista de la compra",
|
||||||
"shopping-lists": "Shopping Lists"
|
"shopping-lists": "Llistes de la compra"
|
||||||
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"all-recipes": "Receptes",
|
||||||
|
"categories": "Categories",
|
||||||
|
"dashboard": "Consola",
|
||||||
|
"home-page": "Inici",
|
||||||
|
"manage-users": "Usuaris",
|
||||||
|
"migrations": "Migracions",
|
||||||
|
"profile": "Perfil",
|
||||||
|
"search": "Cerca",
|
||||||
|
"site-settings": "Configuració",
|
||||||
|
"tags": "Etiquetes",
|
||||||
|
"toolbox": "Eines"
|
||||||
},
|
},
|
||||||
"signup": {
|
"signup": {
|
||||||
"display-name": "Display Name",
|
"error-signing-up": "S'ha produït un error al registrar-se",
|
||||||
"error-signing-up": "Error Signing Up",
|
"sign-up": "Registreu-vos",
|
||||||
"sign-up": "Sign Up",
|
"sign-up-link-created": "S'ha creat l'enllaç per a registrar-se",
|
||||||
"sign-up-link-created": "Sign up link created",
|
"sign-up-link-creation-failed": "S'ha produït un error al crear l'enllaç per a registrar-se",
|
||||||
"sign-up-link-creation-failed": "Sign up link creation failed",
|
"sign-up-links": "Enllaços de registre",
|
||||||
"sign-up-links": "Sign Up Links",
|
"sign-up-token-deleted": "S'ha suprimit el token de registre",
|
||||||
"sign-up-token-deleted": "Sign Up Token Deleted",
|
"sign-up-token-deletion-failed": "S'ha produït un error a l'eliminar el token per a registrar-se",
|
||||||
"sign-up-token-deletion-failed": "Sign up token deletion failed",
|
"welcome-to-mealie": "Benvingut a Mealie! Per a poder ser usuari d'aquesta instància ha de tenir un enllaç d'invitació vàlid. Si no l'ha rebut, no podrà registrar-se. Per a rebre'l, contacte amb l'administrador."
|
||||||
"welcome-to-mealie": "Welcome to Mealie! To become a user of this instance you are required to have a valid invitation link. If you haven't recieved an invitation you are unable to sign-up. To recieve a link, contact the sites administrator."
|
|
||||||
},
|
},
|
||||||
"tag": {
|
"tag": {
|
||||||
"tag-created": "Tag created",
|
"tag-created": "S'ha creat l'etiqueta",
|
||||||
"tag-creation-failed": "Tag creation failed",
|
"tag-creation-failed": "S'ha produït un error al crear l'etiqueta",
|
||||||
"tag-deleted": "Tag deleted",
|
"tag-deleted": "S'ha suprimit l'etiqueta",
|
||||||
"tag-deletion-failed": "Tag deletion failed",
|
"tag-deletion-failed": "S'ha produït un error al suprimir l'etiqueta",
|
||||||
"tag-update-failed": "Tag update failed",
|
"tag-update-failed": "S'ha produït un error a l'actualitzar l'etiqueta",
|
||||||
"tag-updated": "Tag updated",
|
"tag-updated": "S'ha actualitzat l'etiqueta",
|
||||||
"tags": "Tags",
|
"tags": "Etiquetes",
|
||||||
"untagged-count": "Untagged {count}"
|
"untagged-count": "{count} sense etiquetar"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Admin",
|
"admin": "Administrador/a",
|
||||||
"are-you-sure-you-want-to-delete-the-link": "Are you sure you want to delete the link <b>{link}<b/>?",
|
"are-you-sure-you-want-to-delete-the-link": "Esteu segur de voler suprimir l'enllaç <b>{link}<b/>?",
|
||||||
"are-you-sure-you-want-to-delete-the-user": "Are you sure you want to delete the user <b>{activeName} ID: {activeId}<b/>?",
|
"are-you-sure-you-want-to-delete-the-user": "Esteu segur de voler suprimir l'usuari <b>{activeName}<b/> ID: <b>{activeId}<b/>?",
|
||||||
"confirm-link-deletion": "Confirm Link Deletion",
|
"confirm-link-deletion": "Confirmeu l'eliminació de l'enllaç",
|
||||||
"confirm-password": "Confirm Password",
|
"confirm-password": "Confirmeu la contrasenya",
|
||||||
"confirm-user-deletion": "Confirm User Deletion",
|
"confirm-user-deletion": "Confirmeu l'eliminació de l'usuari",
|
||||||
"could-not-validate-credentials": "Could Not Validate Credentials",
|
"could-not-validate-credentials": "No s'han pogut validar les credencials",
|
||||||
"create-link": "Create Link",
|
"create-link": "Crea l’enllaç",
|
||||||
"create-user": "Create User",
|
"create-user": "Crear l'usuari",
|
||||||
"current-password": "Current Password",
|
"current-password": "Contrasenya actual",
|
||||||
"e-mail-must-be-valid": "E-mail must be valid",
|
"e-mail-must-be-valid": "Ha de ser un correu electrònic vàlid",
|
||||||
"edit-user": "Edit User",
|
"edit-user": "Edita l'usuari",
|
||||||
"email": "Email",
|
"email": "Correu electrònic",
|
||||||
"error-cannot-delete-super-user": "Error! Cannot Delete Super User",
|
"error-cannot-delete-super-user": "S'ha produït un error. El Super usuari no es pot suprimir!",
|
||||||
"existing-password-does-not-match": "Existing password does not match",
|
"existing-password-does-not-match": "La contrasenya actual no coincideix",
|
||||||
"full-name": "Full Name",
|
"full-name": "Nom sencer",
|
||||||
"incorrect-username-or-password": "Incorrect username or password",
|
"link-id": "Id de l'enllaç",
|
||||||
"link-id": "Link ID",
|
"link-name": "Nom de l'enllaç",
|
||||||
"link-name": "Link Name",
|
"login": "Inicieu sessió",
|
||||||
"login": "Login",
|
"logout": "Tanca la sessió",
|
||||||
"logout": "Logout",
|
"manage-users": "Gestionar usuaris",
|
||||||
"manage-users": "Manage Users",
|
"new-password": "Nova contrasenya",
|
||||||
"new-password": "New Password",
|
"new-user": "Nou Usuari",
|
||||||
"new-user": "New User",
|
"password": "Contrasenya",
|
||||||
"password": "Password",
|
"password-has-been-reset-to-the-default-password": "S'ha restablert la contrasenya al seu valor per defecte",
|
||||||
"password-has-been-reset-to-the-default-password": "Password has been reset to the default password",
|
"password-must-match": "Les contrasenyes han de coincidir",
|
||||||
"password-must-match": "Password must match",
|
"password-reset-failed": "S'ha produït un error al restablir la contrasenya",
|
||||||
"password-reset-failed": "Password reset failed",
|
"password-updated": "S'ha actualitzat la contrasenya",
|
||||||
"password-updated": "Password updated",
|
"reset-password": "Restableix la contrasenya",
|
||||||
"reset-password": "Reset Password",
|
"sign-in": "Inicia sessió",
|
||||||
"sign-in": "Sign in",
|
"total-mealplans": "Menús totals",
|
||||||
"total-mealplans": "Total MealPlans",
|
"total-users": "Usuaris totals",
|
||||||
"total-users": "Total Users",
|
"upload-photo": "Pugeu la foto",
|
||||||
"upload-photo": "Upload Photo",
|
"use-8-characters-or-more-for-your-password": "La contrasenya ha de tindre mínim 8 caràcters",
|
||||||
"use-8-characters-or-more-for-your-password": "Use 8 characters or more for your password",
|
"user": "Usuari",
|
||||||
"user": "User",
|
"user-created": "S'ha creat l'usuari",
|
||||||
"user-created": "User created",
|
"user-creation-failed": "S'ha produït un error al crear l'usuari",
|
||||||
"user-creation-failed": "User creation failed",
|
"user-deleted": "S'ha suprimit l'usuari",
|
||||||
"user-deleted": "User deleted",
|
"user-id": "ID d'usuari",
|
||||||
"user-id": "User ID",
|
"user-id-with-value": "ID d'usuari: {id}",
|
||||||
"user-id-with-value": "User ID: {id}",
|
"user-password": "Contrasenya",
|
||||||
"user-password": "User Password",
|
"user-successfully-logged-in": "La sessió s'ha iniciat correctament",
|
||||||
"user-successfully-logged-in": "User Successfully Logged In",
|
"user-update-failed": "S'ha produït un error a l'actualitzar l'usuari",
|
||||||
"user-update-failed": "User update failed",
|
"user-updated": "S'ha actualitzat l'usuari",
|
||||||
"user-updated": "User updated",
|
"username": "Nom d'usuari",
|
||||||
"username": "Username",
|
"users": "Usuaris",
|
||||||
"users": "Users",
|
"users-header": "USUARIS",
|
||||||
"users-header": "USERS",
|
"webhook-time": "Hora del Webhook",
|
||||||
"webhook-time": "Webhook Time",
|
"webhooks-enabled": "Webhooks habilitats",
|
||||||
"webhooks-enabled": "Webhooks Enabled",
|
"you-are-not-allowed-to-create-a-user": "Vostè no està autoritzat per a crear un usuari",
|
||||||
"you-are-not-allowed-to-create-a-user": "You are not allowed to create a user",
|
"you-are-not-allowed-to-delete-this-user": "Vostè no està autoritzat per a suprimir l'usuari"
|
||||||
"you-are-not-allowed-to-delete-this-user": "You are not allowed to delete this user"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,4 @@
|
|||||||
{
|
{
|
||||||
"404": {
|
|
||||||
"page-not-found": "404 Page Not Found",
|
|
||||||
"take-me-home": "Take me Home"
|
|
||||||
},
|
|
||||||
"about": {
|
"about": {
|
||||||
"about": "About",
|
"about": "About",
|
||||||
"about-mealie": "About Mealie",
|
"about-mealie": "About Mealie",
|
||||||
@@ -26,8 +22,17 @@
|
|||||||
"support": "Support",
|
"support": "Support",
|
||||||
"version": "Version"
|
"version": "Version"
|
||||||
},
|
},
|
||||||
|
"asset": {
|
||||||
|
"assets": "Assets",
|
||||||
|
"code": "Code",
|
||||||
|
"file": "File",
|
||||||
|
"image": "Image",
|
||||||
|
"new-asset": "New Asset",
|
||||||
|
"pdf": "PDF",
|
||||||
|
"recipe": "Recipe",
|
||||||
|
"show-assets": "Show Assets"
|
||||||
|
},
|
||||||
"category": {
|
"category": {
|
||||||
"category": "Category",
|
|
||||||
"category-created": "Category created",
|
"category-created": "Category created",
|
||||||
"category-creation-failed": "Category creation failed",
|
"category-creation-failed": "Category creation failed",
|
||||||
"category-deleted": "Category Deleted",
|
"category-deleted": "Category Deleted",
|
||||||
@@ -40,17 +45,17 @@
|
|||||||
"events": {
|
"events": {
|
||||||
"apprise-url": "Apprise URL",
|
"apprise-url": "Apprise URL",
|
||||||
"database": "Database",
|
"database": "Database",
|
||||||
|
"delete-event": "Delete Event",
|
||||||
"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-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",
|
"notification": "Notification",
|
||||||
|
"refresh": "Refresh",
|
||||||
"scheduled": "Scheduled",
|
"scheduled": "Scheduled",
|
||||||
"something-went-wrong": "Something Went Wrong!",
|
"something-went-wrong": "Something Went Wrong!",
|
||||||
"subscribed-events": "Subscribed Events",
|
"subscribed-events": "Subscribed Events",
|
||||||
"test-message-sent": "Test Message Sent",
|
"test-message-sent": "Test Message Sent"
|
||||||
"refresh": "Refresh",
|
|
||||||
"new-version": "New version available!"
|
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"apply": "Apply",
|
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"clear": "Clear",
|
"clear": "Clear",
|
||||||
"close": "Close",
|
"close": "Close",
|
||||||
@@ -59,7 +64,6 @@
|
|||||||
"copied": "Copied",
|
"copied": "Copied",
|
||||||
"create": "Create",
|
"create": "Create",
|
||||||
"created": "Created",
|
"created": "Created",
|
||||||
"current-parenthesis": "(Current)",
|
|
||||||
"custom": "Custom",
|
"custom": "Custom",
|
||||||
"dashboard": "Dashboard",
|
"dashboard": "Dashboard",
|
||||||
"delete": "Delete",
|
"delete": "Delete",
|
||||||
@@ -78,18 +82,19 @@
|
|||||||
"friday": "Friday",
|
"friday": "Friday",
|
||||||
"general": "General",
|
"general": "General",
|
||||||
"get": "Get",
|
"get": "Get",
|
||||||
|
"home": "Home",
|
||||||
"image": "Image",
|
"image": "Image",
|
||||||
"image-upload-failed": "Image upload failed",
|
"image-upload-failed": "Image upload failed",
|
||||||
"import": "Import",
|
"import": "Import",
|
||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Keyword",
|
"keyword": "Keyword",
|
||||||
"link": "Link",
|
|
||||||
"link-copied": "Link Copied",
|
"link-copied": "Link Copied",
|
||||||
|
"loading-recipes": "Loading Recipes",
|
||||||
"monday": "Monday",
|
"monday": "Monday",
|
||||||
"more": "More",
|
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"new": "New",
|
"new": "New",
|
||||||
"no": "No",
|
"no": "No",
|
||||||
|
"no-recipe-found": "No Recipe Found",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"options": "Options:",
|
"options": "Options:",
|
||||||
"print": "Print",
|
"print": "Print",
|
||||||
@@ -139,8 +144,8 @@
|
|||||||
"group-id-with-value": "Group ID: {groupID}",
|
"group-id-with-value": "Group ID: {groupID}",
|
||||||
"group-name": "Group Name",
|
"group-name": "Group Name",
|
||||||
"group-not-found": "Group not found",
|
"group-not-found": "Group not found",
|
||||||
|
"group-with-value": "Group: {groupID}",
|
||||||
"groups": "Groups",
|
"groups": "Groups",
|
||||||
"groups-can-only-be-set-by-administrators": "Groups can only be set by administrators",
|
|
||||||
"manage-groups": "Manage Groups",
|
"manage-groups": "Manage Groups",
|
||||||
"user-group": "User Group",
|
"user-group": "User Group",
|
||||||
"user-group-created": "User Group Created",
|
"user-group-created": "User Group Created",
|
||||||
@@ -192,13 +197,20 @@
|
|||||||
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
||||||
"error-title": "Looks Like We Couldn't Find Anything",
|
"error-title": "Looks Like We Couldn't Find Anything",
|
||||||
"from-url": "Import a Recipe",
|
"from-url": "Import a Recipe",
|
||||||
|
"github-issues": "GitHub Issues",
|
||||||
|
"google-ld-json-info": "Google ld+json Info",
|
||||||
|
"must-be-a-valid-url": "Must be a Valid URL",
|
||||||
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
|
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
|
||||||
|
"recipe-markup-specification": "Recipe Markup Specification",
|
||||||
"recipe-url": "Recipe URL",
|
"recipe-url": "Recipe URL",
|
||||||
"url-form-hint": "Copy and paste a link from your favorite recipe website"
|
"upload-a-recipe": "Upload a Recipe",
|
||||||
|
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
|
||||||
|
"url-form-hint": "Copy and paste a link from your favorite recipe website",
|
||||||
|
"view-scraped-data": "View Scraped Data"
|
||||||
},
|
},
|
||||||
"page": {
|
"page": {
|
||||||
|
"404-page-not-found": "404 Page not found",
|
||||||
"all-recipes": "All Recipes",
|
"all-recipes": "All Recipes",
|
||||||
"home-page": "Home Page",
|
|
||||||
"new-page-created": "New page created",
|
"new-page-created": "New page created",
|
||||||
"page": "Page",
|
"page": "Page",
|
||||||
"page-creation-failed": "Page creation failed",
|
"page-creation-failed": "Page creation failed",
|
||||||
@@ -207,14 +219,12 @@
|
|||||||
"page-update-failed": "Page update failed",
|
"page-update-failed": "Page update failed",
|
||||||
"page-updated": "Page updated",
|
"page-updated": "Page updated",
|
||||||
"pages-update-failed": "Pages update failed",
|
"pages-update-failed": "Pages update failed",
|
||||||
"pages-updated": "Pages updated",
|
"pages-updated": "Pages updated"
|
||||||
"recent": "Recent"
|
|
||||||
},
|
},
|
||||||
"recipe": {
|
"recipe": {
|
||||||
"add-key": "Add Key",
|
"add-key": "Add Key",
|
||||||
"add-to-favorites": "Add to Favorites",
|
"add-to-favorites": "Add to Favorites",
|
||||||
"api-extras": "API Extras",
|
"api-extras": "API Extras",
|
||||||
"assets": "Assets",
|
|
||||||
"calories": "Calories",
|
"calories": "Calories",
|
||||||
"calories-suffix": "calories",
|
"calories-suffix": "calories",
|
||||||
"carbohydrate-content": "Carbohydrate",
|
"carbohydrate-content": "Carbohydrate",
|
||||||
@@ -236,11 +246,9 @@
|
|||||||
"key-name-required": "Key Name Required",
|
"key-name-required": "Key Name Required",
|
||||||
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
|
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
|
||||||
"milligrams": "milligrams",
|
"milligrams": "milligrams",
|
||||||
"new-asset": "New Asset",
|
|
||||||
"new-key-name": "New Key Name",
|
"new-key-name": "New Key Name",
|
||||||
"no-white-space-allowed": "No White Space Allowed",
|
"no-white-space-allowed": "No White Space Allowed",
|
||||||
"note": "Note",
|
"note": "Note",
|
||||||
"notes": "Notes",
|
|
||||||
"nutrition": "Nutrition",
|
"nutrition": "Nutrition",
|
||||||
"object-key": "Object Key",
|
"object-key": "Object Key",
|
||||||
"object-value": "Object Value",
|
"object-value": "Object Value",
|
||||||
@@ -260,18 +268,17 @@
|
|||||||
"recipe-updated": "Recipe updated",
|
"recipe-updated": "Recipe updated",
|
||||||
"remove-from-favorites": "Remove from Favorites",
|
"remove-from-favorites": "Remove from Favorites",
|
||||||
"remove-section": "Remove Section",
|
"remove-section": "Remove Section",
|
||||||
|
"save-recipe-before-use": "Save recipe before use",
|
||||||
"section-title": "Section Title",
|
"section-title": "Section Title",
|
||||||
"servings": "Servings",
|
"servings": "Servings",
|
||||||
"share-recipe-message": "I wanted to share my {0} recipe with you.",
|
"share-recipe-message": "I wanted to share my {0} recipe with you.",
|
||||||
"show-assets": "Show Assets",
|
|
||||||
"show-nutrition-values": "Show Nutrition Values",
|
"show-nutrition-values": "Show Nutrition Values",
|
||||||
"sodium-content": "Sodium",
|
"sodium-content": "Sodium",
|
||||||
"step-index": "Step: {step}",
|
"step-index": "Step: {step}",
|
||||||
"sugar-content": "Sugar",
|
"sugar-content": "Sugar",
|
||||||
"title": "Title",
|
"title": "Title",
|
||||||
"total-time": "Total Time",
|
"total-time": "Total Time",
|
||||||
"unable-to-delete-recipe": "Unable to Delete Recipe",
|
"unable-to-delete-recipe": "Unable to Delete Recipe"
|
||||||
"view-recipe": "View Recipe"
|
|
||||||
},
|
},
|
||||||
"reicpe": {
|
"reicpe": {
|
||||||
"no-recipe": "No Recipe"
|
"no-recipe": "No Recipe"
|
||||||
@@ -292,12 +299,12 @@
|
|||||||
"settings": {
|
"settings": {
|
||||||
"add-a-new-theme": "Add a New Theme",
|
"add-a-new-theme": "Add a New Theme",
|
||||||
"admin-settings": "Admin Settings",
|
"admin-settings": "Admin Settings",
|
||||||
"available-backups": "Available Backups",
|
|
||||||
"backup": {
|
"backup": {
|
||||||
"backup-created-at-response-export_path": "Backup Created at {path}",
|
"backup-created-at-response-export_path": "Backup Created at {path}",
|
||||||
"backup-deleted": "Backup deleted",
|
"backup-deleted": "Backup deleted",
|
||||||
"backup-tag": "Backup Tag",
|
"backup-tag": "Backup Tag",
|
||||||
"create-heading": "Create a Backup",
|
"create-heading": "Create a Backup",
|
||||||
|
"delete-backup": "Delete Backup",
|
||||||
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
|
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
|
||||||
"full-backup": "Full Backup",
|
"full-backup": "Full Backup",
|
||||||
"import-summary": "Import Summary",
|
"import-summary": "Import Summary",
|
||||||
@@ -305,7 +312,6 @@
|
|||||||
"unable-to-delete-backup": "Unable to Delete Backup."
|
"unable-to-delete-backup": "Unable to Delete Backup."
|
||||||
},
|
},
|
||||||
"backup-and-exports": "Backups",
|
"backup-and-exports": "Backups",
|
||||||
"backup-info": "Backups are exported in standard JSON format along with all the images stored on the file system. In your backup folder you'll find a .zip file that contains all of the recipe JSON and images from the database. Additionally, if you selected a markdown file, those will also be stored in the .zip file. To import a backup, it must be located in your backups folder. Automated backups are done each day at 3:00 AM.",
|
|
||||||
"change-password": "Change Password",
|
"change-password": "Change Password",
|
||||||
"current": "Version:",
|
"current": "Version:",
|
||||||
"custom-pages": "Custom Pages",
|
"custom-pages": "Custom Pages",
|
||||||
@@ -338,12 +344,8 @@
|
|||||||
"site-settings": "Site Settings",
|
"site-settings": "Site Settings",
|
||||||
"theme": {
|
"theme": {
|
||||||
"accent": "Accent",
|
"accent": "Accent",
|
||||||
"are-you-sure-you-want-to-delete-this-theme": "Are you sure you want to delete this theme?",
|
|
||||||
"choose-how-mealie-looks-to-you-set-your-theme-preference-to-follow-your-system-settings-or-choose-to-use-the-light-or-dark-theme": "Choose how Mealie looks to you. Set your theme preference to follow your system settings, or choose to use the light or dark theme.",
|
|
||||||
"dark": "Dark",
|
"dark": "Dark",
|
||||||
"dark-mode": "Dark Mode",
|
|
||||||
"default-to-system": "Default to system",
|
"default-to-system": "Default to system",
|
||||||
"delete-theme": "Delete Theme",
|
|
||||||
"error": "Error",
|
"error": "Error",
|
||||||
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
|
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
|
||||||
"error-deleting-theme": "Error deleting theme",
|
"error-deleting-theme": "Error deleting theme",
|
||||||
@@ -352,16 +354,13 @@
|
|||||||
"light": "Light",
|
"light": "Light",
|
||||||
"primary": "Primary",
|
"primary": "Primary",
|
||||||
"secondary": "Secondary",
|
"secondary": "Secondary",
|
||||||
"select-a-theme-from-the-dropdown-or-create-a-new-theme-note-that-the-default-theme-will-be-served-to-all-users-who-have-not-set-a-theme-preference": "Select a theme from the dropdown or create a new theme. Note that the default theme will be served to all users who have not set a theme preference.",
|
|
||||||
"success": "Success",
|
"success": "Success",
|
||||||
"switch-to-dark-mode": "Switch to dark mode",
|
"switch-to-dark-mode": "Switch to dark mode",
|
||||||
"switch-to-light-mode": "Switch to light mode",
|
"switch-to-light-mode": "Switch to light mode",
|
||||||
"theme": "Theme",
|
|
||||||
"theme-deleted": "Theme deleted",
|
"theme-deleted": "Theme deleted",
|
||||||
"theme-name": "Theme Name",
|
"theme-name": "Theme Name",
|
||||||
"theme-name-is-required": "Theme Name is required.",
|
"theme-name-is-required": "Theme Name is required.",
|
||||||
"theme-saved": "Theme Saved",
|
"theme-saved": "Theme Saved",
|
||||||
"theme-settings": "Theme Settings",
|
|
||||||
"theme-updated": "Theme updated",
|
"theme-updated": "Theme updated",
|
||||||
"warning": "Warning"
|
"warning": "Warning"
|
||||||
},
|
},
|
||||||
@@ -385,7 +384,6 @@
|
|||||||
"unorganized": "Unorganized"
|
"unorganized": "Unorganized"
|
||||||
},
|
},
|
||||||
"webhooks": {
|
"webhooks": {
|
||||||
"meal-planner-webhooks": "Meal Planner Webhooks",
|
|
||||||
"test-webhooks": "Test Webhooks",
|
"test-webhooks": "Test Webhooks",
|
||||||
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "The URLs listed below will receive webhooks containing the recipe data for the meal plan on it's scheduled day. Currently Webhooks will execute at",
|
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "The URLs listed below will receive webhooks containing the recipe data for the meal plan on it's scheduled day. Currently Webhooks will execute at",
|
||||||
"webhook-url": "Webhook URL",
|
"webhook-url": "Webhook URL",
|
||||||
@@ -402,8 +400,20 @@
|
|||||||
"shopping-list": "Shopping List",
|
"shopping-list": "Shopping List",
|
||||||
"shopping-lists": "Shopping Lists"
|
"shopping-lists": "Shopping Lists"
|
||||||
},
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"all-recipes": "All Recipes",
|
||||||
|
"categories": "Categories",
|
||||||
|
"dashboard": "Dashboard",
|
||||||
|
"home-page": "Home Page",
|
||||||
|
"manage-users": "Manage Users",
|
||||||
|
"migrations": "Migrations",
|
||||||
|
"profile": "Profile",
|
||||||
|
"search": "Search",
|
||||||
|
"site-settings": "Site Settings",
|
||||||
|
"tags": "Tags",
|
||||||
|
"toolbox": "Toolbox"
|
||||||
|
},
|
||||||
"signup": {
|
"signup": {
|
||||||
"display-name": "Display Name",
|
|
||||||
"error-signing-up": "Error Signing Up",
|
"error-signing-up": "Error Signing Up",
|
||||||
"sign-up": "Sign Up",
|
"sign-up": "Sign Up",
|
||||||
"sign-up-link-created": "Sign up link created",
|
"sign-up-link-created": "Sign up link created",
|
||||||
@@ -440,7 +450,6 @@
|
|||||||
"error-cannot-delete-super-user": "Error! Cannot Delete Super User",
|
"error-cannot-delete-super-user": "Error! Cannot Delete Super User",
|
||||||
"existing-password-does-not-match": "Existing password does not match",
|
"existing-password-does-not-match": "Existing password does not match",
|
||||||
"full-name": "Full Name",
|
"full-name": "Full Name",
|
||||||
"incorrect-username-or-password": "Incorrect username or password",
|
|
||||||
"link-id": "Link ID",
|
"link-id": "Link ID",
|
||||||
"link-name": "Link Name",
|
"link-name": "Link Name",
|
||||||
"login": "Login",
|
"login": "Login",
|
||||||
|
|||||||
@@ -1,391 +1,389 @@
|
|||||||
{
|
{
|
||||||
"404": {
|
|
||||||
"page-not-found": "404 side blev ikke fundet",
|
|
||||||
"take-me-home": "Tag mig hjem"
|
|
||||||
},
|
|
||||||
"about": {
|
"about": {
|
||||||
"about": "About",
|
"about": "Om",
|
||||||
"about-mealie": "About Mealie",
|
"about-mealie": "Om Mealie",
|
||||||
"api-docs": "API Docs",
|
"api-docs": "API dokumentation",
|
||||||
"api-port": "API Port",
|
"api-port": "API port",
|
||||||
"application-mode": "Application Mode",
|
"application-mode": "Applikationstilstand",
|
||||||
"database-type": "Database Type",
|
"database-type": "Database-type",
|
||||||
"database-url": "Database URL",
|
"database-url": "Database-url",
|
||||||
"default-group": "Default Group",
|
"default-group": "Standardgruppe",
|
||||||
"demo": "Demo",
|
"demo": "Demo",
|
||||||
"demo-status": "Demo Status",
|
"demo-status": "Demo status",
|
||||||
"development": "Development",
|
"development": "Udvikling",
|
||||||
"docs": "Docs",
|
"docs": "Dokumenter",
|
||||||
"download-log": "Download Log",
|
"download-log": "Download log",
|
||||||
"download-recipe-json": "Last Scraped JSON",
|
"download-recipe-json": "Sidst skrabet JSON",
|
||||||
"github": "Github",
|
"github": "Github",
|
||||||
"log-lines": "Log Lines",
|
"log-lines": "Log linjer",
|
||||||
"not-demo": "Not Demo",
|
"not-demo": "Ikke demo",
|
||||||
"portfolio": "Portfolio",
|
"portfolio": "Portfolio",
|
||||||
"production": "Production",
|
"production": "Produktion",
|
||||||
"support": "Support",
|
"support": "Hjælp",
|
||||||
"version": "Version"
|
"version": "Version"
|
||||||
},
|
},
|
||||||
|
"asset": {
|
||||||
|
"assets": "Ekstramateriale",
|
||||||
|
"code": "Kode",
|
||||||
|
"file": "Fil",
|
||||||
|
"image": "Billede",
|
||||||
|
"new-asset": "Ny aktiv",
|
||||||
|
"pdf": "PDF",
|
||||||
|
"recipe": "Opskrift",
|
||||||
|
"show-assets": "Vis ekstramateriale"
|
||||||
|
},
|
||||||
"category": {
|
"category": {
|
||||||
"category": "Category",
|
"category-created": "Kategori oprettet",
|
||||||
"category-created": "Category created",
|
"category-creation-failed": "Oprettelse af kategorien fejlede",
|
||||||
"category-creation-failed": "Category creation failed",
|
"category-deleted": "Kategori slettet",
|
||||||
"category-deleted": "Category Deleted",
|
"category-deletion-failed": "Sletning af kategori fejlede",
|
||||||
"category-deletion-failed": "Category deletion failed",
|
"category-filter": "Kategorifilter",
|
||||||
"category-filter": "Category Filter",
|
"category-update-failed": "Kategoriopdatering fejlede",
|
||||||
"category-update-failed": "Category update failed",
|
"category-updated": "Kategori opdateret",
|
||||||
"category-updated": "Category updated",
|
"uncategorized-count": "Ukategoriseret {count}"
|
||||||
"uncategorized-count": "Uncategorized {count}"
|
|
||||||
},
|
},
|
||||||
"events": {
|
"events": {
|
||||||
"apprise-url": "Apprise URL",
|
"apprise-url": "Apprise URL",
|
||||||
"database": "Database",
|
"database": "Database",
|
||||||
"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.",
|
"delete-event": "Slet event",
|
||||||
"notification": "Notification",
|
"new-notification-form-description": "Mealie bruger Apprise-biblioteket for at generere notifikationer. De giver mange muligheder for notifikationer til tjenester. Kig i deres wiki for en gennemgående guide til, hvordan en URL oprettes i din situation. Hvis muligt, kan valget af din type af notifikation omfatte flere ekstrafunktioner.",
|
||||||
"scheduled": "Scheduled",
|
"new-version": "Ny opdatering er tilgængelig!",
|
||||||
"something-went-wrong": "Something Went Wrong!",
|
"notification": "Notifikation",
|
||||||
"subscribed-events": "Subscribed Events",
|
"refresh": "Opdater",
|
||||||
"test-message-sent": "Test Message Sent",
|
"scheduled": "Planlagt",
|
||||||
"refresh": "Refresh",
|
"something-went-wrong": "Noget gik galt!",
|
||||||
"new-version": "New version available!"
|
"subscribed-events": "Abonnerede begivenheder",
|
||||||
|
"test-message-sent": "Testbesked sendt"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"apply": "Anvend",
|
|
||||||
"cancel": "Annuller",
|
"cancel": "Annuller",
|
||||||
"clear": "Clear",
|
"clear": "Ryd",
|
||||||
"close": "Luk",
|
"close": "Luk",
|
||||||
"confirm": "Bekræft",
|
"confirm": "Bekræft",
|
||||||
"confirm-delete-generic": "Are you sure you want to delete this?",
|
"confirm-delete-generic": "Er du sikker på, du vil slette dette?",
|
||||||
"copied": "Copied",
|
"copied": "Kopieret",
|
||||||
"create": "Opret",
|
"create": "Opret",
|
||||||
"created": "Created",
|
"created": "Oprettet",
|
||||||
"current-parenthesis": "(Current)",
|
"custom": "Brugerdefineret",
|
||||||
"custom": "Custom",
|
"dashboard": "Instrumentbræt",
|
||||||
"dashboard": "Dashboard",
|
|
||||||
"delete": "Slet",
|
"delete": "Slet",
|
||||||
"disabled": "Disabled",
|
"disabled": "Deaktiveret",
|
||||||
"download": "Hent",
|
"download": "Hent",
|
||||||
"edit": "Rediger",
|
"edit": "Rediger",
|
||||||
"enabled": "Aktiveret",
|
"enabled": "Aktiveret",
|
||||||
"exception": "Exception",
|
"exception": "Undtagelse",
|
||||||
"failed-count": "Failed: {count}",
|
"failed-count": "Fejlet: {count}",
|
||||||
"failure-uploading-file": "Failure uploading file",
|
"failure-uploading-file": "Fejl ved upload af fil",
|
||||||
"favorites": "Favorites",
|
"favorites": "Favoritter",
|
||||||
"field-required": "Felt påkrævet",
|
"field-required": "Felt påkrævet",
|
||||||
"file-folder-not-found": "File/folder not found",
|
"file-folder-not-found": "Fil/mappe ikke fundet",
|
||||||
"file-uploaded": "File uploaded",
|
"file-uploaded": "Fil uploadet",
|
||||||
"filter": "Filtrer",
|
"filter": "Filtrer",
|
||||||
"friday": "Fredag",
|
"friday": "Fredag",
|
||||||
"general": "General",
|
"general": "Generelt",
|
||||||
"get": "Get",
|
"get": "Hent",
|
||||||
"image": "Image",
|
"home": "Hjem",
|
||||||
"image-upload-failed": "Image upload failed",
|
"image": "Billede",
|
||||||
|
"image-upload-failed": "Upload af billede fejlede",
|
||||||
"import": "Importere",
|
"import": "Importere",
|
||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Keyword",
|
"keyword": "Nøgleord",
|
||||||
"link": "Link",
|
"link-copied": "Link kopieret",
|
||||||
"link-copied": "Link Copied",
|
"loading-recipes": "Indlæser opskrifter",
|
||||||
"monday": "Mandag",
|
"monday": "Mandag",
|
||||||
"more": "More",
|
|
||||||
"name": "Navn",
|
"name": "Navn",
|
||||||
"new": "New",
|
"new": "Ny",
|
||||||
"no": "Nej",
|
"no": "Nej",
|
||||||
|
"no-recipe-found": "Ingen opskrift fundet",
|
||||||
"ok": "Ok",
|
"ok": "Ok",
|
||||||
"options": "Options:",
|
"options": "Valgmuligheder:",
|
||||||
"print": "Print",
|
"print": "Print",
|
||||||
"random": "Tilfældig",
|
"random": "Tilfældig",
|
||||||
"rating": "Rating",
|
"rating": "Bedømmelse",
|
||||||
"recent": "Seneste",
|
"recent": "Seneste",
|
||||||
"recipe": "Recipe",
|
"recipe": "Opskrift",
|
||||||
"recipes": "Opskrifter",
|
"recipes": "Opskrifter",
|
||||||
"rename-object": "Rename {0}",
|
"rename-object": "Omdøb {0}",
|
||||||
"reset": "Nulstil",
|
"reset": "Nulstil",
|
||||||
"saturday": "Lørdag",
|
"saturday": "Lørdag",
|
||||||
"save": "Gem",
|
"save": "Gem",
|
||||||
"settings": "Indstillinger",
|
"settings": "Indstillinger",
|
||||||
"share": "Share",
|
"share": "Del",
|
||||||
"shuffle": "Shuffle",
|
"shuffle": "Bland",
|
||||||
"sort": "Sorter",
|
"sort": "Sorter",
|
||||||
"sort-alphabetically": "Alphabetical",
|
"sort-alphabetically": "Alfabetisk",
|
||||||
"status": "Status",
|
"status": "Status",
|
||||||
"submit": "Indsend",
|
"submit": "Indsend",
|
||||||
"success-count": "Success: {count}",
|
"success-count": "Succes: {count}",
|
||||||
"sunday": "Søndag",
|
"sunday": "Søndag",
|
||||||
"templates": "Templates:",
|
"templates": "Skabeloner:",
|
||||||
"test": "Test",
|
"test": "Afprøv",
|
||||||
"themes": "Temaer",
|
"themes": "Temaer",
|
||||||
"thursday": "Torsdag",
|
"thursday": "Torsdag",
|
||||||
"token": "Token",
|
"token": "Token",
|
||||||
"tuesday": "Tirsdag",
|
"tuesday": "Tirsdag",
|
||||||
"type": "Type",
|
"type": "Type",
|
||||||
"update": "Opdater",
|
"update": "Opdater",
|
||||||
"updated": "Updated",
|
"updated": "Opdateret",
|
||||||
"upload": "Upload",
|
"upload": "Upload",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
"view": "View",
|
"view": "Se",
|
||||||
"wednesday": "Onsdag",
|
"wednesday": "Onsdag",
|
||||||
"yes": "Ja"
|
"yes": "Ja"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Are you sure you want to delete <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Er du sikker på, du vil slette <b>{groupName}<b/>?",
|
||||||
"cannot-delete-default-group": "Cannot delete default group",
|
"cannot-delete-default-group": "Standardgruppen kan ikke blive slettet",
|
||||||
"cannot-delete-group-with-users": "Cannot delete group with users",
|
"cannot-delete-group-with-users": "En gruppe med brugere i kan ikke blive slettet",
|
||||||
"confirm-group-deletion": "Confirm Group Deletion",
|
"confirm-group-deletion": "Bekræft sletning af gruppe",
|
||||||
"create-group": "Create Group",
|
"create-group": "Opret gruppe",
|
||||||
"error-updating-group": "Error updating group",
|
"error-updating-group": "Fejl ved opdatering af gruppe",
|
||||||
"group": "Group",
|
"group": "Gruppe",
|
||||||
"group-deleted": "Group deleted",
|
"group-deleted": "Gruppe slettet",
|
||||||
"group-deletion-failed": "Group deletion failed",
|
"group-deletion-failed": "Sletning af gruppe fejlede",
|
||||||
"group-id-with-value": "Group ID: {groupID}",
|
"group-id-with-value": "Gruppe-ID: {groupID}",
|
||||||
"group-name": "Group Name",
|
"group-name": "Gruppenavn",
|
||||||
"group-not-found": "Group not found",
|
"group-not-found": "Gruppen blev ikke fundet",
|
||||||
"groups": "Groups",
|
"group-with-value": "Gruppe: {groupID}",
|
||||||
"groups-can-only-be-set-by-administrators": "Groups can only be set by administrators",
|
"groups": "Grupper",
|
||||||
"manage-groups": "Manage Groups",
|
"manage-groups": "Administrer grupper",
|
||||||
"user-group": "User Group",
|
"user-group": "Brugergruppe",
|
||||||
"user-group-created": "User Group Created",
|
"user-group-created": "Brugergruppe oprettet",
|
||||||
"user-group-creation-failed": "User Group Creation Failed"
|
"user-group-creation-failed": "Oprettelse af brugergruppe fejlede"
|
||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Opret en ny måltidsplan",
|
"create-a-new-meal-plan": "Opret en ny madplan",
|
||||||
"dinner-this-week": "Madplan denne uge",
|
"dinner-this-week": "Madplan denne uge",
|
||||||
"dinner-today": "Madplan i dag",
|
"dinner-today": "Madplan i dag",
|
||||||
"dinner-tonight": "DINNER TONIGHT",
|
"dinner-tonight": "AFTENSMAD I AFTEN",
|
||||||
"edit-meal-plan": "Rediger måltidsplan",
|
"edit-meal-plan": "Rediger madplan",
|
||||||
"end-date": "Slutdato",
|
"end-date": "Slutdato",
|
||||||
"group": "Group (Beta)",
|
"group": "Gruppér (Beta)",
|
||||||
"main": "Main",
|
"main": "Hovedret",
|
||||||
"meal-planner": "Meal Planner",
|
"meal-planner": "Madplanlægger",
|
||||||
"meal-plans": "Måltidsplaner",
|
"meal-plans": "Madplan",
|
||||||
"mealplan-categories": "MEALPLAN CATEGORIES",
|
"mealplan-categories": "MADPLANKATEGORIER",
|
||||||
"mealplan-created": "Mealplan created",
|
"mealplan-created": "Madplan oprettet",
|
||||||
"mealplan-creation-failed": "Mealplan creation failed",
|
"mealplan-creation-failed": "Oprettelse af madplan fejlede",
|
||||||
"mealplan-deleted": "Mealplan Deleted",
|
"mealplan-deleted": "Madplan slettet",
|
||||||
"mealplan-deletion-failed": "Mealplan deletion failed",
|
"mealplan-deletion-failed": "Sletning af madplan fejlede",
|
||||||
"mealplan-settings": "Mealplan Settings",
|
"mealplan-settings": "Madplansindstillinger",
|
||||||
"mealplan-update-failed": "Mealplan update failed",
|
"mealplan-update-failed": "Opdatering af madplanen fejlede",
|
||||||
"mealplan-updated": "Mealplan Updated",
|
"mealplan-updated": "Madplanen blev opdateret",
|
||||||
"no-meal-plan-defined-yet": "No meal plan defined yet",
|
"no-meal-plan-defined-yet": "Ingen madplan er defineret",
|
||||||
"no-meal-planned-for-today": "No meal planned for today",
|
"no-meal-planned-for-today": "Ingen ret er planlagt til i dag",
|
||||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Only recipes with these categories will be used in Meal Plans",
|
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Kun opskrifter med disse kategorier vil blive brugt i madplaner",
|
||||||
"planner": "Planlægger",
|
"planner": "Planlæg madplan",
|
||||||
"quick-week": "Quick Week",
|
"quick-week": "Hurtig uge",
|
||||||
"side": "Side",
|
"side": "Tilbehør",
|
||||||
"sides": "Sides",
|
"sides": "Tilbehør",
|
||||||
"start-date": "Start dato"
|
"start-date": "Start dato"
|
||||||
},
|
},
|
||||||
"migration": {
|
"migration": {
|
||||||
"chowdown": {
|
"chowdown": {
|
||||||
"description": "Migrate data from Chowdown",
|
"description": "Migrer data fra Chowdown",
|
||||||
"title": "Chowdown"
|
"title": "Chowdown"
|
||||||
},
|
},
|
||||||
"migration-data-removed": "Migration data removed",
|
"migration-data-removed": "Migrationsdata fjernet",
|
||||||
"nextcloud": {
|
"nextcloud": {
|
||||||
"description": "Migrate data from a Nextcloud Cookbook instance",
|
"description": "Migrer data fra Nextcloud Cookbook",
|
||||||
"title": "Nextcloud Cookbook"
|
"title": "Nextcould Cookbook"
|
||||||
},
|
},
|
||||||
"no-migration-data-available": "No Migration Data Available",
|
"no-migration-data-available": "Ingen migrationsdata er tilgængelig",
|
||||||
"recipe-migration": "Migrering af opskrifter"
|
"recipe-migration": "Migrering af opskrifter"
|
||||||
},
|
},
|
||||||
"new-recipe": {
|
"new-recipe": {
|
||||||
"bulk-add": "Bulk Tilføj",
|
"bulk-add": "Bulk Tilføj",
|
||||||
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
"error-details": "Kun hjemmesider med ID+JSON eller microdata kan blive importeret af Mealie. De fleste større opskriftshjemmesider bruger denne struktur. Opret et emne på GitHub, hvis en hjemmeside ikke kan blive importeret, men der er JSON-data i loggen.",
|
||||||
"error-title": "Looks Like We Couldn't Find Anything",
|
"error-title": "Det ser ud til, vi ikke kunne finde noget",
|
||||||
"from-url": "Fra URL",
|
"from-url": "Fra URL",
|
||||||
|
"github-issues": "GitHub problemer",
|
||||||
|
"google-ld-json-info": "Google ID+JSON information",
|
||||||
|
"must-be-a-valid-url": "Det skal være en korrekt URL",
|
||||||
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Indsæt dine opskriftsdata. \nHver linje behandles som et element på en liste",
|
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Indsæt dine opskriftsdata. \nHver linje behandles som et element på en liste",
|
||||||
|
"recipe-markup-specification": "Opskriftsmarkupspecifikation",
|
||||||
"recipe-url": "URL på opskrift",
|
"recipe-url": "URL på opskrift",
|
||||||
"url-form-hint": "Kopiér og indsæt et link fra din foretrukne opskrifts hjemmeside"
|
"upload-a-recipe": "Upload en opskrift",
|
||||||
|
"upload-individual-zip-file": "Opload en individuel .zip-fil, eksporteret fra en anden Mealie-instans.",
|
||||||
|
"url-form-hint": "Kopiér og indsæt et link fra din foretrukne opskrifts hjemmeside",
|
||||||
|
"view-scraped-data": "Vis skrabet data"
|
||||||
},
|
},
|
||||||
"page": {
|
"page": {
|
||||||
|
"404-page-not-found": "404 Siden blev ikke fundet",
|
||||||
"all-recipes": "Alle Opskrifter",
|
"all-recipes": "Alle Opskrifter",
|
||||||
"home-page": "Startside",
|
"new-page-created": "Ny side blev oprettet",
|
||||||
"new-page-created": "New page created",
|
"page": "Side",
|
||||||
"page": "Page",
|
"page-creation-failed": "Oprettelse af side fejlede",
|
||||||
"page-creation-failed": "Page creation failed",
|
"page-deleted": "Side slettet",
|
||||||
"page-deleted": "Page deleted",
|
"page-deletion-failed": "Sletning af side fejlede",
|
||||||
"page-deletion-failed": "Page deletion failed",
|
"page-update-failed": "Opdatering af side fejlede",
|
||||||
"page-update-failed": "Page update failed",
|
"page-updated": "Side opdateret",
|
||||||
"page-updated": "Page updated",
|
"pages-update-failed": "Opdatering af sider fejlede",
|
||||||
"pages-update-failed": "Pages update failed",
|
"pages-updated": "Sider opdateret"
|
||||||
"pages-updated": "Pages updated",
|
|
||||||
"recent": "Seneste"
|
|
||||||
},
|
},
|
||||||
"recipe": {
|
"recipe": {
|
||||||
"add-key": "Add Key",
|
"add-key": "Tilføj nøgle",
|
||||||
"add-to-favorites": "Add to Favorites",
|
"add-to-favorites": "Tilføj til favoritter",
|
||||||
"api-extras": "API Extras",
|
"api-extras": "API-ekstramateriale",
|
||||||
"assets": "Assets",
|
"calories": "Kalorier",
|
||||||
"calories": "Calories",
|
"calories-suffix": "kalorier",
|
||||||
"calories-suffix": "calories",
|
"carbohydrate-content": "Kulhydrat",
|
||||||
"carbohydrate-content": "Carbohydrate",
|
|
||||||
"categories": "Kategorier",
|
"categories": "Kategorier",
|
||||||
"comment-action": "Comment",
|
"comment-action": "Kommentar",
|
||||||
"comments": "Comments",
|
"comments": "Kommentarer",
|
||||||
"delete-confirmation": "Are you sure you want to delete this recipe?",
|
"delete-confirmation": "Er du sikker på, du vil slette denne opskrift?",
|
||||||
"delete-recipe": "Delete Recipe",
|
"delete-recipe": "Slet opskrift",
|
||||||
"description": "Beskrivelse",
|
"description": "Beskrivelse",
|
||||||
"disable-amount": "Disable Ingredient Amounts",
|
"disable-amount": "Slå ingrediensmængder fra",
|
||||||
"disable-comments": "Disable Comments",
|
"disable-comments": "Slå kommentarer fra",
|
||||||
"fat-content": "Fat",
|
"fat-content": "Fedt",
|
||||||
"fiber-content": "Fiber",
|
"fiber-content": "Fiber",
|
||||||
"grams": "grams",
|
"grams": "gram",
|
||||||
"ingredient": "Ingrediens",
|
"ingredient": "Ingrediens",
|
||||||
"ingredients": "Ingredienser",
|
"ingredients": "Ingredienser",
|
||||||
"insert-section": "Insert Section",
|
"insert-section": "Indsæt sektion",
|
||||||
"instructions": "Instruktioner",
|
"instructions": "Instruktioner",
|
||||||
"key-name-required": "Key Name Required",
|
"key-name-required": "Nøglenavn påkrævet",
|
||||||
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
|
"landscape-view-coming-soon": "Liggende visning (Kommer snart)",
|
||||||
"milligrams": "milligrams",
|
"milligrams": "milligram",
|
||||||
"new-asset": "New Asset",
|
"new-key-name": "Nyt nøglenavn",
|
||||||
"new-key-name": "New Key Name",
|
"no-white-space-allowed": "Mellemrum er ikke tilladt",
|
||||||
"no-white-space-allowed": "No White Space Allowed",
|
|
||||||
"note": "Bemærk",
|
"note": "Bemærk",
|
||||||
"notes": "Bemærkninger",
|
"nutrition": "Ernæring",
|
||||||
"nutrition": "Nutrition",
|
"object-key": "Objektnøgle",
|
||||||
"object-key": "Object Key",
|
"object-value": "Objektværdi",
|
||||||
"object-value": "Object Value",
|
|
||||||
"original-url": "Oprindelig opskrift",
|
"original-url": "Oprindelig opskrift",
|
||||||
"perform-time": "Cook Time",
|
"perform-time": "Tilberedningstid",
|
||||||
"prep-time": "Prep Time",
|
"prep-time": "Forberedelsestid",
|
||||||
"protein-content": "Protein",
|
"protein-content": "Protein",
|
||||||
"public-recipe": "Public Recipe",
|
"public-recipe": "Offentlig opskrift",
|
||||||
"recipe-created": "Recipe created",
|
"recipe-created": "Opskrift oprettet",
|
||||||
"recipe-creation-failed": "Recipe creation failed",
|
"recipe-creation-failed": "Oprettelse af opskrift fejlede",
|
||||||
"recipe-deleted": "Recipe deleted",
|
"recipe-deleted": "Opskrift slettet",
|
||||||
"recipe-image": "Recipe Image",
|
"recipe-image": "Opskriftsbillede",
|
||||||
"recipe-image-updated": "Recipe image updated",
|
"recipe-image-updated": "Opskriftsbillede opdateret",
|
||||||
"recipe-name": "Opskriftens navn",
|
"recipe-name": "Opskriftens navn",
|
||||||
"recipe-settings": "Recipe Settings",
|
"recipe-settings": "Opskriftsindstillinger",
|
||||||
"recipe-update-failed": "Recipe update failed",
|
"recipe-update-failed": "Opdatering af opskrift fejlede",
|
||||||
"recipe-updated": "Recipe updated",
|
"recipe-updated": "Opskrift opdateret",
|
||||||
"remove-from-favorites": "Remove from Favorites",
|
"remove-from-favorites": "Fjern fra favoritter",
|
||||||
"remove-section": "Remove Section",
|
"remove-section": "Fjern sektion",
|
||||||
"section-title": "Section Title",
|
"save-recipe-before-use": "Gem opskrift før brug",
|
||||||
|
"section-title": "Sektionstitel",
|
||||||
"servings": "Portioner",
|
"servings": "Portioner",
|
||||||
"share-recipe-message": "I wanted to share my {0} recipe with you.",
|
"share-recipe-message": "Jeg vil gerne dele min opskrift \"{0}\" med dig.",
|
||||||
"show-assets": "Show Assets",
|
"show-nutrition-values": "Vis ernæringstabel",
|
||||||
"show-nutrition-values": "Show Nutrition Values",
|
"sodium-content": "Natrium",
|
||||||
"sodium-content": "Sodium",
|
|
||||||
"step-index": "Trin: {step}",
|
"step-index": "Trin: {step}",
|
||||||
"sugar-content": "Sugar",
|
"sugar-content": "Sukker",
|
||||||
"title": "Title",
|
"title": "Titel",
|
||||||
"total-time": "Total Time",
|
"total-time": "Total tid",
|
||||||
"unable-to-delete-recipe": "Unable to Delete Recipe",
|
"unable-to-delete-recipe": "Kunne ikke slette opskrift"
|
||||||
"view-recipe": "Se opskrift"
|
|
||||||
},
|
},
|
||||||
"reicpe": {
|
"reicpe": {
|
||||||
"no-recipe": "No Recipe"
|
"no-recipe": "Ingen opskrift"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Advanced Search",
|
"advanced-search": "Avanceret søgning",
|
||||||
"and": "and",
|
"and": "og",
|
||||||
"exclude": "Exclude",
|
"exclude": "Ekskluder",
|
||||||
"include": "Include",
|
"include": "Inkluder",
|
||||||
"max-results": "Max Results",
|
"max-results": "Maksimalt antal resultater",
|
||||||
"or": "Or",
|
"or": "Eller",
|
||||||
"results": "Results",
|
"results": "Resultater",
|
||||||
"search": "Search",
|
"search": "Søg",
|
||||||
"search-mealie": "Search Mealie (press /)",
|
"search-mealie": "Søg Mealie (tryk /)",
|
||||||
"search-placeholder": "Search...",
|
"search-placeholder": "Søg...",
|
||||||
"tag-filter": "Tag Filter"
|
"tag-filter": "Tagfiler"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"add-a-new-theme": "Tilføj et nyt tema",
|
"add-a-new-theme": "Tilføj et nyt tema",
|
||||||
"admin-settings": "Admin Settings",
|
"admin-settings": "Administratorindstillinger",
|
||||||
"available-backups": "Available Backups",
|
|
||||||
"backup": {
|
"backup": {
|
||||||
"backup-created-at-response-export_path": "Backup Created at {path}",
|
"backup-created-at-response-export_path": "Backup oprettet ved {path}",
|
||||||
"backup-deleted": "Backup deleted",
|
"backup-deleted": "Backup slettet",
|
||||||
"backup-tag": "Backup Tag",
|
"backup-tag": "Backupnavn",
|
||||||
"create-heading": "Create a Backup",
|
"create-heading": "Opret en backup",
|
||||||
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
|
"delete-backup": "Slet backup",
|
||||||
"full-backup": "Full Backup",
|
"error-creating-backup-see-log-file": "Der opstod en fejl under oprettelse af backuppen. Se log-filen",
|
||||||
"import-summary": "Import Summary",
|
"full-backup": "Fuld backup",
|
||||||
"partial-backup": "Partial Backup",
|
"import-summary": "Importer resumé",
|
||||||
"unable-to-delete-backup": "Unable to Delete Backup."
|
"partial-backup": "Delvis backup",
|
||||||
|
"unable-to-delete-backup": "Ude af stand til at slette backup."
|
||||||
},
|
},
|
||||||
"backup-and-exports": "Backup og eksport",
|
"backup-and-exports": "Backup og eksport",
|
||||||
"backup-info": "Sikkerhedskopier eksporteres i standard JSON-format sammen med alle de billeder, der er gemt på filsystemet. \nI din sikkerhedskopimappe finder du en .zip-fil, der indeholder alle opskrifterne JSON og billeder fra databasen. \nDerudover, hvis du valgte en markdown-fil, gemmes disse også i .zip-filen. \nFor at importere en sikkerhedskopi skal den være placeret i din sikkerhedskopimappe. \nAutomatiske sikkerhedskopier udføres hver dag kl. 3:00.",
|
"change-password": "Skift kodeord",
|
||||||
"change-password": "Change Password",
|
|
||||||
"current": "Version:",
|
"current": "Version:",
|
||||||
"custom-pages": "Custom Pages",
|
"custom-pages": "Brugerdefinerede sider",
|
||||||
"edit-page": "Edit Page",
|
"edit-page": "Rediger side",
|
||||||
"events": "Events",
|
"events": "Begivenheder",
|
||||||
"first-day-of-week": "First day of the week",
|
"first-day-of-week": "Første dag i ugen",
|
||||||
"group-settings-updated": "Group Settings Updated",
|
"group-settings-updated": "Gruppeindstillinger blev opdateret",
|
||||||
"homepage": {
|
"homepage": {
|
||||||
"all-categories": "All Categories",
|
"all-categories": "Alle kategorier",
|
||||||
"card-per-section": "Card Per Section",
|
"card-per-section": "Kort per sektion",
|
||||||
"home-page": "Home Page",
|
"home-page": "Forside",
|
||||||
"home-page-sections": "Home Page Sections",
|
"home-page-sections": "Forsidesektioner",
|
||||||
"show-recent": "Show Recent"
|
"show-recent": "Vis seneste opskrifter"
|
||||||
},
|
},
|
||||||
"language": "Language",
|
"language": "Sprog",
|
||||||
"latest": "Seneste:",
|
"latest": "Seneste:",
|
||||||
"local-api": "Local API",
|
"local-api": "Lokal API",
|
||||||
"locale-settings": "Locale settings",
|
"locale-settings": "Lokale indstillinger",
|
||||||
"migrations": "Migrations",
|
"migrations": "Migrationer",
|
||||||
"new-page": "New Page",
|
"new-page": "Ny side",
|
||||||
"notify": "Notify",
|
"notify": "Notifikationer",
|
||||||
"organize": "Organize",
|
"organize": "Organiser",
|
||||||
"page-name": "Page Name",
|
"page-name": "Sidenavn",
|
||||||
"pages": "Pages",
|
"pages": "Sider",
|
||||||
"profile": "Profile",
|
"profile": "Profil",
|
||||||
"remove-existing-entries-matching-imported-entries": "Remove existing entries matching imported entries",
|
"remove-existing-entries-matching-imported-entries": "Fjern eksisterende indtastninger, hvis de matcher de importerede",
|
||||||
"set-new-time": "Indstil ny tid",
|
"set-new-time": "Indstil ny tid",
|
||||||
"settings-update-failed": "Settings update failed",
|
"settings-update-failed": "Ændring af indstillinger fejlede",
|
||||||
"settings-updated": "Settings updated",
|
"settings-updated": "Indstillinger ændret",
|
||||||
"site-settings": "Site Settings",
|
"site-settings": "Sideindstillinger",
|
||||||
"theme": {
|
"theme": {
|
||||||
"accent": "Accent",
|
"accent": "Accent",
|
||||||
"are-you-sure-you-want-to-delete-this-theme": "Er du sikker på, at du vil slette dette tema?",
|
|
||||||
"choose-how-mealie-looks-to-you-set-your-theme-preference-to-follow-your-system-settings-or-choose-to-use-the-light-or-dark-theme": "Vælg, hvordan Mealie ser ud for dig. \nIndstil dit tema til at følge dine systemindstillinger, eller vælg at bruge det lyse eller mørke tema.",
|
|
||||||
"dark": "Mørkt",
|
"dark": "Mørkt",
|
||||||
"dark-mode": "Mørk tilstand",
|
"default-to-system": "Systemstandard",
|
||||||
"default-to-system": "Default to system",
|
|
||||||
"delete-theme": "Slet tema",
|
|
||||||
"error": "Fejl",
|
"error": "Fejl",
|
||||||
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
|
"error-creating-theme-see-log-file": "En fejl opstod ved oprettelse af temaet. Se logfilen.",
|
||||||
"error-deleting-theme": "Error deleting theme",
|
"error-deleting-theme": "En fejl opstod ved sletning af temaet",
|
||||||
"error-updating-theme": "Error updating theme",
|
"error-updating-theme": "En fejl opstod ved opdatering af temaet",
|
||||||
"info": "Info",
|
"info": "Information",
|
||||||
"light": "Lyst",
|
"light": "Lyst",
|
||||||
"primary": "Primær",
|
"primary": "Primær",
|
||||||
"secondary": "Sekundær",
|
"secondary": "Sekundær",
|
||||||
"select-a-theme-from-the-dropdown-or-create-a-new-theme-note-that-the-default-theme-will-be-served-to-all-users-who-have-not-set-a-theme-preference": "Vælg et tema i rullemenuen, eller opret et nyt tema. \nBemærk, at standardtemaet serveres til alle brugere, der ikke har angivet en temapræference.",
|
|
||||||
"success": "Succes",
|
"success": "Succes",
|
||||||
"switch-to-dark-mode": "Switch to dark mode",
|
"switch-to-dark-mode": "Skift til mørkt udseende",
|
||||||
"switch-to-light-mode": "Switch to light mode",
|
"switch-to-light-mode": "Skift til lyst udseende",
|
||||||
"theme": "Tema",
|
"theme-deleted": "Tema slettet",
|
||||||
"theme-deleted": "Theme deleted",
|
"theme-name": "Temanavn",
|
||||||
"theme-name": "Theme Name",
|
"theme-name-is-required": "Temanavnet er påkrævet.",
|
||||||
"theme-name-is-required": "Theme Name is required.",
|
"theme-saved": "Tema gemt",
|
||||||
"theme-saved": "Theme Saved",
|
"theme-updated": "Tema opdateret",
|
||||||
"theme-settings": "Temaindstillinger",
|
|
||||||
"theme-updated": "Theme updated",
|
|
||||||
"warning": "Advarsel"
|
"warning": "Advarsel"
|
||||||
},
|
},
|
||||||
"token": {
|
"token": {
|
||||||
"active-tokens": "ACTIVE TOKENS",
|
"active-tokens": "Aktive tokens",
|
||||||
"api-token": "API Token",
|
"api-token": "API Token",
|
||||||
"api-tokens": "API Tokens",
|
"api-tokens": "API Tokens",
|
||||||
"copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Copy this token for use with an external application. This token will not be viewable again.",
|
"copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Kopier denne token ved brug i en anden applikation. Denne token kan ikke ses igen.",
|
||||||
"create-an-api-token": "Create an API Token",
|
"create-an-api-token": "Opret en API token",
|
||||||
"token-name": "Token Name"
|
"token-name": "Tokennavn"
|
||||||
},
|
},
|
||||||
"toolbox": {
|
"toolbox": {
|
||||||
"assign-all": "Assign All",
|
"assign-all": "Tildel alle",
|
||||||
"bulk-assign": "Bulk Assign",
|
"bulk-assign": "Massetildeling",
|
||||||
"new-name": "New Name",
|
"new-name": "Nyt navn",
|
||||||
"no-unused-items": "No Unused Items",
|
"no-unused-items": "Ingen ubrugte punkter",
|
||||||
"recipes-affected": "No Recipes Affected|One Recipe Affected|{count} Recipes Affected",
|
"recipes-affected": "Ingen opskrifter blev påvirket|En opskrift blev påvirket|{count} opskrifter blev påvirket",
|
||||||
"remove-unused": "Remove Unused",
|
"remove-unused": "Slet ubrugte",
|
||||||
"title-case-all": "Title Case All",
|
"title-case-all": "Stort forbogstav på alle",
|
||||||
"toolbox": "Toolbox",
|
"toolbox": "Værktøjskasse",
|
||||||
"unorganized": "Unorganized"
|
"unorganized": "Uorganiseret"
|
||||||
},
|
},
|
||||||
"webhooks": {
|
"webhooks": {
|
||||||
"meal-planner-webhooks": "Måltidsplanlægning Webhooks",
|
|
||||||
"test-webhooks": "Test Webhooks",
|
"test-webhooks": "Test Webhooks",
|
||||||
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "Webadresserne, der er anført nedenfor, modtager webhooks, der indeholder opskriftsdataene for måltidsplanen på den planlagte dag. \nWebhooks udføres i øjeblikket på <strong> {time} </strong>",
|
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "Webadresserne, der er anført nedenfor, modtager webhooks, der indeholder opskriftsdataene for måltidsplanen på den planlagte dag. \nWebhooks udføres i øjeblikket på <strong> {time} </strong>",
|
||||||
"webhook-url": "Webhook adresse",
|
"webhook-url": "Webhook adresse",
|
||||||
@@ -393,88 +391,99 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"shopping-list": {
|
"shopping-list": {
|
||||||
"all-lists": "All Lists",
|
"all-lists": "Alle lister",
|
||||||
"create-shopping-list": "Create Shopping List",
|
"create-shopping-list": "Lav indkøbsliste",
|
||||||
"from-recipe": "From Recipe",
|
"from-recipe": "Fra opskrift",
|
||||||
"list-name": "List Name",
|
"list-name": "Listenavn",
|
||||||
"new-list": "New List",
|
"new-list": "Ny liste",
|
||||||
"quantity": "Quantity: {0}",
|
"quantity": "Antal: {0}",
|
||||||
"shopping-list": "Shopping List",
|
"shopping-list": "Indkøbsliste",
|
||||||
"shopping-lists": "Shopping Lists"
|
"shopping-lists": "Indkøbslister"
|
||||||
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"all-recipes": "Alle opskr.",
|
||||||
|
"categories": "Kategorier",
|
||||||
|
"dashboard": "Instrumentbræt",
|
||||||
|
"home-page": "Forside",
|
||||||
|
"manage-users": "Adm. brugere",
|
||||||
|
"migrations": "Migrationer",
|
||||||
|
"profile": "Profil",
|
||||||
|
"search": "Søg",
|
||||||
|
"site-settings": "Sideindstil.",
|
||||||
|
"tags": "Tags",
|
||||||
|
"toolbox": "Værktøjskasse"
|
||||||
},
|
},
|
||||||
"signup": {
|
"signup": {
|
||||||
"display-name": "Display Name",
|
"error-signing-up": "Fejl i forbindelse med oprettelse af bruger",
|
||||||
"error-signing-up": "Error Signing Up",
|
"sign-up": "Opret bruger",
|
||||||
"sign-up": "Sign Up",
|
"sign-up-link-created": "Brugeroprettelseslink oprettet",
|
||||||
"sign-up-link-created": "Sign up link created",
|
"sign-up-link-creation-failed": "Oprettelsen af brugeroprettelseslink fejlede",
|
||||||
"sign-up-link-creation-failed": "Sign up link creation failed",
|
"sign-up-links": "Brugeroprettelseslinks",
|
||||||
"sign-up-links": "Sign Up Links",
|
"sign-up-token-deleted": "Brugeroprettelsestoken blev slettet",
|
||||||
"sign-up-token-deleted": "Sign Up Token Deleted",
|
"sign-up-token-deletion-failed": "Sletning af brugeroprettelsestoken fejlede",
|
||||||
"sign-up-token-deletion-failed": "Sign up token deletion failed",
|
"welcome-to-mealie": "Velkommen til Mealie. For at oprette en bruger på denne hjemmeside, kræves det at du har et validt invitationslink. Har du ikke fået en invitation, kan du ikke oprette en bruger. For at få et link, skal du kontakte sideadministratoren."
|
||||||
"welcome-to-mealie": "Welcome to Mealie! To become a user of this instance you are required to have a valid invitation link. If you haven't recieved an invitation you are unable to sign-up. To recieve a link, contact the sites administrator."
|
|
||||||
},
|
},
|
||||||
"tag": {
|
"tag": {
|
||||||
"tag-created": "Tag created",
|
"tag-created": "Tag oprettet",
|
||||||
"tag-creation-failed": "Tag creation failed",
|
"tag-creation-failed": "Oprettelse af tag fejlede",
|
||||||
"tag-deleted": "Tag deleted",
|
"tag-deleted": "Tag blev slettet",
|
||||||
"tag-deletion-failed": "Tag deletion failed",
|
"tag-deletion-failed": "Sletning af tag fejlede",
|
||||||
"tag-update-failed": "Tag update failed",
|
"tag-update-failed": "Opdatering af tag fejlede",
|
||||||
"tag-updated": "Tag updated",
|
"tag-updated": "Tag blev opdateret",
|
||||||
"tags": "Tags",
|
"tags": "Tags",
|
||||||
"untagged-count": "Untagged {count}"
|
"untagged-count": "Ikke-tagget: {count}"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Administrator",
|
"admin": "Administrator",
|
||||||
"are-you-sure-you-want-to-delete-the-link": "Are you sure you want to delete the link <b>{link}<b/>?",
|
"are-you-sure-you-want-to-delete-the-link": "Er du sikker på, at du vil slette linket \"<b>{link}<b/>\"?",
|
||||||
"are-you-sure-you-want-to-delete-the-user": "Er du sikker på, at du vil slette brugeren <b>{activeName} med ID: {activeId}<b/>?",
|
"are-you-sure-you-want-to-delete-the-user": "Er du sikker på, at du vil slette brugeren <b>{activeName} med ID: {activeId}<b/>?",
|
||||||
"confirm-link-deletion": "Confirm Link Deletion",
|
"confirm-link-deletion": "Bekræft sletning af link",
|
||||||
"confirm-password": "Confirm Password",
|
"confirm-password": "Bekræft adgangskode",
|
||||||
"confirm-user-deletion": "Bekræft Sletning Af Bruger",
|
"confirm-user-deletion": "Bekræft Sletning Af Bruger",
|
||||||
"could-not-validate-credentials": "Could Not Validate Credentials",
|
"could-not-validate-credentials": "Kunne verificere legitimationsoplysninger",
|
||||||
"create-link": "Create Link",
|
"create-link": "Link blev oprettet",
|
||||||
"create-user": "Opret bruger",
|
"create-user": "Opret bruger",
|
||||||
"current-password": "Current Password",
|
"current-password": "Nuværende kodeord",
|
||||||
"e-mail-must-be-valid": "E-mail must be valid",
|
"e-mail-must-be-valid": "E-mailen skal være valid",
|
||||||
"edit-user": "Rediger bruger",
|
"edit-user": "Rediger bruger",
|
||||||
"email": "E-mail",
|
"email": "E-mail",
|
||||||
"error-cannot-delete-super-user": "Error! Cannot Delete Super User",
|
"error-cannot-delete-super-user": "Fejl! Kan ikke slette super-brugeren",
|
||||||
"existing-password-does-not-match": "Existing password does not match",
|
"existing-password-does-not-match": "Nuværende adgangskode matcher ikke",
|
||||||
"full-name": "Fulde navn",
|
"full-name": "Fulde navn",
|
||||||
"incorrect-username-or-password": "Incorrect username or password",
|
|
||||||
"link-id": "Link ID",
|
"link-id": "Link ID",
|
||||||
"link-name": "Link Name",
|
"link-name": "Linknavn",
|
||||||
"login": "Login",
|
"login": "Log på",
|
||||||
"logout": "Log ud",
|
"logout": "Log ud",
|
||||||
"manage-users": "Manage Users",
|
"manage-users": "Administrer brugere",
|
||||||
"new-password": "New Password",
|
"new-password": "Ny adgangskode",
|
||||||
"new-user": "Ny bruger",
|
"new-user": "Ny bruger",
|
||||||
"password": "Adgangskode",
|
"password": "Adgangskode",
|
||||||
"password-has-been-reset-to-the-default-password": "Password has been reset to the default password",
|
"password-has-been-reset-to-the-default-password": "Adgangskode er blevet nulstillet til systemstandarden",
|
||||||
"password-must-match": "Password must match",
|
"password-must-match": "Adgangskode skal matche",
|
||||||
"password-reset-failed": "Password reset failed",
|
"password-reset-failed": "Nulstilling af adgangskode fejlede",
|
||||||
"password-updated": "Password updated",
|
"password-updated": "Adgangskoden blev opdateret",
|
||||||
"reset-password": "Reset Password",
|
"reset-password": "Nulstil adgangskoden",
|
||||||
"sign-in": "Log ind",
|
"sign-in": "Log ind",
|
||||||
"total-mealplans": "Antal Madplaner",
|
"total-mealplans": "Antal Madplaner",
|
||||||
"total-users": "Antal brugere",
|
"total-users": "Antal brugere",
|
||||||
"upload-photo": "Upload Photo",
|
"upload-photo": "Upload billede",
|
||||||
"use-8-characters-or-more-for-your-password": "Use 8 characters or more for your password",
|
"use-8-characters-or-more-for-your-password": "Adgangskode skal indeholde 8 tegn eller flere",
|
||||||
"user": "User",
|
"user": "Bruger",
|
||||||
"user-created": "User created",
|
"user-created": "Brugeren blev oprettet",
|
||||||
"user-creation-failed": "User creation failed",
|
"user-creation-failed": "Oprettelsen af brugeren fejlede",
|
||||||
"user-deleted": "User deleted",
|
"user-deleted": "Brugeren blev slettet",
|
||||||
"user-id": "Bruger ID",
|
"user-id": "Bruger ID",
|
||||||
"user-id-with-value": "Bruger ID: {id}",
|
"user-id-with-value": "Bruger ID: {id}",
|
||||||
"user-password": "Adgangskode",
|
"user-password": "Adgangskode",
|
||||||
"user-successfully-logged-in": "User Successfully Logged In",
|
"user-successfully-logged-in": "Brugeren blev succesfuld logget ind",
|
||||||
"user-update-failed": "User update failed",
|
"user-update-failed": "Opdatering af bruger fejlede",
|
||||||
"user-updated": "User updated",
|
"user-updated": "Bruger opdateret",
|
||||||
"username": "Username",
|
"username": "Brugernavn",
|
||||||
"users": "Users",
|
"users": "Brugere",
|
||||||
"users-header": "USERS",
|
"users-header": "BRUGERE",
|
||||||
"webhook-time": "Webhook Tid",
|
"webhook-time": "Webhook Tid",
|
||||||
"webhooks-enabled": "Webhooks Aktiveret",
|
"webhooks-enabled": "Webhooks Aktiveret",
|
||||||
"you-are-not-allowed-to-create-a-user": "You are not allowed to create a user",
|
"you-are-not-allowed-to-create-a-user": "Du har ikke rettigheder til at oprette en ny bruger",
|
||||||
"you-are-not-allowed-to-delete-this-user": "You are not allowed to delete this user"
|
"you-are-not-allowed-to-delete-this-user": "Du har ikke rettigheder til at slette denne bruger"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,6 @@
|
|||||||
{
|
{
|
||||||
"404": {
|
|
||||||
"page-not-found": "404 Seite nicht gefunden",
|
|
||||||
"take-me-home": "Zurück"
|
|
||||||
},
|
|
||||||
"about": {
|
"about": {
|
||||||
"about": "About",
|
"about": "Über",
|
||||||
"about-mealie": "Über Mealie",
|
"about-mealie": "Über Mealie",
|
||||||
"api-docs": "API Dokumentation",
|
"api-docs": "API Dokumentation",
|
||||||
"api-port": "API Port",
|
"api-port": "API Port",
|
||||||
@@ -17,7 +13,7 @@
|
|||||||
"development": "Entwicklung",
|
"development": "Entwicklung",
|
||||||
"docs": "Dokumentation",
|
"docs": "Dokumentation",
|
||||||
"download-log": "Protokoll herunterladen",
|
"download-log": "Protokoll herunterladen",
|
||||||
"download-recipe-json": "Last Scraped JSON",
|
"download-recipe-json": "Zuletzt geladenes JSON",
|
||||||
"github": "GitHub",
|
"github": "GitHub",
|
||||||
"log-lines": "Protokoll",
|
"log-lines": "Protokoll",
|
||||||
"not-demo": "Keine Demo",
|
"not-demo": "Keine Demo",
|
||||||
@@ -26,8 +22,17 @@
|
|||||||
"support": "Unterstützen",
|
"support": "Unterstützen",
|
||||||
"version": "Version"
|
"version": "Version"
|
||||||
},
|
},
|
||||||
|
"asset": {
|
||||||
|
"assets": "Anhänge",
|
||||||
|
"code": "Quelltext",
|
||||||
|
"file": "Datei",
|
||||||
|
"image": "Bild",
|
||||||
|
"new-asset": "Neuer Anhang",
|
||||||
|
"pdf": "PDF",
|
||||||
|
"recipe": "Rezept",
|
||||||
|
"show-assets": "Anhänge anzeigen"
|
||||||
|
},
|
||||||
"category": {
|
"category": {
|
||||||
"category": "Kategorie",
|
|
||||||
"category-created": "Kategorie angelegt",
|
"category-created": "Kategorie angelegt",
|
||||||
"category-creation-failed": "Anlegen der Kategorie fehlgeschlagen",
|
"category-creation-failed": "Anlegen der Kategorie fehlgeschlagen",
|
||||||
"category-deleted": "Kategorie entfernt",
|
"category-deleted": "Kategorie entfernt",
|
||||||
@@ -40,17 +45,17 @@
|
|||||||
"events": {
|
"events": {
|
||||||
"apprise-url": "Apprise URL",
|
"apprise-url": "Apprise URL",
|
||||||
"database": "Datenbank",
|
"database": "Datenbank",
|
||||||
|
"delete-event": "Ereignis löschen",
|
||||||
"new-notification-form-description": "Mealie verwendet die Apprise-Bibliothek, um Benachrichtigungen zu erzeugen. Sie bietet viele Optionen für Dienste an, die für Benachrichtigungen genutzt werden können. Werfe einen Blick in ihr Wiki für eine umfassende Anleitung zum Erstellen der URL für Ihren Dienst. Falls verfügbar, kann die Auswahl des Benachrichtigungstyps zusätzliche Funktionen enthalten.",
|
"new-notification-form-description": "Mealie verwendet die Apprise-Bibliothek, um Benachrichtigungen zu erzeugen. Sie bietet viele Optionen für Dienste an, die für Benachrichtigungen genutzt werden können. Werfe einen Blick in ihr Wiki für eine umfassende Anleitung zum Erstellen der URL für Ihren Dienst. Falls verfügbar, kann die Auswahl des Benachrichtigungstyps zusätzliche Funktionen enthalten.",
|
||||||
|
"new-version": "Neue Version verfügbar!",
|
||||||
"notification": "Benachrichtigung",
|
"notification": "Benachrichtigung",
|
||||||
|
"refresh": "Aktualisieren",
|
||||||
"scheduled": "Geplant",
|
"scheduled": "Geplant",
|
||||||
"something-went-wrong": "Etwas ist schief gelaufen!",
|
"something-went-wrong": "Etwas ist schief gelaufen!",
|
||||||
"subscribed-events": "Abonnierte Ereignisse",
|
"subscribed-events": "Abonnierte Ereignisse",
|
||||||
"test-message-sent": "Testnachricht gesendet",
|
"test-message-sent": "Testnachricht gesendet"
|
||||||
"refresh": "Refresh",
|
|
||||||
"new-version": "New version available!"
|
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"apply": "Anwenden",
|
|
||||||
"cancel": "Abbrechen",
|
"cancel": "Abbrechen",
|
||||||
"clear": "Zurücksetzen",
|
"clear": "Zurücksetzen",
|
||||||
"close": "Schließen",
|
"close": "Schließen",
|
||||||
@@ -59,7 +64,6 @@
|
|||||||
"copied": "Kopiert",
|
"copied": "Kopiert",
|
||||||
"create": "Erstellen",
|
"create": "Erstellen",
|
||||||
"created": "Erstellt",
|
"created": "Erstellt",
|
||||||
"current-parenthesis": "(Neueste)",
|
|
||||||
"custom": "Benutzerdefiniert",
|
"custom": "Benutzerdefiniert",
|
||||||
"dashboard": "Dashboard",
|
"dashboard": "Dashboard",
|
||||||
"delete": "Löschen",
|
"delete": "Löschen",
|
||||||
@@ -70,7 +74,7 @@
|
|||||||
"exception": "Fehler",
|
"exception": "Fehler",
|
||||||
"failed-count": "Fehlgeschlagen: {count}",
|
"failed-count": "Fehlgeschlagen: {count}",
|
||||||
"failure-uploading-file": "Fehler beim Hochladen der Datei",
|
"failure-uploading-file": "Fehler beim Hochladen der Datei",
|
||||||
"favorites": "Favorites",
|
"favorites": "Favoriten",
|
||||||
"field-required": "Erforderliches Feld",
|
"field-required": "Erforderliches Feld",
|
||||||
"file-folder-not-found": "Datei/Ordner nicht gefunden",
|
"file-folder-not-found": "Datei/Ordner nicht gefunden",
|
||||||
"file-uploaded": "Datei hochgeladen",
|
"file-uploaded": "Datei hochgeladen",
|
||||||
@@ -78,18 +82,19 @@
|
|||||||
"friday": "Freitag",
|
"friday": "Freitag",
|
||||||
"general": "Allgemein",
|
"general": "Allgemein",
|
||||||
"get": "Holen",
|
"get": "Holen",
|
||||||
|
"home": "Startseite",
|
||||||
"image": "Bild",
|
"image": "Bild",
|
||||||
"image-upload-failed": "Das Bild konnte nicht hochgeladen werden",
|
"image-upload-failed": "Das Bild konnte nicht hochgeladen werden",
|
||||||
"import": "Importieren",
|
"import": "Importieren",
|
||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Keyword",
|
"keyword": "Keyword",
|
||||||
"link": "Link",
|
|
||||||
"link-copied": "Link kopiert",
|
"link-copied": "Link kopiert",
|
||||||
|
"loading-recipes": "Lade Rezepte",
|
||||||
"monday": "Montag",
|
"monday": "Montag",
|
||||||
"more": "More",
|
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"new": "Neu",
|
"new": "Neu",
|
||||||
"no": "Nein",
|
"no": "Nein",
|
||||||
|
"no-recipe-found": "Kein Rezept gefunden",
|
||||||
"ok": "Okay",
|
"ok": "Okay",
|
||||||
"options": "Optionen:",
|
"options": "Optionen:",
|
||||||
"print": "Drucken",
|
"print": "Drucken",
|
||||||
@@ -139,8 +144,8 @@
|
|||||||
"group-id-with-value": "Gruppenkennung: {groupID}",
|
"group-id-with-value": "Gruppenkennung: {groupID}",
|
||||||
"group-name": "Name der Gruppe",
|
"group-name": "Name der Gruppe",
|
||||||
"group-not-found": "Gruppe nicht gefunden",
|
"group-not-found": "Gruppe nicht gefunden",
|
||||||
|
"group-with-value": "Gruppe: {groupID}",
|
||||||
"groups": "Gruppen",
|
"groups": "Gruppen",
|
||||||
"groups-can-only-be-set-by-administrators": "Gruppen können nur von Administratoren gesetzt werden",
|
|
||||||
"manage-groups": "Gruppen verwalten",
|
"manage-groups": "Gruppen verwalten",
|
||||||
"user-group": "Benutzergruppe",
|
"user-group": "Benutzergruppe",
|
||||||
"user-group-created": "Benutzergruppe angelegt",
|
"user-group-created": "Benutzergruppe angelegt",
|
||||||
@@ -154,7 +159,7 @@
|
|||||||
"edit-meal-plan": "Essensplan bearbeiten",
|
"edit-meal-plan": "Essensplan bearbeiten",
|
||||||
"end-date": "Enddatum",
|
"end-date": "Enddatum",
|
||||||
"group": "Gruppe (Beta)",
|
"group": "Gruppe (Beta)",
|
||||||
"main": "Main",
|
"main": "Hauptgericht",
|
||||||
"meal-planner": "Essensplaner",
|
"meal-planner": "Essensplaner",
|
||||||
"meal-plans": "Essenspläne",
|
"meal-plans": "Essenspläne",
|
||||||
"mealplan-categories": "KATEGORIEN FÜR ESSENSPLÄNE",
|
"mealplan-categories": "KATEGORIEN FÜR ESSENSPLÄNE",
|
||||||
@@ -170,8 +175,8 @@
|
|||||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Nur Rezepte dieser Kategorien werden in Essensplänen verwendet",
|
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Nur Rezepte dieser Kategorien werden in Essensplänen verwendet",
|
||||||
"planner": "Planer",
|
"planner": "Planer",
|
||||||
"quick-week": "Schnelle Woche",
|
"quick-week": "Schnelle Woche",
|
||||||
"side": "Side",
|
"side": "Beilage",
|
||||||
"sides": "Sides",
|
"sides": "Beilagen",
|
||||||
"start-date": "Startdatum"
|
"start-date": "Startdatum"
|
||||||
},
|
},
|
||||||
"migration": {
|
"migration": {
|
||||||
@@ -189,16 +194,23 @@
|
|||||||
},
|
},
|
||||||
"new-recipe": {
|
"new-recipe": {
|
||||||
"bulk-add": "Massenimport",
|
"bulk-add": "Massenimport",
|
||||||
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
"error-details": "Mealie kann Rezepte nur von Webseiten importieren, die Id+json oder Mikrodaten enthalten. Die meisten großen Rezeptwebseiten unterstützen diese Datenstruktur. Wenn das Rezept nicht importiert werden kann, aber JSON-Daten im Log vorhanden sind, melde es bitte mit der URL und diesen Daten auf GitHub.",
|
||||||
"error-title": "Anscheinend konnten wir nichts finden",
|
"error-title": "Anscheinend konnten wir nichts finden",
|
||||||
"from-url": "Von URL",
|
"from-url": "Von URL",
|
||||||
|
"github-issues": "GitHub Issues",
|
||||||
|
"google-ld-json-info": "Google ld+json Info",
|
||||||
|
"must-be-a-valid-url": "Muss eine gültige URL sein",
|
||||||
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Füge deine Rezeptdaten ein. Jede Zeile wird als Eintrag in einer Liste dargestellt",
|
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Füge deine Rezeptdaten ein. Jede Zeile wird als Eintrag in einer Liste dargestellt",
|
||||||
|
"recipe-markup-specification": "Rezept Markup Spezifikation",
|
||||||
"recipe-url": "Rezept URL",
|
"recipe-url": "Rezept URL",
|
||||||
"url-form-hint": "Kopiere einen Link von deiner Lieblingsrezept-Website und füge ihn ein"
|
"upload-a-recipe": "Rezept hochladen",
|
||||||
|
"upload-individual-zip-file": "Lade eine individuelle .zip-Datei hoch, die von einer anderen Mealie-Instanz exportiert wird.",
|
||||||
|
"url-form-hint": "Kopiere einen Link von deiner Lieblingsrezept-Website und füge ihn ein",
|
||||||
|
"view-scraped-data": "Gesammelte Daten anzeigen"
|
||||||
},
|
},
|
||||||
"page": {
|
"page": {
|
||||||
|
"404-page-not-found": "404 Seite nicht gefunden",
|
||||||
"all-recipes": "Alle Rezepte",
|
"all-recipes": "Alle Rezepte",
|
||||||
"home-page": "Startseite",
|
|
||||||
"new-page-created": "Neue Seite angelegt",
|
"new-page-created": "Neue Seite angelegt",
|
||||||
"page": "Seite",
|
"page": "Seite",
|
||||||
"page-creation-failed": "Anlegen der Seite fehlgeschlagen",
|
"page-creation-failed": "Anlegen der Seite fehlgeschlagen",
|
||||||
@@ -207,40 +219,36 @@
|
|||||||
"page-update-failed": "Aktualisieren der Seite fehlgeschlagen",
|
"page-update-failed": "Aktualisieren der Seite fehlgeschlagen",
|
||||||
"page-updated": "Seite aktualisiert",
|
"page-updated": "Seite aktualisiert",
|
||||||
"pages-update-failed": "Aktualisieren der Seiten fehlgeschlagen",
|
"pages-update-failed": "Aktualisieren der Seiten fehlgeschlagen",
|
||||||
"pages-updated": "Seiten aktualisiert",
|
"pages-updated": "Seiten aktualisiert"
|
||||||
"recent": "Neueste"
|
|
||||||
},
|
},
|
||||||
"recipe": {
|
"recipe": {
|
||||||
"add-key": "Schlüssel hinzufügen",
|
"add-key": "Schlüssel hinzufügen",
|
||||||
"add-to-favorites": "Zu Favoriten hinzufügen",
|
"add-to-favorites": "Zu Favoriten hinzufügen",
|
||||||
"api-extras": "API Extras",
|
"api-extras": "API Extras",
|
||||||
"assets": "Anlagen",
|
|
||||||
"calories": "Kalorien",
|
"calories": "Kalorien",
|
||||||
"calories-suffix": "Kalorien",
|
"calories-suffix": "Kalorien",
|
||||||
"carbohydrate-content": "Kohlenhydrate",
|
"carbohydrate-content": "Kohlenhydrate",
|
||||||
"categories": "Kategorien",
|
"categories": "Kategorien",
|
||||||
"comment-action": "Comment",
|
"comment-action": "Kommentieren",
|
||||||
"comments": "Comments",
|
"comments": "Kommentare",
|
||||||
"delete-confirmation": "Bist du dir sicher, dass du dieses Rezept löschen möchtest?",
|
"delete-confirmation": "Bist du dir sicher, dass du dieses Rezept löschen möchtest?",
|
||||||
"delete-recipe": "Rezept löschen",
|
"delete-recipe": "Rezept löschen",
|
||||||
"description": "Beschreibung",
|
"description": "Beschreibung",
|
||||||
"disable-amount": "Disable Ingredient Amounts",
|
"disable-amount": "Zutatenmenge deaktivieren",
|
||||||
"disable-comments": "Disable Comments",
|
"disable-comments": "Kommentare deaktivieren",
|
||||||
"fat-content": "Fett",
|
"fat-content": "Fett",
|
||||||
"fiber-content": "Ballaststoffe",
|
"fiber-content": "Ballaststoffe",
|
||||||
"grams": "g",
|
"grams": "g",
|
||||||
"ingredient": "Zutat",
|
"ingredient": "Zutat",
|
||||||
"ingredients": "Zutaten",
|
"ingredients": "Zutaten",
|
||||||
"insert-section": "Insert Section",
|
"insert-section": "Abschnitt einfügen",
|
||||||
"instructions": "Anweisungen",
|
"instructions": "Anweisungen",
|
||||||
"key-name-required": "Schlüsselname benötigt",
|
"key-name-required": "Schlüsselname benötigt",
|
||||||
"landscape-view-coming-soon": "Landschaftsansicht (demnächst verfügbar)",
|
"landscape-view-coming-soon": "Landschaftsansicht (demnächst verfügbar)",
|
||||||
"milligrams": "mg",
|
"milligrams": "mg",
|
||||||
"new-asset": "Neuer Anhang",
|
|
||||||
"new-key-name": "Neuer Schlüsselname",
|
"new-key-name": "Neuer Schlüsselname",
|
||||||
"no-white-space-allowed": "Kein Leerzeichen erlaubt",
|
"no-white-space-allowed": "Kein Leerzeichen erlaubt",
|
||||||
"note": "Notiz",
|
"note": "Notiz",
|
||||||
"notes": "Notizen",
|
|
||||||
"nutrition": "Nährwerte",
|
"nutrition": "Nährwerte",
|
||||||
"object-key": "Objektschlüssel",
|
"object-key": "Objektschlüssel",
|
||||||
"object-value": "Objektwert",
|
"object-value": "Objektwert",
|
||||||
@@ -259,31 +267,30 @@
|
|||||||
"recipe-update-failed": "Aktualisieren des Rezepts fehlgeschlagen",
|
"recipe-update-failed": "Aktualisieren des Rezepts fehlgeschlagen",
|
||||||
"recipe-updated": "Rezept aktualisiert",
|
"recipe-updated": "Rezept aktualisiert",
|
||||||
"remove-from-favorites": "Von Favoriten entfernen",
|
"remove-from-favorites": "Von Favoriten entfernen",
|
||||||
"remove-section": "Remove Section",
|
"remove-section": "Abschnitt entfernen",
|
||||||
"section-title": "Section Title",
|
"save-recipe-before-use": "Rezept vor Verwendung speichern",
|
||||||
|
"section-title": "Titel des Abschnitts",
|
||||||
"servings": "Portionen",
|
"servings": "Portionen",
|
||||||
"share-recipe-message": "Ich möchte mein Rezept {0} mit dir teilen.",
|
"share-recipe-message": "Ich möchte mein Rezept {0} mit dir teilen.",
|
||||||
"show-assets": "Anhänge anzeigen",
|
|
||||||
"show-nutrition-values": "Nährwerte anzeigen",
|
"show-nutrition-values": "Nährwerte anzeigen",
|
||||||
"sodium-content": "Natrium",
|
"sodium-content": "Natrium",
|
||||||
"step-index": "Schritt {step}:",
|
"step-index": "Schritt {step}:",
|
||||||
"sugar-content": "Zucker",
|
"sugar-content": "Zucker",
|
||||||
"title": "Titel",
|
"title": "Titel",
|
||||||
"total-time": "Gesamtzeit",
|
"total-time": "Gesamtzeit",
|
||||||
"unable-to-delete-recipe": "Rezept kann nicht gelöscht werden",
|
"unable-to-delete-recipe": "Rezept kann nicht gelöscht werden"
|
||||||
"view-recipe": "Rezept anschauen"
|
|
||||||
},
|
},
|
||||||
"reicpe": {
|
"reicpe": {
|
||||||
"no-recipe": "No Recipe"
|
"no-recipe": "Kein Rezept"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Advanced Search",
|
"advanced-search": "Erweiterte Suche",
|
||||||
"and": "und",
|
"and": "und",
|
||||||
"exclude": "Ausschließen",
|
"exclude": "Ausschließen",
|
||||||
"include": "Einbeziehen",
|
"include": "Einbeziehen",
|
||||||
"max-results": "Max. Ergebnisse",
|
"max-results": "Max. Ergebnisse",
|
||||||
"or": "Oder",
|
"or": "Oder",
|
||||||
"results": "Results",
|
"results": "Ergebnisse",
|
||||||
"search": "Suchen",
|
"search": "Suchen",
|
||||||
"search-mealie": "Mealie durchsuchen (/ drücken)",
|
"search-mealie": "Mealie durchsuchen (/ drücken)",
|
||||||
"search-placeholder": "Suchen...",
|
"search-placeholder": "Suchen...",
|
||||||
@@ -292,12 +299,12 @@
|
|||||||
"settings": {
|
"settings": {
|
||||||
"add-a-new-theme": "Neues Thema hinzufügen",
|
"add-a-new-theme": "Neues Thema hinzufügen",
|
||||||
"admin-settings": "Admin Einstellungen",
|
"admin-settings": "Admin Einstellungen",
|
||||||
"available-backups": "Verfügbare Sicherungen",
|
|
||||||
"backup": {
|
"backup": {
|
||||||
"backup-created-at-response-export_path": "Sicherung erstellt unter {path}",
|
"backup-created-at-response-export_path": "Sicherung erstellt unter {path}",
|
||||||
"backup-deleted": "Sicherung gelöscht",
|
"backup-deleted": "Sicherung gelöscht",
|
||||||
"backup-tag": "Sicherungsbeschreibung",
|
"backup-tag": "Sicherungsbeschreibung",
|
||||||
"create-heading": "Sicherung erstellen",
|
"create-heading": "Sicherung erstellen",
|
||||||
|
"delete-backup": "Sicherung löschen",
|
||||||
"error-creating-backup-see-log-file": "Fehler beim Erstellen der Sicherung. Siehe Protokolldatei",
|
"error-creating-backup-see-log-file": "Fehler beim Erstellen der Sicherung. Siehe Protokolldatei",
|
||||||
"full-backup": "Komplettsicherung",
|
"full-backup": "Komplettsicherung",
|
||||||
"import-summary": "Zusammenfassung des Imports",
|
"import-summary": "Zusammenfassung des Imports",
|
||||||
@@ -305,7 +312,6 @@
|
|||||||
"unable-to-delete-backup": "Sicherung kann nicht gelöscht werden."
|
"unable-to-delete-backup": "Sicherung kann nicht gelöscht werden."
|
||||||
},
|
},
|
||||||
"backup-and-exports": "Sicherungen",
|
"backup-and-exports": "Sicherungen",
|
||||||
"backup-info": "Sicherungen werden mitsamt aller Bilder im Standard-JSON-Format in das Dateisystem exportiert. In deinem Sicherungsordner findest du eine ZIP Datei, welche sämtliche JSON's deiner Rezepte und die Bilder aus der Datenbank enthält. Solltest du eine Markdown Datei auswählen werden diese ebenfalls im ZIP gespeichert. Um eine Sicherung zurückzuspielen muss die entsprechende ZIP-Datei im Sicherungsordner liegen. Automatische Sicherungen finden jeden Tag um 3 Uhr morgens statt.",
|
|
||||||
"change-password": "Passwort ändern",
|
"change-password": "Passwort ändern",
|
||||||
"current": "Version:",
|
"current": "Version:",
|
||||||
"custom-pages": "Benutzerdefinierte Seiten",
|
"custom-pages": "Benutzerdefinierte Seiten",
|
||||||
@@ -338,12 +344,8 @@
|
|||||||
"site-settings": "Seiteneinstellungen",
|
"site-settings": "Seiteneinstellungen",
|
||||||
"theme": {
|
"theme": {
|
||||||
"accent": "Akzent",
|
"accent": "Akzent",
|
||||||
"are-you-sure-you-want-to-delete-this-theme": "Bist du dir sicher, dass du dieses Thema löschen möchtest?",
|
|
||||||
"choose-how-mealie-looks-to-you-set-your-theme-preference-to-follow-your-system-settings-or-choose-to-use-the-light-or-dark-theme": "Entscheide, wie Mealie für dich aussehen soll. Wähle die Einstellung deines Systems oder bestimme ob es Hell oder Dunkel dargestellt werden soll.",
|
|
||||||
"dark": "Dunkel",
|
"dark": "Dunkel",
|
||||||
"dark-mode": "Dunkler Modus",
|
|
||||||
"default-to-system": "Standardeinstellung",
|
"default-to-system": "Standardeinstellung",
|
||||||
"delete-theme": "Thema löschen",
|
|
||||||
"error": "Fehler",
|
"error": "Fehler",
|
||||||
"error-creating-theme-see-log-file": "Fehler beim Erstellen des Themas. Siehe Protokolldatei.",
|
"error-creating-theme-see-log-file": "Fehler beim Erstellen des Themas. Siehe Protokolldatei.",
|
||||||
"error-deleting-theme": "Fehler beim Löschen des Themas",
|
"error-deleting-theme": "Fehler beim Löschen des Themas",
|
||||||
@@ -352,16 +354,13 @@
|
|||||||
"light": "Hell",
|
"light": "Hell",
|
||||||
"primary": "Primär",
|
"primary": "Primär",
|
||||||
"secondary": "Sekundär",
|
"secondary": "Sekundär",
|
||||||
"select-a-theme-from-the-dropdown-or-create-a-new-theme-note-that-the-default-theme-will-be-served-to-all-users-who-have-not-set-a-theme-preference": "Wähle ein Thema aus der Dropdown-Liste oder erstelle ein neues. Beachte, dass das Standard-Thema auf alle Benutzer angewandt wird die keine Einstellung für ein Thema getroffen haben.",
|
|
||||||
"success": "Erfolg",
|
"success": "Erfolg",
|
||||||
"switch-to-dark-mode": "Switch to dark mode",
|
"switch-to-dark-mode": "Zum dunklen Modus wechseln",
|
||||||
"switch-to-light-mode": "Switch to light mode",
|
"switch-to-light-mode": "Zum hellen Modus wechseln",
|
||||||
"theme": "Thema",
|
|
||||||
"theme-deleted": "Thema gelöscht",
|
"theme-deleted": "Thema gelöscht",
|
||||||
"theme-name": "Themenname",
|
"theme-name": "Themenname",
|
||||||
"theme-name-is-required": "Themenname wird benötigt.",
|
"theme-name-is-required": "Themenname wird benötigt.",
|
||||||
"theme-saved": "Thema gespeichert",
|
"theme-saved": "Thema gespeichert",
|
||||||
"theme-settings": "Themeneinstellungen",
|
|
||||||
"theme-updated": "Thema aktualisiert",
|
"theme-updated": "Thema aktualisiert",
|
||||||
"warning": "Warnung"
|
"warning": "Warnung"
|
||||||
},
|
},
|
||||||
@@ -385,7 +384,6 @@
|
|||||||
"unorganized": "Unorganisiert"
|
"unorganized": "Unorganisiert"
|
||||||
},
|
},
|
||||||
"webhooks": {
|
"webhooks": {
|
||||||
"meal-planner-webhooks": "Essensplaner Webhooks",
|
|
||||||
"test-webhooks": "Teste Webhooks",
|
"test-webhooks": "Teste Webhooks",
|
||||||
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "Die unten stehenden URL's erhalten Webhooks welche die Rezeptdaten für den Menüplan am geplanten Tag enthalten. Derzeit werden die Webhooks ausgeführt um",
|
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "Die unten stehenden URL's erhalten Webhooks welche die Rezeptdaten für den Menüplan am geplanten Tag enthalten. Derzeit werden die Webhooks ausgeführt um",
|
||||||
"webhook-url": "Webhook URL",
|
"webhook-url": "Webhook URL",
|
||||||
@@ -402,8 +400,20 @@
|
|||||||
"shopping-list": "Einkaufsliste",
|
"shopping-list": "Einkaufsliste",
|
||||||
"shopping-lists": "Einkaufslisten"
|
"shopping-lists": "Einkaufslisten"
|
||||||
},
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"all-recipes": "Alle Rezepte",
|
||||||
|
"categories": "Kategorien",
|
||||||
|
"dashboard": "Übersicht",
|
||||||
|
"home-page": "Startseite",
|
||||||
|
"manage-users": "Benutzer",
|
||||||
|
"migrations": "Migrationen",
|
||||||
|
"profile": "Profil",
|
||||||
|
"search": "Suche",
|
||||||
|
"site-settings": "Einstellungen",
|
||||||
|
"tags": "Schlagworte",
|
||||||
|
"toolbox": "Werkzeuge"
|
||||||
|
},
|
||||||
"signup": {
|
"signup": {
|
||||||
"display-name": "Anzeigename",
|
|
||||||
"error-signing-up": "Fehler beim Registrieren",
|
"error-signing-up": "Fehler beim Registrieren",
|
||||||
"sign-up": "Registrieren",
|
"sign-up": "Registrieren",
|
||||||
"sign-up-link-created": "Einladungslink angelegt",
|
"sign-up-link-created": "Einladungslink angelegt",
|
||||||
@@ -440,7 +450,6 @@
|
|||||||
"error-cannot-delete-super-user": "Fehler! Super Benutzer kann nicht gelöscht werden",
|
"error-cannot-delete-super-user": "Fehler! Super Benutzer kann nicht gelöscht werden",
|
||||||
"existing-password-does-not-match": "Bestehendes Passwort stimmt nicht überein",
|
"existing-password-does-not-match": "Bestehendes Passwort stimmt nicht überein",
|
||||||
"full-name": "Vollständiger Name",
|
"full-name": "Vollständiger Name",
|
||||||
"incorrect-username-or-password": "Ungültiger Benutzername oder Passwort",
|
|
||||||
"link-id": "Linkkennung",
|
"link-id": "Linkkennung",
|
||||||
"link-name": "Linkname",
|
"link-name": "Linkname",
|
||||||
"login": "Anmeldung",
|
"login": "Anmeldung",
|
||||||
|
|||||||
@@ -1,8 +1,4 @@
|
|||||||
{
|
{
|
||||||
"404": {
|
|
||||||
"page-not-found": "404 Page Not Found",
|
|
||||||
"take-me-home": "Take me Home"
|
|
||||||
},
|
|
||||||
"about": {
|
"about": {
|
||||||
"about": "About",
|
"about": "About",
|
||||||
"about-mealie": "About Mealie",
|
"about-mealie": "About Mealie",
|
||||||
@@ -26,8 +22,17 @@
|
|||||||
"support": "Support",
|
"support": "Support",
|
||||||
"version": "Version"
|
"version": "Version"
|
||||||
},
|
},
|
||||||
|
"asset": {
|
||||||
|
"assets": "Assets",
|
||||||
|
"code": "Code",
|
||||||
|
"file": "File",
|
||||||
|
"image": "Image",
|
||||||
|
"new-asset": "New Asset",
|
||||||
|
"pdf": "PDF",
|
||||||
|
"recipe": "Recipe",
|
||||||
|
"show-assets": "Show Assets"
|
||||||
|
},
|
||||||
"category": {
|
"category": {
|
||||||
"category": "Category",
|
|
||||||
"category-created": "Category created",
|
"category-created": "Category created",
|
||||||
"category-creation-failed": "Category creation failed",
|
"category-creation-failed": "Category creation failed",
|
||||||
"category-deleted": "Category Deleted",
|
"category-deleted": "Category Deleted",
|
||||||
@@ -40,17 +45,17 @@
|
|||||||
"events": {
|
"events": {
|
||||||
"apprise-url": "Apprise URL",
|
"apprise-url": "Apprise URL",
|
||||||
"database": "Database",
|
"database": "Database",
|
||||||
|
"delete-event": "Delete Event",
|
||||||
"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-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",
|
"notification": "Notification",
|
||||||
|
"refresh": "Refresh",
|
||||||
"scheduled": "Scheduled",
|
"scheduled": "Scheduled",
|
||||||
"something-went-wrong": "Something Went Wrong!",
|
"something-went-wrong": "Something Went Wrong!",
|
||||||
"subscribed-events": "Subscribed Events",
|
"subscribed-events": "Subscribed Events",
|
||||||
"test-message-sent": "Test Message Sent",
|
"test-message-sent": "Test Message Sent"
|
||||||
"refresh": "Refresh",
|
|
||||||
"new-version": "New version available!"
|
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"apply": "Apply",
|
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"clear": "Clear",
|
"clear": "Clear",
|
||||||
"close": "Close",
|
"close": "Close",
|
||||||
@@ -59,7 +64,6 @@
|
|||||||
"copied": "Copied",
|
"copied": "Copied",
|
||||||
"create": "Create",
|
"create": "Create",
|
||||||
"created": "Created",
|
"created": "Created",
|
||||||
"current-parenthesis": "(Current)",
|
|
||||||
"custom": "Custom",
|
"custom": "Custom",
|
||||||
"dashboard": "Dashboard",
|
"dashboard": "Dashboard",
|
||||||
"delete": "Delete",
|
"delete": "Delete",
|
||||||
@@ -78,18 +82,19 @@
|
|||||||
"friday": "Friday",
|
"friday": "Friday",
|
||||||
"general": "General",
|
"general": "General",
|
||||||
"get": "Get",
|
"get": "Get",
|
||||||
|
"home": "Home",
|
||||||
"image": "Image",
|
"image": "Image",
|
||||||
"image-upload-failed": "Image upload failed",
|
"image-upload-failed": "Image upload failed",
|
||||||
"import": "Import",
|
"import": "Import",
|
||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Keyword",
|
"keyword": "Keyword",
|
||||||
"link": "Link",
|
|
||||||
"link-copied": "Link Copied",
|
"link-copied": "Link Copied",
|
||||||
|
"loading-recipes": "Loading Recipes",
|
||||||
"monday": "Monday",
|
"monday": "Monday",
|
||||||
"more": "More",
|
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"new": "New",
|
"new": "New",
|
||||||
"no": "No",
|
"no": "No",
|
||||||
|
"no-recipe-found": "No Recipe Found",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"options": "Options:",
|
"options": "Options:",
|
||||||
"print": "Print",
|
"print": "Print",
|
||||||
@@ -139,8 +144,8 @@
|
|||||||
"group-id-with-value": "Group ID: {groupID}",
|
"group-id-with-value": "Group ID: {groupID}",
|
||||||
"group-name": "Group Name",
|
"group-name": "Group Name",
|
||||||
"group-not-found": "Group not found",
|
"group-not-found": "Group not found",
|
||||||
|
"group-with-value": "Group: {groupID}",
|
||||||
"groups": "Groups",
|
"groups": "Groups",
|
||||||
"groups-can-only-be-set-by-administrators": "Groups can only be set by administrators",
|
|
||||||
"manage-groups": "Manage Groups",
|
"manage-groups": "Manage Groups",
|
||||||
"user-group": "User Group",
|
"user-group": "User Group",
|
||||||
"user-group-created": "User Group Created",
|
"user-group-created": "User Group Created",
|
||||||
@@ -192,13 +197,20 @@
|
|||||||
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
||||||
"error-title": "Looks Like We Couldn't Find Anything",
|
"error-title": "Looks Like We Couldn't Find Anything",
|
||||||
"from-url": "Import a Recipe",
|
"from-url": "Import a Recipe",
|
||||||
|
"github-issues": "GitHub Issues",
|
||||||
|
"google-ld-json-info": "Google ld+json Info",
|
||||||
|
"must-be-a-valid-url": "Must be a Valid URL",
|
||||||
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
|
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
|
||||||
|
"recipe-markup-specification": "Recipe Markup Specification",
|
||||||
"recipe-url": "Recipe URL",
|
"recipe-url": "Recipe URL",
|
||||||
"url-form-hint": "Copy and paste a link from your favorite recipe website"
|
"upload-a-recipe": "Upload a Recipe",
|
||||||
|
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
|
||||||
|
"url-form-hint": "Copy and paste a link from your favorite recipe website",
|
||||||
|
"view-scraped-data": "View Scraped Data"
|
||||||
},
|
},
|
||||||
"page": {
|
"page": {
|
||||||
|
"404-page-not-found": "404 Page not found",
|
||||||
"all-recipes": "All Recipes",
|
"all-recipes": "All Recipes",
|
||||||
"home-page": "Home Page",
|
|
||||||
"new-page-created": "New page created",
|
"new-page-created": "New page created",
|
||||||
"page": "Page",
|
"page": "Page",
|
||||||
"page-creation-failed": "Page creation failed",
|
"page-creation-failed": "Page creation failed",
|
||||||
@@ -207,14 +219,12 @@
|
|||||||
"page-update-failed": "Page update failed",
|
"page-update-failed": "Page update failed",
|
||||||
"page-updated": "Page updated",
|
"page-updated": "Page updated",
|
||||||
"pages-update-failed": "Pages update failed",
|
"pages-update-failed": "Pages update failed",
|
||||||
"pages-updated": "Pages updated",
|
"pages-updated": "Pages updated"
|
||||||
"recent": "Recent"
|
|
||||||
},
|
},
|
||||||
"recipe": {
|
"recipe": {
|
||||||
"add-key": "Add Key",
|
"add-key": "Add Key",
|
||||||
"add-to-favorites": "Add to Favorites",
|
"add-to-favorites": "Add to Favorites",
|
||||||
"api-extras": "API Extras",
|
"api-extras": "API Extras",
|
||||||
"assets": "Assets",
|
|
||||||
"calories": "Calories",
|
"calories": "Calories",
|
||||||
"calories-suffix": "calories",
|
"calories-suffix": "calories",
|
||||||
"carbohydrate-content": "Carbohydrate",
|
"carbohydrate-content": "Carbohydrate",
|
||||||
@@ -236,11 +246,9 @@
|
|||||||
"key-name-required": "Key Name Required",
|
"key-name-required": "Key Name Required",
|
||||||
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
|
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
|
||||||
"milligrams": "milligrams",
|
"milligrams": "milligrams",
|
||||||
"new-asset": "New Asset",
|
|
||||||
"new-key-name": "New Key Name",
|
"new-key-name": "New Key Name",
|
||||||
"no-white-space-allowed": "No White Space Allowed",
|
"no-white-space-allowed": "No White Space Allowed",
|
||||||
"note": "Note",
|
"note": "Note",
|
||||||
"notes": "Notes",
|
|
||||||
"nutrition": "Nutrition",
|
"nutrition": "Nutrition",
|
||||||
"object-key": "Object Key",
|
"object-key": "Object Key",
|
||||||
"object-value": "Object Value",
|
"object-value": "Object Value",
|
||||||
@@ -260,18 +268,17 @@
|
|||||||
"recipe-updated": "Recipe updated",
|
"recipe-updated": "Recipe updated",
|
||||||
"remove-from-favorites": "Remove from Favorites",
|
"remove-from-favorites": "Remove from Favorites",
|
||||||
"remove-section": "Remove Section",
|
"remove-section": "Remove Section",
|
||||||
|
"save-recipe-before-use": "Save recipe before use",
|
||||||
"section-title": "Section Title",
|
"section-title": "Section Title",
|
||||||
"servings": "Servings",
|
"servings": "Servings",
|
||||||
"share-recipe-message": "I wanted to share my {0} recipe with you.",
|
"share-recipe-message": "I wanted to share my {0} recipe with you.",
|
||||||
"show-assets": "Show Assets",
|
|
||||||
"show-nutrition-values": "Show Nutrition Values",
|
"show-nutrition-values": "Show Nutrition Values",
|
||||||
"sodium-content": "Sodium",
|
"sodium-content": "Sodium",
|
||||||
"step-index": "Step: {step}",
|
"step-index": "Step: {step}",
|
||||||
"sugar-content": "Sugar",
|
"sugar-content": "Sugar",
|
||||||
"title": "Title",
|
"title": "Title",
|
||||||
"total-time": "Total Time",
|
"total-time": "Total Time",
|
||||||
"unable-to-delete-recipe": "Unable to Delete Recipe",
|
"unable-to-delete-recipe": "Unable to Delete Recipe"
|
||||||
"view-recipe": "View Recipe"
|
|
||||||
},
|
},
|
||||||
"reicpe": {
|
"reicpe": {
|
||||||
"no-recipe": "No Recipe"
|
"no-recipe": "No Recipe"
|
||||||
@@ -292,12 +299,12 @@
|
|||||||
"settings": {
|
"settings": {
|
||||||
"add-a-new-theme": "Add a New Theme",
|
"add-a-new-theme": "Add a New Theme",
|
||||||
"admin-settings": "Admin Settings",
|
"admin-settings": "Admin Settings",
|
||||||
"available-backups": "Available Backups",
|
|
||||||
"backup": {
|
"backup": {
|
||||||
"backup-created-at-response-export_path": "Backup Created at {path}",
|
"backup-created-at-response-export_path": "Backup Created at {path}",
|
||||||
"backup-deleted": "Backup deleted",
|
"backup-deleted": "Backup deleted",
|
||||||
"backup-tag": "Backup Tag",
|
"backup-tag": "Backup Tag",
|
||||||
"create-heading": "Create a Backup",
|
"create-heading": "Create a Backup",
|
||||||
|
"delete-backup": "Delete Backup",
|
||||||
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
|
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
|
||||||
"full-backup": "Full Backup",
|
"full-backup": "Full Backup",
|
||||||
"import-summary": "Import Summary",
|
"import-summary": "Import Summary",
|
||||||
@@ -305,7 +312,6 @@
|
|||||||
"unable-to-delete-backup": "Unable to Delete Backup."
|
"unable-to-delete-backup": "Unable to Delete Backup."
|
||||||
},
|
},
|
||||||
"backup-and-exports": "Backups",
|
"backup-and-exports": "Backups",
|
||||||
"backup-info": "Backups are exported in standard JSON format along with all the images stored on the file system. In your backup folder you'll find a .zip file that contains all of the recipe JSON and images from the database. Additionally, if you selected a markdown file, those will also be stored in the .zip file. To import a backup, it must be located in your backups folder. Automated backups are done each day at 3:00 AM.",
|
|
||||||
"change-password": "Change Password",
|
"change-password": "Change Password",
|
||||||
"current": "Version:",
|
"current": "Version:",
|
||||||
"custom-pages": "Custom Pages",
|
"custom-pages": "Custom Pages",
|
||||||
@@ -338,12 +344,8 @@
|
|||||||
"site-settings": "Site Settings",
|
"site-settings": "Site Settings",
|
||||||
"theme": {
|
"theme": {
|
||||||
"accent": "Accent",
|
"accent": "Accent",
|
||||||
"are-you-sure-you-want-to-delete-this-theme": "Are you sure you want to delete this theme?",
|
|
||||||
"choose-how-mealie-looks-to-you-set-your-theme-preference-to-follow-your-system-settings-or-choose-to-use-the-light-or-dark-theme": "Choose how Mealie looks to you. Set your theme preference to follow your system settings, or choose to use the light or dark theme.",
|
|
||||||
"dark": "Dark",
|
"dark": "Dark",
|
||||||
"dark-mode": "Dark Mode",
|
|
||||||
"default-to-system": "Default to system",
|
"default-to-system": "Default to system",
|
||||||
"delete-theme": "Delete Theme",
|
|
||||||
"error": "Error",
|
"error": "Error",
|
||||||
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
|
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
|
||||||
"error-deleting-theme": "Error deleting theme",
|
"error-deleting-theme": "Error deleting theme",
|
||||||
@@ -352,16 +354,13 @@
|
|||||||
"light": "Light",
|
"light": "Light",
|
||||||
"primary": "Primary",
|
"primary": "Primary",
|
||||||
"secondary": "Secondary",
|
"secondary": "Secondary",
|
||||||
"select-a-theme-from-the-dropdown-or-create-a-new-theme-note-that-the-default-theme-will-be-served-to-all-users-who-have-not-set-a-theme-preference": "Select a theme from the dropdown or create a new theme. Note that the default theme will be served to all users who have not set a theme preference.",
|
|
||||||
"success": "Success",
|
"success": "Success",
|
||||||
"switch-to-dark-mode": "Switch to dark mode",
|
"switch-to-dark-mode": "Switch to dark mode",
|
||||||
"switch-to-light-mode": "Switch to light mode",
|
"switch-to-light-mode": "Switch to light mode",
|
||||||
"theme": "Theme",
|
|
||||||
"theme-deleted": "Theme deleted",
|
"theme-deleted": "Theme deleted",
|
||||||
"theme-name": "Theme Name",
|
"theme-name": "Theme Name",
|
||||||
"theme-name-is-required": "Theme Name is required.",
|
"theme-name-is-required": "Theme Name is required.",
|
||||||
"theme-saved": "Theme Saved",
|
"theme-saved": "Theme Saved",
|
||||||
"theme-settings": "Theme Settings",
|
|
||||||
"theme-updated": "Theme updated",
|
"theme-updated": "Theme updated",
|
||||||
"warning": "Warning"
|
"warning": "Warning"
|
||||||
},
|
},
|
||||||
@@ -385,7 +384,6 @@
|
|||||||
"unorganized": "Unorganized"
|
"unorganized": "Unorganized"
|
||||||
},
|
},
|
||||||
"webhooks": {
|
"webhooks": {
|
||||||
"meal-planner-webhooks": "Meal Planner Webhooks",
|
|
||||||
"test-webhooks": "Test Webhooks",
|
"test-webhooks": "Test Webhooks",
|
||||||
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "The URLs listed below will receive webhooks containing the recipe data for the meal plan on it's scheduled day. Currently Webhooks will execute at",
|
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "The URLs listed below will receive webhooks containing the recipe data for the meal plan on it's scheduled day. Currently Webhooks will execute at",
|
||||||
"webhook-url": "Webhook URL",
|
"webhook-url": "Webhook URL",
|
||||||
@@ -402,8 +400,20 @@
|
|||||||
"shopping-list": "Shopping List",
|
"shopping-list": "Shopping List",
|
||||||
"shopping-lists": "Shopping Lists"
|
"shopping-lists": "Shopping Lists"
|
||||||
},
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"all-recipes": "All Recipes",
|
||||||
|
"categories": "Categories",
|
||||||
|
"dashboard": "Dashboard",
|
||||||
|
"home-page": "Home Page",
|
||||||
|
"manage-users": "Manage Users",
|
||||||
|
"migrations": "Migrations",
|
||||||
|
"profile": "Profile",
|
||||||
|
"search": "Search",
|
||||||
|
"site-settings": "Site Settings",
|
||||||
|
"tags": "Tags",
|
||||||
|
"toolbox": "Toolbox"
|
||||||
|
},
|
||||||
"signup": {
|
"signup": {
|
||||||
"display-name": "Display Name",
|
|
||||||
"error-signing-up": "Error Signing Up",
|
"error-signing-up": "Error Signing Up",
|
||||||
"sign-up": "Sign Up",
|
"sign-up": "Sign Up",
|
||||||
"sign-up-link-created": "Sign up link created",
|
"sign-up-link-created": "Sign up link created",
|
||||||
@@ -440,7 +450,6 @@
|
|||||||
"error-cannot-delete-super-user": "Error! Cannot Delete Super User",
|
"error-cannot-delete-super-user": "Error! Cannot Delete Super User",
|
||||||
"existing-password-does-not-match": "Existing password does not match",
|
"existing-password-does-not-match": "Existing password does not match",
|
||||||
"full-name": "Full Name",
|
"full-name": "Full Name",
|
||||||
"incorrect-username-or-password": "Incorrect username or password",
|
|
||||||
"link-id": "Link ID",
|
"link-id": "Link ID",
|
||||||
"link-name": "Link Name",
|
"link-name": "Link Name",
|
||||||
"login": "Login",
|
"login": "Login",
|
||||||
|
|||||||
489
frontend/src/locales/messages/en-GB.json
Normal file
489
frontend/src/locales/messages/en-GB.json
Normal file
@@ -0,0 +1,489 @@
|
|||||||
|
{
|
||||||
|
"about": {
|
||||||
|
"about": "About",
|
||||||
|
"about-mealie": "About Mealie",
|
||||||
|
"api-docs": "API Docs",
|
||||||
|
"api-port": "API Port",
|
||||||
|
"application-mode": "Application Mode",
|
||||||
|
"database-type": "Database Type",
|
||||||
|
"database-url": "Database URL",
|
||||||
|
"default-group": "Default Group",
|
||||||
|
"demo": "Demo",
|
||||||
|
"demo-status": "Demo Status",
|
||||||
|
"development": "Development",
|
||||||
|
"docs": "Docs",
|
||||||
|
"download-log": "Download Log",
|
||||||
|
"download-recipe-json": "Last Scraped JSON",
|
||||||
|
"github": "Github",
|
||||||
|
"log-lines": "Log Lines",
|
||||||
|
"not-demo": "Not Demo",
|
||||||
|
"portfolio": "Portfolio",
|
||||||
|
"production": "Production",
|
||||||
|
"support": "Support",
|
||||||
|
"version": "Version"
|
||||||
|
},
|
||||||
|
"asset": {
|
||||||
|
"assets": "Assets",
|
||||||
|
"code": "Code",
|
||||||
|
"file": "File",
|
||||||
|
"image": "Image",
|
||||||
|
"new-asset": "New Asset",
|
||||||
|
"pdf": "PDF",
|
||||||
|
"recipe": "Recipe",
|
||||||
|
"show-assets": "Show Assets"
|
||||||
|
},
|
||||||
|
"category": {
|
||||||
|
"category-created": "Category created",
|
||||||
|
"category-creation-failed": "Category creation failed",
|
||||||
|
"category-deleted": "Category deleted",
|
||||||
|
"category-deletion-failed": "Category deletion failed",
|
||||||
|
"category-filter": "Category Filter",
|
||||||
|
"category-update-failed": "Category update failed",
|
||||||
|
"category-updated": "Category updated",
|
||||||
|
"uncategorized-count": "Uncategorised {count}"
|
||||||
|
},
|
||||||
|
"events": {
|
||||||
|
"apprise-url": "Apprise URL",
|
||||||
|
"database": "Database",
|
||||||
|
"delete-event": "Delete Event",
|
||||||
|
"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",
|
||||||
|
"scheduled": "Scheduled",
|
||||||
|
"something-went-wrong": "Something Went Wrong!",
|
||||||
|
"subscribed-events": "Subscribed Events",
|
||||||
|
"test-message-sent": "Test Message Sent"
|
||||||
|
},
|
||||||
|
"general": {
|
||||||
|
"cancel": "Cancel",
|
||||||
|
"clear": "Clear",
|
||||||
|
"close": "Close",
|
||||||
|
"confirm": "Confirm",
|
||||||
|
"confirm-delete-generic": "Are you sure you want to delete this?",
|
||||||
|
"copied": "Copied",
|
||||||
|
"create": "Create",
|
||||||
|
"created": "Created",
|
||||||
|
"custom": "Custom",
|
||||||
|
"dashboard": "Dashboard",
|
||||||
|
"delete": "Delete",
|
||||||
|
"disabled": "Disabled",
|
||||||
|
"download": "Download",
|
||||||
|
"edit": "Edit",
|
||||||
|
"enabled": "Enabled",
|
||||||
|
"exception": "Exception",
|
||||||
|
"failed-count": "Failed: {count}",
|
||||||
|
"failure-uploading-file": "Failure uploading file",
|
||||||
|
"favorites": "Favourites",
|
||||||
|
"field-required": "Field Required",
|
||||||
|
"file-folder-not-found": "File/folder not found",
|
||||||
|
"file-uploaded": "File uploaded",
|
||||||
|
"filter": "Filter",
|
||||||
|
"friday": "Friday",
|
||||||
|
"general": "General",
|
||||||
|
"get": "Get",
|
||||||
|
"home": "Home",
|
||||||
|
"image": "Image",
|
||||||
|
"image-upload-failed": "Image upload failed",
|
||||||
|
"import": "Import",
|
||||||
|
"json": "JSON",
|
||||||
|
"keyword": "Keyword",
|
||||||
|
"link-copied": "Link Copied",
|
||||||
|
"loading-recipes": "Loading Recipes",
|
||||||
|
"monday": "Monday",
|
||||||
|
"name": "Name",
|
||||||
|
"new": "New",
|
||||||
|
"no": "No",
|
||||||
|
"no-recipe-found": "No Recipe Found",
|
||||||
|
"ok": "OK",
|
||||||
|
"options": "Options:",
|
||||||
|
"print": "Print",
|
||||||
|
"random": "Random",
|
||||||
|
"rating": "Rating",
|
||||||
|
"recent": "Recent",
|
||||||
|
"recipe": "Recipe",
|
||||||
|
"recipes": "Recipes",
|
||||||
|
"rename-object": "Rename {0}",
|
||||||
|
"reset": "Reset",
|
||||||
|
"saturday": "Saturday",
|
||||||
|
"save": "Save",
|
||||||
|
"settings": "Settings",
|
||||||
|
"share": "Share",
|
||||||
|
"shuffle": "Shuffle",
|
||||||
|
"sort": "Sort",
|
||||||
|
"sort-alphabetically": "Alphabetical",
|
||||||
|
"status": "Status",
|
||||||
|
"submit": "Submit",
|
||||||
|
"success-count": "Success: {count}",
|
||||||
|
"sunday": "Sunday",
|
||||||
|
"templates": "Templates:",
|
||||||
|
"test": "Test",
|
||||||
|
"themes": "Themes",
|
||||||
|
"thursday": "Thursday",
|
||||||
|
"token": "Token",
|
||||||
|
"tuesday": "Tuesday",
|
||||||
|
"type": "Type",
|
||||||
|
"update": "Update",
|
||||||
|
"updated": "Updated",
|
||||||
|
"upload": "Upload",
|
||||||
|
"url": "URL",
|
||||||
|
"view": "View",
|
||||||
|
"wednesday": "Wednesday",
|
||||||
|
"yes": "Yes"
|
||||||
|
},
|
||||||
|
"group": {
|
||||||
|
"are-you-sure-you-want-to-delete-the-group": "Are you sure you want to delete <b>{groupName}<b/>?",
|
||||||
|
"cannot-delete-default-group": "Cannot delete default group",
|
||||||
|
"cannot-delete-group-with-users": "Cannot delete group with users",
|
||||||
|
"confirm-group-deletion": "Confirm Group Deletion",
|
||||||
|
"create-group": "Create Group",
|
||||||
|
"error-updating-group": "Error updating group",
|
||||||
|
"group": "Group",
|
||||||
|
"group-deleted": "Group deleted",
|
||||||
|
"group-deletion-failed": "Group deletion failed",
|
||||||
|
"group-id-with-value": "Group ID: {groupID}",
|
||||||
|
"group-name": "Group Name",
|
||||||
|
"group-not-found": "Group not found",
|
||||||
|
"group-with-value": "Group: {groupID}",
|
||||||
|
"groups": "Groups",
|
||||||
|
"manage-groups": "Manage Groups",
|
||||||
|
"user-group": "User Group",
|
||||||
|
"user-group-created": "User Group Created",
|
||||||
|
"user-group-creation-failed": "User Group Creation Failed"
|
||||||
|
},
|
||||||
|
"meal-plan": {
|
||||||
|
"create-a-new-meal-plan": "Create a New Meal Plan",
|
||||||
|
"dinner-this-week": "Dinner This Week",
|
||||||
|
"dinner-today": "Dinner Today",
|
||||||
|
"dinner-tonight": "DINNER TONIGHT",
|
||||||
|
"edit-meal-plan": "Edit Meal Plan",
|
||||||
|
"end-date": "End Date",
|
||||||
|
"group": "Group (Beta)",
|
||||||
|
"main": "Main",
|
||||||
|
"meal-planner": "Meal Planner",
|
||||||
|
"meal-plans": "Meal Plans",
|
||||||
|
"mealplan-categories": "MEALPLAN CATEGORIES",
|
||||||
|
"mealplan-created": "Mealplan created",
|
||||||
|
"mealplan-creation-failed": "Mealplan creation failed",
|
||||||
|
"mealplan-deleted": "Mealplan deleted",
|
||||||
|
"mealplan-deletion-failed": "Mealplan deletion failed",
|
||||||
|
"mealplan-settings": "Mealplan Settings",
|
||||||
|
"mealplan-update-failed": "Mealplan update failed",
|
||||||
|
"mealplan-updated": "Mealplan Updated",
|
||||||
|
"no-meal-plan-defined-yet": "No meal plan defined yet",
|
||||||
|
"no-meal-planned-for-today": "No meal planned for today",
|
||||||
|
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Only recipes with these categories will be used in Meal Plans",
|
||||||
|
"planner": "Planner",
|
||||||
|
"quick-week": "Quick Week",
|
||||||
|
"side": "Side",
|
||||||
|
"sides": "Sides",
|
||||||
|
"start-date": "Start Date"
|
||||||
|
},
|
||||||
|
"migration": {
|
||||||
|
"chowdown": {
|
||||||
|
"description": "Migrate data from Chowdown",
|
||||||
|
"title": "Chowdown"
|
||||||
|
},
|
||||||
|
"migration-data-removed": "Migration data removed",
|
||||||
|
"nextcloud": {
|
||||||
|
"description": "Migrate data from a Nextcloud Cookbook instance",
|
||||||
|
"title": "Nextcloud Cookbook"
|
||||||
|
},
|
||||||
|
"no-migration-data-available": "No Migration Data Available",
|
||||||
|
"recipe-migration": "Recipe Migration"
|
||||||
|
},
|
||||||
|
"new-recipe": {
|
||||||
|
"bulk-add": "Bulk Add",
|
||||||
|
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
||||||
|
"error-title": "Looks Like We Couldn't Find Anything",
|
||||||
|
"from-url": "Import a Recipe",
|
||||||
|
"github-issues": "GitHub Issues",
|
||||||
|
"google-ld-json-info": "Google ld+json Info",
|
||||||
|
"must-be-a-valid-url": "Must be a Valid URL",
|
||||||
|
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
|
||||||
|
"recipe-markup-specification": "Recipe Markup Specification",
|
||||||
|
"recipe-url": "Recipe URL",
|
||||||
|
"upload-a-recipe": "Upload a Recipe",
|
||||||
|
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
|
||||||
|
"url-form-hint": "Copy and paste a link from your favourite recipe website",
|
||||||
|
"view-scraped-data": "View Scraped Data"
|
||||||
|
},
|
||||||
|
"page": {
|
||||||
|
"404-page-not-found": "404 Page not found",
|
||||||
|
"all-recipes": "All Recipes",
|
||||||
|
"new-page-created": "New page created",
|
||||||
|
"page": "Page",
|
||||||
|
"page-creation-failed": "Page creation failed",
|
||||||
|
"page-deleted": "Page deleted",
|
||||||
|
"page-deletion-failed": "Page deletion failed",
|
||||||
|
"page-update-failed": "Page update failed",
|
||||||
|
"page-updated": "Page updated",
|
||||||
|
"pages-update-failed": "Pages update failed",
|
||||||
|
"pages-updated": "Pages updated"
|
||||||
|
},
|
||||||
|
"recipe": {
|
||||||
|
"add-key": "Add Key",
|
||||||
|
"add-to-favorites": "Add to Favourites",
|
||||||
|
"api-extras": "API Extras",
|
||||||
|
"calories": "Calories",
|
||||||
|
"calories-suffix": "calories",
|
||||||
|
"carbohydrate-content": "Carbohydrate",
|
||||||
|
"categories": "Categories",
|
||||||
|
"comment-action": "Comment",
|
||||||
|
"comments": "Comments",
|
||||||
|
"delete-confirmation": "Are you sure you want to delete this recipe?",
|
||||||
|
"delete-recipe": "Delete Recipe",
|
||||||
|
"description": "Description",
|
||||||
|
"disable-amount": "Disable Ingredient Amounts",
|
||||||
|
"disable-comments": "Disable Comments",
|
||||||
|
"fat-content": "Fat",
|
||||||
|
"fiber-content": "Fibre",
|
||||||
|
"grams": "grams",
|
||||||
|
"ingredient": "Ingredient",
|
||||||
|
"ingredients": "Ingredients",
|
||||||
|
"insert-section": "Insert Section",
|
||||||
|
"instructions": "Instructions",
|
||||||
|
"key-name-required": "Key Name Required",
|
||||||
|
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
|
||||||
|
"milligrams": "milligrams",
|
||||||
|
"new-key-name": "New Key Name",
|
||||||
|
"no-white-space-allowed": "No White Space Allowed",
|
||||||
|
"note": "Note",
|
||||||
|
"nutrition": "Nutrition",
|
||||||
|
"object-key": "Object Key",
|
||||||
|
"object-value": "Object Value",
|
||||||
|
"original-url": "Original URL",
|
||||||
|
"perform-time": "Cook Time",
|
||||||
|
"prep-time": "Prep Time",
|
||||||
|
"protein-content": "Protein",
|
||||||
|
"public-recipe": "Public Recipe",
|
||||||
|
"recipe-created": "Recipe created",
|
||||||
|
"recipe-creation-failed": "Recipe creation failed",
|
||||||
|
"recipe-deleted": "Recipe deleted",
|
||||||
|
"recipe-image": "Recipe Image",
|
||||||
|
"recipe-image-updated": "Recipe image updated",
|
||||||
|
"recipe-name": "Recipe Name",
|
||||||
|
"recipe-settings": "Recipe Settings",
|
||||||
|
"recipe-update-failed": "Recipe update failed",
|
||||||
|
"recipe-updated": "Recipe updated",
|
||||||
|
"remove-from-favorites": "Remove from Favourites",
|
||||||
|
"remove-section": "Remove Section",
|
||||||
|
"save-recipe-before-use": "Save recipe before use",
|
||||||
|
"section-title": "Section Title",
|
||||||
|
"servings": "Servings",
|
||||||
|
"share-recipe-message": "I wanted to share my {0} recipe with you.",
|
||||||
|
"show-nutrition-values": "Show Nutrition Values",
|
||||||
|
"sodium-content": "Sodium",
|
||||||
|
"step-index": "Step. {step}",
|
||||||
|
"sugar-content": "Sugar",
|
||||||
|
"title": "Title",
|
||||||
|
"total-time": "Total Time",
|
||||||
|
"unable-to-delete-recipe": "Unable to Delete Recipe"
|
||||||
|
},
|
||||||
|
"reicpe": {
|
||||||
|
"no-recipe": "No Recipe"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"advanced-search": "Advanced Search",
|
||||||
|
"and": "and",
|
||||||
|
"exclude": "Exclude",
|
||||||
|
"include": "Include",
|
||||||
|
"max-results": "Max Results",
|
||||||
|
"or": "Or",
|
||||||
|
"results": "Results",
|
||||||
|
"search": "Search",
|
||||||
|
"search-mealie": "Search Mealie (press /)",
|
||||||
|
"search-placeholder": "Search...",
|
||||||
|
"tag-filter": "Tag Filter"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"add-a-new-theme": "Add a New Theme",
|
||||||
|
"admin-settings": "Admin Settings",
|
||||||
|
"backup": {
|
||||||
|
"backup-created-at-response-export_path": "Backup Created at {path}",
|
||||||
|
"backup-deleted": "Backup deleted",
|
||||||
|
"backup-tag": "Backup Tag",
|
||||||
|
"create-heading": "Create a Backup",
|
||||||
|
"delete-backup": "Delete Backup",
|
||||||
|
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
|
||||||
|
"full-backup": "Full Backup",
|
||||||
|
"import-summary": "Import Summary",
|
||||||
|
"partial-backup": "Partial Backup",
|
||||||
|
"unable-to-delete-backup": "Unable to Delete Backup."
|
||||||
|
},
|
||||||
|
"backup-and-exports": "Backups",
|
||||||
|
"change-password": "Change Password",
|
||||||
|
"current": "Version:",
|
||||||
|
"custom-pages": "Custom Pages",
|
||||||
|
"edit-page": "Edit Page",
|
||||||
|
"events": "Events",
|
||||||
|
"first-day-of-week": "First day of the week",
|
||||||
|
"group-settings-updated": "Group Settings Updated",
|
||||||
|
"homepage": {
|
||||||
|
"all-categories": "All Categories",
|
||||||
|
"card-per-section": "Card Per Section",
|
||||||
|
"home-page": "Home Page",
|
||||||
|
"home-page-sections": "Home Page Sections",
|
||||||
|
"show-recent": "Show Recent"
|
||||||
|
},
|
||||||
|
"language": "Language",
|
||||||
|
"latest": "Latest",
|
||||||
|
"local-api": "Local API",
|
||||||
|
"locale-settings": "Locale settings",
|
||||||
|
"migrations": "Migrations",
|
||||||
|
"new-page": "New Page",
|
||||||
|
"notify": "Notify",
|
||||||
|
"organize": "Organise",
|
||||||
|
"page-name": "Page Name",
|
||||||
|
"pages": "Pages",
|
||||||
|
"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",
|
||||||
|
"theme": {
|
||||||
|
"accent": "Accent",
|
||||||
|
"dark": "Dark",
|
||||||
|
"default-to-system": "Default to system",
|
||||||
|
"error": "Error",
|
||||||
|
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
|
||||||
|
"error-deleting-theme": "Error deleting theme",
|
||||||
|
"error-updating-theme": "Error updating theme",
|
||||||
|
"info": "Info",
|
||||||
|
"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",
|
||||||
|
"theme-name-is-required": "Theme Name is required.",
|
||||||
|
"theme-saved": "Theme Saved",
|
||||||
|
"theme-updated": "Theme updated",
|
||||||
|
"warning": "Warning"
|
||||||
|
},
|
||||||
|
"token": {
|
||||||
|
"active-tokens": "ACTIVE TOKENS",
|
||||||
|
"api-token": "API Token",
|
||||||
|
"api-tokens": "API Tokens",
|
||||||
|
"copy-this-token-for-use-with-an-external-application-this-token-will-not-be-viewable-again": "Copy this token for use with an external application. This token will not be viewable again.",
|
||||||
|
"create-an-api-token": "Create an API Token",
|
||||||
|
"token-name": "Token Name"
|
||||||
|
},
|
||||||
|
"toolbox": {
|
||||||
|
"assign-all": "Assign All",
|
||||||
|
"bulk-assign": "Bulk Assign",
|
||||||
|
"new-name": "New Name",
|
||||||
|
"no-unused-items": "No Unused Items",
|
||||||
|
"recipes-affected": "No Recipes Affected|One Recipe Affected|{count} Recipes Affected",
|
||||||
|
"remove-unused": "Remove Unused",
|
||||||
|
"title-case-all": "Title Case All",
|
||||||
|
"toolbox": "Toolbox",
|
||||||
|
"unorganized": "Unorganised"
|
||||||
|
},
|
||||||
|
"webhooks": {
|
||||||
|
"test-webhooks": "Test Webhooks",
|
||||||
|
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "The URLs listed below will receive webhooks containing the recipe data for the meal plan on its scheduled day. Currently Webhooks will execute at",
|
||||||
|
"webhook-url": "Webhook URL",
|
||||||
|
"webhooks-caps": "WEBHOOKS"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"shopping-list": {
|
||||||
|
"all-lists": "All Lists",
|
||||||
|
"create-shopping-list": "Create Shopping List",
|
||||||
|
"from-recipe": "From Recipe",
|
||||||
|
"list-name": "List Name",
|
||||||
|
"new-list": "New List",
|
||||||
|
"quantity": "Quantity: {0}",
|
||||||
|
"shopping-list": "Shopping List",
|
||||||
|
"shopping-lists": "Shopping Lists"
|
||||||
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"all-recipes": "All Recipes",
|
||||||
|
"categories": "Categories",
|
||||||
|
"dashboard": "Dashboard",
|
||||||
|
"home-page": "Home Page",
|
||||||
|
"manage-users": "Manage Users",
|
||||||
|
"migrations": "Migrations",
|
||||||
|
"profile": "Profile",
|
||||||
|
"search": "Search",
|
||||||
|
"site-settings": "Site Settings",
|
||||||
|
"tags": "Tags",
|
||||||
|
"toolbox": "Toolbox"
|
||||||
|
},
|
||||||
|
"signup": {
|
||||||
|
"error-signing-up": "Error Signing 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",
|
||||||
|
"sign-up-token-deleted": "Sign Up Token Deleted",
|
||||||
|
"sign-up-token-deletion-failed": "Sign up token deletion failed",
|
||||||
|
"welcome-to-mealie": "Welcome to Mealie! To become a user of this instance you are required to have a valid invitation link. If you haven't received an invitation you are unable to sign-up. To receive a link, contact the sites administrator."
|
||||||
|
},
|
||||||
|
"tag": {
|
||||||
|
"tag-created": "Tag created",
|
||||||
|
"tag-creation-failed": "Tag creation failed",
|
||||||
|
"tag-deleted": "Tag deleted",
|
||||||
|
"tag-deletion-failed": "Tag deletion failed",
|
||||||
|
"tag-update-failed": "Tag update failed",
|
||||||
|
"tag-updated": "Tag updated",
|
||||||
|
"tags": "Tags",
|
||||||
|
"untagged-count": "Untagged {count}"
|
||||||
|
},
|
||||||
|
"user": {
|
||||||
|
"admin": "Admin",
|
||||||
|
"are-you-sure-you-want-to-delete-the-link": "Are you sure you want to delete the link <b>{link}<b/>?",
|
||||||
|
"are-you-sure-you-want-to-delete-the-user": "Are you sure you want to delete the user <b>{activeName} ID: {activeId}<b/>?",
|
||||||
|
"confirm-link-deletion": "Confirm Link Deletion",
|
||||||
|
"confirm-password": "Confirm Password",
|
||||||
|
"confirm-user-deletion": "Confirm User Deletion",
|
||||||
|
"could-not-validate-credentials": "Could Not Validate Credentials",
|
||||||
|
"create-link": "Create Link",
|
||||||
|
"create-user": "Create User",
|
||||||
|
"current-password": "Current Password",
|
||||||
|
"e-mail-must-be-valid": "Email must be valid",
|
||||||
|
"edit-user": "Edit User",
|
||||||
|
"email": "Email",
|
||||||
|
"error-cannot-delete-super-user": "Error! Cannot Delete Super User",
|
||||||
|
"existing-password-does-not-match": "Existing password does not match",
|
||||||
|
"full-name": "Full Name",
|
||||||
|
"link-id": "Link ID",
|
||||||
|
"link-name": "Link Name",
|
||||||
|
"login": "Login",
|
||||||
|
"logout": "Logout",
|
||||||
|
"manage-users": "Manage Users",
|
||||||
|
"new-password": "New Password",
|
||||||
|
"new-user": "New User",
|
||||||
|
"password": "Password",
|
||||||
|
"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",
|
||||||
|
"reset-password": "Reset Password",
|
||||||
|
"sign-in": "Sign in",
|
||||||
|
"total-mealplans": "Total MealPlans",
|
||||||
|
"total-users": "Total Users",
|
||||||
|
"upload-photo": "Upload Photo",
|
||||||
|
"use-8-characters-or-more-for-your-password": "Use 8 characters or more for your password",
|
||||||
|
"user": "User",
|
||||||
|
"user-created": "User created",
|
||||||
|
"user-creation-failed": "User creation failed",
|
||||||
|
"user-deleted": "User deleted",
|
||||||
|
"user-id": "User ID",
|
||||||
|
"user-id-with-value": "User ID: {id}",
|
||||||
|
"user-password": "User Password",
|
||||||
|
"user-successfully-logged-in": "User Successfully Logged In",
|
||||||
|
"user-update-failed": "User update failed",
|
||||||
|
"user-updated": "User updated",
|
||||||
|
"username": "Username",
|
||||||
|
"users": "Users",
|
||||||
|
"users-header": "USERS",
|
||||||
|
"webhook-time": "Webhook Time",
|
||||||
|
"webhooks-enabled": "Webhooks Enabled",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,4 @@
|
|||||||
{
|
{
|
||||||
"404": {
|
|
||||||
"page-not-found": "404 Page Not Found",
|
|
||||||
"take-me-home": "Take me Home"
|
|
||||||
},
|
|
||||||
"about": {
|
"about": {
|
||||||
"about": "About",
|
"about": "About",
|
||||||
"about-mealie": "About Mealie",
|
"about-mealie": "About Mealie",
|
||||||
@@ -26,8 +22,17 @@
|
|||||||
"support": "Support",
|
"support": "Support",
|
||||||
"version": "Version"
|
"version": "Version"
|
||||||
},
|
},
|
||||||
|
"asset": {
|
||||||
|
"assets": "Assets",
|
||||||
|
"code": "Code",
|
||||||
|
"file": "File",
|
||||||
|
"image": "Image",
|
||||||
|
"new-asset": "New Asset",
|
||||||
|
"pdf": "PDF",
|
||||||
|
"recipe": "Recipe",
|
||||||
|
"show-assets": "Show Assets"
|
||||||
|
},
|
||||||
"category": {
|
"category": {
|
||||||
"category": "Category",
|
|
||||||
"category-created": "Category created",
|
"category-created": "Category created",
|
||||||
"category-creation-failed": "Category creation failed",
|
"category-creation-failed": "Category creation failed",
|
||||||
"category-deleted": "Category Deleted",
|
"category-deleted": "Category Deleted",
|
||||||
@@ -40,17 +45,17 @@
|
|||||||
"events": {
|
"events": {
|
||||||
"apprise-url": "Apprise URL",
|
"apprise-url": "Apprise URL",
|
||||||
"database": "Database",
|
"database": "Database",
|
||||||
|
"delete-event": "Delete Event",
|
||||||
"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-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",
|
"notification": "Notification",
|
||||||
|
"refresh": "Refresh",
|
||||||
"scheduled": "Scheduled",
|
"scheduled": "Scheduled",
|
||||||
"something-went-wrong": "Something Went Wrong!",
|
"something-went-wrong": "Something Went Wrong!",
|
||||||
"subscribed-events": "Subscribed Events",
|
"subscribed-events": "Subscribed Events",
|
||||||
"test-message-sent": "Test Message Sent",
|
"test-message-sent": "Test Message Sent"
|
||||||
"refresh": "Refresh",
|
|
||||||
"new-version": "New version available!"
|
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"apply": "Apply",
|
|
||||||
"cancel": "Cancel",
|
"cancel": "Cancel",
|
||||||
"clear": "Clear",
|
"clear": "Clear",
|
||||||
"close": "Close",
|
"close": "Close",
|
||||||
@@ -59,7 +64,6 @@
|
|||||||
"copied": "Copied",
|
"copied": "Copied",
|
||||||
"create": "Create",
|
"create": "Create",
|
||||||
"created": "Created",
|
"created": "Created",
|
||||||
"current-parenthesis": "(Current)",
|
|
||||||
"custom": "Custom",
|
"custom": "Custom",
|
||||||
"dashboard": "Dashboard",
|
"dashboard": "Dashboard",
|
||||||
"delete": "Delete",
|
"delete": "Delete",
|
||||||
@@ -78,18 +82,19 @@
|
|||||||
"friday": "Friday",
|
"friday": "Friday",
|
||||||
"general": "General",
|
"general": "General",
|
||||||
"get": "Get",
|
"get": "Get",
|
||||||
|
"home": "Home",
|
||||||
"image": "Image",
|
"image": "Image",
|
||||||
"image-upload-failed": "Image upload failed",
|
"image-upload-failed": "Image upload failed",
|
||||||
"import": "Import",
|
"import": "Import",
|
||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Keyword",
|
"keyword": "Keyword",
|
||||||
"link": "Link",
|
|
||||||
"link-copied": "Link Copied",
|
"link-copied": "Link Copied",
|
||||||
|
"loading-recipes": "Loading Recipes",
|
||||||
"monday": "Monday",
|
"monday": "Monday",
|
||||||
"more": "More",
|
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
"new": "New",
|
"new": "New",
|
||||||
"no": "No",
|
"no": "No",
|
||||||
|
"no-recipe-found": "No Recipe Found",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"options": "Options:",
|
"options": "Options:",
|
||||||
"print": "Print",
|
"print": "Print",
|
||||||
@@ -139,8 +144,8 @@
|
|||||||
"group-id-with-value": "Group ID: {groupID}",
|
"group-id-with-value": "Group ID: {groupID}",
|
||||||
"group-name": "Group Name",
|
"group-name": "Group Name",
|
||||||
"group-not-found": "Group not found",
|
"group-not-found": "Group not found",
|
||||||
|
"group-with-value": "Group: {groupID}",
|
||||||
"groups": "Groups",
|
"groups": "Groups",
|
||||||
"groups-can-only-be-set-by-administrators": "Groups can only be set by administrators",
|
|
||||||
"manage-groups": "Manage Groups",
|
"manage-groups": "Manage Groups",
|
||||||
"user-group": "User Group",
|
"user-group": "User Group",
|
||||||
"user-group-created": "User Group Created",
|
"user-group-created": "User Group Created",
|
||||||
@@ -192,13 +197,20 @@
|
|||||||
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
||||||
"error-title": "Looks Like We Couldn't Find Anything",
|
"error-title": "Looks Like We Couldn't Find Anything",
|
||||||
"from-url": "Import a Recipe",
|
"from-url": "Import a Recipe",
|
||||||
|
"github-issues": "GitHub Issues",
|
||||||
|
"google-ld-json-info": "Google ld+json Info",
|
||||||
|
"must-be-a-valid-url": "Must be a Valid URL",
|
||||||
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
|
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
|
||||||
|
"recipe-markup-specification": "Recipe Markup Specification",
|
||||||
"recipe-url": "Recipe URL",
|
"recipe-url": "Recipe URL",
|
||||||
"url-form-hint": "Copy and paste a link from your favorite recipe website"
|
"upload-a-recipe": "Upload a Recipe",
|
||||||
|
"upload-individual-zip-file": "Upload an individual .zip file exported from another Mealie instance.",
|
||||||
|
"url-form-hint": "Copy and paste a link from your favorite recipe website",
|
||||||
|
"view-scraped-data": "View Scraped Data"
|
||||||
},
|
},
|
||||||
"page": {
|
"page": {
|
||||||
|
"404-page-not-found": "404 Page not found",
|
||||||
"all-recipes": "All Recipes",
|
"all-recipes": "All Recipes",
|
||||||
"home-page": "Home Page",
|
|
||||||
"new-page-created": "New page created",
|
"new-page-created": "New page created",
|
||||||
"page": "Page",
|
"page": "Page",
|
||||||
"page-creation-failed": "Page creation failed",
|
"page-creation-failed": "Page creation failed",
|
||||||
@@ -207,14 +219,12 @@
|
|||||||
"page-update-failed": "Page update failed",
|
"page-update-failed": "Page update failed",
|
||||||
"page-updated": "Page updated",
|
"page-updated": "Page updated",
|
||||||
"pages-update-failed": "Pages update failed",
|
"pages-update-failed": "Pages update failed",
|
||||||
"pages-updated": "Pages updated",
|
"pages-updated": "Pages updated"
|
||||||
"recent": "Recent"
|
|
||||||
},
|
},
|
||||||
"recipe": {
|
"recipe": {
|
||||||
"add-key": "Add Key",
|
"add-key": "Add Key",
|
||||||
"add-to-favorites": "Add to Favorites",
|
"add-to-favorites": "Add to Favorites",
|
||||||
"api-extras": "API Extras",
|
"api-extras": "API Extras",
|
||||||
"assets": "Assets",
|
|
||||||
"calories": "Calories",
|
"calories": "Calories",
|
||||||
"calories-suffix": "calories",
|
"calories-suffix": "calories",
|
||||||
"carbohydrate-content": "Carbohydrate",
|
"carbohydrate-content": "Carbohydrate",
|
||||||
@@ -236,11 +246,9 @@
|
|||||||
"key-name-required": "Key Name Required",
|
"key-name-required": "Key Name Required",
|
||||||
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
|
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
|
||||||
"milligrams": "milligrams",
|
"milligrams": "milligrams",
|
||||||
"new-asset": "New Asset",
|
|
||||||
"new-key-name": "New Key Name",
|
"new-key-name": "New Key Name",
|
||||||
"no-white-space-allowed": "No White Space Allowed",
|
"no-white-space-allowed": "No White Space Allowed",
|
||||||
"note": "Note",
|
"note": "Note",
|
||||||
"notes": "Notes",
|
|
||||||
"nutrition": "Nutrition",
|
"nutrition": "Nutrition",
|
||||||
"object-key": "Object Key",
|
"object-key": "Object Key",
|
||||||
"object-value": "Object Value",
|
"object-value": "Object Value",
|
||||||
@@ -260,18 +268,17 @@
|
|||||||
"recipe-updated": "Recipe updated",
|
"recipe-updated": "Recipe updated",
|
||||||
"remove-from-favorites": "Remove from Favorites",
|
"remove-from-favorites": "Remove from Favorites",
|
||||||
"remove-section": "Remove Section",
|
"remove-section": "Remove Section",
|
||||||
|
"save-recipe-before-use": "Save recipe before use",
|
||||||
"section-title": "Section Title",
|
"section-title": "Section Title",
|
||||||
"servings": "Servings",
|
"servings": "Servings",
|
||||||
"share-recipe-message": "I wanted to share my {0} recipe with you.",
|
"share-recipe-message": "I wanted to share my {0} recipe with you.",
|
||||||
"show-assets": "Show Assets",
|
|
||||||
"show-nutrition-values": "Show Nutrition Values",
|
"show-nutrition-values": "Show Nutrition Values",
|
||||||
"sodium-content": "Sodium",
|
"sodium-content": "Sodium",
|
||||||
"step-index": "Step: {step}",
|
"step-index": "Step: {step}",
|
||||||
"sugar-content": "Sugar",
|
"sugar-content": "Sugar",
|
||||||
"title": "Title",
|
"title": "Title",
|
||||||
"total-time": "Total Time",
|
"total-time": "Total Time",
|
||||||
"unable-to-delete-recipe": "Unable to Delete Recipe",
|
"unable-to-delete-recipe": "Unable to Delete Recipe"
|
||||||
"view-recipe": "View Recipe"
|
|
||||||
},
|
},
|
||||||
"reicpe": {
|
"reicpe": {
|
||||||
"no-recipe": "No Recipe"
|
"no-recipe": "No Recipe"
|
||||||
@@ -292,12 +299,12 @@
|
|||||||
"settings": {
|
"settings": {
|
||||||
"add-a-new-theme": "Add a New Theme",
|
"add-a-new-theme": "Add a New Theme",
|
||||||
"admin-settings": "Admin Settings",
|
"admin-settings": "Admin Settings",
|
||||||
"available-backups": "Available Backups",
|
|
||||||
"backup": {
|
"backup": {
|
||||||
"backup-created-at-response-export_path": "Backup Created at {path}",
|
"backup-created-at-response-export_path": "Backup Created at {path}",
|
||||||
"backup-deleted": "Backup deleted",
|
"backup-deleted": "Backup deleted",
|
||||||
"backup-tag": "Backup Tag",
|
"backup-tag": "Backup Tag",
|
||||||
"create-heading": "Create a Backup",
|
"create-heading": "Create a Backup",
|
||||||
|
"delete-backup": "Delete Backup",
|
||||||
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
|
"error-creating-backup-see-log-file": "Error Creating Backup. See Log File",
|
||||||
"full-backup": "Full Backup",
|
"full-backup": "Full Backup",
|
||||||
"import-summary": "Import Summary",
|
"import-summary": "Import Summary",
|
||||||
@@ -305,7 +312,6 @@
|
|||||||
"unable-to-delete-backup": "Unable to Delete Backup."
|
"unable-to-delete-backup": "Unable to Delete Backup."
|
||||||
},
|
},
|
||||||
"backup-and-exports": "Backups",
|
"backup-and-exports": "Backups",
|
||||||
"backup-info": "Backups are exported in standard JSON format along with all the images stored on the file system. In your backup folder you'll find a .zip file that contains all of the recipe JSON and images from the database. Additionally, if you selected a markdown file, those will also be stored in the .zip file. To import a backup, it must be located in your backups folder. Automated backups are done each day at 3:00 AM.",
|
|
||||||
"change-password": "Change Password",
|
"change-password": "Change Password",
|
||||||
"current": "Version:",
|
"current": "Version:",
|
||||||
"custom-pages": "Custom Pages",
|
"custom-pages": "Custom Pages",
|
||||||
@@ -338,12 +344,8 @@
|
|||||||
"site-settings": "Site Settings",
|
"site-settings": "Site Settings",
|
||||||
"theme": {
|
"theme": {
|
||||||
"accent": "Accent",
|
"accent": "Accent",
|
||||||
"are-you-sure-you-want-to-delete-this-theme": "Are you sure you want to delete this theme?",
|
|
||||||
"choose-how-mealie-looks-to-you-set-your-theme-preference-to-follow-your-system-settings-or-choose-to-use-the-light-or-dark-theme": "Choose how Mealie looks to you. Set your theme preference to follow your system settings, or choose to use the light or dark theme.",
|
|
||||||
"dark": "Dark",
|
"dark": "Dark",
|
||||||
"dark-mode": "Dark Mode",
|
|
||||||
"default-to-system": "Default to system",
|
"default-to-system": "Default to system",
|
||||||
"delete-theme": "Delete Theme",
|
|
||||||
"error": "Error",
|
"error": "Error",
|
||||||
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
|
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
|
||||||
"error-deleting-theme": "Error deleting theme",
|
"error-deleting-theme": "Error deleting theme",
|
||||||
@@ -352,16 +354,13 @@
|
|||||||
"light": "Light",
|
"light": "Light",
|
||||||
"primary": "Primary",
|
"primary": "Primary",
|
||||||
"secondary": "Secondary",
|
"secondary": "Secondary",
|
||||||
"select-a-theme-from-the-dropdown-or-create-a-new-theme-note-that-the-default-theme-will-be-served-to-all-users-who-have-not-set-a-theme-preference": "Select a theme from the dropdown or create a new theme. Note that the default theme will be served to all users who have not set a theme preference.",
|
|
||||||
"success": "Success",
|
"success": "Success",
|
||||||
"switch-to-dark-mode": "Switch to dark mode",
|
"switch-to-dark-mode": "Switch to dark mode",
|
||||||
"switch-to-light-mode": "Switch to light mode",
|
"switch-to-light-mode": "Switch to light mode",
|
||||||
"theme": "Theme",
|
|
||||||
"theme-deleted": "Theme deleted",
|
"theme-deleted": "Theme deleted",
|
||||||
"theme-name": "Theme Name",
|
"theme-name": "Theme Name",
|
||||||
"theme-name-is-required": "Theme Name is required.",
|
"theme-name-is-required": "Theme Name is required.",
|
||||||
"theme-saved": "Theme Saved",
|
"theme-saved": "Theme Saved",
|
||||||
"theme-settings": "Theme Settings",
|
|
||||||
"theme-updated": "Theme updated",
|
"theme-updated": "Theme updated",
|
||||||
"warning": "Warning"
|
"warning": "Warning"
|
||||||
},
|
},
|
||||||
@@ -385,7 +384,6 @@
|
|||||||
"unorganized": "Unorganized"
|
"unorganized": "Unorganized"
|
||||||
},
|
},
|
||||||
"webhooks": {
|
"webhooks": {
|
||||||
"meal-planner-webhooks": "Meal Planner Webhooks",
|
|
||||||
"test-webhooks": "Test Webhooks",
|
"test-webhooks": "Test Webhooks",
|
||||||
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "The URLs listed below will receive webhooks containing the recipe data for the meal plan on it's scheduled day. Currently Webhooks will execute at",
|
"the-urls-listed-below-will-recieve-webhooks-containing-the-recipe-data-for-the-meal-plan-on-its-scheduled-day-currently-webhooks-will-execute-at": "The URLs listed below will receive webhooks containing the recipe data for the meal plan on it's scheduled day. Currently Webhooks will execute at",
|
||||||
"webhook-url": "Webhook URL",
|
"webhook-url": "Webhook URL",
|
||||||
@@ -402,8 +400,20 @@
|
|||||||
"shopping-list": "Shopping List",
|
"shopping-list": "Shopping List",
|
||||||
"shopping-lists": "Shopping Lists"
|
"shopping-lists": "Shopping Lists"
|
||||||
},
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"all-recipes": "All Recipes",
|
||||||
|
"categories": "Categories",
|
||||||
|
"dashboard": "Dashboard",
|
||||||
|
"home-page": "Home Page",
|
||||||
|
"manage-users": "Manage Users",
|
||||||
|
"migrations": "Migrations",
|
||||||
|
"profile": "Profile",
|
||||||
|
"search": "Search",
|
||||||
|
"site-settings": "Site Settings",
|
||||||
|
"tags": "Tags",
|
||||||
|
"toolbox": "Toolbox"
|
||||||
|
},
|
||||||
"signup": {
|
"signup": {
|
||||||
"display-name": "Display Name",
|
|
||||||
"error-signing-up": "Error Signing Up",
|
"error-signing-up": "Error Signing Up",
|
||||||
"sign-up": "Sign Up",
|
"sign-up": "Sign Up",
|
||||||
"sign-up-link-created": "Sign up link created",
|
"sign-up-link-created": "Sign up link created",
|
||||||
@@ -440,7 +450,6 @@
|
|||||||
"error-cannot-delete-super-user": "Error! Cannot Delete Super User",
|
"error-cannot-delete-super-user": "Error! Cannot Delete Super User",
|
||||||
"existing-password-does-not-match": "Existing password does not match",
|
"existing-password-does-not-match": "Existing password does not match",
|
||||||
"full-name": "Full Name",
|
"full-name": "Full Name",
|
||||||
"incorrect-username-or-password": "Incorrect username or password",
|
|
||||||
"link-id": "Link ID",
|
"link-id": "Link ID",
|
||||||
"link-name": "Link Name",
|
"link-name": "Link Name",
|
||||||
"login": "Login",
|
"login": "Login",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user