Merge branch 'mealie-next' into fix/warn-on-edit-nav
@ -14,6 +14,7 @@ RUN echo "export PROMPT_COMMAND='history -a'" >> /home/vscode/.bashrc \
|
|||||||
&& echo "export HISTFILE=~/commandhistory/.bash_history" >> /home/vscode/.bashrc \
|
&& echo "export HISTFILE=~/commandhistory/.bash_history" >> /home/vscode/.bashrc \
|
||||||
&& chown vscode:vscode -R /home/vscode/
|
&& chown vscode:vscode -R /home/vscode/
|
||||||
|
|
||||||
|
RUN npm install -g @go-task/cli
|
||||||
|
|
||||||
ENV PYTHONUNBUFFERED=1 \
|
ENV PYTHONUNBUFFERED=1 \
|
||||||
PYTHONDONTWRITEBYTECODE=1 \
|
PYTHONDONTWRITEBYTECODE=1 \
|
||||||
@ -37,4 +38,3 @@ RUN apt-get update \
|
|||||||
libwebp-dev \
|
libwebp-dev \
|
||||||
libsasl2-dev libldap2-dev libssl-dev \
|
libsasl2-dev libldap2-dev libssl-dev \
|
||||||
gnupg gnupg2 gnupg1
|
gnupg gnupg2 gnupg1
|
||||||
# && pip install -U --no-cache-dir pip
|
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
],
|
],
|
||||||
// Use 'onCreateCommand' to run commands at the end of container creation.
|
// Use 'onCreateCommand' to run commands at the end of container creation.
|
||||||
// Use 'postCreateCommand' to run commands after the container is created.
|
// Use 'postCreateCommand' to run commands after the container is created.
|
||||||
"onCreateCommand": "sudo chown -R vscode:vscode /workspaces/mealie/frontend/node_modules && make setup",
|
"onCreateCommand": "sudo chown -R vscode:vscode /workspaces/mealie/frontend/node_modules && task setup",
|
||||||
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
|
// Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
|
||||||
"remoteUser": "vscode",
|
"remoteUser": "vscode",
|
||||||
// "features": {
|
// "features": {
|
||||||
|
@ -11,7 +11,7 @@ body:
|
|||||||
options:
|
options:
|
||||||
- label: I used the GitHub search to find a similar requests and didn't find it.
|
- label: I used the GitHub search to find a similar requests and didn't find it.
|
||||||
required: true
|
required: true
|
||||||
- label: Checked the [tasks tagged](https://github.com/hay-kot/mealie/issues?q=is%3Aissue+is%3Aopen+label%3Atask+) issues and verified my feature is not covered
|
- label: Checked the [tasks tagged](https://github.com/mealie-recipes/mealie/issues?q=is%3Aissue+is%3Aopen+label%3Atask+) issues and verified my feature is not covered
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
id: problem
|
id: problem
|
||||||
|
2
.github/ISSUE_TEMPLATE/bug-report.yaml
vendored
@ -42,7 +42,7 @@ body:
|
|||||||
id: logs
|
id: logs
|
||||||
attributes:
|
attributes:
|
||||||
label: Please provide relevant logs
|
label: Please provide relevant logs
|
||||||
placeholder: For example from `docker-compose logs` or other system logs.
|
placeholder: For example from `docker compose logs` or other system logs.
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
- type: textarea
|
||||||
|
21
.github/stale.yml
vendored
@ -1,21 +0,0 @@
|
|||||||
# 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
|
|
||||||
- early-stages
|
|
||||||
- "bug: confirmed"
|
|
||||||
- feedback
|
|
||||||
- task
|
|
||||||
# Label to use when marking an issue as stale
|
|
||||||
staleLabel: stale
|
|
||||||
# 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
|
|
81
.github/workflows/codeql.yml
vendored
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
# For most projects, this workflow file will not need changing; you simply need
|
||||||
|
# to commit it to your repository.
|
||||||
|
#
|
||||||
|
# You may wish to alter this file to override the set of languages analyzed,
|
||||||
|
# or to provide custom queries or build logic.
|
||||||
|
#
|
||||||
|
# ******** NOTE ********
|
||||||
|
# We have attempted to detect the languages in your repository. Please check
|
||||||
|
# the `language` matrix defined below to confirm you have the correct set of
|
||||||
|
# supported CodeQL languages.
|
||||||
|
#
|
||||||
|
name: "CodeQL"
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "mealie-next" ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ "mealie-next" ]
|
||||||
|
schedule:
|
||||||
|
- cron: '36 9 * * 3'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
name: Analyze
|
||||||
|
# Runner size impacts CodeQL analysis time. To learn more, please see:
|
||||||
|
# - https://gh.io/recommended-hardware-resources-for-running-codeql
|
||||||
|
# - https://gh.io/supported-runners-and-hardware-resources
|
||||||
|
# - https://gh.io/using-larger-runners
|
||||||
|
# Consider using larger runners for possible analysis time improvements.
|
||||||
|
runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }}
|
||||||
|
timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }}
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
language: [ 'javascript-typescript', 'python' ]
|
||||||
|
# CodeQL supports [ 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' ]
|
||||||
|
# Use only 'java-kotlin' to analyze code written in Java, Kotlin or both
|
||||||
|
# Use only 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
|
||||||
|
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
# Initializes the CodeQL tools for scanning.
|
||||||
|
- name: Initialize CodeQL
|
||||||
|
uses: github/codeql-action/init@v2
|
||||||
|
with:
|
||||||
|
languages: ${{ matrix.language }}
|
||||||
|
# If you wish to specify custom queries, you can do so here or in a config file.
|
||||||
|
# By default, queries listed here will override any specified in a config file.
|
||||||
|
# Prefix the list here with "+" to use these queries and those in the config file.
|
||||||
|
|
||||||
|
# For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
|
||||||
|
# queries: security-extended,security-and-quality
|
||||||
|
|
||||||
|
|
||||||
|
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift).
|
||||||
|
# If this step fails, then you should remove it and run the build manually (see below)
|
||||||
|
- name: Autobuild
|
||||||
|
uses: github/codeql-action/autobuild@v2
|
||||||
|
|
||||||
|
# ℹ️ Command-line programs to run using the OS shell.
|
||||||
|
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
|
||||||
|
|
||||||
|
# If the Autobuild fails above, remove it and uncomment the following three lines.
|
||||||
|
# modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance.
|
||||||
|
|
||||||
|
# - run: |
|
||||||
|
# echo "Run, Build Application using script"
|
||||||
|
# ./location_of_script_within_repo/buildscript.sh
|
||||||
|
|
||||||
|
- name: Perform CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@v2
|
||||||
|
with:
|
||||||
|
category: "/language:${{matrix.language}}"
|
14
.github/workflows/partial-backend.yml
vendored
@ -35,6 +35,12 @@ jobs:
|
|||||||
|
|
||||||
# Steps
|
# Steps
|
||||||
steps:
|
steps:
|
||||||
|
- name: Install Task
|
||||||
|
uses: arduino/setup-task@v1
|
||||||
|
with:
|
||||||
|
version: 3.x
|
||||||
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Check out repository
|
- name: Check out repository
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
@ -69,7 +75,7 @@ jobs:
|
|||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install libsasl2-dev libldap2-dev libssl-dev
|
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.9.9"
|
||||||
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' || steps.cache-validate.outputs.cache-hit-success != 'true'
|
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' || steps.cache-validate.outputs.cache-hit-success != 'true'
|
||||||
|
|
||||||
- name: Formatting (Black)
|
- name: Formatting (Black)
|
||||||
@ -78,11 +84,11 @@ jobs:
|
|||||||
|
|
||||||
- name: Lint (Ruff)
|
- name: Lint (Ruff)
|
||||||
run: |
|
run: |
|
||||||
make backend-lint
|
task py:lint
|
||||||
|
|
||||||
- name: Mypy Typecheck
|
- name: Mypy Typecheck
|
||||||
run: |
|
run: |
|
||||||
make backend-typecheck
|
task py:mypy
|
||||||
|
|
||||||
- name: Pytest
|
- name: Pytest
|
||||||
env:
|
env:
|
||||||
@ -101,4 +107,4 @@ jobs:
|
|||||||
LDAP_NAME_ATTRIBUTE: cn
|
LDAP_NAME_ATTRIBUTE: cn
|
||||||
LDAP_MAIL_ATTRIBUTE: mail
|
LDAP_MAIL_ATTRIBUTE: mail
|
||||||
run: |
|
run: |
|
||||||
make backend-test
|
task py:test
|
||||||
|
25
.github/workflows/release.yml
vendored
@ -42,4 +42,27 @@ jobs:
|
|||||||
DISCORD_WEBHOOK: ${{ secrets.DISCORD_RELEASE_WEBHOOK }}
|
DISCORD_WEBHOOK: ${{ secrets.DISCORD_RELEASE_WEBHOOK }}
|
||||||
uses: Ilshidur/action-discord@0.3.2
|
uses: Ilshidur/action-discord@0.3.2
|
||||||
with:
|
with:
|
||||||
args: "🚀 Version {{ EVENT_PAYLOAD.release.tag_name }} of Mealie has been released. See the release notes https://github.com/hay-kot/mealie/releases/tag/{{ EVENT_PAYLOAD.release.tag_name }}"
|
args: "🚀 Version {{ EVENT_PAYLOAD.release.tag_name }} of Mealie has been released. See the release notes https://github.com/mealie-recipes/mealie/releases/tag/{{ EVENT_PAYLOAD.release.tag_name }}"
|
||||||
|
|
||||||
|
update-image-tags:
|
||||||
|
name: Update image tag in sample docker-compose files
|
||||||
|
needs:
|
||||||
|
- build-release
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout 🛎
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Modify version strings
|
||||||
|
run: |
|
||||||
|
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:${{ github.event.release.tag_name }}/' docs/docs/documentation/getting-started/installation/sqlite.md
|
||||||
|
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:${{ github.event.release.tag_name }}/' docs/docs/documentation/getting-started/installation/postgres.md
|
||||||
|
|
||||||
|
- name: Commit updates
|
||||||
|
uses: test-room-7/action-update-file@v1
|
||||||
|
with:
|
||||||
|
file-path: |
|
||||||
|
docs/docs/documentation/getting-started/installation/sqlite.md
|
||||||
|
docs/docs/documentation/getting-started/installation/postgres.md
|
||||||
|
commit-msg: "Change image tag, for release ${{ github.event.release.tag_name }}"
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
41
.github/workflows/stale.yml
vendored
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
# Documentation: https://github.com/marketplace/actions/close-stale-issues
|
||||||
|
name: 'Stale: Flag and close stale issues and PRs'
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '30 1 * * *'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v9
|
||||||
|
with:
|
||||||
|
stale-issue-label: 'stale'
|
||||||
|
exempt-issue-labels: 'pinned,security,early-stages,bug: confirmed,feedback,task'
|
||||||
|
stale-issue-message: '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.'
|
||||||
|
days-before-issue-stale: 30
|
||||||
|
days-before-issue-close: 5
|
||||||
|
stale-pr-label: 'stale'
|
||||||
|
stale-pr-message: 'This PR is stale because it has been open 45 days with no activity.'
|
||||||
|
days-before-pr-stale: 45
|
||||||
|
# This stops a PR from ever getting closed automatically.
|
||||||
|
days-before-pr-close: -1
|
||||||
|
# If an issue/PR has a milestone, it's exempt from being marked as stale.
|
||||||
|
exempt-all-milestones: true
|
||||||
|
# How many API calls will we allow the action to make, essentially.
|
||||||
|
# Doco: https://github.com/actions/stale?tab=readme-ov-file#operations-per-run
|
||||||
|
operations-per-run: 150
|
||||||
|
########################################################################
|
||||||
|
# The below are just default values, but populating here for reference #
|
||||||
|
########################################################################
|
||||||
|
# Automatically remove the stale label when the issues or the pull requests are updated
|
||||||
|
remove-stale-when-updated: true
|
||||||
|
# The reason used when closing issues. Valid values are `completed` and `not_planned`.
|
||||||
|
close-issue-reason: 'not_planned'
|
||||||
|
# If true, PRs currently in draft will not be marked as stale automatically.
|
||||||
|
# We can mark them stale (after `days-before-pr-stale`), though we don't auto-close.
|
||||||
|
exempt-draft-pr: false
|
1
.gitignore
vendored
@ -162,3 +162,4 @@ lcov.info
|
|||||||
dev/code-generation/openapi.json
|
dev/code-generation/openapi.json
|
||||||
|
|
||||||
.run/
|
.run/
|
||||||
|
.task/*
|
||||||
|
@ -11,6 +11,6 @@ repos:
|
|||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
exclude: ^tests/data/
|
exclude: ^tests/data/
|
||||||
- repo: https://github.com/psf/black
|
- repo: https://github.com/psf/black
|
||||||
rev: 23.1.0
|
rev: 24.1.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: black
|
- id: black
|
||||||
|
87
.pylintrc
@ -60,17 +60,7 @@ confidence=
|
|||||||
# --enable=similarities". If you want to run only the classes checker, but have
|
# --enable=similarities". If you want to run only the classes checker, but have
|
||||||
# no Warning level messages displayed, use "--disable=all --enable=classes
|
# no Warning level messages displayed, use "--disable=all --enable=classes
|
||||||
# --disable=W".
|
# --disable=W".
|
||||||
disable=print-statement,
|
disable=raw-checker-failed,
|
||||||
parameter-unpacking,
|
|
||||||
unpacking-in-except,
|
|
||||||
old-raise-syntax,
|
|
||||||
backtick,
|
|
||||||
long-suffix,
|
|
||||||
old-ne-operator,
|
|
||||||
old-octal-literal,
|
|
||||||
import-star-module-level,
|
|
||||||
non-ascii-bytes-literal,
|
|
||||||
raw-checker-failed,
|
|
||||||
bad-inline-option,
|
bad-inline-option,
|
||||||
locally-disabled,
|
locally-disabled,
|
||||||
file-ignored,
|
file-ignored,
|
||||||
@ -78,67 +68,10 @@ disable=print-statement,
|
|||||||
useless-suppression,
|
useless-suppression,
|
||||||
deprecated-pragma,
|
deprecated-pragma,
|
||||||
use-symbolic-message-instead,
|
use-symbolic-message-instead,
|
||||||
apply-builtin,
|
missing-function-docstring,
|
||||||
basestring-builtin,
|
missing-class-docstring,
|
||||||
buffer-builtin,
|
missing-module-docstring,
|
||||||
cmp-builtin,
|
too-few-public-methods
|
||||||
coerce-builtin,
|
|
||||||
execfile-builtin,
|
|
||||||
file-builtin,
|
|
||||||
long-builtin,
|
|
||||||
raw_input-builtin,
|
|
||||||
reduce-builtin,
|
|
||||||
standarderror-builtin,
|
|
||||||
unicode-builtin,
|
|
||||||
xrange-builtin,
|
|
||||||
coerce-method,
|
|
||||||
delslice-method,
|
|
||||||
getslice-method,
|
|
||||||
setslice-method,
|
|
||||||
no-absolute-import,
|
|
||||||
old-division,
|
|
||||||
dict-iter-method,
|
|
||||||
dict-view-method,
|
|
||||||
next-method-called,
|
|
||||||
metaclass-assignment,
|
|
||||||
indexing-exception,
|
|
||||||
raising-string,
|
|
||||||
reload-builtin,
|
|
||||||
oct-method,
|
|
||||||
hex-method,
|
|
||||||
nonzero-method,
|
|
||||||
cmp-method,
|
|
||||||
input-builtin,
|
|
||||||
round-builtin,
|
|
||||||
intern-builtin,
|
|
||||||
unichr-builtin,
|
|
||||||
map-builtin-not-iterating,
|
|
||||||
zip-builtin-not-iterating,
|
|
||||||
range-builtin-not-iterating,
|
|
||||||
filter-builtin-not-iterating,
|
|
||||||
using-cmp-argument,
|
|
||||||
eq-without-hash,
|
|
||||||
div-method,
|
|
||||||
idiv-method,
|
|
||||||
rdiv-method,
|
|
||||||
exception-message-attribute,
|
|
||||||
invalid-str-codec,
|
|
||||||
sys-max-int,
|
|
||||||
bad-python3-import,
|
|
||||||
deprecated-string-function,
|
|
||||||
deprecated-str-translate-call,
|
|
||||||
deprecated-itertools-function,
|
|
||||||
deprecated-types-field,
|
|
||||||
next-method-defined,
|
|
||||||
dict-items-not-iterating,
|
|
||||||
dict-keys-not-iterating,
|
|
||||||
dict-values-not-iterating,
|
|
||||||
deprecated-operator-function,
|
|
||||||
deprecated-urllib-function,
|
|
||||||
xreadlines-attribute,
|
|
||||||
deprecated-sys-function,
|
|
||||||
exception-escape,
|
|
||||||
comprehension-escape
|
|
||||||
|
|
||||||
# Enable the message, report, category or checker with the given id(s). You can
|
# Enable the message, report, category or checker with the given id(s). You can
|
||||||
# either give multiple identifier separated by comma (,) or put this option
|
# either give multiple identifier separated by comma (,) or put this option
|
||||||
@ -292,7 +225,9 @@ good-names=i,
|
|||||||
k,
|
k,
|
||||||
ex,
|
ex,
|
||||||
Run,
|
Run,
|
||||||
_
|
_,
|
||||||
|
e,
|
||||||
|
db
|
||||||
|
|
||||||
# Good variable names regexes, separated by a comma. If names match any regex,
|
# Good variable names regexes, separated by a comma. If names match any regex,
|
||||||
# they will always be accepted
|
# they will always be accepted
|
||||||
@ -455,7 +390,7 @@ indent-after-paren=4
|
|||||||
indent-string=' '
|
indent-string=' '
|
||||||
|
|
||||||
# Maximum number of characters on a single line.
|
# Maximum number of characters on a single line.
|
||||||
max-line-length=100
|
max-line-length=120
|
||||||
|
|
||||||
# Maximum number of lines in a module.
|
# Maximum number of lines in a module.
|
||||||
max-module-lines=1000
|
max-module-lines=1000
|
||||||
@ -583,5 +518,5 @@ valid-metaclass-classmethod-first-arg=cls
|
|||||||
|
|
||||||
# Exceptions that will emit a warning when being caught. Defaults to
|
# Exceptions that will emit a warning when being caught. Defaults to
|
||||||
# "BaseException, Exception".
|
# "BaseException, Exception".
|
||||||
overgeneral-exceptions=BaseException,
|
overgeneral-exceptions=builtins.BaseException,
|
||||||
Exception
|
builtins.Exception
|
||||||
|
23
.vscode/tasks.json
vendored
@ -1,22 +1,9 @@
|
|||||||
{
|
{
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"tasks": [
|
"tasks": [
|
||||||
{
|
|
||||||
"label": "DEV: Build and Start Docker Compose",
|
|
||||||
"command": "make docker-dev",
|
|
||||||
"type": "shell",
|
|
||||||
"args": [],
|
|
||||||
"problemMatcher": [
|
|
||||||
"$tsc"
|
|
||||||
],
|
|
||||||
"presentation": {
|
|
||||||
"reveal": "always"
|
|
||||||
},
|
|
||||||
"group": "test"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"label": "Production: Build and Start Docker Compose",
|
"label": "Production: Build and Start Docker Compose",
|
||||||
"command": "make docker-prod",
|
"command": "task docker:prod",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"args": [],
|
"args": [],
|
||||||
"problemMatcher": [
|
"problemMatcher": [
|
||||||
@ -29,7 +16,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Dev: Start Backend",
|
"label": "Dev: Start Backend",
|
||||||
"command": "make backend",
|
"command": "task py",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"presentation": {
|
"presentation": {
|
||||||
"reveal": "always",
|
"reveal": "always",
|
||||||
@ -49,7 +36,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Dev: Start Frontend",
|
"label": "Dev: Start Frontend",
|
||||||
"command": "make frontend",
|
"command": "task ui",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"presentation": {
|
"presentation": {
|
||||||
"reveal": "always",
|
"reveal": "always",
|
||||||
@ -59,7 +46,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Dev: Start Docs Server",
|
"label": "Dev: Start Docs Server",
|
||||||
"command": "make docs",
|
"command": "task docs",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"presentation": {
|
"presentation": {
|
||||||
"reveal": "always",
|
"reveal": "always",
|
||||||
@ -69,7 +56,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Run python tests",
|
"label": "Run python tests",
|
||||||
"command": "make test",
|
"command": "task py:test",
|
||||||
"type": "shell",
|
"type": "shell",
|
||||||
"presentation": {
|
"presentation": {
|
||||||
"reveal": "always"
|
"reveal": "always"
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
|
[![Latest Release][latest-release-shield]][latest-release-url]
|
||||||
[![Contributors][contributors-shield]][contributors-url]
|
[![Contributors][contributors-shield]][contributors-url]
|
||||||
[![Forks][forks-shield]][forks-url]
|
[![Forks][forks-shield]][forks-url]
|
||||||
[![Stargazers][stars-shield]][stars-url]
|
[![Stargazers][stars-shield]][stars-url]
|
||||||
[![Issues][issues-shield]][issues-url]
|
[![Issues][issues-shield]][issues-url]
|
||||||
[![AGPL License][license-shield]][license-url]
|
[![AGPL License][license-shield]][license-url]
|
||||||
[![Docker Pulls][docker-pull]][docker-pull]
|
[![Docker Pulls][docker-pull]][docker-pull]
|
||||||
[](https://www.codefactor.io/repository/github/mealie-recipes/mealie)
|
|
||||||
|
|
||||||
<!-- PROJECT LOGO -->
|
<!-- PROJECT LOGO -->
|
||||||
<br />
|
<br />
|
||||||
@ -91,6 +91,8 @@ Thanks to Linode for providing Hosting for the Demo, Beta, and Documentation sit
|
|||||||
[stars-url]: https://github.com/mealie-recipes/mealie/stargazers
|
[stars-url]: https://github.com/mealie-recipes/mealie/stargazers
|
||||||
[issues-shield]: https://img.shields.io/github/issues/mealie-recipes/mealie.svg?style=flat-square
|
[issues-shield]: https://img.shields.io/github/issues/mealie-recipes/mealie.svg?style=flat-square
|
||||||
[issues-url]: https://github.com/mealie-recipes/mealie/issues
|
[issues-url]: https://github.com/mealie-recipes/mealie/issues
|
||||||
|
[latest-release-shield]: https://img.shields.io/github/v/release/mealie-recipes/mealie?style=flat-square&label=latest%20release
|
||||||
|
[latest-release-url]: https://img.shields.io/github/v/release/mealie-recipes/mealie
|
||||||
[license-shield]: https://img.shields.io/github/license/mealie-recipes/mealie.svg?style=flat-square
|
[license-shield]: https://img.shields.io/github/license/mealie-recipes/mealie.svg?style=flat-square
|
||||||
[license-url]: https://github.com/mealie-recipes/mealie/blob/mealie-next/LICENSE
|
[license-url]: https://github.com/mealie-recipes/mealie/blob/mealie-next/LICENSE
|
||||||
[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=flat-square&logo=linkedin&colorB=555
|
[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=flat-square&logo=linkedin&colorB=555
|
||||||
|
183
Taskfile.yml
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
# https://taskfile.dev
|
||||||
|
|
||||||
|
version: "3"
|
||||||
|
vars:
|
||||||
|
GREETING: Hello, World!
|
||||||
|
env:
|
||||||
|
DEFAULT_GROUP: Home
|
||||||
|
PRODUCTION: false
|
||||||
|
API_PORT: 9000
|
||||||
|
API_DOCS: True
|
||||||
|
TOKEN_TIME: 256 # hours
|
||||||
|
# mailplit SMTP config
|
||||||
|
# start dev:services to use mailpit
|
||||||
|
SMTP_HOST: localhost
|
||||||
|
SMTP_PORT: 1025
|
||||||
|
SMTP_FROM_NAME: MealieDev
|
||||||
|
SMTP_AUTH_STRATEGY: NONE
|
||||||
|
LANG: en-US
|
||||||
|
|
||||||
|
# loads .env file if it exists
|
||||||
|
dotenv:
|
||||||
|
- .env
|
||||||
|
- .dev.env
|
||||||
|
tasks:
|
||||||
|
docs:gen:
|
||||||
|
desc: runs the API documentation generator
|
||||||
|
cmds:
|
||||||
|
- poetry run python dev/code-generation/gen_docs_api.py
|
||||||
|
|
||||||
|
docs:
|
||||||
|
desc: runs the documentation server
|
||||||
|
dir: docs
|
||||||
|
deps:
|
||||||
|
- docs:gen
|
||||||
|
cmds:
|
||||||
|
- poetry run python -m mkdocs serve
|
||||||
|
|
||||||
|
setup:ui:
|
||||||
|
desc: setup frontend dependencies
|
||||||
|
dir: frontend
|
||||||
|
cmds:
|
||||||
|
- yarn install
|
||||||
|
|
||||||
|
setup:py:
|
||||||
|
desc: setup python dependencies
|
||||||
|
cmds:
|
||||||
|
- poetry install --with main,dev,postgres
|
||||||
|
- poetry run pre-commit install
|
||||||
|
|
||||||
|
setup:model:
|
||||||
|
desc: setup nlp model
|
||||||
|
vars:
|
||||||
|
MODEL_URL: https://github.com/mealie-recipes/nlp-model/releases/download/v1.0.0/model.crfmodel
|
||||||
|
OUTPUT: ./mealie/services/parser_services/crfpp/model.crfmodel
|
||||||
|
sources:
|
||||||
|
# using pyproject.toml as the dependency since this should only ever need to run once
|
||||||
|
# during setup. There is perhaps a better way to do this.
|
||||||
|
- ./pyproject.toml
|
||||||
|
generates:
|
||||||
|
- ./mealie/services/parser_services/crfpp/model.crfmodel
|
||||||
|
cmds:
|
||||||
|
- curl -L0 {{ .MODEL_URL }} --output {{ .OUTPUT }}
|
||||||
|
|
||||||
|
setup:
|
||||||
|
desc: setup all dependencies
|
||||||
|
deps:
|
||||||
|
- setup:ui
|
||||||
|
- setup:py
|
||||||
|
- setup:model
|
||||||
|
|
||||||
|
dev:generate:
|
||||||
|
desc: run code generators
|
||||||
|
cmds:
|
||||||
|
- poetry run python dev/code-generation/main.py
|
||||||
|
|
||||||
|
dev:services:
|
||||||
|
desc: starts postgres and mailpit containers
|
||||||
|
dir: docker
|
||||||
|
cmds:
|
||||||
|
- docker compose -f docker-compose.dev.yml up
|
||||||
|
|
||||||
|
dev:clean:
|
||||||
|
desc: cleans up dev environment !! removes all data files !!
|
||||||
|
vars:
|
||||||
|
DEV_DATA: ""
|
||||||
|
cmds:
|
||||||
|
- rm -r ./dev/data/recipes/
|
||||||
|
- rm -r ./dev/data/users/
|
||||||
|
- rm -f ./dev/data/mealie*.db
|
||||||
|
- rm -f ./dev/data/mealie.log
|
||||||
|
- rm -f ./dev/data/.secret
|
||||||
|
|
||||||
|
py:mypy:
|
||||||
|
desc: runs python type checking
|
||||||
|
cmds:
|
||||||
|
- poetry run mypy mealie
|
||||||
|
|
||||||
|
py:test:
|
||||||
|
desc: runs python tests (support args after '--')
|
||||||
|
cmds:
|
||||||
|
- poetry run pytest {{ .CLI_ARGS }}
|
||||||
|
|
||||||
|
py:format:
|
||||||
|
desc: runs python code formatter
|
||||||
|
cmds:
|
||||||
|
- poetry run black mealie
|
||||||
|
|
||||||
|
py:lint:
|
||||||
|
desc: runs python linter
|
||||||
|
cmds:
|
||||||
|
- poetry run ruff mealie
|
||||||
|
|
||||||
|
py:check:
|
||||||
|
desc: runs all linters, type checkers, and formatters
|
||||||
|
deps:
|
||||||
|
- py:format
|
||||||
|
- py:lint
|
||||||
|
- py:mypy
|
||||||
|
- py:test
|
||||||
|
|
||||||
|
py:coverage:
|
||||||
|
desc: runs python coverage and generates html report
|
||||||
|
cmds:
|
||||||
|
- poetry run pytest
|
||||||
|
- poetry run coverage report -m
|
||||||
|
- poetry run coveragepy-lcov
|
||||||
|
- poetry run coverage html
|
||||||
|
- open htmlcov/index.html
|
||||||
|
|
||||||
|
py:
|
||||||
|
desc: runs the backend server
|
||||||
|
cmds:
|
||||||
|
- poetry run python mealie/db/init_db.py
|
||||||
|
- poetry run python mealie/app.py
|
||||||
|
|
||||||
|
py:postgres:
|
||||||
|
desc: runs the backend server configured for containerized postgres
|
||||||
|
env:
|
||||||
|
DB_ENGINE: postgres
|
||||||
|
POSTGRES_USER: mealie
|
||||||
|
POSTGRES_PASSWORD: mealie
|
||||||
|
POSTGRES_SERVER: localhost
|
||||||
|
POSTGRES_PORT: 5432
|
||||||
|
POSTGRES_DB: mealie
|
||||||
|
cmds:
|
||||||
|
- poetry run python mealie/db/init_db.py
|
||||||
|
- poetry run python mealie/app.py
|
||||||
|
|
||||||
|
ui:build:
|
||||||
|
desc: builds the frontend in frontend/dist
|
||||||
|
dir: frontend
|
||||||
|
cmds:
|
||||||
|
- yarn build
|
||||||
|
|
||||||
|
ui:lint:
|
||||||
|
desc: runs the frontend linter
|
||||||
|
dir: frontend
|
||||||
|
cmds:
|
||||||
|
- yarn lint
|
||||||
|
|
||||||
|
ui:test:
|
||||||
|
desc: runs the frontend tests
|
||||||
|
dir: frontend
|
||||||
|
cmds:
|
||||||
|
- yarn test
|
||||||
|
|
||||||
|
ui:check:
|
||||||
|
desc: runs all frontend checks
|
||||||
|
deps:
|
||||||
|
- ui:lint
|
||||||
|
- ui:test
|
||||||
|
|
||||||
|
ui:
|
||||||
|
desc: runs the frontend server
|
||||||
|
dir: frontend
|
||||||
|
cmds:
|
||||||
|
- yarn run dev
|
||||||
|
|
||||||
|
docker:prod:
|
||||||
|
desc: builds and runs the production docker image locally
|
||||||
|
dir: docker
|
||||||
|
cmds:
|
||||||
|
- docker compose -f docker-compose.yml -p mealie up -d --build
|
@ -5,6 +5,7 @@ Revises:
|
|||||||
Create Date: 2022-02-21 19:56:24.351115
|
Create Date: 2022-02-21 19:56:24.351115
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
from sqlalchemy import engine_from_config
|
from sqlalchemy import engine_from_config
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ Revises: 6b0f5f32d602
|
|||||||
Create Date: 2022-03-23 17:43:34.727829
|
Create Date: 2022-03-23 17:43:34.727829
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
from alembic import op
|
from alembic import op
|
||||||
|
@ -5,6 +5,7 @@ Revises: 263dd6707191
|
|||||||
Create Date: 2022-03-27 19:30:28.545846
|
Create Date: 2022-03-27 19:30:28.545846
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
from alembic import op
|
from alembic import op
|
||||||
|
@ -5,6 +5,7 @@ Revises: f1a2dbee5fe9
|
|||||||
Create Date: 2022-03-31 19:19:55.428965
|
Create Date: 2022-03-31 19:19:55.428965
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
import mealie.db.migration_types
|
import mealie.db.migration_types
|
||||||
|
@ -5,6 +5,7 @@ Revises: 59eb59135381
|
|||||||
Create Date: 2022-04-03 10:48:51.379968
|
Create Date: 2022-04-03 10:48:51.379968
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
import mealie.db.migration_types # noqa: F401
|
import mealie.db.migration_types # noqa: F401
|
||||||
|
@ -5,6 +5,7 @@ Revises: 09dfc897ad62
|
|||||||
Create Date: 2022-06-01 11:12:06.748383
|
Create Date: 2022-06-01 11:12:06.748383
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
from alembic import op
|
from alembic import op
|
||||||
|
@ -6,6 +6,7 @@ Revises: ab0bae02578f
|
|||||||
Create Date: 2022-06-15 21:05:34.851857
|
Create Date: 2022-06-15 21:05:34.851857
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
from alembic import op
|
from alembic import op
|
||||||
|
@ -5,6 +5,7 @@ Revises: f30cf048c228
|
|||||||
Create Date: 2022-08-12 19:05:59.776361
|
Create Date: 2022-08-12 19:05:59.776361
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
from alembic import op
|
from alembic import op
|
||||||
|
@ -5,6 +5,7 @@ Revises: 188374910655
|
|||||||
Create Date: 2022-08-05 17:07:07.389271
|
Create Date: 2022-08-05 17:07:07.389271
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
from alembic import op
|
from alembic import op
|
||||||
|
@ -5,6 +5,7 @@ Revises: 089bfa50d0ed
|
|||||||
Create Date: 2022-08-29 13:57:40.452245
|
Create Date: 2022-08-29 13:57:40.452245
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
import mealie.db.migration_types
|
import mealie.db.migration_types
|
||||||
|
@ -5,6 +5,7 @@ Revises: 44e8d670719d
|
|||||||
Create Date: 2022-09-27 14:53:14.111054
|
Create Date: 2022-09-27 14:53:14.111054
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
import mealie.db.migration_types
|
import mealie.db.migration_types
|
||||||
|
@ -5,6 +5,7 @@ Revises: 2ea7a807915c
|
|||||||
Create Date: 2022-11-03 13:10:24.811134
|
Create Date: 2022-11-03 13:10:24.811134
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
from alembic import op
|
from alembic import op
|
||||||
|
@ -5,6 +5,7 @@ Revises: 1923519381ad
|
|||||||
Create Date: 2022-11-22 03:42:45.494567
|
Create Date: 2022-11-22 03:42:45.494567
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
from alembic import op
|
from alembic import op
|
||||||
|
@ -5,6 +5,7 @@ Revises: 167eb69066ad
|
|||||||
Create Date: 2023-01-21 16:54:44.368768
|
Create Date: 2023-01-21 16:54:44.368768
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
import mealie.db.migration_types
|
import mealie.db.migration_types
|
||||||
|
@ -5,6 +5,7 @@ Revises: ff5f73b01a7a
|
|||||||
Create Date: 2023-02-10 21:18:32.405130
|
Create Date: 2023-02-10 21:18:32.405130
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
import mealie.db.migration_types
|
import mealie.db.migration_types
|
||||||
|
@ -5,6 +5,7 @@ Revises: 16160bf731a0
|
|||||||
Create Date: 2023-02-14 20:45:41.102571
|
Create Date: 2023-02-14 20:45:41.102571
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
from sqlalchemy import orm, select
|
from sqlalchemy import orm, select
|
||||||
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
|
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
|
||||||
|
@ -5,6 +5,7 @@ Revises: 5ab195a474eb
|
|||||||
Create Date: 2023-21-02 22:03:19.837244
|
Create Date: 2023-21-02 22:03:19.837244
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from uuid import uuid4
|
from uuid import uuid4
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
@ -5,6 +5,7 @@ Revises: b04a08da2108
|
|||||||
Create Date: 2023-02-22 21:45:52.900964
|
Create Date: 2023-02-22 21:45:52.900964
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
import mealie.db.migration_types
|
import mealie.db.migration_types
|
||||||
|
@ -5,6 +5,7 @@ Revises: 38514b39a824
|
|||||||
Create Date: 2023-04-13 06:47:04.617131
|
Create Date: 2023-04-13 06:47:04.617131
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
import mealie.db.migration_types
|
import mealie.db.migration_types
|
||||||
|
@ -5,6 +5,7 @@ Revises: b3dbb554ba53
|
|||||||
Create Date: 2023-08-06 21:00:34.582905
|
Create Date: 2023-08-06 21:00:34.582905
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
from slugify import slugify
|
from slugify import slugify
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session
|
||||||
|
@ -5,6 +5,7 @@ Revises: 04ac51cbe9a4
|
|||||||
Create Date: 2023-08-14 19:30:49.103185
|
Create Date: 2023-08-14 19:30:49.103185
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
from alembic import op
|
from alembic import op
|
||||||
|
@ -5,6 +5,7 @@ Revises: 1825b5225403
|
|||||||
Create Date: 2023-08-15 16:25:07.058929
|
Create Date: 2023-08-15 16:25:07.058929
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from alembic import op
|
from alembic import op
|
||||||
|
|
||||||
# revision identifiers, used by Alembic.
|
# revision identifiers, used by Alembic.
|
||||||
|
@ -5,6 +5,7 @@ Revises: bcfdad6b7355
|
|||||||
Create Date: 2023-09-01 14:55:42.166766
|
Create Date: 2023-09-01 14:55:42.166766
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
from sqlalchemy import orm, select
|
from sqlalchemy import orm, select
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@ Revises: 0341b154f79a
|
|||||||
Create Date: 2023-10-04 14:29:26.688065
|
Create Date: 2023-10-04 14:29:26.688065
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import Any
|
from typing import Any
|
||||||
@ -58,7 +59,12 @@ def _resolve_duplicate_food(
|
|||||||
keep_food_id: UUID4,
|
keep_food_id: UUID4,
|
||||||
dupe_food_id: UUID4,
|
dupe_food_id: UUID4,
|
||||||
):
|
):
|
||||||
for shopping_list_item in session.query(ShoppingListItem).filter_by(food_id=dupe_food_id).all():
|
for shopping_list_item in (
|
||||||
|
session.query(ShoppingListItem)
|
||||||
|
.options(load_only(ShoppingListItem.id, ShoppingListItem.food_id))
|
||||||
|
.filter_by(food_id=dupe_food_id)
|
||||||
|
.all()
|
||||||
|
):
|
||||||
shopping_list_item.food_id = keep_food_id
|
shopping_list_item.food_id = keep_food_id
|
||||||
|
|
||||||
for recipe_ingredient in (
|
for recipe_ingredient in (
|
||||||
@ -69,9 +75,11 @@ def _resolve_duplicate_food(
|
|||||||
):
|
):
|
||||||
recipe_ingredient.food_id = keep_food_id
|
recipe_ingredient.food_id = keep_food_id
|
||||||
|
|
||||||
|
session.commit()
|
||||||
session.execute(
|
session.execute(
|
||||||
sa.text(f"DELETE FROM {IngredientFoodModel.__tablename__} WHERE id=:id").bindparams(id=dupe_food_id)
|
sa.text(f"DELETE FROM {IngredientFoodModel.__tablename__} WHERE id=:id").bindparams(id=dupe_food_id)
|
||||||
)
|
)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
|
||||||
def _resolve_duplicate_unit(
|
def _resolve_duplicate_unit(
|
||||||
@ -79,15 +87,27 @@ def _resolve_duplicate_unit(
|
|||||||
keep_unit_id: UUID4,
|
keep_unit_id: UUID4,
|
||||||
dupe_unit_id: UUID4,
|
dupe_unit_id: UUID4,
|
||||||
):
|
):
|
||||||
for shopping_list_item in session.query(ShoppingListItem).filter_by(unit_id=dupe_unit_id).all():
|
for shopping_list_item in (
|
||||||
|
session.query(ShoppingListItem)
|
||||||
|
.options(load_only(ShoppingListItem.id, ShoppingListItem.unit_id))
|
||||||
|
.filter_by(unit_id=dupe_unit_id)
|
||||||
|
.all()
|
||||||
|
):
|
||||||
shopping_list_item.unit_id = keep_unit_id
|
shopping_list_item.unit_id = keep_unit_id
|
||||||
|
|
||||||
for recipe_ingredient in session.query(RecipeIngredientModel).filter_by(unit_id=dupe_unit_id).all():
|
for recipe_ingredient in (
|
||||||
|
session.query(RecipeIngredientModel)
|
||||||
|
.options(load_only(RecipeIngredientModel.id, RecipeIngredientModel.unit_id))
|
||||||
|
.filter_by(unit_id=dupe_unit_id)
|
||||||
|
.all()
|
||||||
|
):
|
||||||
recipe_ingredient.unit_id = keep_unit_id
|
recipe_ingredient.unit_id = keep_unit_id
|
||||||
|
|
||||||
|
session.commit()
|
||||||
session.execute(
|
session.execute(
|
||||||
sa.text(f"DELETE FROM {IngredientUnitModel.__tablename__} WHERE id=:id").bindparams(id=dupe_unit_id)
|
sa.text(f"DELETE FROM {IngredientUnitModel.__tablename__} WHERE id=:id").bindparams(id=dupe_unit_id)
|
||||||
)
|
)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
|
||||||
def _resolve_duplicate_label(
|
def _resolve_duplicate_label(
|
||||||
@ -95,13 +115,25 @@ def _resolve_duplicate_label(
|
|||||||
keep_label_id: UUID4,
|
keep_label_id: UUID4,
|
||||||
dupe_label_id: UUID4,
|
dupe_label_id: UUID4,
|
||||||
):
|
):
|
||||||
for shopping_list_item in session.query(ShoppingListItem).filter_by(label_id=dupe_label_id).all():
|
for shopping_list_item in (
|
||||||
|
session.query(ShoppingListItem)
|
||||||
|
.options(load_only(ShoppingListItem.id, ShoppingListItem.label_id))
|
||||||
|
.filter_by(label_id=dupe_label_id)
|
||||||
|
.all()
|
||||||
|
):
|
||||||
shopping_list_item.label_id = keep_label_id
|
shopping_list_item.label_id = keep_label_id
|
||||||
|
|
||||||
for ingredient_food in session.query(IngredientFoodModel).filter_by(label_id=dupe_label_id).all():
|
for ingredient_food in (
|
||||||
|
session.query(IngredientFoodModel)
|
||||||
|
.options(load_only(IngredientFoodModel.id, IngredientFoodModel.label_id))
|
||||||
|
.filter_by(label_id=dupe_label_id)
|
||||||
|
.all()
|
||||||
|
):
|
||||||
ingredient_food.label_id = keep_label_id
|
ingredient_food.label_id = keep_label_id
|
||||||
|
|
||||||
|
session.commit()
|
||||||
session.execute(sa.text(f"DELETE FROM {MultiPurposeLabel.__tablename__} WHERE id=:id").bindparams(id=dupe_label_id))
|
session.execute(sa.text(f"DELETE FROM {MultiPurposeLabel.__tablename__} WHERE id=:id").bindparams(id=dupe_label_id))
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
|
||||||
def _resolve_duplicate_foods_units_labels(session: Session):
|
def _resolve_duplicate_foods_units_labels(session: Session):
|
||||||
@ -140,6 +172,7 @@ def _remove_duplicates_from_m2m_table(session: Session, table_meta: TableMeta):
|
|||||||
)
|
)
|
||||||
|
|
||||||
session.execute(query)
|
session.execute(query)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
|
|
||||||
def _remove_duplicates_from_m2m_tables(session: Session, table_metas: list[TableMeta]):
|
def _remove_duplicates_from_m2m_tables(session: Session, table_metas: list[TableMeta]):
|
||||||
|
@ -5,6 +5,7 @@ Revises: dded3119c1fe
|
|||||||
Create Date: 2023-10-19 19:22:55.369319
|
Create Date: 2023-10-19 19:22:55.369319
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sqlalchemy as sa
|
import sqlalchemy as sa
|
||||||
|
|
||||||
import mealie.db.migration_types
|
import mealie.db.migration_types
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import pathlib
|
import pathlib
|
||||||
|
from dataclasses import dataclass
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
import dotenv
|
import dotenv
|
||||||
@ -15,38 +16,44 @@ BASE = pathlib.Path(__file__).parent.parent.parent
|
|||||||
API_KEY = dotenv.get_key(BASE / ".env", "CROWDIN_API_KEY")
|
API_KEY = dotenv.get_key(BASE / ".env", "CROWDIN_API_KEY")
|
||||||
|
|
||||||
|
|
||||||
NAMES = {
|
@dataclass
|
||||||
"en-US": "American English",
|
class LocaleData:
|
||||||
"en-GB": "British English",
|
name: str
|
||||||
"af-ZA": "Afrikaans (Afrikaans)",
|
dir: str = "ltr"
|
||||||
"ar-SA": "العربية (Arabic)",
|
|
||||||
"ca-ES": "Català (Catalan)",
|
|
||||||
"cs-CZ": "Čeština (Czech)",
|
LOCALE_DATA: dict[str, LocaleData] = {
|
||||||
"da-DK": "Dansk (Danish)",
|
"en-US": LocaleData(name="American English"),
|
||||||
"de-DE": "Deutsch (German)",
|
"en-GB": LocaleData(name="British English"),
|
||||||
"el-GR": "Ελληνικά (Greek)",
|
"af-ZA": LocaleData(name="Afrikaans (Afrikaans)"),
|
||||||
"es-ES": "Español (Spanish)",
|
"ar-SA": LocaleData(name="العربية (Arabic)", dir="rtl"),
|
||||||
"fi-FI": "Suomi (Finnish)",
|
"ca-ES": LocaleData(name="Català (Catalan)"),
|
||||||
"fr-FR": "Français (French)",
|
"cs-CZ": LocaleData(name="Čeština (Czech)"),
|
||||||
"he-IL": "עברית (Hebrew)",
|
"da-DK": LocaleData(name="Dansk (Danish)"),
|
||||||
"hu-HU": "Magyar (Hungarian)",
|
"de-DE": LocaleData(name="Deutsch (German)"),
|
||||||
"it-IT": "Italiano (Italian)",
|
"el-GR": LocaleData(name="Ελληνικά (Greek)"),
|
||||||
"ja-JP": "日本語 (Japanese)",
|
"es-ES": LocaleData(name="Español (Spanish)"),
|
||||||
"ko-KR": "한국어 (Korean)",
|
"fi-FI": LocaleData(name="Suomi (Finnish)"),
|
||||||
"no-NO": "Norsk (Norwegian)",
|
"fr-FR": LocaleData(name="Français (French)"),
|
||||||
"nl-NL": "Nederlands (Dutch)",
|
"he-IL": LocaleData(name="עברית (Hebrew)", dir="rtl"),
|
||||||
"pl-PL": "Polski (Polish)",
|
"hu-HU": LocaleData(name="Magyar (Hungarian)"),
|
||||||
"pt-BR": "Português do Brasil (Brazilian Portuguese)",
|
"it-IT": LocaleData(name="Italiano (Italian)"),
|
||||||
"pt-PT": "Português (Portuguese)",
|
"ja-JP": LocaleData(name="日本語 (Japanese)"),
|
||||||
"ro-RO": "Română (Romanian)",
|
"ko-KR": LocaleData(name="한국어 (Korean)"),
|
||||||
"ru-RU": "Pусский (Russian)",
|
"no-NO": LocaleData(name="Norsk (Norwegian)"),
|
||||||
"sr-SP": "српски (Serbian)",
|
"nl-NL": LocaleData(name="Nederlands (Dutch)"),
|
||||||
"sv-SE": "Svenska (Swedish)",
|
"pl-PL": LocaleData(name="Polski (Polish)"),
|
||||||
"tr-TR": "Türkçe (Turkish)",
|
"pt-BR": LocaleData(name="Português do Brasil (Brazilian Portuguese)"),
|
||||||
"uk-UA": "Українська (Ukrainian)",
|
"pt-PT": LocaleData(name="Português (Portuguese)"),
|
||||||
"vi-VN": "Tiếng Việt (Vietnamese)",
|
"ro-RO": LocaleData(name="Română (Romanian)"),
|
||||||
"zh-CN": "简体中文 (Chinese simplified)",
|
"ru-RU": LocaleData(name="Pусский (Russian)"),
|
||||||
"zh-TW": "繁體中文 (Chinese traditional)",
|
"sr-SP": LocaleData(name="српски (Serbian)"),
|
||||||
|
"sv-SE": LocaleData(name="Svenska (Swedish)"),
|
||||||
|
"tr-TR": LocaleData(name="Türkçe (Turkish)"),
|
||||||
|
"uk-UA": LocaleData(name="Українська (Ukrainian)"),
|
||||||
|
"vi-VN": LocaleData(name="Tiếng Việt (Vietnamese)"),
|
||||||
|
"zh-CN": LocaleData(name="简体中文 (Chinese simplified)"),
|
||||||
|
"zh-TW": LocaleData(name="繁體中文 (Chinese traditional)"),
|
||||||
}
|
}
|
||||||
|
|
||||||
LOCALE_TEMPLATE = """// This Code is auto generated by gen_global_components.py
|
LOCALE_TEMPLATE = """// This Code is auto generated by gen_global_components.py
|
||||||
@ -55,6 +62,7 @@ export const LOCALES = [{% for locale in locales %}
|
|||||||
name: "{{ locale.name }}",
|
name: "{{ locale.name }}",
|
||||||
value: "{{ locale.locale }}",
|
value: "{{ locale.locale }}",
|
||||||
progress: {{ locale.progress }},
|
progress: {{ locale.progress }},
|
||||||
|
dir: "{{ locale.dir }}",
|
||||||
},{% endfor %}
|
},{% endfor %}
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -65,12 +73,14 @@ class TargetLanguage(MealieModel):
|
|||||||
id: str
|
id: str
|
||||||
name: str
|
name: str
|
||||||
locale: str
|
locale: str
|
||||||
|
dir: str = "ltr"
|
||||||
threeLettersCode: str
|
threeLettersCode: str
|
||||||
twoLettersCode: str
|
twoLettersCode: str
|
||||||
progress: float = 0.0
|
progress: float = 0.0
|
||||||
|
|
||||||
class Config:
|
class Config:
|
||||||
extra = Extra.allow
|
extra = Extra.allow
|
||||||
|
allow_population_by_field_name = True
|
||||||
|
|
||||||
|
|
||||||
class CrowdinApi:
|
class CrowdinApi:
|
||||||
@ -103,15 +113,23 @@ class CrowdinApi:
|
|||||||
models.insert(
|
models.insert(
|
||||||
0,
|
0,
|
||||||
TargetLanguage(
|
TargetLanguage(
|
||||||
id="en-US", name="English", locale="en-US", threeLettersCode="en", twoLettersCode="en", progress=100
|
id="en-US",
|
||||||
|
name="English",
|
||||||
|
locale="en-US",
|
||||||
|
dir="ltr",
|
||||||
|
threeLettersCode="en",
|
||||||
|
twoLettersCode="en",
|
||||||
|
progress=100,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
progress: list[dict] = self.get_progress()["data"]
|
progress: list[dict] = self.get_progress()["data"]
|
||||||
|
|
||||||
for model in models:
|
for model in models:
|
||||||
if model.locale in NAMES:
|
if model.locale in LOCALE_DATA:
|
||||||
model.name = NAMES[model.locale]
|
locale_data = LOCALE_DATA[model.locale]
|
||||||
|
model.name = locale_data.name
|
||||||
|
model.dir = locale_data.dir
|
||||||
|
|
||||||
for p in progress:
|
for p in progress:
|
||||||
if p["data"]["languageId"] == model.id:
|
if p["data"]["languageId"] == model.id:
|
||||||
|
@ -138,4 +138,4 @@ EXPOSE ${APP_PORT}
|
|||||||
COPY ./docker/entry.sh $MEALIE_HOME/run.sh
|
COPY ./docker/entry.sh $MEALIE_HOME/run.sh
|
||||||
|
|
||||||
RUN chmod +x $MEALIE_HOME/run.sh
|
RUN chmod +x $MEALIE_HOME/run.sh
|
||||||
ENTRYPOINT $MEALIE_HOME/run.sh
|
ENTRYPOINT ["/app/run.sh"]
|
||||||
|
21
docker/docker-compose.dev.yml
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
version: "3.4"
|
||||||
|
services:
|
||||||
|
mailpit:
|
||||||
|
image: axllent/mailpit:latest
|
||||||
|
container_name: mealie_dev_mailpit
|
||||||
|
restart: no
|
||||||
|
environment:
|
||||||
|
- "MP_SMTP_AUTH_ACCEPT_ANY=true"
|
||||||
|
- "MP_SMTP_AUTH_ALLOW_INSECURE=true"
|
||||||
|
ports:
|
||||||
|
- "8025:8025"
|
||||||
|
- "1025:1025"
|
||||||
|
postgres:
|
||||||
|
container_name: mealie_dev_postgres
|
||||||
|
image: postgres:15
|
||||||
|
restart: no
|
||||||
|
ports:
|
||||||
|
- "5432:5432"
|
||||||
|
environment:
|
||||||
|
POSTGRES_PASSWORD: mealie
|
||||||
|
POSTGRES_USER: mealie
|
@ -1,13 +1,10 @@
|
|||||||
# Start Backend API
|
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
# Start Backend API
|
||||||
# Strict Mode
|
|
||||||
# set -e
|
|
||||||
# IFS=$'\n\t'
|
|
||||||
|
|
||||||
# Get PUID/PGID
|
# Get PUID/PGID
|
||||||
PUID=${PUID:-911}
|
PUID=${PUID:-911}
|
||||||
PGID=${PGID:-911}
|
PGID=${PGID:-911}
|
||||||
|
BASH_SOURCE=${BASH_SOURCE:-$0}
|
||||||
|
|
||||||
add_user() {
|
add_user() {
|
||||||
groupmod -o -g "$PGID" abc
|
groupmod -o -g "$PGID" abc
|
||||||
@ -15,18 +12,18 @@ add_user() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
change_user() {
|
change_user() {
|
||||||
|
if [ "$(id -u)" = $PUID ]; then
|
||||||
|
echo "
|
||||||
|
User uid: $PUID
|
||||||
|
User gid: $PGID
|
||||||
|
"
|
||||||
|
elif [ "$(id -u)" = "0" ]; then
|
||||||
# If container is started as root then create a new user and switch to it
|
# If container is started as root then create a new user and switch to it
|
||||||
if [ "$(id -u)" = "0" ]; then
|
|
||||||
add_user
|
add_user
|
||||||
chown -R $PUID:$PGID /app
|
chown -R $PUID:$PGID /app
|
||||||
|
|
||||||
echo "Switching to dedicated user"
|
echo "Switching to dedicated user"
|
||||||
exec gosu $PUID "$BASH_SOURCE" "$@"
|
exec gosu $PUID "$BASH_SOURCE" "$@"
|
||||||
elif [ "$(id -u)" = $PUID ]; then
|
|
||||||
echo "
|
|
||||||
User uid: $PUID
|
|
||||||
User gid: $PGID
|
|
||||||
"
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,7 +38,7 @@ init() {
|
|||||||
poetry run python /app/mealie/db/init_db.py
|
poetry run python /app/mealie/db/init_db.py
|
||||||
}
|
}
|
||||||
|
|
||||||
# change_user
|
change_user
|
||||||
init
|
init
|
||||||
GUNICORN_PORT=${API_PORT:-9000}
|
GUNICORN_PORT=${API_PORT:-9000}
|
||||||
|
|
||||||
@ -49,7 +46,7 @@ GUNICORN_PORT=${API_PORT:-9000}
|
|||||||
hostip=`/sbin/ip route|awk '/default/ { print $3 }'`
|
hostip=`/sbin/ip route|awk '/default/ { print $3 }'`
|
||||||
if [ "$WEB_GUNICORN" = 'true' ]; then
|
if [ "$WEB_GUNICORN" = 'true' ]; then
|
||||||
echo "Starting Gunicorn"
|
echo "Starting Gunicorn"
|
||||||
gunicorn mealie.app:app -b 0.0.0.0:$GUNICORN_PORT --forwarded-allow-ips=$hostip -k uvicorn.workers.UvicornWorker -c /app/gunicorn_conf.py --preload
|
exec gunicorn mealie.app:app -b 0.0.0.0:$GUNICORN_PORT --forwarded-allow-ips=$hostip -k uvicorn.workers.UvicornWorker -c /app/gunicorn_conf.py --preload
|
||||||
else
|
else
|
||||||
uvicorn mealie.app:app --host 0.0.0.0 --forwarded-allow-ips=$hostip --port $GUNICORN_PORT
|
exec uvicorn mealie.app:app --host 0.0.0.0 --forwarded-allow-ips=$hostip --port $GUNICORN_PORT
|
||||||
fi
|
fi
|
||||||
|
BIN
docs/docs/assets/img/ios/api.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
docs/docs/assets/img/ios/gemini.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
docs/docs/assets/img/ios/setup.png
Normal file
After Width: | Height: | Size: 183 KiB |
BIN
docs/docs/assets/img/ios/url.png
Normal file
After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 41 KiB |
Before Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 45 KiB |
Before Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 64 KiB |
@ -13,7 +13,7 @@ Pull requests are the best way to propose changes to the codebase (we use [Githu
|
|||||||
3. If you're interested on working on major changes please get in touch on discord and coordinate with other developers. No sense in doubling up on work if someones already on it.
|
3. If you're interested on working on major changes please get in touch on discord and coordinate with other developers. No sense in doubling up on work if someones already on it.
|
||||||
4. Once you've got an idea of what changes you want to make, create a draft PR as soon as you can to let us know what you're working on and how we can help!
|
4. Once you've got an idea of what changes you want to make, create a draft PR as soon as you can to let us know what you're working on and how we can help!
|
||||||
5. If you've changed APIs, update the documentation.
|
5. If you've changed APIs, update the documentation.
|
||||||
6. Run tests, including `make backend-all`. Note that the tests do not clean up after themselves and leave things in the database. So be sure to also run `make clean-data` and/or `make backend-clean` inbetween major testing rounds to be sure that you aren't testing on old data.
|
6. Run tests, including `task py:check`.
|
||||||
6. Issue that pull request! First make a draft PR, make sure that the automated github tests all pass, then mark as ready for review.
|
6. Issue that pull request! First make a draft PR, make sure that the automated github tests all pass, then mark as ready for review.
|
||||||
7. Be sure to add release notes to the pull request.
|
7. Be sure to add release notes to the pull request.
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Maintainers Guide
|
# Maintainers Guide
|
||||||
|
|
||||||
This is the start of the maintainers guide for Mealie developers. Those who have been invited to the GitHub organization and/or those who whish to play a bigger part in the Mealie developers community may find this helpful.
|
This is the start of the maintainers guide for Mealie developers. Those who have been invited to the GitHub organization and/or those who wish to play a bigger part in the Mealie developers community may find this helpful.
|
||||||
|
|
||||||
## Managing Issues
|
## Managing Issues
|
||||||
|
|
||||||
@ -13,7 +13,7 @@ After you've reviered an issue it will generally move into one of two states:
|
|||||||
|
|
||||||
|
|
||||||
`needs more info`
|
`needs more info`
|
||||||
: The orignal post does not contain enough information, and if the reporter does not provide additional information, the issue will be automatically closed.
|
: The original post does not contain enough information, and if the reporter does not provide additional information, the issue will be automatically closed.
|
||||||
|
|
||||||
Once you've reviewed an issue and moved it into another category, you should remove the triage label.
|
Once you've reviewed an issue and moved it into another category, you should remove the triage label.
|
||||||
|
|
||||||
@ -40,18 +40,38 @@ Mealie is published via GitHub actions to the GitHub container registry with the
|
|||||||
: published when a new GitHub Release is created - [Actions File](https://github.com/mealie-recipes/mealie/blob/mealie-next/.github/workflows/release.yml)
|
: published when a new GitHub Release is created - [Actions File](https://github.com/mealie-recipes/mealie/blob/mealie-next/.github/workflows/release.yml)
|
||||||
|
|
||||||
!!! note
|
!!! note
|
||||||
Both the latest, and {version} tags will be the same container on the release of a new version
|
Both the latest, and {version} tags will be the same image on the release of a new version
|
||||||
|
|
||||||
### Process
|
### Process
|
||||||
|
|
||||||
Because we've built all our publishing effors on GitHub Actions we rely primarily on automations to perform our releases. As such creating a new build of Mealie is as simple as creating a new GitHub release. Here are the general steps we take to create a new release
|
Because we've built all our publishing efforts on GitHub Actions we rely primarily on automations to perform our releases. As such creating a new build of Mealie is as simple as creating a new GitHub release. Here are the general steps we take to create a new release
|
||||||
|
|
||||||
1. Navigate to the [Github Release Page](https://github.com/mealie-recipes/mealie/releases) and click the 'Draft a new release' button.
|
1. Navigate to the [Github Release Page](https://github.com/mealie-recipes/mealie/releases) and click the 'Draft a new release' button.
|
||||||
2. Choose a tag and increment the version according to the semver specification. i.e, **major** version for breaking changes, **minor** for feature updates, and **patch** for bug fixes.
|
2. Choose a tag and increment the version according to the semver specification. i.e, **major** version for breaking changes, **minor** for feature updates, and **patch** for bug fixes.
|
||||||
3. Name the Release, usually just the tag is fine, however if there is a special feature you'd like to higlight this would be a great place to do it.
|
3. Name the Release, usually just the tag is fine, however if there is a special feature you'd like to highlight this would be a great place to do it.
|
||||||
4. Click the "Generate release notes" button which will pull in all the Git Commits as a changelog. For bug fix only releases this is sufficient, however if there are major features, or good quality of life improvements it's good to provide those prior to listing the full changelog.
|
4. Click the "Generate release notes" button which will pull in all the Git Commits as a changelog. For bug fix only releases this is sufficient, however if there are major features, or good quality of life improvements it's good to provide those prior to listing the full changelog.
|
||||||
|
|
||||||
!!! tip
|
!!! tip
|
||||||
Don't worry about setting the version number in the container or code, it's set during the build process and uses the tag you specified when drafting a new release.
|
Don't worry about setting the version number in the container or code, it's set during the build process and uses the tag you specified when drafting a new release.
|
||||||
|
|
||||||
You can see how this is done in the [Actions File](https://github.com/mealie-recipes/mealie/blob/mealie-next/.github/workflows/partial-builder.yml#L35-L37)
|
You can see how this is done in the [Actions File](https://github.com/mealie-recipes/mealie/blob/mealie-next/.github/workflows/partial-builder.yml#L35-L37)
|
||||||
|
|
||||||
|
### Tags and Releases
|
||||||
|
|
||||||
|
Mealie tries to adhere to a strict [Semver](https://semver.org/) policy. This means that we try to keep our releases as stable as possible, and only introduce breaking changes when absolutely necessary. As such we try to keep our releases as follows:
|
||||||
|
|
||||||
|
- **Major** releases are reserved for breaking changes, and are not expected to be frequent. Ideally, we will remain at v1.x.x for the forseeable future.
|
||||||
|
- **Minor** releases are reserved for new features, and are expected to be frequent.
|
||||||
|
- **Patch** releases are reserved for bug fixes, and are expected to be frequent.
|
||||||
|
|
||||||
|
Any maintainer who has privileges on GitHub to create a new release can create a release at any time they feel it is necessary. However, it is recommended that you reach out in the discord to other maintainers and get at least one other maintainer to approve the release.
|
||||||
|
|
||||||
|
An important caveat to this is that we _may_ make breaking changes in a minor release if it is security related. In this case, the releaser should headline the release notes with the notice and impact of the breaking change, however we may not bump the major version depending on user impact.
|
||||||
|
|
||||||
|
### Release Notes
|
||||||
|
|
||||||
|
When drafting a new release, GitHub will automatically pull in all the commits since the last release. This is a great start. After pulling in all of the commits, you should add sections for
|
||||||
|
|
||||||
|
- New Features - Any new features that are being introduced in this release (screenshots are great here)
|
||||||
|
- Bug Fixes - Significant bug fixes that are being introduced in this release, smaller bug fixes can be left out if they are noted in a commit message
|
||||||
|
- Breaking Changes - Any breaking changes that are being introduced in this release (should be rare)
|
||||||
|
@ -14,12 +14,12 @@ Prerequisites
|
|||||||
- Visual Studio Code
|
- Visual Studio Code
|
||||||
|
|
||||||
### Linux and MacOS
|
### Linux and MacOS
|
||||||
|
|
||||||
First ensure that docker is running. Then when you clone the repo and open with VS Code you should see a popup asking you to reopen the project inside a development container. Click yes and it will build the development container and run the setup required to run both the backend API and the frontend webserver. This also pre-configures pre-commit hooks to ensure that the code is up to date before committing.
|
First ensure that docker is running. Then when you clone the repo and open with VS Code you should see a popup asking you to reopen the project inside a development container. Click yes and it will build the development container and run the setup required to run both the backend API and the frontend webserver. This also pre-configures pre-commit hooks to ensure that the code is up to date before committing.
|
||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
Make sure the VSCode Dev Containers extension is installed, then select "Dev Containers: Clone Repository in Container Volume..." in the command pallete (F1). Select your forked repo and choose the `mealie-next` branch, which contains the latest changes. This mounts your repository directly in WSL2, which [greatly improves the performance of the container](https://code.visualstudio.com/docs/devcontainers/containers#_quick-start-open-a-git-repository-or-github-pr-in-an-isolated-container-volume), and enables hot-reloading for the frontend. Running the container on a mounted volume may not work correctly on Windows due to WSL permission mapping issues.
|
|
||||||
|
|
||||||
[Checkout the makefile reference](#make-file-reference) for all of the available commands.
|
Make sure the VSCode Dev Containers extension is installed, then select "Dev Containers: Clone Repository in Container Volume..." in the command palette (F1). Select your forked repo and choose the `mealie-next` branch, which contains the latest changes. This mounts your repository directly in WSL2, which [greatly improves the performance of the container](https://code.visualstudio.com/docs/devcontainers/containers#_quick-start-open-a-git-repository-or-github-pr-in-an-isolated-container-volume), and enables hot-reloading for the frontend. Running the container on a mounted volume may not work correctly on Windows due to WSL permission mapping issues.
|
||||||
|
|
||||||
!!! tip
|
!!! tip
|
||||||
For slow terminal checkout the solution in this [GitHub Issue](https://github.com/microsoft/vscode/issues/133215)
|
For slow terminal checkout the solution in this [GitHub Issue](https://github.com/microsoft/vscode/issues/133215)
|
||||||
@ -29,16 +29,18 @@ Make sure the VSCode Dev Containers extension is installed, then select "Dev Con
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Without Dev Containers
|
## Without Dev Containers
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
|
|
||||||
- [Python 3.10](https://www.python.org/downloads/)
|
- [Python 3.10](https://www.python.org/downloads/)
|
||||||
- [Poetry](https://python-poetry.org/docs/#installation)
|
- [Poetry](https://python-poetry.org/docs/#installation)
|
||||||
- [Node v16.x](https://nodejs.org/en/)
|
- [Node v16.x](https://nodejs.org/en/)
|
||||||
- [yarn](https://classic.yarnpkg.com/lang/en/docs/install/#mac-stable)
|
- [yarn](https://classic.yarnpkg.com/lang/en/docs/install/#mac-stable)
|
||||||
|
- [task](https://taskfile.dev/#/installation)
|
||||||
|
|
||||||
### Installing Dependencies
|
### Installing Dependencies
|
||||||
|
|
||||||
Once the prerequisites are installed you can cd into the project base directory and run `make setup` to install the python and node dependencies.
|
Once the prerequisites are installed you can cd into the project base directory and run `task setup` to install the python and node dependencies, and download the NLP model.
|
||||||
|
|
||||||
=== "Linux / macOS"
|
=== "Linux / macOS"
|
||||||
|
|
||||||
@ -46,29 +48,16 @@ Once the prerequisites are installed you can cd into the project base directory
|
|||||||
# Naviate To The Root Directory
|
# Naviate To The Root Directory
|
||||||
cd /path/to/project
|
cd /path/to/project
|
||||||
|
|
||||||
# Utilize the Makefile to Install Dependencies
|
# Utilize the Taskfile to Install Dependencies
|
||||||
make setup
|
task setup
|
||||||
```
|
```
|
||||||
|
|
||||||
=== "Windows"
|
|
||||||
|
|
||||||
``` powershell
|
|
||||||
# Install Python Dependencies
|
|
||||||
Set-Directory -Path "C:\path\to\project"
|
|
||||||
poetry install
|
|
||||||
|
|
||||||
# Install Node Dependencies
|
|
||||||
Set-Directory frontend
|
|
||||||
yarn install
|
|
||||||
```
|
|
||||||
|
|
||||||
### Setting ENV Variables
|
|
||||||
|
|
||||||
Before you start the server you MUST copy the `template.env` and `frontend/template.env` files to their respective locations with the name `.env` and `frontend/.env` respectively. The application will-not run without these files.
|
|
||||||
|
|
||||||
## Postgres
|
## Postgres
|
||||||
- Whether using a container or manual install, you need to set up your own postgres dev server. The database, username, password, etc should match the `POSTGRES_*` options located in the `.env` file.
|
|
||||||
- Install psycog2 with `poetry install -E pgsql` (in the main `mealie` directory, *not* `frontend`)
|
The taskfile has two commands that need to be run to run the development environment against a postgres database.
|
||||||
|
|
||||||
|
- `task dev:services` - This will start the postgres database, and a smtp server for email testing.
|
||||||
|
- `task py:postgres` - This will run that backend API configured for the local postgres database.
|
||||||
|
|
||||||
## Starting The Server
|
## Starting The Server
|
||||||
|
|
||||||
@ -78,57 +67,24 @@ Now you're ready to start the servers. You'll need two shells open, One for the
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Terminal #1
|
# Terminal #1
|
||||||
make backend
|
task py
|
||||||
|
|
||||||
# Terminal #2
|
# Terminal #2
|
||||||
make frontend
|
task ui
|
||||||
```
|
```
|
||||||
|
|
||||||
=== "Windows"
|
|
||||||
|
|
||||||
``` powershell
|
|
||||||
# Terminal # 1
|
|
||||||
poetry run python mealie/db/init_db.py # Initialize the database
|
|
||||||
poetry run python mealie/app.py # start application
|
|
||||||
|
|
||||||
# Terminal # 2
|
|
||||||
Set-Directory frontend
|
|
||||||
yarn run dev
|
|
||||||
```
|
|
||||||
|
|
||||||
## Make File Reference
|
|
||||||
|
|
||||||
Run `make help` for reference. If you're on a system that doesn't support makefiles in most cases you can use the commands directly in your terminal by copy/pasting them from the Makefile.
|
|
||||||
|
|
||||||
```
|
|
||||||
docs 📄 Start Mkdocs Development Server
|
|
||||||
code-gen 🤖 Run Code-Gen Scripts
|
|
||||||
setup 🏗 Setup Development Instance
|
|
||||||
setup-model 🤖 Get the latest NLP CRF++ Model
|
|
||||||
clean-data ⚠️ Removes All Developer Data for a fresh server start
|
|
||||||
clean-pyc 🧹 Remove Python file artifacts
|
|
||||||
clean-test 🧹 Remove test and coverage artifacts
|
|
||||||
backend-clean 🧹 Remove all build, test, coverage and Python artifacts
|
|
||||||
backend-test 🧪 Run tests quickly with the default Python
|
|
||||||
backend-format 🧺 Format, Check and Flake8
|
|
||||||
backend-all 🧪 Runs all the backend checks and tests
|
|
||||||
backend-coverage ☂️ Check code coverage quickly with the default Python
|
|
||||||
backend 🎬 Start Mealie Backend Development Server
|
|
||||||
frontend 🎬 Start Mealie Frontend Development Server
|
|
||||||
frontend-build 🏗 Build Frontend in frontend/dist
|
|
||||||
frontend-generate 🏗 Generate Code for Frontend
|
|
||||||
frontend-lint 🧺 Run yarn lint
|
|
||||||
docker-dev 🐳 Build and Start Docker Development Stack (currently not functional, see #756, #1072)
|
|
||||||
docker-prod 🐳 Build and Start Docker Production Stack
|
|
||||||
|
|
||||||
```
|
|
||||||
## Internationalization
|
## Internationalization
|
||||||
|
|
||||||
### Frontend
|
### Frontend
|
||||||
|
|
||||||
We use vue-i18n package for internationalization. Translations are stored in json format located in [frontend/lang/messages](https://github.com/mealie-recipes/mealie/tree/mealie-next/frontend/lang/messages).
|
We use vue-i18n package for internationalization. Translations are stored in json format located in [frontend/lang/messages](https://github.com/mealie-recipes/mealie/tree/mealie-next/frontend/lang/messages).
|
||||||
|
|
||||||
### Backend
|
### Backend
|
||||||
|
|
||||||
Translations are stored in json format located in [mealie/lang/messages](https://github.com/mealie-recipes/mealie/tree/mealie-next/mealie/lang/messages).
|
Translations are stored in json format located in [mealie/lang/messages](https://github.com/mealie-recipes/mealie/tree/mealie-next/mealie/lang/messages).
|
||||||
|
|
||||||
### Quick frontend localization with VS Code
|
### Quick frontend localization with VS Code
|
||||||
|
|
||||||
[i18n Ally for VScode](https://marketplace.visualstudio.com/items?itemName=lokalise.i18n-ally) is helpful for generating new strings to translate using Code Actions. 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 using Code Actions. It also has a nice feature, which shows translations in-place when editing code.
|
||||||
|
|
||||||
A few settings must be tweaked to make the most of its features. Some settings are stored on project level, but most of them have to be set manually in your workspace or user settings.\
|
A few settings must be tweaked to make the most of its features. Some settings are stored on project level, but most of them have to be set manually in your workspace or user settings.\
|
||||||
|
@ -3,37 +3,80 @@
|
|||||||
!!! info
|
!!! info
|
||||||
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!
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
User [brasilikum](https://github.com/brasilikum) opened an issue on the main repo about how they had created an [iOS shortcut](https://github.com/mealie-recipes/mealie/issues/103) for interested users.
|
|
||||||
This original method broke after the transition to version 1.X and an issue was raised on [Github](https://github.com/mealie-recipes/mealie/issues/2092) GitHub user [Zippyy](https://github.com/zippyy) has helped to create a working shortcut for version 1.X.
|
|
||||||
|
|
||||||
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/cc568d1615bc4f998789f85d1ef74846) 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/94aa272af5ff4d2c8fe5e13a946f89a9) 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.
|
||||||
|
|
||||||
This guide assumes that you already know how to [generate API tokens](https://hay-kot.github.io/mealie/documentation/users-groups/user-settings/#api-key-generation) for your user that intends to use an iOS shortcut.
|
## Setup Video
|
||||||
|
|
||||||
First, click the [link](https://www.icloud.com/shortcuts/cc568d1615bc4f998789f85d1ef74846) and begin the setup of the shortcut.
|
The following YouTube video walks through setting up the shortcut in 3 minutes for those who prefer following along visually.
|
||||||
|
|
||||||
|
<iframe width="560" height="315" src="https://www.youtube.com/embed/XZk6S1MVUrE?si=HGH07RbK-Ip_1qFz" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
|
||||||
|
|
||||||

|
## Guide
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
Before setting up the shortcut, make sure you have the following information ready and easily accessable on your Apple device.
|
||||||
|
|
||||||
|
1. The URL of your Mealie instance
|
||||||
|
2. An API Key for your user
|
||||||
|
3. A Gemini API Key from [Google AI Studio](https://makersuite.google.com)
|
||||||
|
|
||||||
|
!!! note
|
||||||
|
A Gemini API Key is not required for importing URLs from Safari or your Camera, however you will not be able to take a photo of a recipe and import it without a Gemini key.
|
||||||
|
|
||||||
|
Google AI Studio is currently only available in [certain countries and languages](https://ai.google.dev/available_regions). Most notably it is not currently available in Europe.
|
||||||
|
|
||||||
|
### Setup
|
||||||
|
|
||||||
|
On the Apple device you wish to add the shortcut to, click on [this link](https://www.icloud.com/shortcuts/94aa272af5ff4d2c8fe5e13a946f89a9) to begin the setup of the shortcut.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
Next, you need to replace `url` and `port` with the information for your Mealie instance.
|
Next, you need to replace `url` and `port` with the information for your Mealie instance.
|
||||||
|
|
||||||
If you have a domain that you use (e.g. `https://mealie.example.com`), put that here. If you just run local, then you need to put in your Mealie instance IP and the port you use (e.g. the default is `9925`).
|
If you have a domain that you use (e.g. `https://mealie.example.com`), put that here. If you just run local, then you need to put in your Mealie instance IP and the port you use (e.g. the default is `9925`).
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||

|
Next, you need to replace `MEALIE_API_KEY` with your API token.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
Finally, you need to replace the word `keyhere` with your API token. Keep the word `Bearer`!!!
|
Finally, replace `GEMINI_API_KEY` with the one you got from [Google AI Studio](https://makersuite.google.com)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||

|
You may wish to [add the shortcut to your home screen](https://support.apple.com/guide/shortcuts/add-a-shortcut-to-the-home-screen-apd735880972/ios) for easier access.
|
||||||
|
|
||||||
You should now be able to share a website to the shortcut and have Mealie grab all the necessary information!
|
## Features
|
||||||
|
|
||||||
|
- Share a website from Safari with Mealie to import via URL.
|
||||||
|
- Share a recipe photo from photos to perform OCR and import a physical recipe.
|
||||||
|
- Trigger the shortcut and take a photo of a physical recipe to import.
|
||||||
|
- Trigger the shortcut to select a photo from your Photos app to import.
|
||||||
|
- Trigger the shortcut to take a picture of a URL (like on the bottom of a printed recipe) to import.
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
Sometimes Gemini will not be able to parse a recipe, and you will get an error. Users have found success with a combination of the following:
|
||||||
|
|
||||||
|
1. #### Try Again
|
||||||
|
Sometimes Gemini returns the wrong information which causes the import to fail. Often, trying again will be successful.
|
||||||
|
|
||||||
|
2. #### Photo Quality
|
||||||
|
Make sure there is no large glare or shadow over the picture, and you have all the text in frame.
|
||||||
|
|
||||||
|
3. #### Edit the Photo
|
||||||
|
Users have found success by cropping the picture to just the recipe card, adding a "mono" filter, and cranking up the exposure before importing.
|
||||||
|
|
||||||
|
## History
|
||||||
|
|
||||||
|
User [brasilikum](https://github.com/brasilikum) opened an issue on the main repo about how they had created an [iOS shortcut](https://github.com/mealie-recipes/mealie/issues/103) for interested users.
|
||||||
|
|
||||||
|
This original method broke after the transition to version 1.X and an issue was raised on [Github](https://github.com/mealie-recipes/mealie/issues/2092) GitHub user [Zippyy](https://github.com/zippyy) has helped to create a working shortcut for version 1.X.
|
||||||
|
|
||||||
|
When OCR was removed from Mealie, GitHub user [hunterjm](https://github.com/zippyy) created a new shortcut that uses Apple's built-in OCR and Google Gemini to enhance and replace that functionality.
|
||||||
|
@ -14,10 +14,10 @@ The first step is to grab a dynamic DNS if you don't have your own subdomain alr
|
|||||||
|
|
||||||
## 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).
|
Then you will need to set up SWAG, the variables of the docker-compose.yaml file 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.yaml"
|
||||||
```yaml
|
```yaml
|
||||||
version: "3.1"
|
version: "3.1"
|
||||||
services:
|
services:
|
||||||
@ -46,7 +46,6 @@ ports:
|
|||||||
- 443:443
|
- 443:443
|
||||||
- 80:80 #optional
|
- 80:80 #optional
|
||||||
restart: unless-stopped
|
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 <code>mydomain.duckns</code> into your personal domain and the <code>duckdnstoken</code> into your token and remove the brackets.
|
||||||
@ -79,7 +78,6 @@ Alternatively, you can create a new file <code>mealie.subdomain.conf</code> in p
|
|||||||
set $upstream_proto http;
|
set $upstream_proto http;
|
||||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -41,22 +41,15 @@ Yes. If you are using the v1 branches (including beta), you can upgrade to the l
|
|||||||
|
|
||||||
## How can I change the theme?
|
## How can I change the theme?
|
||||||
|
|
||||||
You can change the theme by settings the environment variables on the frontend container.
|
You can change the theme by settings the environment variables.
|
||||||
|
|
||||||
- [Frontend Theme](../installation/frontend-config#themeing)
|
- [Backend Config - Themeing](./installation/backend-config.md#themeing)
|
||||||
|
|
||||||
## How can I change the language?
|
|
||||||
|
|
||||||
Languages need to be set on the frontend and backend containers as ENV variables.
|
|
||||||
|
|
||||||
- [Frontend Config](../installation/frontend-config/)
|
|
||||||
- [Backend Config](../installation/backend-config/)
|
|
||||||
|
|
||||||
## How can I change the Login Session Timeout?
|
## How can I change the Login Session Timeout?
|
||||||
|
|
||||||
Login session can be configured by setting the `TOKEN_TIME` variable on the backend container.
|
Login session can be configured by setting the `TOKEN_TIME` variable on the backend container.
|
||||||
|
|
||||||
- [Backend Config](../installation/backend-config/)
|
- [Backend Config](./installation/backend-config.md)
|
||||||
|
|
||||||
## Can I serve Mealie on a subpath?
|
## Can I serve Mealie on a subpath?
|
||||||
|
|
||||||
|
@ -72,7 +72,7 @@ After you've decided setup the files it's important to set a few ENV variables t
|
|||||||
After you've configured your database and updated the `docker-compose.yaml` files, you can start Mealie by running the following command in the directory where you've added your `docker-compose.yaml`.
|
After you've configured your database and updated the `docker-compose.yaml` files, you can start Mealie by running the following command in the directory where you've added your `docker-compose.yaml`.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ docker-compose up -d
|
$ docker compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
You should see the containers start up without error. You should now be able to access the Mealie frontend at [http://localhost:9925](http://localhost:9925).
|
You should see the containers start up without error. You should now be able to access the Mealie frontend at [http://localhost:9925](http://localhost:9925).
|
||||||
@ -107,13 +107,11 @@ See all available tags on [GitHub](https://github.com/mealie-recipes/mealie/pkgs
|
|||||||
|
|
||||||
The nightly build are the latest and greatest builds that are built directly off of every commit to the `mealie-next` branch and as such may contain bugs. These are great to help the community catch bugs before they hit the stable release or if you like living on the edge.
|
The nightly build are the latest and greatest builds that are built directly off of every commit to the `mealie-next` branch and as such may contain bugs. These are great to help the community catch bugs before they hit the stable release or if you like living on the edge.
|
||||||
|
|
||||||
`ghrc.io/mealie-recipes/mealie:<version>`
|
`ghcr.io/mealie-recipes/mealie:<version>`
|
||||||
|
|
||||||
We also provide versioned containers that allow to pin to a specific release. Each time a new release is built a new tag will be pushed with the version. These are great to pin to a specific version and allows you to have absolute control on when you upgrade your container.
|
We also provide versioned containers that allow to pin to a specific release. Each time a new release is built a new tag will be pushed with the version. These are great to pin to a specific version and allows you to have absolute control on when you upgrade your container.
|
||||||
|
|
||||||
`ghrc.io/mealie-recipes/mealie:latest`
|
`ghcr.io/mealie-recipes/mealie:latest`
|
||||||
|
|
||||||
_Note: This tag is not yet available; it will be available with the v1 stable release_
|
|
||||||
|
|
||||||
The latest tag provides the latest released image of Mealie.
|
The latest tag provides the latest released image of Mealie.
|
||||||
|
|
||||||
|
@ -2,23 +2,21 @@
|
|||||||
|
|
||||||
PostgreSQL might be considered if you need to support many concurrent users. In addition, some features are only enabled on PostgreSQL, such as fuzzy search.
|
PostgreSQL might be considered if you need to support many concurrent users. In addition, some features are only enabled on PostgreSQL, such as fuzzy search.
|
||||||
|
|
||||||
**For Environmental Variable Configuration See:**
|
**For Environment Variable Configuration, see** [Backend Configuration](./backend-config.md)
|
||||||
|
|
||||||
- [Configuration](./backend-config.md)
|
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
---
|
---
|
||||||
version: "3.7"
|
version: "3.7"
|
||||||
services:
|
services:
|
||||||
mealie:
|
mealie:
|
||||||
image: ghcr.io/mealie-recipes/mealie:v1.0.0-RC1.1
|
image: ghcr.io/mealie-recipes/mealie:v1.1.0 # (3)
|
||||||
container_name: mealie
|
container_name: mealie
|
||||||
ports:
|
ports:
|
||||||
- "9925:9000"
|
- "9925:9000" # (1)
|
||||||
deploy:
|
deploy:
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
memory: 1000M # (1)
|
memory: 1000M # (2)
|
||||||
depends_on:
|
depends_on:
|
||||||
- postgres
|
- postgres
|
||||||
volumes:
|
volumes:
|
||||||
@ -62,3 +60,4 @@ volumes:
|
|||||||
|
|
||||||
1. To access the mealie interface you only need to expose port 9000 on the mealie container. Here we expose port 9925 on the host, but feel free to change this to any port you like.
|
1. To access the mealie interface you only need to expose port 9000 on the mealie container. Here we expose port 9925 on the host, but feel free to change this to any port you like.
|
||||||
2. Setting an explicit memory limit is recommended. Python can pre-allocate larger amounts of memory than is necessary if you have a machine with a lot of RAM. This can cause the container to idle at a high memory usage. Setting a memory limit will improve idle performance.
|
2. Setting an explicit memory limit is recommended. Python can pre-allocate larger amounts of memory than is necessary if you have a machine with a lot of RAM. This can cause the container to idle at a high memory usage. Setting a memory limit will improve idle performance.
|
||||||
|
3. You should double check this value isn't out of date when setting up for the first time; check the README and use the value from the "latest release" badge at the top - the format should be `vX.Y.Z`. Whilst a 'latest' tag is available, the Mealie team advises specifying a specific version tag and consciously updating to newer versions when you have time to read the release notes and ensure you follow any manual actions required (which should be rare).
|
||||||
|
@ -1,17 +1,19 @@
|
|||||||
# Installing with SQLite
|
# Installing with SQLite
|
||||||
|
|
||||||
|
!!! Warning
|
||||||
|
If you're planning on deploying and using Network Attached Storage with Mealie, you should use [Postgres](./postgres.md) instead of SQLite. SQLite is not designed to be used with Network Attached Storage and can cause data corruption, or locked database errors
|
||||||
|
|
||||||
|
|
||||||
SQLite is a popular, open source, self-contained, zero-configuration database that is the ideal choice for Mealie when you have 1-20 Users. Below is a ready to use docker-compose.yaml file for deploying Mealie on your server.
|
SQLite is a popular, open source, self-contained, zero-configuration database that is the ideal choice for Mealie when you have 1-20 Users. Below is a ready to use docker-compose.yaml file for deploying Mealie on your server.
|
||||||
|
|
||||||
**For Environmental Variable Configuration See:**
|
**For Environment Variable Configuration, see** [Backend Configuration](./backend-config.md)
|
||||||
|
|
||||||
- [Configuration](./backend-config.md)
|
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
---
|
---
|
||||||
version: "3.7"
|
version: "3.7"
|
||||||
services:
|
services:
|
||||||
mealie:
|
mealie:
|
||||||
image: ghcr.io/mealie-recipes/mealie:v1.0.0-RC1.1
|
image: ghcr.io/mealie-recipes/mealie:v1.1.0 # (3)
|
||||||
container_name: mealie
|
container_name: mealie
|
||||||
ports:
|
ports:
|
||||||
- "9925:9000" # (1)
|
- "9925:9000" # (1)
|
||||||
@ -41,3 +43,4 @@ volumes:
|
|||||||
|
|
||||||
1. To access the mealie interface you only need to expose port 9000 on the container. Here we expose port 9925 on the host, but feel free to change this to any port you like.
|
1. To access the mealie interface you only need to expose port 9000 on the container. Here we expose port 9925 on the host, but feel free to change this to any port you like.
|
||||||
2. Setting an explicit memory limit is recommended. Python can pre-allocate larger amounts of memory than is necessary if you have a machine with a lot of RAM. This can cause the container to idle at a high memory usage. Setting a memory limit will improve idle performance.
|
2. Setting an explicit memory limit is recommended. Python can pre-allocate larger amounts of memory than is necessary if you have a machine with a lot of RAM. This can cause the container to idle at a high memory usage. Setting a memory limit will improve idle performance.
|
||||||
|
3. You should double check this value isn't out of date when setting up for the first time; check the README and use the value from the "latest release" badge at the top - the format should be `vX.Y.Z`. Whilst a 'latest' tag is available, the Mealie team advises specifying a specific version tag and consciously updating to newer versions when you have time to read the release notes and ensure you follow any manual actions required (which should be rare).
|
||||||
|
@ -1,11 +1,5 @@
|
|||||||
# About The Project
|
# About The Project
|
||||||
|
|
||||||
!!! warning "Mealie v1 Beta Release"
|
|
||||||
|
|
||||||
This documentation is for the Mealie v1 Beta release and is not final. As such, it may contain incomplete or incorrect information. You should understand that installing Mealie v1 Beta is a work in progress and while we've committed to maintaining the database schema and provided migrations, we are still in the process of adding new features, and robust testing to ensure the application works as expected.
|
|
||||||
|
|
||||||
You should likely find bugs, errors, and unfinished pages within the application. To find the current status of the release you can checkout the [project on github](https://github.com/mealie-recipes/mealie/projects/7) or reach out on discord.
|
|
||||||
|
|
||||||
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)
|
[Remember to join the Discord](https://discord.gg/QuStdQGSGK)
|
||||||
|
@ -19,6 +19,7 @@ If you are upgrading from pre-v1.0.0 to v1.0.0, make sure you read [Migrating to
|
|||||||
## Docker
|
## Docker
|
||||||
For all setups using Docker the updating process looks 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`
|
- If you are not using the latest tag, change the version (image tag) in your docker-compose file
|
||||||
- Start the container again using `docker-compose up -d`
|
- Pull the latest image using `docker compose pull`
|
||||||
|
- Start the container again using `docker compose up -d`
|
||||||
|
@ -51,8 +51,8 @@ extra_css:
|
|||||||
- assets/stylesheets/custom.css
|
- assets/stylesheets/custom.css
|
||||||
extra_javascript:
|
extra_javascript:
|
||||||
- assets/js/extra.js
|
- assets/js/extra.js
|
||||||
repo_url: https://github.com/hay-kot/mealie/
|
repo_url: https://github.com/mealie-recipes/mealie/
|
||||||
repo_name: hay-kot/mealie
|
repo_name: mealie-recipes/mealie
|
||||||
edit_uri: edit/mealie-next/docs/docs/
|
edit_uri: edit/mealie-next/docs/docs/
|
||||||
|
|
||||||
nav:
|
nav:
|
||||||
|
55
frontend/components/Domain/Cookbook/CookbookEditor.vue
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<v-card-text v-if="cookbook">
|
||||||
|
<v-text-field v-model="cookbook.name" :label="$t('cookbook.cookbook-name')"></v-text-field>
|
||||||
|
<v-textarea v-model="cookbook.description" auto-grow :rows="2" :label="$t('recipe.description')"></v-textarea>
|
||||||
|
<RecipeOrganizerSelector v-model="cookbook.categories" selector-type="categories" />
|
||||||
|
<RecipeOrganizerSelector v-model="cookbook.tags" selector-type="tags" />
|
||||||
|
<RecipeOrganizerSelector v-model="cookbook.tools" selector-type="tools" />
|
||||||
|
<v-switch v-model="cookbook.public" hide-details single-line>
|
||||||
|
<template #label>
|
||||||
|
{{ $t('cookbook.public-cookbook') }}
|
||||||
|
<HelpIcon small right class="ml-2">
|
||||||
|
{{ $t('cookbook.public-cookbook-description') }}
|
||||||
|
</HelpIcon>
|
||||||
|
</template>
|
||||||
|
</v-switch>
|
||||||
|
<div class="mt-4">
|
||||||
|
<h3 class="text-subtitle-1 d-flex align-center mb-0 pb-0">
|
||||||
|
{{ $t('cookbook.filter-options') }}
|
||||||
|
<HelpIcon right small class="ml-2">
|
||||||
|
{{ $t('cookbook.filter-options-description') }}
|
||||||
|
</HelpIcon>
|
||||||
|
</h3>
|
||||||
|
<v-switch v-model="cookbook.requireAllCategories" class="mt-0" hide-details single-line>
|
||||||
|
<template #label> {{ $t('cookbook.require-all-categories') }} </template>
|
||||||
|
</v-switch>
|
||||||
|
<v-switch v-model="cookbook.requireAllTags" hide-details single-line>
|
||||||
|
<template #label> {{ $t('cookbook.require-all-tags') }} </template>
|
||||||
|
</v-switch>
|
||||||
|
<v-switch v-model="cookbook.requireAllTools" hide-details single-line>
|
||||||
|
<template #label> {{ $t('cookbook.require-all-tools') }} </template>
|
||||||
|
</v-switch>
|
||||||
|
</div>
|
||||||
|
</v-card-text>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import { defineComponent } from "@nuxtjs/composition-api";
|
||||||
|
import { ReadCookBook } from "~/lib/api/types/cookbook";
|
||||||
|
import RecipeOrganizerSelector from "~/components/Domain/Recipe/RecipeOrganizerSelector.vue";
|
||||||
|
export default defineComponent({
|
||||||
|
components: { RecipeOrganizerSelector },
|
||||||
|
props: {
|
||||||
|
cookbook: {
|
||||||
|
type: Object as () => ReadCookBook,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
actions: {
|
||||||
|
type: Object as () => any,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
</script>
|
@ -139,7 +139,7 @@ export default defineComponent({
|
|||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
setup(props, context) {
|
setup(_, context) {
|
||||||
const deleteDialog = ref(false);
|
const deleteDialog = ref(false);
|
||||||
|
|
||||||
const { i18n, $globals } = useContext();
|
const { i18n, $globals } = useContext();
|
||||||
|
@ -26,40 +26,53 @@
|
|||||||
>
|
>
|
||||||
<div style="max-height: 70vh; overflow-y: auto">
|
<div style="max-height: 70vh; overflow-y: auto">
|
||||||
<v-card
|
<v-card
|
||||||
v-for="(section, sectionIndex) in recipeIngredientSections" :key="section.recipeId + sectionIndex"
|
v-for="(recipeSection, recipeSectionIndex) in recipeIngredientSections" :key="recipeSection.recipeId + recipeSectionIndex"
|
||||||
elevation="0"
|
elevation="0"
|
||||||
height="fit-content"
|
height="fit-content"
|
||||||
width="100%"
|
width="100%"
|
||||||
>
|
>
|
||||||
<v-divider v-if="sectionIndex > 0" class="mt-3" />
|
<v-divider v-if="recipeSectionIndex > 0" class="mt-3" />
|
||||||
<v-card-title
|
<v-card-title
|
||||||
v-if="recipeIngredientSections.length > 1"
|
v-if="recipeIngredientSections.length > 1"
|
||||||
class="justify-center"
|
class="justify-center text-h5"
|
||||||
width="100%"
|
width="100%"
|
||||||
>
|
>
|
||||||
<v-container style="width: 100%;">
|
<v-container style="width: 100%;">
|
||||||
<v-row no-gutters class="ma-0 pa-0">
|
<v-row no-gutters class="ma-0 pa-0">
|
||||||
<v-col cols="12" align-self="center" class="text-center">
|
<v-col cols="12" align-self="center" class="text-center">
|
||||||
{{ section.recipeName }}
|
{{ recipeSection.recipeName }}
|
||||||
</v-col>
|
</v-col>
|
||||||
</v-row>
|
</v-row>
|
||||||
<v-row v-if="section.recipeScale > 1" no-gutters class="ma-0 pa-0">
|
<v-row v-if="recipeSection.recipeScale > 1" no-gutters class="ma-0 pa-0">
|
||||||
<!-- TODO: make this editable in the dialog and visible on single-recipe lists -->
|
<!-- TODO: make this editable in the dialog and visible on single-recipe lists -->
|
||||||
<v-col cols="12" align-self="center" class="text-center">
|
<v-col cols="12" align-self="center" class="text-center">
|
||||||
({{ $tc("recipe.quantity") }}: {{ section.recipeScale }})
|
({{ $tc("recipe.quantity") }}: {{ recipeSection.recipeScale }})
|
||||||
</v-col>
|
</v-col>
|
||||||
</v-row>
|
</v-row>
|
||||||
</v-container>
|
</v-container>
|
||||||
</v-card-title>
|
</v-card-title>
|
||||||
|
<div>
|
||||||
|
<div
|
||||||
|
v-for="(ingredientSection, ingredientSectionIndex) in recipeSection.ingredientSections"
|
||||||
|
:key="recipeSection.recipeId + recipeSectionIndex + ingredientSectionIndex"
|
||||||
|
>
|
||||||
|
<v-card-title v-if="ingredientSection.sectionName" class="ingredient-title mt-2 pb-0 text-h6">
|
||||||
|
{{ ingredientSection.sectionName }}
|
||||||
|
</v-card-title>
|
||||||
<div
|
<div
|
||||||
:class="$vuetify.breakpoint.smAndDown ? '' : 'ingredient-grid'"
|
:class="$vuetify.breakpoint.smAndDown ? '' : 'ingredient-grid'"
|
||||||
:style="$vuetify.breakpoint.smAndDown ? '' : { gridTemplateRows: `repeat(${Math.ceil(section.ingredients.length / 2)}, min-content)` }"
|
:style="$vuetify.breakpoint.smAndDown ? '' : { gridTemplateRows: `repeat(${Math.ceil(ingredientSection.ingredients.length / 2)}, min-content)` }"
|
||||||
>
|
>
|
||||||
<v-list-item
|
<v-list-item
|
||||||
v-for="(ingredientData, i) in section.ingredients"
|
v-for="(ingredientData, i) in ingredientSection.ingredients"
|
||||||
:key="'ingredient' + i"
|
:key="recipeSection.recipeId + recipeSectionIndex + ingredientSectionIndex + i"
|
||||||
dense
|
dense
|
||||||
@click="recipeIngredientSections[sectionIndex].ingredients[i].checked = !recipeIngredientSections[sectionIndex].ingredients[i].checked"
|
@click="recipeIngredientSections[recipeSectionIndex]
|
||||||
|
.ingredientSections[ingredientSectionIndex]
|
||||||
|
.ingredients[i].checked = !recipeIngredientSections[recipeSectionIndex]
|
||||||
|
.ingredientSections[ingredientSectionIndex]
|
||||||
|
.ingredients[i]
|
||||||
|
.checked"
|
||||||
>
|
>
|
||||||
<v-checkbox
|
<v-checkbox
|
||||||
hide-details
|
hide-details
|
||||||
@ -71,10 +84,12 @@
|
|||||||
<RecipeIngredientListItem
|
<RecipeIngredientListItem
|
||||||
:ingredient="ingredientData.ingredient"
|
:ingredient="ingredientData.ingredient"
|
||||||
:disable-amount="ingredientData.disableAmount"
|
:disable-amount="ingredientData.disableAmount"
|
||||||
:scale="section.recipeScale" />
|
:scale="recipeSection.recipeScale" />
|
||||||
</v-list-item-content>
|
</v-list-item-content>
|
||||||
</v-list-item>
|
</v-list-item>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</v-card>
|
</v-card>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex justify-end mb-4 mt-2">
|
<div class="d-flex justify-end mb-4 mt-2">
|
||||||
@ -112,17 +127,22 @@ export interface RecipeWithScale extends Recipe {
|
|||||||
scale: number;
|
scale: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ShoppingListRecipeIngredient {
|
export interface ShoppingListIngredient {
|
||||||
checked: boolean;
|
checked: boolean;
|
||||||
ingredient: RecipeIngredient;
|
ingredient: RecipeIngredient;
|
||||||
disableAmount: boolean;
|
disableAmount: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ShoppingListIngredientSection {
|
||||||
|
sectionName: string;
|
||||||
|
ingredients: ShoppingListIngredient[];
|
||||||
|
}
|
||||||
|
|
||||||
export interface ShoppingListRecipeIngredientSection {
|
export interface ShoppingListRecipeIngredientSection {
|
||||||
recipeId: string;
|
recipeId: string;
|
||||||
recipeName: string;
|
recipeName: string;
|
||||||
recipeScale: number;
|
recipeScale: number;
|
||||||
ingredients: ShoppingListRecipeIngredient[];
|
ingredientSections: ShoppingListIngredientSection[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
@ -191,7 +211,7 @@ export default defineComponent({
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const shoppingListIngredients: ShoppingListRecipeIngredient[] = recipe.recipeIngredient.map((ing) => {
|
const shoppingListIngredients: ShoppingListIngredient[] = recipe.recipeIngredient.map((ing) => {
|
||||||
return {
|
return {
|
||||||
checked: true,
|
checked: true,
|
||||||
ingredient: ing,
|
ingredient: ing,
|
||||||
@ -199,11 +219,35 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const shoppingListIngredientSections = shoppingListIngredients.reduce((sections, ing) => {
|
||||||
|
// if title append new section to the end of the array
|
||||||
|
if (ing.ingredient.title) {
|
||||||
|
sections.push({
|
||||||
|
sectionName: ing.ingredient.title,
|
||||||
|
ingredients: [ing],
|
||||||
|
});
|
||||||
|
return sections;
|
||||||
|
}
|
||||||
|
|
||||||
|
// append new section if first
|
||||||
|
if (sections.length === 0) {
|
||||||
|
sections.push({
|
||||||
|
sectionName: "",
|
||||||
|
ingredients: [ing],
|
||||||
|
});
|
||||||
|
return sections;
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise add ingredient to last section in the array
|
||||||
|
sections[sections.length - 1].ingredients.push(ing);
|
||||||
|
return sections;
|
||||||
|
}, [] as ShoppingListIngredientSection[]);
|
||||||
|
|
||||||
recipeSectionMap.set(recipe.slug, {
|
recipeSectionMap.set(recipe.slug, {
|
||||||
recipeId: recipe.id,
|
recipeId: recipe.id,
|
||||||
recipeName: recipe.name,
|
recipeName: recipe.name,
|
||||||
recipeScale: recipe.scale,
|
recipeScale: recipe.scale,
|
||||||
ingredients: shoppingListIngredients,
|
ingredientSections: shoppingListIngredientSections,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,11 +275,13 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
function bulkCheckIngredients(value = true) {
|
function bulkCheckIngredients(value = true) {
|
||||||
recipeIngredientSections.value.forEach((section) => {
|
recipeIngredientSections.value.forEach((recipeSection) => {
|
||||||
section.ingredients.forEach((ing) => {
|
recipeSection.ingredientSections.forEach((ingSection) => {
|
||||||
|
ingSection.ingredients.forEach((ing) => {
|
||||||
ing.checked = value;
|
ing.checked = value;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function addRecipesToList() {
|
async function addRecipesToList() {
|
||||||
@ -246,11 +292,13 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const ingredients: RecipeIngredient[] = [];
|
const ingredients: RecipeIngredient[] = [];
|
||||||
section.ingredients.forEach((ing) => {
|
section.ingredientSections.forEach((ingSection) => {
|
||||||
|
ingSection.ingredients.forEach((ing) => {
|
||||||
if (ing.checked) {
|
if (ing.checked) {
|
||||||
ingredients.push(ing.ingredient);
|
ingredients.push(ing.ingredient);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
if (!ingredients.length) {
|
if (!ingredients.length) {
|
||||||
return;
|
return;
|
||||||
@ -272,7 +320,11 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
success ? alert.success(i18n.t("recipe.recipes-added-to-list") as string)
|
const successMessage = promises.length === 1
|
||||||
|
? i18n.t("recipe.successfully-added-to-list") as string
|
||||||
|
: i18n.t("recipe.failed-to-add-to-list") as string;
|
||||||
|
|
||||||
|
success ? alert.success(successMessage)
|
||||||
: alert.error(i18n.t("failed-to-add-recipes-to-list") as string)
|
: alert.error(i18n.t("failed-to-add-recipes-to-list") as string)
|
||||||
|
|
||||||
state.shoppingListDialog = false;
|
state.shoppingListDialog = false;
|
||||||
|
@ -52,11 +52,20 @@ export default defineComponent({
|
|||||||
});
|
});
|
||||||
|
|
||||||
const ingredientCopyText = computed(() => {
|
const ingredientCopyText = computed(() => {
|
||||||
return props.value
|
const components: string[] = [];
|
||||||
.map((ingredient) => {
|
props.value.forEach((ingredient) => {
|
||||||
return `${parseIngredientText(ingredient, props.disableAmount, props.scale, false)}`;
|
if (ingredient.title) {
|
||||||
})
|
if (components.length) {
|
||||||
.join("\n");
|
components.push("");
|
||||||
|
}
|
||||||
|
|
||||||
|
components.push(`[${ingredient.title}]`);
|
||||||
|
}
|
||||||
|
|
||||||
|
components.push(parseIngredientText(ingredient, props.disableAmount, props.scale, false));
|
||||||
|
});
|
||||||
|
|
||||||
|
return components.join("\n");
|
||||||
});
|
});
|
||||||
|
|
||||||
function toggleChecked(index: number) {
|
function toggleChecked(index: number) {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-if="value.length > 0 || edit" class="mt-8">
|
<div v-if="value.length > 0 || edit" class="mt-8">
|
||||||
<h2 class="my-4">{{ $t("recipe.note") }}</h2>
|
<h2 class="my-4">{{ $t("recipe.note") }}</h2>
|
||||||
<div v-for="(note, index) in value" :key="'note' + index" class="mt-1">
|
<div v-for="(note, index) in value" :id="'note' + index" :key="'note' + index" class="mt-1">
|
||||||
<v-card v-if="edit">
|
<v-card v-if="edit">
|
||||||
<v-card-text>
|
<v-card-text>
|
||||||
<div class="d-flex align-center">
|
<div class="d-flex align-center">
|
||||||
|
@ -5,17 +5,20 @@
|
|||||||
<BaseDialog
|
<BaseDialog
|
||||||
v-if="deleteTarget"
|
v-if="deleteTarget"
|
||||||
v-model="dialogs.delete"
|
v-model="dialogs.delete"
|
||||||
:title="$t('general.delete-with-name', { name: deleteTarget.name })"
|
:title="$t('general.delete-with-name', { name: $t(translationKey) })"
|
||||||
color="error"
|
color="error"
|
||||||
:icon="$globals.icons.alertCircle"
|
:icon="$globals.icons.alertCircle"
|
||||||
@confirm="deleteOne()"
|
@confirm="deleteOne()"
|
||||||
>
|
>
|
||||||
<v-card-text> {{ $t("general.confirm-delete-generic-with-name", { name: deleteTarget.name }) }} </v-card-text>
|
<v-card-text>
|
||||||
|
<p>{{ $t("general.confirm-delete-generic-with-name", { name: $t(translationKey) }) }}</p>
|
||||||
|
<p class="mt-4 mb-0 ml-4">{{ deleteTarget.name }}</p>
|
||||||
|
</v-card-text>
|
||||||
</BaseDialog>
|
</BaseDialog>
|
||||||
|
|
||||||
<BaseDialog v-if="updateTarget" v-model="dialogs.update" :title="$t('general.update')" @confirm="updateOne()">
|
<BaseDialog v-if="updateTarget" v-model="dialogs.update" :title="$t('general.update')" @confirm="updateOne()">
|
||||||
<v-card-text>
|
<v-card-text>
|
||||||
<v-text-field v-model="updateTarget.name" label="$t('general.name')"> </v-text-field>
|
<v-text-field v-model="updateTarget.name" :label="$t('general.name')"> </v-text-field>
|
||||||
<v-checkbox v-if="itemType === Organizer.Tool" v-model="updateTarget.onHand" :label="$t('tool.on-hand')"></v-checkbox>
|
<v-checkbox v-if="itemType === Organizer.Tool" v-model="updateTarget.onHand" :label="$t('tool.on-hand')"></v-checkbox>
|
||||||
</v-card-text>
|
</v-card-text>
|
||||||
</BaseDialog>
|
</BaseDialog>
|
||||||
@ -136,6 +139,15 @@ export default defineComponent({
|
|||||||
|
|
||||||
const presets = useContextPresets();
|
const presets = useContextPresets();
|
||||||
|
|
||||||
|
const translationKey = computed<string>(() => {
|
||||||
|
const typeMap = {
|
||||||
|
"categories": "category.category",
|
||||||
|
"tags": "tag.tag",
|
||||||
|
"tools": "tool.tool"
|
||||||
|
};
|
||||||
|
return typeMap[props.itemType] || "";
|
||||||
|
});
|
||||||
|
|
||||||
const deleteTarget = ref<GenericItem | null>(null);
|
const deleteTarget = ref<GenericItem | null>(null);
|
||||||
const updateTarget = ref<GenericItem | null>(null);
|
const updateTarget = ref<GenericItem | null>(null);
|
||||||
|
|
||||||
@ -223,6 +235,7 @@ export default defineComponent({
|
|||||||
presets,
|
presets,
|
||||||
itemsSorted,
|
itemsSorted,
|
||||||
searchString,
|
searchString,
|
||||||
|
translationKey,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
// Needed for useMeta
|
// Needed for useMeta
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<section @keyup.ctrl.90="undoMerge">
|
<section @keyup.ctrl.90="undoMerge">
|
||||||
<!-- Ingredient Link Editor -->
|
<!-- Ingredient Link Editor -->
|
||||||
<v-dialog v-model="dialog" width="600">
|
<v-dialog v-if="dialog" v-model="dialog" width="600">
|
||||||
<v-card :ripple="false">
|
<v-card :ripple="false">
|
||||||
<v-app-bar dark color="primary" class="mt-n1 mb-3">
|
<v-app-bar dark color="primary" class="mt-n1 mb-3">
|
||||||
<v-icon large left>
|
<v-icon large left>
|
||||||
@ -50,11 +50,15 @@
|
|||||||
<BaseButton cancel @click="dialog = false"> </BaseButton>
|
<BaseButton cancel @click="dialog = false"> </BaseButton>
|
||||||
<v-spacer></v-spacer>
|
<v-spacer></v-spacer>
|
||||||
<div class="d-flex flex-wrap justify-end">
|
<div class="d-flex flex-wrap justify-end">
|
||||||
<BaseButton color="info" @click="autoSetReferences">
|
<BaseButton class="my-1" color="info" @click="autoSetReferences">
|
||||||
<template #icon> {{ $globals.icons.robot }}</template>
|
<template #icon> {{ $globals.icons.robot }}</template>
|
||||||
{{ $t("recipe.auto") }}
|
{{ $t("recipe.auto") }}
|
||||||
</BaseButton>
|
</BaseButton>
|
||||||
<BaseButton class="ml-2" save @click="setIngredientIds"> </BaseButton>
|
<BaseButton class="ml-2 my-1" save @click="setIngredientIds"> </BaseButton>
|
||||||
|
<BaseButton v-if="availableNextStep" class="ml-2 my-1" @click="saveAndOpenNextLinkIngredients">
|
||||||
|
<template #icon> {{ $globals.icons.forward }}</template>
|
||||||
|
{{ $t("recipe.nextStep") }}
|
||||||
|
</BaseButton>
|
||||||
</div>
|
</div>
|
||||||
</v-card-actions>
|
</v-card-actions>
|
||||||
</v-card>
|
</v-card>
|
||||||
@ -236,6 +240,7 @@ import {
|
|||||||
onMounted,
|
onMounted,
|
||||||
useContext,
|
useContext,
|
||||||
computed,
|
computed,
|
||||||
|
nextTick,
|
||||||
} from "@nuxtjs/composition-api";
|
} from "@nuxtjs/composition-api";
|
||||||
import RecipeIngredientHtml from "../../RecipeIngredientHtml.vue";
|
import RecipeIngredientHtml from "../../RecipeIngredientHtml.vue";
|
||||||
import { RecipeStep, IngredientReferences, RecipeIngredient, RecipeAsset, Recipe } from "~/lib/api/types/recipe";
|
import { RecipeStep, IngredientReferences, RecipeIngredient, RecipeAsset, Recipe } from "~/lib/api/types/recipe";
|
||||||
@ -399,6 +404,8 @@ export default defineComponent({
|
|||||||
activeRefs.value = refs.map((ref) => ref.referenceId ?? "");
|
activeRefs.value = refs.map((ref) => ref.referenceId ?? "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const availableNextStep = computed(() => activeIndex.value < props.value.length - 1);
|
||||||
|
|
||||||
function setIngredientIds() {
|
function setIngredientIds() {
|
||||||
const instruction = props.value[activeIndex.value];
|
const instruction = props.value[activeIndex.value];
|
||||||
instruction.ingredientReferences = activeRefs.value.map((ref) => {
|
instruction.ingredientReferences = activeRefs.value.map((ref) => {
|
||||||
@ -417,6 +424,20 @@ export default defineComponent({
|
|||||||
state.dialog = false;
|
state.dialog = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function saveAndOpenNextLinkIngredients() {
|
||||||
|
const currentStepIndex = activeIndex.value;
|
||||||
|
|
||||||
|
if(!availableNextStep.value) {
|
||||||
|
return; // no next step, the button calling this function should not be shown
|
||||||
|
}
|
||||||
|
|
||||||
|
setIngredientIds();
|
||||||
|
const nextStep = props.value[currentStepIndex + 1];
|
||||||
|
// close dialog before opening to reset the scroll position
|
||||||
|
nextTick(() => openDialog(currentStepIndex + 1, nextStep.text, nextStep.ingredientReferences));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
function setUsedIngredients() {
|
function setUsedIngredients() {
|
||||||
const usedRefs: { [key: string]: boolean } = {};
|
const usedRefs: { [key: string]: boolean } = {};
|
||||||
|
|
||||||
@ -627,6 +648,8 @@ export default defineComponent({
|
|||||||
mergeAbove,
|
mergeAbove,
|
||||||
openDialog,
|
openDialog,
|
||||||
setIngredientIds,
|
setIngredientIds,
|
||||||
|
availableNextStep,
|
||||||
|
saveAndOpenNextLinkIngredients,
|
||||||
undoMerge,
|
undoMerge,
|
||||||
toggleDisabled,
|
toggleDisabled,
|
||||||
isChecked,
|
isChecked,
|
||||||
|
@ -12,6 +12,8 @@
|
|||||||
$emit('submit');
|
$emit('submit');
|
||||||
dialog = false;
|
dialog = false;
|
||||||
"
|
"
|
||||||
|
@click:outside="$emit('cancel')"
|
||||||
|
@keydown.esc="$emit('cancel')"
|
||||||
>
|
>
|
||||||
<v-card height="100%">
|
<v-card height="100%">
|
||||||
<v-app-bar dark dense :color="color" class="">
|
<v-app-bar dark dense :color="color" class="">
|
||||||
|
@ -57,12 +57,12 @@
|
|||||||
:buttons="[
|
:buttons="[
|
||||||
{
|
{
|
||||||
icon: $globals.icons.edit,
|
icon: $globals.icons.edit,
|
||||||
text: $t('general.edit'),
|
text: $tc('general.edit'),
|
||||||
event: 'edit',
|
event: 'edit',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
icon: $globals.icons.delete,
|
icon: $globals.icons.delete,
|
||||||
text: $t('general.delete'),
|
text: $tc('general.delete'),
|
||||||
event: 'delete',
|
event: 'delete',
|
||||||
},
|
},
|
||||||
]"
|
]"
|
||||||
@ -160,6 +160,8 @@ export default defineComponent({
|
|||||||
props.bulkActions.forEach((action) => {
|
props.bulkActions.forEach((action) => {
|
||||||
handlers[action.event] = () => {
|
handlers[action.event] = () => {
|
||||||
context.emit(action.event, selected.value);
|
context.emit(action.event, selected.value);
|
||||||
|
// clear selection
|
||||||
|
selected.value = [];
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ import { usePublicExploreApi } from "../api/api-client";
|
|||||||
import { useUserApi } from "~/composables/api";
|
import { useUserApi } from "~/composables/api";
|
||||||
import { IngredientFood } from "~/lib/api/types/recipe";
|
import { IngredientFood } from "~/lib/api/types/recipe";
|
||||||
|
|
||||||
let foodStore: Ref<IngredientFood[] | null> | null = null;
|
let foodStore: Ref<IngredientFood[] | null> = ref([]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* useFoodData returns a template reactive object
|
* useFoodData returns a template reactive object
|
||||||
@ -39,11 +39,11 @@ export const usePublicFoodStore = function (groupSlug: string) {
|
|||||||
const actions = {
|
const actions = {
|
||||||
...usePublicStoreActions(api.foods, foodStore, loading),
|
...usePublicStoreActions(api.foods, foodStore, loading),
|
||||||
flushStore() {
|
flushStore() {
|
||||||
foodStore = null;
|
foodStore = ref([]);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!foodStore) {
|
if (!foodStore.value) {
|
||||||
foodStore = actions.getAll();
|
foodStore = actions.getAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,7 +57,7 @@ export const useFoodStore = function () {
|
|||||||
const actions = {
|
const actions = {
|
||||||
...useStoreActions(api.foods, foodStore, loading),
|
...useStoreActions(api.foods, foodStore, loading),
|
||||||
flushStore() {
|
flushStore() {
|
||||||
foodStore = null;
|
foodStore.value = [];
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ import { useStoreActions } from "../partials/use-actions-factory";
|
|||||||
import { MultiPurposeLabelOut } from "~/lib/api/types/labels";
|
import { MultiPurposeLabelOut } from "~/lib/api/types/labels";
|
||||||
import { useUserApi } from "~/composables/api";
|
import { useUserApi } from "~/composables/api";
|
||||||
|
|
||||||
let labelStore: Ref<MultiPurposeLabelOut[] | null> | null = null;
|
let labelStore: Ref<MultiPurposeLabelOut[] | null> = ref([]);
|
||||||
|
|
||||||
export function useLabelData() {
|
export function useLabelData() {
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
@ -33,11 +33,11 @@ export function useLabelStore() {
|
|||||||
const actions = {
|
const actions = {
|
||||||
...useStoreActions<MultiPurposeLabelOut>(api.multiPurposeLabels, labelStore, loading),
|
...useStoreActions<MultiPurposeLabelOut>(api.multiPurposeLabels, labelStore, loading),
|
||||||
flushStore() {
|
flushStore() {
|
||||||
labelStore = null;
|
labelStore.value =[];
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!labelStore) {
|
if (!labelStore.value) {
|
||||||
labelStore = actions.getAll();
|
labelStore = actions.getAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ import { useStoreActions } from "../partials/use-actions-factory";
|
|||||||
import { useUserApi } from "~/composables/api";
|
import { useUserApi } from "~/composables/api";
|
||||||
import { IngredientUnit } from "~/lib/api/types/recipe";
|
import { IngredientUnit } from "~/lib/api/types/recipe";
|
||||||
|
|
||||||
let unitStore: Ref<IngredientUnit[] | null> | null = null;
|
let unitStore: Ref<IngredientUnit[] | null> = ref([]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* useUnitData returns a template reactive object
|
* useUnitData returns a template reactive object
|
||||||
@ -40,11 +40,11 @@ export const useUnitStore = function () {
|
|||||||
const actions = {
|
const actions = {
|
||||||
...useStoreActions<IngredientUnit>(api.units, unitStore, loading),
|
...useStoreActions<IngredientUnit>(api.units, unitStore, loading),
|
||||||
flushStore() {
|
flushStore() {
|
||||||
unitStore = null;
|
unitStore.value = [];
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!unitStore) {
|
if (!unitStore.value) {
|
||||||
unitStore = actions.getAll();
|
unitStore = actions.getAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,6 +109,7 @@ export const useCookbooks = function () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
|
return data;
|
||||||
},
|
},
|
||||||
async updateOne(updateData: UpdateCookBook) {
|
async updateOne(updateData: UpdateCookBook) {
|
||||||
if (!updateData.id) {
|
if (!updateData.id) {
|
||||||
|
@ -3,196 +3,241 @@ export const LOCALES = [
|
|||||||
{
|
{
|
||||||
name: "繁體中文 (Chinese traditional)",
|
name: "繁體中文 (Chinese traditional)",
|
||||||
value: "zh-TW",
|
value: "zh-TW",
|
||||||
progress: 28,
|
progress: 30,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "简体中文 (Chinese simplified)",
|
name: "简体中文 (Chinese simplified)",
|
||||||
value: "zh-CN",
|
value: "zh-CN",
|
||||||
progress: 65,
|
progress: 98,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Tiếng Việt (Vietnamese)",
|
name: "Tiếng Việt (Vietnamese)",
|
||||||
value: "vi-VN",
|
value: "vi-VN",
|
||||||
progress: 2,
|
progress: 1,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Українська (Ukrainian)",
|
name: "Українська (Ukrainian)",
|
||||||
value: "uk-UA",
|
value: "uk-UA",
|
||||||
progress: 99,
|
progress: 100,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Türkçe (Turkish)",
|
name: "Türkçe (Turkish)",
|
||||||
value: "tr-TR",
|
value: "tr-TR",
|
||||||
progress: 50,
|
progress: 53,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Svenska (Swedish)",
|
name: "Svenska (Swedish)",
|
||||||
value: "sv-SE",
|
value: "sv-SE",
|
||||||
progress: 71,
|
progress: 94,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "српски (Serbian)",
|
name: "српски (Serbian)",
|
||||||
value: "sr-SP",
|
value: "sr-SP",
|
||||||
progress: 4,
|
progress: 32,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Slovenian",
|
name: "Slovenian",
|
||||||
value: "sl-SI",
|
value: "sl-SI",
|
||||||
progress: 49,
|
progress: 47,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Slovak",
|
name: "Slovak",
|
||||||
value: "sk-SK",
|
value: "sk-SK",
|
||||||
progress: 97,
|
progress: 93,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Pусский (Russian)",
|
name: "Pусский (Russian)",
|
||||||
value: "ru-RU",
|
value: "ru-RU",
|
||||||
progress: 99,
|
progress: 98,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Română (Romanian)",
|
name: "Română (Romanian)",
|
||||||
value: "ro-RO",
|
value: "ro-RO",
|
||||||
progress: 32,
|
progress: 42,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Português (Portuguese)",
|
name: "Português (Portuguese)",
|
||||||
value: "pt-PT",
|
value: "pt-PT",
|
||||||
progress: 99,
|
progress: 100,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Português do Brasil (Brazilian Portuguese)",
|
name: "Português do Brasil (Brazilian Portuguese)",
|
||||||
value: "pt-BR",
|
value: "pt-BR",
|
||||||
progress: 98,
|
progress: 97,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Polski (Polish)",
|
name: "Polski (Polish)",
|
||||||
value: "pl-PL",
|
value: "pl-PL",
|
||||||
progress: 97,
|
progress: 98,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Norsk (Norwegian)",
|
name: "Norsk (Norwegian)",
|
||||||
value: "no-NO",
|
value: "no-NO",
|
||||||
progress: 85,
|
progress: 99,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Nederlands (Dutch)",
|
name: "Nederlands (Dutch)",
|
||||||
value: "nl-NL",
|
value: "nl-NL",
|
||||||
progress: 98,
|
progress: 100,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Latvian",
|
name: "Latvian",
|
||||||
value: "lv-LV",
|
value: "lv-LV",
|
||||||
progress: 1,
|
progress: 1,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Lithuanian",
|
name: "Lithuanian",
|
||||||
value: "lt-LT",
|
value: "lt-LT",
|
||||||
progress: 97,
|
progress: 93,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "한국어 (Korean)",
|
name: "한국어 (Korean)",
|
||||||
value: "ko-KR",
|
value: "ko-KR",
|
||||||
progress: 5,
|
progress: 5,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "日本語 (Japanese)",
|
name: "日本語 (Japanese)",
|
||||||
value: "ja-JP",
|
value: "ja-JP",
|
||||||
progress: 11,
|
progress: 12,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Italiano (Italian)",
|
name: "Italiano (Italian)",
|
||||||
value: "it-IT",
|
value: "it-IT",
|
||||||
progress: 96,
|
progress: 100,
|
||||||
|
dir: "ltr",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Icelandic",
|
||||||
|
value: "is-IS",
|
||||||
|
progress: 0,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Magyar (Hungarian)",
|
name: "Magyar (Hungarian)",
|
||||||
value: "hu-HU",
|
value: "hu-HU",
|
||||||
progress: 99,
|
progress: 100,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Croatian",
|
name: "Croatian",
|
||||||
value: "hr-HR",
|
value: "hr-HR",
|
||||||
progress: 97,
|
progress: 93,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "עברית (Hebrew)",
|
name: "עברית (Hebrew)",
|
||||||
value: "he-IL",
|
value: "he-IL",
|
||||||
progress: 99,
|
progress: 97,
|
||||||
|
dir: "rtl",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Galician",
|
name: "Galician",
|
||||||
value: "gl-ES",
|
value: "gl-ES",
|
||||||
progress: 1,
|
progress: 1,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Français (French)",
|
name: "Français (French)",
|
||||||
value: "fr-FR",
|
value: "fr-FR",
|
||||||
progress: 99,
|
progress: 100,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "French, Canada",
|
name: "French, Canada",
|
||||||
value: "fr-CA",
|
value: "fr-CA",
|
||||||
progress: 97,
|
progress: 97,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Suomi (Finnish)",
|
name: "Suomi (Finnish)",
|
||||||
value: "fi-FI",
|
value: "fi-FI",
|
||||||
progress: 95,
|
progress: 91,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Español (Spanish)",
|
name: "Español (Spanish)",
|
||||||
value: "es-ES",
|
value: "es-ES",
|
||||||
progress: 76,
|
progress: 79,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "American English",
|
name: "American English",
|
||||||
value: "en-US",
|
value: "en-US",
|
||||||
progress: 100.0,
|
progress: 100.0,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "British English",
|
name: "British English",
|
||||||
value: "en-GB",
|
value: "en-GB",
|
||||||
progress: 4,
|
progress: 3,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Ελληνικά (Greek)",
|
name: "Ελληνικά (Greek)",
|
||||||
value: "el-GR",
|
value: "el-GR",
|
||||||
progress: 35,
|
progress: 34,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Deutsch (German)",
|
name: "Deutsch (German)",
|
||||||
value: "de-DE",
|
value: "de-DE",
|
||||||
progress: 99,
|
progress: 100,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Dansk (Danish)",
|
name: "Dansk (Danish)",
|
||||||
value: "da-DK",
|
value: "da-DK",
|
||||||
progress: 100,
|
progress: 98,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Čeština (Czech)",
|
name: "Čeština (Czech)",
|
||||||
value: "cs-CZ",
|
value: "cs-CZ",
|
||||||
progress: 66,
|
progress: 64,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Català (Catalan)",
|
name: "Català (Catalan)",
|
||||||
value: "ca-ES",
|
value: "ca-ES",
|
||||||
progress: 61,
|
progress: 75,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Bulgarian",
|
name: "Bulgarian",
|
||||||
value: "bg-BG",
|
value: "bg-BG",
|
||||||
progress: 99,
|
progress: 99,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "العربية (Arabic)",
|
name: "العربية (Arabic)",
|
||||||
value: "ar-SA",
|
value: "ar-SA",
|
||||||
progress: 16,
|
progress: 20,
|
||||||
|
dir: "rtl",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Afrikaans (Afrikaans)",
|
name: "Afrikaans (Afrikaans)",
|
||||||
value: "af-ZA",
|
value: "af-ZA",
|
||||||
progress: 96,
|
progress: 92,
|
||||||
|
dir: "ltr",
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
@ -4,14 +4,31 @@ import { LOCALES } from "./available-locales";
|
|||||||
export const useLocales = () => {
|
export const useLocales = () => {
|
||||||
const { i18n, $vuetify } = useContext();
|
const { i18n, $vuetify } = useContext();
|
||||||
|
|
||||||
|
function getLocale(value: string) {
|
||||||
|
const currentLocale = LOCALES.filter((locale) => locale.value === value);
|
||||||
|
return currentLocale.length ? currentLocale[0] : null;
|
||||||
|
}
|
||||||
|
|
||||||
const locale = computed<string>({
|
const locale = computed<string>({
|
||||||
get() {
|
get() {
|
||||||
$vuetify.lang.current = i18n.locale; // dirty hack
|
// dirty hack
|
||||||
|
$vuetify.lang.current = i18n.locale;
|
||||||
|
const currentLocale = getLocale(i18n.locale);
|
||||||
|
if (currentLocale) {
|
||||||
|
$vuetify.rtl = currentLocale.dir === "rtl";
|
||||||
|
}
|
||||||
|
|
||||||
return i18n.locale;
|
return i18n.locale;
|
||||||
},
|
},
|
||||||
set(value) {
|
set(value) {
|
||||||
i18n.setLocale(value);
|
i18n.setLocale(value);
|
||||||
$vuetify.lang.current = value; // this does not persist after window reload :-(
|
|
||||||
|
// this does not persist after window reload :-(
|
||||||
|
$vuetify.lang.current = value;
|
||||||
|
const currentLocale = getLocale(value);
|
||||||
|
if (currentLocale) {
|
||||||
|
$vuetify.rtl = currentLocale.dir === "rtl";
|
||||||
|
}
|
||||||
|
|
||||||
// Reload the page to update the language - not all strings are reactive
|
// Reload the page to update the language - not all strings are reactive
|
||||||
window.location.reload();
|
window.location.reload();
|
||||||
|
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "Laai dokument op",
|
"upload-file": "Laai dokument op",
|
||||||
"created-on-date": "Geskep op: {0}",
|
"created-on-date": "Geskep op: {0}",
|
||||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
||||||
"clipboard-copy-failure": "Failed to copy to the clipboard."
|
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||||
|
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Is jy seker jy wil <b>{groupName}<b/> uitvee?",
|
"are-you-sure-you-want-to-delete-the-group": "Is jy seker jy wil <b>{groupName}<b/> uitvee?",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Skep 'n nuwe maaltydplan",
|
"create-a-new-meal-plan": "Skep 'n nuwe maaltydplan",
|
||||||
|
"update-this-meal-plan": "Update this Meal Plan",
|
||||||
"dinner-this-week": "Aandete hierdie week",
|
"dinner-this-week": "Aandete hierdie week",
|
||||||
"dinner-today": "Vandag se Aandete",
|
"dinner-today": "Vandag se Aandete",
|
||||||
"dinner-tonight": "VANAAND SE AANDETE",
|
"dinner-tonight": "VANAAND SE AANDETE",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Voeg by tydlyn",
|
"add-to-timeline": "Voeg by tydlyn",
|
||||||
"recipe-added-to-list": "Resep by lys gevoeg",
|
"recipe-added-to-list": "Resep by lys gevoeg",
|
||||||
"recipes-added-to-list": "Recipes added to list",
|
"recipes-added-to-list": "Recipes added to list",
|
||||||
|
"successfully-added-to-list": "Successfully added to list",
|
||||||
"recipe-added-to-mealplan": "Resep is by die maaltydplan gevoeg",
|
"recipe-added-to-mealplan": "Resep is by die maaltydplan gevoeg",
|
||||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||||
"failed-to-add-recipe-to-mealplan": "Kon nie resep by maaltydplan voeg nie",
|
"failed-to-add-recipe-to-mealplan": "Kon nie resep by maaltydplan voeg nie",
|
||||||
|
"failed-to-add-to-list": "Failed to add to list",
|
||||||
"yield": "Resultaat",
|
"yield": "Resultaat",
|
||||||
"quantity": "Hoeveelheid",
|
"quantity": "Hoeveelheid",
|
||||||
"choose-unit": "Kies 'n eenheid",
|
"choose-unit": "Kies 'n eenheid",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Nuwe resepname moet uniek wees",
|
"new-recipe-names-must-be-unique": "Nuwe resepname moet uniek wees",
|
||||||
"scrape-recipe": "Skraap resep",
|
"scrape-recipe": "Skraap resep",
|
||||||
"scrape-recipe-description": "Voeg 'n resep by via 'n url. Voer die url van die webwerf in wat jy vir 'n resep wil skandeer, Mealie sal probeer om die resep vanaf daardie plek te skandeer en by jou versameling te voeg.",
|
"scrape-recipe-description": "Voeg 'n resep by via 'n url. Voer die url van die webwerf in wat jy vir 'n resep wil skandeer, Mealie sal probeer om die resep vanaf daardie plek te skandeer en by jou versameling te voeg.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||||
"import-original-keywords-as-tags": "Voer oorspronklike sleutelwoorde as merkers in",
|
"import-original-keywords-as-tags": "Voer oorspronklike sleutelwoorde as merkers in",
|
||||||
"stay-in-edit-mode": "Bly in redigeer modus",
|
"stay-in-edit-mode": "Bly in redigeer modus",
|
||||||
"import-from-zip": "Voer vanaf zip in",
|
"import-from-zip": "Voer vanaf zip in",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Eenheid",
|
"unit": "Eenheid",
|
||||||
"upload-image": "Laai prent",
|
"upload-image": "Laai prent",
|
||||||
"screen-awake": "Hou die skerm aan",
|
"screen-awake": "Hou die skerm aan",
|
||||||
"remove-image": "Verwyder prent"
|
"remove-image": "Verwyder prent",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Gevorderde soek",
|
"advanced-search": "Gevorderde soek",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Merkers",
|
"tags": "Merkers",
|
||||||
"untagged-count": "Nie gemerk {count}",
|
"untagged-count": "Nie gemerk {count}",
|
||||||
"create-a-tag": "Skep 'n merker",
|
"create-a-tag": "Skep 'n merker",
|
||||||
"tag-name": "Merker naam"
|
"tag-name": "Merker naam",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Kookgerei",
|
"tools": "Kookgerei",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Naam van die kookgerei",
|
"tool-name": "Naam van die kookgerei",
|
||||||
"create-new-tool": "Skep nuwe kookgerei",
|
"create-new-tool": "Skep nuwe kookgerei",
|
||||||
"on-hand-checkbox-label": "Wys as in besit (gemerk)",
|
"on-hand-checkbox-label": "Wys as in besit (gemerk)",
|
||||||
"required-tools": "Vereiste kookgerei"
|
"required-tools": "Vereiste kookgerei",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Administrateur",
|
"admin": "Administrateur",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Vereis alle merkers",
|
"require-all-tags": "Vereis alle merkers",
|
||||||
"require-all-tools": "Vereis alle kookgerei",
|
"require-all-tools": "Vereis alle kookgerei",
|
||||||
"cookbook-name": "Naam van die kookboek",
|
"cookbook-name": "Naam van die kookboek",
|
||||||
"cookbook-with-name": "Kookboek {0}"
|
"cookbook-with-name": "Kookboek {0}",
|
||||||
|
"create-a-cookbook": "Create a Cookbook",
|
||||||
|
"cookbook": "Cookbook"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "تحميل الملف",
|
"upload-file": "تحميل الملف",
|
||||||
"created-on-date": "تم الإنشاء في {0}",
|
"created-on-date": "تم الإنشاء في {0}",
|
||||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
||||||
"clipboard-copy-failure": "Failed to copy to the clipboard."
|
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||||
|
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "هل انت متأكد من رغبتك في حذف <b>{groupName}<b/>؟",
|
"are-you-sure-you-want-to-delete-the-group": "هل انت متأكد من رغبتك في حذف <b>{groupName}<b/>؟",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "إنشاء خطة وجبة جديدة",
|
"create-a-new-meal-plan": "إنشاء خطة وجبة جديدة",
|
||||||
|
"update-this-meal-plan": "Update this Meal Plan",
|
||||||
"dinner-this-week": "العشاء لهذا الأسبوع",
|
"dinner-this-week": "العشاء لهذا الأسبوع",
|
||||||
"dinner-today": "العشاء اليوم",
|
"dinner-today": "العشاء اليوم",
|
||||||
"dinner-tonight": "العشاء الليلة",
|
"dinner-tonight": "العشاء الليلة",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Add to Timeline",
|
"add-to-timeline": "Add to Timeline",
|
||||||
"recipe-added-to-list": "Recipe added to list",
|
"recipe-added-to-list": "Recipe added to list",
|
||||||
"recipes-added-to-list": "Recipes added to list",
|
"recipes-added-to-list": "Recipes added to list",
|
||||||
|
"successfully-added-to-list": "Successfully added to list",
|
||||||
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
||||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||||
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
||||||
|
"failed-to-add-to-list": "Failed to add to list",
|
||||||
"yield": "Yield",
|
"yield": "Yield",
|
||||||
"quantity": "Quantity",
|
"quantity": "Quantity",
|
||||||
"choose-unit": "Choose Unit",
|
"choose-unit": "Choose Unit",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "New recipe names must be unique",
|
"new-recipe-names-must-be-unique": "New recipe names must be unique",
|
||||||
"scrape-recipe": "Scrape Recipe",
|
"scrape-recipe": "Scrape Recipe",
|
||||||
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||||
"import-original-keywords-as-tags": "Import original keywords as tags",
|
"import-original-keywords-as-tags": "Import original keywords as tags",
|
||||||
"stay-in-edit-mode": "Stay in Edit mode",
|
"stay-in-edit-mode": "Stay in Edit mode",
|
||||||
"import-from-zip": "Import from Zip",
|
"import-from-zip": "Import from Zip",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Unit",
|
"unit": "Unit",
|
||||||
"upload-image": "Upload image",
|
"upload-image": "Upload image",
|
||||||
"screen-awake": "Keep Screen Awake",
|
"screen-awake": "Keep Screen Awake",
|
||||||
"remove-image": "Remove image"
|
"remove-image": "Remove image",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Advanced Search",
|
"advanced-search": "Advanced Search",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Tags",
|
"tags": "Tags",
|
||||||
"untagged-count": "Untagged {count}",
|
"untagged-count": "Untagged {count}",
|
||||||
"create-a-tag": "Create a Tag",
|
"create-a-tag": "Create a Tag",
|
||||||
"tag-name": "Tag Name"
|
"tag-name": "Tag Name",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Tools",
|
"tools": "Tools",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Tool Name",
|
"tool-name": "Tool Name",
|
||||||
"create-new-tool": "Create New Tool",
|
"create-new-tool": "Create New Tool",
|
||||||
"on-hand-checkbox-label": "Show as On Hand (Checked)",
|
"on-hand-checkbox-label": "Show as On Hand (Checked)",
|
||||||
"required-tools": "Required Tools"
|
"required-tools": "Required Tools",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Admin",
|
"admin": "Admin",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Require All Tags",
|
"require-all-tags": "Require All Tags",
|
||||||
"require-all-tools": "Require All Tools",
|
"require-all-tools": "Require All Tools",
|
||||||
"cookbook-name": "Cookbook Name",
|
"cookbook-name": "Cookbook Name",
|
||||||
"cookbook-with-name": "Cookbook {0}"
|
"cookbook-with-name": "Cookbook {0}",
|
||||||
|
"create-a-cookbook": "Create a Cookbook",
|
||||||
|
"cookbook": "Cookbook"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "Качване на файл",
|
"upload-file": "Качване на файл",
|
||||||
"created-on-date": "Създадено на {0}",
|
"created-on-date": "Създадено на {0}",
|
||||||
"unsaved-changes": "Имате незапазени промени. Желаете ли да ги запазите преди да излезете? Натиснете Ок за запазване и Отказ за отхвърляне на промените.",
|
"unsaved-changes": "Имате незапазени промени. Желаете ли да ги запазите преди да излезете? Натиснете Ок за запазване и Отказ за отхвърляне на промените.",
|
||||||
"clipboard-copy-failure": "Failed to copy to the clipboard."
|
"clipboard-copy-failure": "Линкът към рецептата е копиран в клипборда.",
|
||||||
|
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Сигурни ли сте, че искате да изтриете <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Сигурни ли сте, че искате да изтриете <b>{groupName}<b/>?",
|
||||||
@ -250,7 +251,7 @@
|
|||||||
"general-preferences": "Общи предпочитания",
|
"general-preferences": "Общи предпочитания",
|
||||||
"group-recipe-preferences": "Предпочитания за рецепта по група",
|
"group-recipe-preferences": "Предпочитания за рецепта по група",
|
||||||
"report": "Сигнал",
|
"report": "Сигнал",
|
||||||
"report-with-id": "Номер на сигнала: {id}",
|
"report-with-id": "Номер на доклада: {id}",
|
||||||
"group-management": "Управление на групите",
|
"group-management": "Управление на групите",
|
||||||
"admin-group-management": "Административно управление на групите",
|
"admin-group-management": "Административно управление на групите",
|
||||||
"admin-group-management-text": "Промените по тази група ще бъдат отразени моментално.",
|
"admin-group-management-text": "Промените по тази група ще бъдат отразени моментално.",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Създаване на нов хранителен план",
|
"create-a-new-meal-plan": "Създаване на нов хранителен план",
|
||||||
|
"update-this-meal-plan": "Update this Meal Plan",
|
||||||
"dinner-this-week": "Вечеря тази седмица",
|
"dinner-this-week": "Вечеря тази седмица",
|
||||||
"dinner-today": "Вечеря Днес",
|
"dinner-today": "Вечеря Днес",
|
||||||
"dinner-tonight": "Вечеря ТАЗИ ВЕЧЕР",
|
"dinner-tonight": "Вечеря ТАЗИ ВЕЧЕР",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Добави към времевата линия",
|
"add-to-timeline": "Добави към времевата линия",
|
||||||
"recipe-added-to-list": "Рецептата е добавена към списъка",
|
"recipe-added-to-list": "Рецептата е добавена към списъка",
|
||||||
"recipes-added-to-list": "Рецептите са добавени към списъка",
|
"recipes-added-to-list": "Рецептите са добавени към списъка",
|
||||||
|
"successfully-added-to-list": "Successfully added to list",
|
||||||
"recipe-added-to-mealplan": "Рецептата е добавена към хранителния план",
|
"recipe-added-to-mealplan": "Рецептата е добавена към хранителния план",
|
||||||
"failed-to-add-recipes-to-list": "Неуспешно добавяне на рецепта към списъка",
|
"failed-to-add-recipes-to-list": "Неуспешно добавяне на рецепта към списъка",
|
||||||
"failed-to-add-recipe-to-mealplan": "Рецептата не беше добавена към хранителния план",
|
"failed-to-add-recipe-to-mealplan": "Рецептата не беше добавена към хранителния план",
|
||||||
|
"failed-to-add-to-list": "Failed to add to list",
|
||||||
"yield": "Добив",
|
"yield": "Добив",
|
||||||
"quantity": "Количество",
|
"quantity": "Количество",
|
||||||
"choose-unit": "Избери единица",
|
"choose-unit": "Избери единица",
|
||||||
@ -515,7 +519,7 @@
|
|||||||
"message-key": "Ключ на съобщението",
|
"message-key": "Ключ на съобщението",
|
||||||
"parse": "Анализирай",
|
"parse": "Анализирай",
|
||||||
"attach-images-hint": "Прикачете снимки като ги влачете и пуснете в редактора",
|
"attach-images-hint": "Прикачете снимки като ги влачете и пуснете в редактора",
|
||||||
"drop-image": "Влачете и пуснете снимка",
|
"drop-image": "Премахване на изображение",
|
||||||
"enable-ingredient-amounts-to-use-this-feature": "Пуснете количествата на съставките за да използвате функционалността",
|
"enable-ingredient-amounts-to-use-this-feature": "Пуснете количествата на съставките за да използвате функционалността",
|
||||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Рецепти със зададени мерни единици и храни ме могат да бъдат анализирани.",
|
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Рецепти със зададени мерни единици и храни ме могат да бъдат анализирани.",
|
||||||
"parse-ingredients": "Анализирай съставките",
|
"parse-ingredients": "Анализирай съставките",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Името на рецептата трябва да бъде уникално",
|
"new-recipe-names-must-be-unique": "Името на рецептата трябва да бъде уникално",
|
||||||
"scrape-recipe": "Обхождане на рецепта",
|
"scrape-recipe": "Обхождане на рецепта",
|
||||||
"scrape-recipe-description": "Обходи рецепта по линк. Предоставете линк за сайт, който искате да бъде обходен. Mealie ще опита да обходи рецептата от този сайт и да я добави във Вашата колекция.",
|
"scrape-recipe-description": "Обходи рецепта по линк. Предоставете линк за сайт, който искате да бъде обходен. Mealie ще опита да обходи рецептата от този сайт и да я добави във Вашата колекция.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||||
"import-original-keywords-as-tags": "Импортирай оригиналните ключови думи като тагове",
|
"import-original-keywords-as-tags": "Импортирай оригиналните ключови думи като тагове",
|
||||||
"stay-in-edit-mode": "Остани в режим на редакция",
|
"stay-in-edit-mode": "Остани в режим на редакция",
|
||||||
"import-from-zip": "Импортирай от Zip",
|
"import-from-zip": "Импортирай от Zip",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Единица",
|
"unit": "Единица",
|
||||||
"upload-image": "Качване на изображение",
|
"upload-image": "Качване на изображение",
|
||||||
"screen-awake": "Запази екрана активен",
|
"screen-awake": "Запази екрана активен",
|
||||||
"remove-image": "Премахване на изображение"
|
"remove-image": "Премахване на изображение",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Разширено търсене",
|
"advanced-search": "Разширено търсене",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Тагове",
|
"tags": "Тагове",
|
||||||
"untagged-count": "Без таг {count}",
|
"untagged-count": "Без таг {count}",
|
||||||
"create-a-tag": "Създаване на таг",
|
"create-a-tag": "Създаване на таг",
|
||||||
"tag-name": "Име на тага"
|
"tag-name": "Име на тага",
|
||||||
|
"tag": "Тагове"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Инструменти",
|
"tools": "Инструменти",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Име на инструмента",
|
"tool-name": "Име на инструмента",
|
||||||
"create-new-tool": "Създаване на нов инструмент",
|
"create-new-tool": "Създаване на нов инструмент",
|
||||||
"on-hand-checkbox-label": "Показване като налични (отметнато)",
|
"on-hand-checkbox-label": "Показване като налични (отметнато)",
|
||||||
"required-tools": "Задължителни инструменти"
|
"required-tools": "Задължителни инструменти",
|
||||||
|
"tool": "Инструменти"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Админ",
|
"admin": "Админ",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Изискване на всички тагове",
|
"require-all-tags": "Изискване на всички тагове",
|
||||||
"require-all-tools": "Изискване на всички инструменти",
|
"require-all-tools": "Изискване на всички инструменти",
|
||||||
"cookbook-name": "Име на книгата с рецепти",
|
"cookbook-name": "Име на книгата с рецепти",
|
||||||
"cookbook-with-name": "Книга с рецепти {0}"
|
"cookbook-with-name": "Книга с рецепти {0}",
|
||||||
|
"create-a-cookbook": "Create a Cookbook",
|
||||||
|
"cookbook": "Cookbook"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@
|
|||||||
"event-delete-confirmation": "Està segur que vol suprimir aquest esdeveniment?",
|
"event-delete-confirmation": "Està segur que vol suprimir aquest esdeveniment?",
|
||||||
"event-deleted": "Esdeveniment eliminat",
|
"event-deleted": "Esdeveniment eliminat",
|
||||||
"event-updated": "Esdeveniment actualitzat",
|
"event-updated": "Esdeveniment actualitzat",
|
||||||
"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.",
|
"new-notification-form-description": "Mealie utilitza la llibreria Apprise per a generar notificacions. Ofereix moltes opcions de serveis de notificació. A la seva wiki, disposeu de guies d'ús i informació per a crear l'URL al vostre servei. Si està disponible, en seleccionar el tipus de notificació, pot incloure funcions addicionals.",
|
||||||
"new-version": "Hi ha una nova versió disponible!",
|
"new-version": "Hi ha una nova versió disponible!",
|
||||||
"notification": "Notificacions",
|
"notification": "Notificacions",
|
||||||
"refresh": "Recarrega",
|
"refresh": "Recarrega",
|
||||||
@ -114,7 +114,7 @@
|
|||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Paraula clau",
|
"keyword": "Paraula clau",
|
||||||
"link-copied": "S'ha copiat l'enllaç",
|
"link-copied": "S'ha copiat l'enllaç",
|
||||||
"loading": "Loading",
|
"loading": "Carregant",
|
||||||
"loading-events": "Carregant esdeveniments",
|
"loading-events": "Carregant esdeveniments",
|
||||||
"loading-recipe": "Carregant la recepta...",
|
"loading-recipe": "Carregant la recepta...",
|
||||||
"loading-ocr-data": "Carregant les dades OCR...",
|
"loading-ocr-data": "Carregant les dades OCR...",
|
||||||
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "Puja un fitxer",
|
"upload-file": "Puja un fitxer",
|
||||||
"created-on-date": "Creat el: {0}",
|
"created-on-date": "Creat el: {0}",
|
||||||
"unsaved-changes": "Tens canvis que no estan guardats. Vols guardar-los abans de sortir? Clica d'acord per guardar-los o cancel·lar per descartar els canvis.",
|
"unsaved-changes": "Tens canvis que no estan guardats. Vols guardar-los abans de sortir? Clica d'acord per guardar-los o cancel·lar per descartar els canvis.",
|
||||||
"clipboard-copy-failure": "Failed to copy to the clipboard."
|
"clipboard-copy-failure": "No s'ha pogut copiar al porta-retalls.",
|
||||||
|
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Esteu segur de voler suprimir el grup <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Esteu segur de voler suprimir el grup <b>{groupName}<b/>?",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Crea un nou menú",
|
"create-a-new-meal-plan": "Crea un nou menú",
|
||||||
|
"update-this-meal-plan": "Update this Meal Plan",
|
||||||
"dinner-this-week": "Sopar d'esta setmana",
|
"dinner-this-week": "Sopar d'esta setmana",
|
||||||
"dinner-today": "Sopar per avui",
|
"dinner-today": "Sopar per avui",
|
||||||
"dinner-tonight": "Sopar d'aquesta nit",
|
"dinner-tonight": "Sopar d'aquesta nit",
|
||||||
@ -294,7 +296,7 @@
|
|||||||
"meal-recipe": "Recepta del menú",
|
"meal-recipe": "Recepta del menú",
|
||||||
"meal-title": "Títol del menú",
|
"meal-title": "Títol del menú",
|
||||||
"meal-note": "Notes del menú",
|
"meal-note": "Notes del menú",
|
||||||
"note-only": "Note Only",
|
"note-only": "Només notes",
|
||||||
"random-meal": "Menú aleatori",
|
"random-meal": "Menú aleatori",
|
||||||
"random-dinner": "Principal aleatori",
|
"random-dinner": "Principal aleatori",
|
||||||
"random-side": "Guarnició aleatòria",
|
"random-side": "Guarnició aleatòria",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Afegir a la cronologia",
|
"add-to-timeline": "Afegir a la cronologia",
|
||||||
"recipe-added-to-list": "Recepta afegida a la llista",
|
"recipe-added-to-list": "Recepta afegida a la llista",
|
||||||
"recipes-added-to-list": "Receptes afegides a la llista",
|
"recipes-added-to-list": "Receptes afegides a la llista",
|
||||||
|
"successfully-added-to-list": "Successfully added to list",
|
||||||
"recipe-added-to-mealplan": "Recepta afegida al menú",
|
"recipe-added-to-mealplan": "Recepta afegida al menú",
|
||||||
"failed-to-add-recipes-to-list": "S'ha produït un error al intentar afegir la recepta a la llista",
|
"failed-to-add-recipes-to-list": "S'ha produït un error al intentar afegir la recepta a la llista",
|
||||||
"failed-to-add-recipe-to-mealplan": "S'ha produït un error afegint la recepta al menú",
|
"failed-to-add-recipe-to-mealplan": "S'ha produït un error afegint la recepta al menú",
|
||||||
|
"failed-to-add-to-list": "Failed to add to list",
|
||||||
"yield": "Racions",
|
"yield": "Racions",
|
||||||
"quantity": "Quantitat",
|
"quantity": "Quantitat",
|
||||||
"choose-unit": "Tria el tipus d'unitat",
|
"choose-unit": "Tria el tipus d'unitat",
|
||||||
@ -512,7 +516,7 @@
|
|||||||
"user-made-this": "{user} ha fet això",
|
"user-made-this": "{user} ha fet això",
|
||||||
"last-made-date": "Última vegada feta {date}",
|
"last-made-date": "Última vegada feta {date}",
|
||||||
"api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.",
|
"api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.",
|
||||||
"message-key": "Message Key",
|
"message-key": "Clau del missatge",
|
||||||
"parse": "Analitzar",
|
"parse": "Analitzar",
|
||||||
"attach-images-hint": "Afegeix imatges arrossegant i deixant anar la imatge a l'editor",
|
"attach-images-hint": "Afegeix imatges arrossegant i deixant anar la imatge a l'editor",
|
||||||
"drop-image": "Deixa anar la imatge",
|
"drop-image": "Deixa anar la imatge",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Els noms de les noves receptes han de ser únics",
|
"new-recipe-names-must-be-unique": "Els noms de les noves receptes han de ser únics",
|
||||||
"scrape-recipe": "Rastrejar recepta",
|
"scrape-recipe": "Rastrejar recepta",
|
||||||
"scrape-recipe-description": "Rastrejar recepta des de l'Url. Proporciona un Url del lloc que vols rastrejar i Mealie intentarà analitzar la recepta del lloc web i afegir-la a la teva col·lecció.",
|
"scrape-recipe-description": "Rastrejar recepta des de l'Url. Proporciona un Url del lloc que vols rastrejar i Mealie intentarà analitzar la recepta del lloc web i afegir-la a la teva col·lecció.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||||
"import-original-keywords-as-tags": "Importa les paraules clau originals com a tags",
|
"import-original-keywords-as-tags": "Importa les paraules clau originals com a tags",
|
||||||
"stay-in-edit-mode": "Segueix en el mode d'edició",
|
"stay-in-edit-mode": "Segueix en el mode d'edició",
|
||||||
"import-from-zip": "Importa des d'un ZIP",
|
"import-from-zip": "Importa des d'un ZIP",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Unitat",
|
"unit": "Unitat",
|
||||||
"upload-image": "Puja una imatge",
|
"upload-image": "Puja una imatge",
|
||||||
"screen-awake": "Mantenir la pantalla encesa",
|
"screen-awake": "Mantenir la pantalla encesa",
|
||||||
"remove-image": "Esborrar la imatge"
|
"remove-image": "Esborrar la imatge",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Cerca avançada",
|
"advanced-search": "Cerca avançada",
|
||||||
@ -696,8 +703,8 @@
|
|||||||
"volumes-are-configured-correctly": "Volumes are configured correctly.",
|
"volumes-are-configured-correctly": "Volumes are configured correctly.",
|
||||||
"status-unknown-try-running-a-validation": "Status Unknown. Try running a validation.",
|
"status-unknown-try-running-a-validation": "Status Unknown. Try running a validation.",
|
||||||
"validate": "Validate",
|
"validate": "Validate",
|
||||||
"email-configuration-status": "Email Configuration Status",
|
"email-configuration-status": "Estat de la configuració del correu electrònic",
|
||||||
"email-configured": "Email Configured",
|
"email-configured": "Correu electrònic configurat",
|
||||||
"email-test-results": "Email Test Results",
|
"email-test-results": "Email Test Results",
|
||||||
"ready": "Ready",
|
"ready": "Ready",
|
||||||
"not-ready": "Not Ready - Check Environmental Variables",
|
"not-ready": "Not Ready - Check Environmental Variables",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Etiquetes",
|
"tags": "Etiquetes",
|
||||||
"untagged-count": "{count} sense etiquetar",
|
"untagged-count": "{count} sense etiquetar",
|
||||||
"create-a-tag": "Crea una etiqueta",
|
"create-a-tag": "Crea una etiqueta",
|
||||||
"tag-name": "Nom de l'etiqueta"
|
"tag-name": "Nom de l'etiqueta",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Estris",
|
"tools": "Estris",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Nom de l'estri",
|
"tool-name": "Nom de l'estri",
|
||||||
"create-new-tool": "Crea un nou estri",
|
"create-new-tool": "Crea un nou estri",
|
||||||
"on-hand-checkbox-label": "Mostra com a disponible (marcat)",
|
"on-hand-checkbox-label": "Mostra com a disponible (marcat)",
|
||||||
"required-tools": "Eines necessàries"
|
"required-tools": "Eines necessàries",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Administrador/a",
|
"admin": "Administrador/a",
|
||||||
@ -890,7 +899,7 @@
|
|||||||
"enable-advanced-features": "Enable advanced features",
|
"enable-advanced-features": "Enable advanced features",
|
||||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
||||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!",
|
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!",
|
||||||
"forgot-password": "Forgot Password",
|
"forgot-password": "Contrasenya oblidada",
|
||||||
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
|
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
|
||||||
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
|
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
|
||||||
},
|
},
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Requereix totes les etiquetes",
|
"require-all-tags": "Requereix totes les etiquetes",
|
||||||
"require-all-tools": "Requereix tots els utensilis",
|
"require-all-tools": "Requereix tots els utensilis",
|
||||||
"cookbook-name": "Nom del receptari",
|
"cookbook-name": "Nom del receptari",
|
||||||
"cookbook-with-name": "Receptari {0}"
|
"cookbook-with-name": "Receptari {0}",
|
||||||
|
"create-a-cookbook": "Create a Cookbook",
|
||||||
|
"cookbook": "Cookbook"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@
|
|||||||
"test-message-sent": "Testovací zpráva odeslána",
|
"test-message-sent": "Testovací zpráva odeslána",
|
||||||
"new-notification": "Nové oznámení",
|
"new-notification": "Nové oznámení",
|
||||||
"event-notifiers": "Notifikace událostí",
|
"event-notifiers": "Notifikace událostí",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (skipped if blank)",
|
"apprise-url-skipped-if-blank": "Apprise URL (přeskočeno pokud je prázdné)",
|
||||||
"enable-notifier": "Povolit notifikaci",
|
"enable-notifier": "Povolit notifikaci",
|
||||||
"what-events": "What events should this notifier subscribe to?",
|
"what-events": "What events should this notifier subscribe to?",
|
||||||
"user-events": "Uživatelské události",
|
"user-events": "Uživatelské události",
|
||||||
@ -114,10 +114,10 @@
|
|||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Klíčové slovo",
|
"keyword": "Klíčové slovo",
|
||||||
"link-copied": "Odkaz zkopírován",
|
"link-copied": "Odkaz zkopírován",
|
||||||
"loading": "Loading",
|
"loading": "Načítá se",
|
||||||
"loading-events": "Načítání událostí",
|
"loading-events": "Načítání událostí",
|
||||||
"loading-recipe": "Loading recipe...",
|
"loading-recipe": "Načítám recept...",
|
||||||
"loading-ocr-data": "Loading OCR data...",
|
"loading-ocr-data": "Načítám OCR data...",
|
||||||
"loading-recipes": "Načítám recepty",
|
"loading-recipes": "Načítám recepty",
|
||||||
"message": "Zpráva",
|
"message": "Zpráva",
|
||||||
"monday": "Pondělí",
|
"monday": "Pondělí",
|
||||||
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "Nahrát soubor",
|
"upload-file": "Nahrát soubor",
|
||||||
"created-on-date": "Vytvořeno dne: {0}",
|
"created-on-date": "Vytvořeno dne: {0}",
|
||||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
||||||
"clipboard-copy-failure": "Failed to copy to the clipboard."
|
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||||
|
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Jste si jisti, že chcete smazat <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Jste si jisti, že chcete smazat <b>{groupName}<b/>?",
|
||||||
@ -243,8 +244,8 @@
|
|||||||
"show-recipe-assets-description": "When enabled the recipe assets will be shown on the recipe if available",
|
"show-recipe-assets-description": "When enabled the recipe assets will be shown on the recipe if available",
|
||||||
"default-to-landscape-view": "Default to landscape view",
|
"default-to-landscape-view": "Default to landscape view",
|
||||||
"default-to-landscape-view-description": "When enabled the recipe header section will be shown in landscape view",
|
"default-to-landscape-view-description": "When enabled the recipe header section will be shown in landscape view",
|
||||||
"disable-users-from-commenting-on-recipes": "Disable users from commenting on recipes",
|
"disable-users-from-commenting-on-recipes": "Zakázat uživatelům komentovat u receptů",
|
||||||
"disable-users-from-commenting-on-recipes-description": "Hides the comment section on the recipe page and disables commenting",
|
"disable-users-from-commenting-on-recipes-description": "Na stránce receptu skryje sekci s komentáři a zakáže komentování",
|
||||||
"disable-organizing-recipe-ingredients-by-units-and-food": "Disable organizing recipe ingredients by units and food",
|
"disable-organizing-recipe-ingredients-by-units-and-food": "Disable organizing recipe ingredients by units and food",
|
||||||
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Hides the Food, Unit, and Amount fields for ingredients and treats ingredients as plain text fields.",
|
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Hides the Food, Unit, and Amount fields for ingredients and treats ingredients as plain text fields.",
|
||||||
"general-preferences": "General Preferences",
|
"general-preferences": "General Preferences",
|
||||||
@ -254,10 +255,11 @@
|
|||||||
"group-management": "Správa skupin",
|
"group-management": "Správa skupin",
|
||||||
"admin-group-management": "Admin Group Management",
|
"admin-group-management": "Admin Group Management",
|
||||||
"admin-group-management-text": "Změny v této skupině budou okamžitě zohledněny.",
|
"admin-group-management-text": "Změny v této skupině budou okamžitě zohledněny.",
|
||||||
"group-id-value": "Group Id: {0}"
|
"group-id-value": "ID skupiny: {0}"
|
||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Vytvořit nový jídelníček",
|
"create-a-new-meal-plan": "Vytvořit nový jídelníček",
|
||||||
|
"update-this-meal-plan": "Update this Meal Plan",
|
||||||
"dinner-this-week": "Večeře na tento týden",
|
"dinner-this-week": "Večeře na tento týden",
|
||||||
"dinner-today": "Dnešní večeře",
|
"dinner-today": "Dnešní večeře",
|
||||||
"dinner-tonight": "DNEŠNÍ VEČEŘE",
|
"dinner-tonight": "DNEŠNÍ VEČEŘE",
|
||||||
@ -307,10 +309,10 @@
|
|||||||
"new-rule": "Nové pravidlo",
|
"new-rule": "Nové pravidlo",
|
||||||
"meal-plan-rules-description": "You can create rules for auto selecting recipes for your meal plans. These rules are used by the server to determine the random pool of recipes to select from when creating meal plans. Note that if rules have the same day/type constraints then the categories of the rules will be merged. In practice, it's unnecessary to create duplicate rules, but it's possible to do so.",
|
"meal-plan-rules-description": "You can create rules for auto selecting recipes for your meal plans. These rules are used by the server to determine the random pool of recipes to select from when creating meal plans. Note that if rules have the same day/type constraints then the categories of the rules will be merged. In practice, it's unnecessary to create duplicate rules, but it's possible to do so.",
|
||||||
"new-rule-description": "When creating a new rule for a meal plan you can restrict the rule to be applicable for a specific day of the week and/or a specific type of meal. To apply a rule to all days or all meal types you can set the rule to \"Any\" which will apply it to all the possible values for the day and/or meal type.",
|
"new-rule-description": "When creating a new rule for a meal plan you can restrict the rule to be applicable for a specific day of the week and/or a specific type of meal. To apply a rule to all days or all meal types you can set the rule to \"Any\" which will apply it to all the possible values for the day and/or meal type.",
|
||||||
"recipe-rules": "Recipe Rules",
|
"recipe-rules": "Pravidla receptu",
|
||||||
"applies-to-all-days": "Použije se na všechny dny",
|
"applies-to-all-days": "Použije se na všechny dny",
|
||||||
"applies-on-days": "Applies on {0}s",
|
"applies-on-days": "Applies on {0}s",
|
||||||
"meal-plan-settings": "Meal Plan Settings"
|
"meal-plan-settings": "Nastavení jídelníčku"
|
||||||
},
|
},
|
||||||
"migration": {
|
"migration": {
|
||||||
"migration-data-removed": "Data z migrace byla smazána",
|
"migration-data-removed": "Data z migrace byla smazána",
|
||||||
@ -335,7 +337,7 @@
|
|||||||
},
|
},
|
||||||
"paprika": {
|
"paprika": {
|
||||||
"description-long": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.",
|
"description-long": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.",
|
||||||
"title": "Paprika Recipe Manager"
|
"title": "Správce receptů Paprika"
|
||||||
},
|
},
|
||||||
"mealie-pre-v1": {
|
"mealie-pre-v1": {
|
||||||
"description-long": "Mealie can import recipes from the Mealie application from a pre v1.0 release. Export your recipes from your old instance, and upload the zip file below. Note that only recipes can be imported from the export.",
|
"description-long": "Mealie can import recipes from the Mealie application from a pre v1.0 release. Export your recipes from your old instance, and upload the zip file below. Note that only recipes can be imported from the export.",
|
||||||
@ -469,12 +471,14 @@
|
|||||||
"date-format-hint-yyyy-mm-dd": "Formát RRRR-MM-DD",
|
"date-format-hint-yyyy-mm-dd": "Formát RRRR-MM-DD",
|
||||||
"add-to-list": "Přidat na seznam",
|
"add-to-list": "Přidat na seznam",
|
||||||
"add-to-plan": "Přidat do jídelníčku",
|
"add-to-plan": "Přidat do jídelníčku",
|
||||||
"add-to-timeline": "Add to Timeline",
|
"add-to-timeline": "Přidat na časovou osu",
|
||||||
"recipe-added-to-list": "Recept byl přidán na seznam",
|
"recipe-added-to-list": "Recept byl přidán na seznam",
|
||||||
"recipes-added-to-list": "Recipes added to list",
|
"recipes-added-to-list": "Recipes added to list",
|
||||||
|
"successfully-added-to-list": "Successfully added to list",
|
||||||
"recipe-added-to-mealplan": "Recept byl přidán do jídelníčku",
|
"recipe-added-to-mealplan": "Recept byl přidán do jídelníčku",
|
||||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||||
"failed-to-add-recipe-to-mealplan": "Přidání receptu do jídelníčku selhalo",
|
"failed-to-add-recipe-to-mealplan": "Přidání receptu do jídelníčku selhalo",
|
||||||
|
"failed-to-add-to-list": "Failed to add to list",
|
||||||
"yield": "Úroda",
|
"yield": "Úroda",
|
||||||
"quantity": "Množství",
|
"quantity": "Množství",
|
||||||
"choose-unit": "Vybrat jednotku",
|
"choose-unit": "Vybrat jednotku",
|
||||||
@ -496,9 +500,9 @@
|
|||||||
"locked": "Uzamčeno",
|
"locked": "Uzamčeno",
|
||||||
"public-link": "Veřejný odkaz",
|
"public-link": "Veřejný odkaz",
|
||||||
"timer": {
|
"timer": {
|
||||||
"kitchen-timer": "Kitchen Timer",
|
"kitchen-timer": "Kuchyňský časovač",
|
||||||
"start-timer": "Start Timer",
|
"start-timer": "Spustit časovač",
|
||||||
"pause-timer": "Pause Timer",
|
"pause-timer": "Pozastavit časovač",
|
||||||
"resume-timer": "Resume Timer",
|
"resume-timer": "Resume Timer",
|
||||||
"stop-timer": "Stop Timer"
|
"stop-timer": "Stop Timer"
|
||||||
},
|
},
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "New recipe names must be unique",
|
"new-recipe-names-must-be-unique": "New recipe names must be unique",
|
||||||
"scrape-recipe": "Scrape Recipe",
|
"scrape-recipe": "Scrape Recipe",
|
||||||
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||||
"import-original-keywords-as-tags": "Import original keywords as tags",
|
"import-original-keywords-as-tags": "Import original keywords as tags",
|
||||||
"stay-in-edit-mode": "Zůstat v režimu úprav",
|
"stay-in-edit-mode": "Zůstat v režimu úprav",
|
||||||
"import-from-zip": "Importovat ze zipu",
|
"import-from-zip": "Importovat ze zipu",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Jednotka",
|
"unit": "Jednotka",
|
||||||
"upload-image": "Nahrát obrázek",
|
"upload-image": "Nahrát obrázek",
|
||||||
"screen-awake": "Keep Screen Awake",
|
"screen-awake": "Keep Screen Awake",
|
||||||
"remove-image": "Remove image"
|
"remove-image": "Remove image",
|
||||||
|
"nextStep": "Další krok"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Pokročilé vyhledávání",
|
"advanced-search": "Pokročilé vyhledávání",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Štítky",
|
"tags": "Štítky",
|
||||||
"untagged-count": "Bez štítku {count}",
|
"untagged-count": "Bez štítku {count}",
|
||||||
"create-a-tag": "Vytvořit štítek",
|
"create-a-tag": "Vytvořit štítek",
|
||||||
"tag-name": "Název štítku"
|
"tag-name": "Název štítku",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Nástroje",
|
"tools": "Nástroje",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Název nástroje",
|
"tool-name": "Název nástroje",
|
||||||
"create-new-tool": "Vytvořit nový nástroj",
|
"create-new-tool": "Vytvořit nový nástroj",
|
||||||
"on-hand-checkbox-label": "Zobrazit jako \"Po ruce\" (zaškrtnuto)",
|
"on-hand-checkbox-label": "Zobrazit jako \"Po ruce\" (zaškrtnuto)",
|
||||||
"required-tools": "Required Tools"
|
"required-tools": "Required Tools",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Správce",
|
"admin": "Správce",
|
||||||
@ -1149,7 +1158,7 @@
|
|||||||
"notifiers-description": "Setup email and push notifications that trigger on specific events.",
|
"notifiers-description": "Setup email and push notifications that trigger on specific events.",
|
||||||
"manage-data": "Spravovat data",
|
"manage-data": "Spravovat data",
|
||||||
"manage-data-description": "Manage your Food and Units (more options coming soon)",
|
"manage-data-description": "Manage your Food and Units (more options coming soon)",
|
||||||
"data-migrations": "Data Migrations",
|
"data-migrations": "Migrace dat",
|
||||||
"data-migrations-description": "Migrate your existing data from other applications like Nextcloud Recipes and Chowdown",
|
"data-migrations-description": "Migrate your existing data from other applications like Nextcloud Recipes and Chowdown",
|
||||||
"email-sent": "E-mail odeslán",
|
"email-sent": "E-mail odeslán",
|
||||||
"error-sending-email": "Nastala chyba při odesílání e-mailu",
|
"error-sending-email": "Nastala chyba při odesílání e-mailu",
|
||||||
@ -1161,10 +1170,10 @@
|
|||||||
"manage-your-api-tokens": "Správa API tokenů",
|
"manage-your-api-tokens": "Správa API tokenů",
|
||||||
"manage-user-profile": "Správa uživatelského profilu",
|
"manage-user-profile": "Správa uživatelského profilu",
|
||||||
"manage-cookbooks": "Správa kuchařek",
|
"manage-cookbooks": "Správa kuchařek",
|
||||||
"manage-members": "Manage Members",
|
"manage-members": "Spravovat členy",
|
||||||
"manage-webhooks": "Manage Webhooks",
|
"manage-webhooks": "Spravovat webhooky",
|
||||||
"manage-notifiers": "Manage Notifiers",
|
"manage-notifiers": "Spravovat oznámení",
|
||||||
"manage-data-migrations": "Manage Data Migrations"
|
"manage-data-migrations": "Spravovat migrace dat"
|
||||||
},
|
},
|
||||||
"cookbook": {
|
"cookbook": {
|
||||||
"cookbooks": "Kuchařky",
|
"cookbooks": "Kuchařky",
|
||||||
@ -1172,11 +1181,13 @@
|
|||||||
"public-cookbook": "Veřejná kuchařka",
|
"public-cookbook": "Veřejná kuchařka",
|
||||||
"public-cookbook-description": "Veřejné kuchařky mohou být sdíleny s neregistrovanými uživateli a budou zobrazeny na stránce vaší skupiny.",
|
"public-cookbook-description": "Veřejné kuchařky mohou být sdíleny s neregistrovanými uživateli a budou zobrazeny na stránce vaší skupiny.",
|
||||||
"filter-options": "Možnosti filtru",
|
"filter-options": "Možnosti filtru",
|
||||||
"filter-options-description": "When require all is selected the cookbook will only include recipes that have all of the items selected. This applies to each subset of selectors and not a cross section of the selected items.",
|
"filter-options-description": "Pokud je vybrána možnost vyžadovat vše, kuchařka bude obsahovat pouze ty recepty, které mají všechny vybrané položky. To platí pro každou podmnožinu výběru, nikoliv pro jejich průnik.",
|
||||||
"require-all-categories": "Require All Categories",
|
"require-all-categories": "Vyžadovat všechny kategorie",
|
||||||
"require-all-tags": "Require All Tags",
|
"require-all-tags": "Vyžadovat všechny štítky",
|
||||||
"require-all-tools": "Require All Tools",
|
"require-all-tools": "Vyžadovat všechny nástroje",
|
||||||
"cookbook-name": "Název kuchařky",
|
"cookbook-name": "Název kuchařky",
|
||||||
"cookbook-with-name": "Kuchařka {0}"
|
"cookbook-with-name": "Kuchařka {0}",
|
||||||
|
"create-a-cookbook": "Create a Cookbook",
|
||||||
|
"cookbook": "Cookbook"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "Upload Fil",
|
"upload-file": "Upload Fil",
|
||||||
"created-on-date": "Oprettet den: {0}",
|
"created-on-date": "Oprettet den: {0}",
|
||||||
"unsaved-changes": "Du har ændringer som ikke er gemt. Vil du gemme før du forlader? Vælg \"Okay\" for at gemme, eller \"Annullér\" for at kassere ændringer.",
|
"unsaved-changes": "Du har ændringer som ikke er gemt. Vil du gemme før du forlader? Vælg \"Okay\" for at gemme, eller \"Annullér\" for at kassere ændringer.",
|
||||||
"clipboard-copy-failure": "Failed to copy to the clipboard."
|
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||||
|
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Er du sikker på, du vil slette <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Er du sikker på, du vil slette <b>{groupName}<b/>?",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Opret en ny madplan",
|
"create-a-new-meal-plan": "Opret en ny madplan",
|
||||||
|
"update-this-meal-plan": "Update this Meal Plan",
|
||||||
"dinner-this-week": "Madplan denne uge",
|
"dinner-this-week": "Madplan denne uge",
|
||||||
"dinner-today": "Madplan i dag",
|
"dinner-today": "Madplan i dag",
|
||||||
"dinner-tonight": "AFTENSMAD I AFTEN",
|
"dinner-tonight": "AFTENSMAD I AFTEN",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Tilføj til tidslinje",
|
"add-to-timeline": "Tilføj til tidslinje",
|
||||||
"recipe-added-to-list": "Opskrift tilføjet til listen",
|
"recipe-added-to-list": "Opskrift tilføjet til listen",
|
||||||
"recipes-added-to-list": "Opskrifter tilføjet til listen",
|
"recipes-added-to-list": "Opskrifter tilføjet til listen",
|
||||||
|
"successfully-added-to-list": "Tilføjet til listen",
|
||||||
"recipe-added-to-mealplan": "Opskrift tilføjet til madplanen",
|
"recipe-added-to-mealplan": "Opskrift tilføjet til madplanen",
|
||||||
"failed-to-add-recipes-to-list": "Kunne ikke tilføje opskrift til listen",
|
"failed-to-add-recipes-to-list": "Kunne ikke tilføje opskrift til listen",
|
||||||
"failed-to-add-recipe-to-mealplan": "Kunne ikke tilføje opskrift til madplanen",
|
"failed-to-add-recipe-to-mealplan": "Kunne ikke tilføje opskrift til madplanen",
|
||||||
|
"failed-to-add-to-list": "Kunne ikke tilføje opskrift til listen",
|
||||||
"yield": "Portioner",
|
"yield": "Portioner",
|
||||||
"quantity": "Antal",
|
"quantity": "Antal",
|
||||||
"choose-unit": "Vælg enhed",
|
"choose-unit": "Vælg enhed",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Opskriftsnavnet er allerede i brug",
|
"new-recipe-names-must-be-unique": "Opskriftsnavnet er allerede i brug",
|
||||||
"scrape-recipe": "Scrape Opskrift",
|
"scrape-recipe": "Scrape Opskrift",
|
||||||
"scrape-recipe-description": "Hent en opskrift fra en hjemmeside. Angiv URL'en til den hjemmeside, du vil hente data fra, og Mealie vil forsøge at hente opskriften og tilføje den til din samling.",
|
"scrape-recipe-description": "Hent en opskrift fra en hjemmeside. Angiv URL'en til den hjemmeside, du vil hente data fra, og Mealie vil forsøge at hente opskriften og tilføje den til din samling.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||||
"import-original-keywords-as-tags": "Importér originale nøgleord som mærker",
|
"import-original-keywords-as-tags": "Importér originale nøgleord som mærker",
|
||||||
"stay-in-edit-mode": "Bliv i redigeringstilstand",
|
"stay-in-edit-mode": "Bliv i redigeringstilstand",
|
||||||
"import-from-zip": "Importer fra zip-fil",
|
"import-from-zip": "Importer fra zip-fil",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Enhed",
|
"unit": "Enhed",
|
||||||
"upload-image": "Upload billede",
|
"upload-image": "Upload billede",
|
||||||
"screen-awake": "Hold skærmen tændt",
|
"screen-awake": "Hold skærmen tændt",
|
||||||
"remove-image": "Fjern billede"
|
"remove-image": "Fjern billede",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Avanceret søgning",
|
"advanced-search": "Avanceret søgning",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Tags",
|
"tags": "Tags",
|
||||||
"untagged-count": "Ikke-tagget: {count}",
|
"untagged-count": "Ikke-tagget: {count}",
|
||||||
"create-a-tag": "Opret tag",
|
"create-a-tag": "Opret tag",
|
||||||
"tag-name": "Tag navn"
|
"tag-name": "Tag navn",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Værktøjer",
|
"tools": "Værktøjer",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Værktøjsnavn",
|
"tool-name": "Værktøjsnavn",
|
||||||
"create-new-tool": "Opret et nyt værktøj",
|
"create-new-tool": "Opret et nyt værktøj",
|
||||||
"on-hand-checkbox-label": "Vis som \"Har allerede\" (afkrydset)",
|
"on-hand-checkbox-label": "Vis som \"Har allerede\" (afkrydset)",
|
||||||
"required-tools": "Nødvendige Værktøjer"
|
"required-tools": "Nødvendige Værktøjer",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Administrator",
|
"admin": "Administrator",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Kræv Alle Mærker",
|
"require-all-tags": "Kræv Alle Mærker",
|
||||||
"require-all-tools": "Kræv Alle Værktøjer",
|
"require-all-tools": "Kræv Alle Værktøjer",
|
||||||
"cookbook-name": "Navn på kogebog",
|
"cookbook-name": "Navn på kogebog",
|
||||||
"cookbook-with-name": "Kogebog {0}"
|
"cookbook-with-name": "Kogebog {0}",
|
||||||
|
"create-a-cookbook": "Opret en ny kogebog",
|
||||||
|
"cookbook": "Kogebog"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "Datei hochladen",
|
"upload-file": "Datei hochladen",
|
||||||
"created-on-date": "Erstellt am: {0}",
|
"created-on-date": "Erstellt am: {0}",
|
||||||
"unsaved-changes": "Du hast ungespeicherte Änderungen. Möchtest du vor dem Verlassen speichern? OK um zu speichern, Cancel um Änderungen zu verwerfen.",
|
"unsaved-changes": "Du hast ungespeicherte Änderungen. Möchtest du vor dem Verlassen speichern? OK um zu speichern, Cancel um Änderungen zu verwerfen.",
|
||||||
"clipboard-copy-failure": "Fehler beim Kopieren in die Zwischenablage."
|
"clipboard-copy-failure": "Fehler beim Kopieren in die Zwischenablage.",
|
||||||
|
"confirm-delete-generic-items": "Bist du dir sicher, dass du die folgenden Einträge löschen möchtest?"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Bist du dir sicher, dass du die Gruppe <b>{groupName}<b/> löschen möchtest?",
|
"are-you-sure-you-want-to-delete-the-group": "Bist du dir sicher, dass du die Gruppe <b>{groupName}<b/> löschen möchtest?",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Neue Mahlzeit planen",
|
"create-a-new-meal-plan": "Neue Mahlzeit planen",
|
||||||
|
"update-this-meal-plan": "Mahlzeit aktualisieren",
|
||||||
"dinner-this-week": "Essen diese Woche",
|
"dinner-this-week": "Essen diese Woche",
|
||||||
"dinner-today": "Heutiges Essen",
|
"dinner-today": "Heutiges Essen",
|
||||||
"dinner-tonight": "HEUTE GIBT ES",
|
"dinner-tonight": "HEUTE GIBT ES",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Zum Zeitstrahl hinzufügen",
|
"add-to-timeline": "Zum Zeitstrahl hinzufügen",
|
||||||
"recipe-added-to-list": "Rezept wurde zur Einkaufsliste hinzugefügt",
|
"recipe-added-to-list": "Rezept wurde zur Einkaufsliste hinzugefügt",
|
||||||
"recipes-added-to-list": "Rezepte wurden zur Einkaufsliste hinzugefügt",
|
"recipes-added-to-list": "Rezepte wurden zur Einkaufsliste hinzugefügt",
|
||||||
|
"successfully-added-to-list": "Erfolgreich zur Liste hinzugefügt",
|
||||||
"recipe-added-to-mealplan": "Rezept zum Essensplan hinzugefügt",
|
"recipe-added-to-mealplan": "Rezept zum Essensplan hinzugefügt",
|
||||||
"failed-to-add-recipes-to-list": "Fehler beim Hinzufügen des Rezepts zur Einkaufsliste",
|
"failed-to-add-recipes-to-list": "Fehler beim Hinzufügen des Rezepts zur Einkaufsliste",
|
||||||
"failed-to-add-recipe-to-mealplan": "Fehler beim Hinzufügen des Rezepts zum Essensplan",
|
"failed-to-add-recipe-to-mealplan": "Fehler beim Hinzufügen des Rezepts zum Essensplan",
|
||||||
|
"failed-to-add-to-list": "Fehler beim Hinzufügen zur Liste",
|
||||||
"yield": "Portionsangabe",
|
"yield": "Portionsangabe",
|
||||||
"quantity": "Menge",
|
"quantity": "Menge",
|
||||||
"choose-unit": "Einheit wählen",
|
"choose-unit": "Einheit wählen",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Neue Rezeptnamen müssen eindeutig sein",
|
"new-recipe-names-must-be-unique": "Neue Rezeptnamen müssen eindeutig sein",
|
||||||
"scrape-recipe": "Rezept einlesen",
|
"scrape-recipe": "Rezept einlesen",
|
||||||
"scrape-recipe-description": "Importiere ein Rezept mit der URL. Gib die URL für die Seite an, die du importieren möchtest und Mealie wird versuchen, das Rezept von dieser Seite einzulesen und deiner Sammlung hinzuzufügen.",
|
"scrape-recipe-description": "Importiere ein Rezept mit der URL. Gib die URL für die Seite an, die du importieren möchtest und Mealie wird versuchen, das Rezept von dieser Seite einzulesen und deiner Sammlung hinzuzufügen.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Hast Du viele Rezepte, die Du auf einmal einlesen willst?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Probiere den Massenimporter aus",
|
||||||
"import-original-keywords-as-tags": "Importiere ursprüngliche Stichwörter als Schlagwörter",
|
"import-original-keywords-as-tags": "Importiere ursprüngliche Stichwörter als Schlagwörter",
|
||||||
"stay-in-edit-mode": "Im Bearbeitungsmodus bleiben",
|
"stay-in-edit-mode": "Im Bearbeitungsmodus bleiben",
|
||||||
"import-from-zip": "Von Zip importieren",
|
"import-from-zip": "Von Zip importieren",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Maßeinheit",
|
"unit": "Maßeinheit",
|
||||||
"upload-image": "Bild hochladen",
|
"upload-image": "Bild hochladen",
|
||||||
"screen-awake": "Bildschirm nicht abschalten",
|
"screen-awake": "Bildschirm nicht abschalten",
|
||||||
"remove-image": "Bild entfernen"
|
"remove-image": "Bild entfernen",
|
||||||
|
"nextStep": "Nächster Schritt"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Erweiterte Suche",
|
"advanced-search": "Erweiterte Suche",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Schlagworte",
|
"tags": "Schlagworte",
|
||||||
"untagged-count": "{count} ohne Schlagworte",
|
"untagged-count": "{count} ohne Schlagworte",
|
||||||
"create-a-tag": "Ein Schlagwort erstellen",
|
"create-a-tag": "Ein Schlagwort erstellen",
|
||||||
"tag-name": "Name des Schlagworts"
|
"tag-name": "Name des Schlagworts",
|
||||||
|
"tag": "Schlagwort"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Utensilien",
|
"tools": "Utensilien",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Name des Utensils",
|
"tool-name": "Name des Utensils",
|
||||||
"create-new-tool": "Neues Utensil erstellen",
|
"create-new-tool": "Neues Utensil erstellen",
|
||||||
"on-hand-checkbox-label": "Als \"vorhanden\" anzeigen (markiert)",
|
"on-hand-checkbox-label": "Als \"vorhanden\" anzeigen (markiert)",
|
||||||
"required-tools": "Benötigte Utensilien"
|
"required-tools": "Benötigte Utensilien",
|
||||||
|
"tool": "Utensil"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Admin",
|
"admin": "Admin",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Alle Schlagwörter erforderlich",
|
"require-all-tags": "Alle Schlagwörter erforderlich",
|
||||||
"require-all-tools": "Alle Utensilien erforderlich",
|
"require-all-tools": "Alle Utensilien erforderlich",
|
||||||
"cookbook-name": "Kochbuch Name",
|
"cookbook-name": "Kochbuch Name",
|
||||||
"cookbook-with-name": "Kochbuch {0}"
|
"cookbook-with-name": "Kochbuch {0}",
|
||||||
|
"create-a-cookbook": "Ein Kochbuch erstellen",
|
||||||
|
"cookbook": "Kochbuch"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "Μεταφόρτωση αρχείου",
|
"upload-file": "Μεταφόρτωση αρχείου",
|
||||||
"created-on-date": "Δημιουργήθηκε στις: {0}",
|
"created-on-date": "Δημιουργήθηκε στις: {0}",
|
||||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
||||||
"clipboard-copy-failure": "Failed to copy to the clipboard."
|
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||||
|
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό τον ασφαλή σύνδεσμο <b>{groupName}<b/>;",
|
"are-you-sure-you-want-to-delete-the-group": "Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό τον ασφαλή σύνδεσμο <b>{groupName}<b/>;",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Δημιουργία νέου σχεδίου γεύματος",
|
"create-a-new-meal-plan": "Δημιουργία νέου σχεδίου γεύματος",
|
||||||
|
"update-this-meal-plan": "Update this Meal Plan",
|
||||||
"dinner-this-week": "Δείπνο Αυτή Τη Εβδομάδα",
|
"dinner-this-week": "Δείπνο Αυτή Τη Εβδομάδα",
|
||||||
"dinner-today": "Δείπνο Σήμερα",
|
"dinner-today": "Δείπνο Σήμερα",
|
||||||
"dinner-tonight": "ΔΕΙΠΝΟ ΣΗΜΕΡΑ",
|
"dinner-tonight": "ΔΕΙΠΝΟ ΣΗΜΕΡΑ",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Add to Timeline",
|
"add-to-timeline": "Add to Timeline",
|
||||||
"recipe-added-to-list": "Recipe added to list",
|
"recipe-added-to-list": "Recipe added to list",
|
||||||
"recipes-added-to-list": "Recipes added to list",
|
"recipes-added-to-list": "Recipes added to list",
|
||||||
|
"successfully-added-to-list": "Successfully added to list",
|
||||||
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
||||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||||
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
||||||
|
"failed-to-add-to-list": "Failed to add to list",
|
||||||
"yield": "Yield",
|
"yield": "Yield",
|
||||||
"quantity": "Quantity",
|
"quantity": "Quantity",
|
||||||
"choose-unit": "Choose Unit",
|
"choose-unit": "Choose Unit",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "New recipe names must be unique",
|
"new-recipe-names-must-be-unique": "New recipe names must be unique",
|
||||||
"scrape-recipe": "Scrape Recipe",
|
"scrape-recipe": "Scrape Recipe",
|
||||||
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||||
"import-original-keywords-as-tags": "Import original keywords as tags",
|
"import-original-keywords-as-tags": "Import original keywords as tags",
|
||||||
"stay-in-edit-mode": "Stay in Edit mode",
|
"stay-in-edit-mode": "Stay in Edit mode",
|
||||||
"import-from-zip": "Import from Zip",
|
"import-from-zip": "Import from Zip",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Unit",
|
"unit": "Unit",
|
||||||
"upload-image": "Upload image",
|
"upload-image": "Upload image",
|
||||||
"screen-awake": "Keep Screen Awake",
|
"screen-awake": "Keep Screen Awake",
|
||||||
"remove-image": "Remove image"
|
"remove-image": "Remove image",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Σύνθετη Αναζήτηση",
|
"advanced-search": "Σύνθετη Αναζήτηση",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Ετικέτες",
|
"tags": "Ετικέτες",
|
||||||
"untagged-count": "Χωρίς ετικέτα {count}",
|
"untagged-count": "Χωρίς ετικέτα {count}",
|
||||||
"create-a-tag": "Create a Tag",
|
"create-a-tag": "Create a Tag",
|
||||||
"tag-name": "Tag Name"
|
"tag-name": "Tag Name",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Εργαλεία",
|
"tools": "Εργαλεία",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Tool Name",
|
"tool-name": "Tool Name",
|
||||||
"create-new-tool": "Create New Tool",
|
"create-new-tool": "Create New Tool",
|
||||||
"on-hand-checkbox-label": "Show as On Hand (Checked)",
|
"on-hand-checkbox-label": "Show as On Hand (Checked)",
|
||||||
"required-tools": "Required Tools"
|
"required-tools": "Required Tools",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Διαχειριστής",
|
"admin": "Διαχειριστής",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Require All Tags",
|
"require-all-tags": "Require All Tags",
|
||||||
"require-all-tools": "Require All Tools",
|
"require-all-tools": "Require All Tools",
|
||||||
"cookbook-name": "Cookbook Name",
|
"cookbook-name": "Cookbook Name",
|
||||||
"cookbook-with-name": "Cookbook {0}"
|
"cookbook-with-name": "Cookbook {0}",
|
||||||
|
"create-a-cookbook": "Create a Cookbook",
|
||||||
|
"cookbook": "Cookbook"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "Upload File",
|
"upload-file": "Upload File",
|
||||||
"created-on-date": "Created on: {0}",
|
"created-on-date": "Created on: {0}",
|
||||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
||||||
"clipboard-copy-failure": "Failed to copy to the clipboard."
|
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||||
|
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||||
},
|
},
|
||||||
"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": "Are you sure you want to delete <b>{groupName}<b/>?",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Create a New Meal Plan",
|
"create-a-new-meal-plan": "Create a New Meal Plan",
|
||||||
|
"update-this-meal-plan": "Update this Meal Plan",
|
||||||
"dinner-this-week": "Dinner This Week",
|
"dinner-this-week": "Dinner This Week",
|
||||||
"dinner-today": "Dinner Today",
|
"dinner-today": "Dinner Today",
|
||||||
"dinner-tonight": "DINNER TONIGHT",
|
"dinner-tonight": "DINNER TONIGHT",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Add to Timeline",
|
"add-to-timeline": "Add to Timeline",
|
||||||
"recipe-added-to-list": "Recipe added to list",
|
"recipe-added-to-list": "Recipe added to list",
|
||||||
"recipes-added-to-list": "Recipes added to list",
|
"recipes-added-to-list": "Recipes added to list",
|
||||||
|
"successfully-added-to-list": "Successfully added to list",
|
||||||
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
||||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||||
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
||||||
|
"failed-to-add-to-list": "Failed to add to list",
|
||||||
"yield": "Yield",
|
"yield": "Yield",
|
||||||
"quantity": "Quantity",
|
"quantity": "Quantity",
|
||||||
"choose-unit": "Choose Unit",
|
"choose-unit": "Choose Unit",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "New recipe names must be unique",
|
"new-recipe-names-must-be-unique": "New recipe names must be unique",
|
||||||
"scrape-recipe": "Scrape Recipe",
|
"scrape-recipe": "Scrape Recipe",
|
||||||
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||||
"import-original-keywords-as-tags": "Import original keywords as tags",
|
"import-original-keywords-as-tags": "Import original keywords as tags",
|
||||||
"stay-in-edit-mode": "Stay in Edit mode",
|
"stay-in-edit-mode": "Stay in Edit mode",
|
||||||
"import-from-zip": "Import from Zip",
|
"import-from-zip": "Import from Zip",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Unit",
|
"unit": "Unit",
|
||||||
"upload-image": "Upload image",
|
"upload-image": "Upload image",
|
||||||
"screen-awake": "Keep Screen Awake",
|
"screen-awake": "Keep Screen Awake",
|
||||||
"remove-image": "Remove image"
|
"remove-image": "Remove image",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Advanced Search",
|
"advanced-search": "Advanced Search",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Tags",
|
"tags": "Tags",
|
||||||
"untagged-count": "Untagged {count}",
|
"untagged-count": "Untagged {count}",
|
||||||
"create-a-tag": "Create a Tag",
|
"create-a-tag": "Create a Tag",
|
||||||
"tag-name": "Tag Name"
|
"tag-name": "Tag Name",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Tools",
|
"tools": "Tools",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Tool Name",
|
"tool-name": "Tool Name",
|
||||||
"create-new-tool": "Create New Tool",
|
"create-new-tool": "Create New Tool",
|
||||||
"on-hand-checkbox-label": "Show as On Hand (Checked)",
|
"on-hand-checkbox-label": "Show as On Hand (Checked)",
|
||||||
"required-tools": "Required Tools"
|
"required-tools": "Required Tools",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Admin",
|
"admin": "Admin",
|
||||||
@ -881,7 +890,7 @@
|
|||||||
"user-details": "User Details",
|
"user-details": "User Details",
|
||||||
"user-name": "User Name",
|
"user-name": "User Name",
|
||||||
"authentication-method": "Authentication Method",
|
"authentication-method": "Authentication Method",
|
||||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie'",
|
||||||
"permissions": "Permissions",
|
"permissions": "Permissions",
|
||||||
"administrator": "Administrator",
|
"administrator": "Administrator",
|
||||||
"user-can-invite-other-to-group": "User can invite other to group",
|
"user-can-invite-other-to-group": "User can invite other to group",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Require All Tags",
|
"require-all-tags": "Require All Tags",
|
||||||
"require-all-tools": "Require All Tools",
|
"require-all-tools": "Require All Tools",
|
||||||
"cookbook-name": "Cookbook Name",
|
"cookbook-name": "Cookbook Name",
|
||||||
"cookbook-with-name": "Cookbook {0}"
|
"cookbook-with-name": "Cookbook {0}",
|
||||||
|
"create-a-cookbook": "Create a Cookbook",
|
||||||
|
"cookbook": "Cookbook"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "Upload File",
|
"upload-file": "Upload File",
|
||||||
"created-on-date": "Created on: {0}",
|
"created-on-date": "Created on: {0}",
|
||||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
||||||
"clipboard-copy-failure": "Failed to copy to the clipboard."
|
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||||
|
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||||
},
|
},
|
||||||
"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": "Are you sure you want to delete <b>{groupName}<b/>?",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Create a New Meal Plan",
|
"create-a-new-meal-plan": "Create a New Meal Plan",
|
||||||
|
"update-this-meal-plan": "Update this Meal Plan",
|
||||||
"dinner-this-week": "Dinner This Week",
|
"dinner-this-week": "Dinner This Week",
|
||||||
"dinner-today": "Dinner Today",
|
"dinner-today": "Dinner Today",
|
||||||
"dinner-tonight": "DINNER TONIGHT",
|
"dinner-tonight": "DINNER TONIGHT",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Add to Timeline",
|
"add-to-timeline": "Add to Timeline",
|
||||||
"recipe-added-to-list": "Recipe added to list",
|
"recipe-added-to-list": "Recipe added to list",
|
||||||
"recipes-added-to-list": "Recipes added to list",
|
"recipes-added-to-list": "Recipes added to list",
|
||||||
|
"successfully-added-to-list": "Successfully added to list",
|
||||||
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
||||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||||
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
||||||
|
"failed-to-add-to-list": "Failed to add to list",
|
||||||
"yield": "Yield",
|
"yield": "Yield",
|
||||||
"quantity": "Quantity",
|
"quantity": "Quantity",
|
||||||
"choose-unit": "Choose Unit",
|
"choose-unit": "Choose Unit",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "New recipe names must be unique",
|
"new-recipe-names-must-be-unique": "New recipe names must be unique",
|
||||||
"scrape-recipe": "Scrape Recipe",
|
"scrape-recipe": "Scrape Recipe",
|
||||||
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||||
"import-original-keywords-as-tags": "Import original keywords as tags",
|
"import-original-keywords-as-tags": "Import original keywords as tags",
|
||||||
"stay-in-edit-mode": "Stay in Edit mode",
|
"stay-in-edit-mode": "Stay in Edit mode",
|
||||||
"import-from-zip": "Import from Zip",
|
"import-from-zip": "Import from Zip",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Unit",
|
"unit": "Unit",
|
||||||
"upload-image": "Upload image",
|
"upload-image": "Upload image",
|
||||||
"screen-awake": "Keep Screen Awake",
|
"screen-awake": "Keep Screen Awake",
|
||||||
"remove-image": "Remove image"
|
"remove-image": "Remove image",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Advanced Search",
|
"advanced-search": "Advanced Search",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Tags",
|
"tags": "Tags",
|
||||||
"untagged-count": "Untagged {count}",
|
"untagged-count": "Untagged {count}",
|
||||||
"create-a-tag": "Create a Tag",
|
"create-a-tag": "Create a Tag",
|
||||||
"tag-name": "Tag Name"
|
"tag-name": "Tag Name",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Tools",
|
"tools": "Tools",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Tool Name",
|
"tool-name": "Tool Name",
|
||||||
"create-new-tool": "Create New Tool",
|
"create-new-tool": "Create New Tool",
|
||||||
"on-hand-checkbox-label": "Show as On Hand (Checked)",
|
"on-hand-checkbox-label": "Show as On Hand (Checked)",
|
||||||
"required-tools": "Required Tools"
|
"required-tools": "Required Tools",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Admin",
|
"admin": "Admin",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Require All Tags",
|
"require-all-tags": "Require All Tags",
|
||||||
"require-all-tools": "Require All Tools",
|
"require-all-tools": "Require All Tools",
|
||||||
"cookbook-name": "Cookbook Name",
|
"cookbook-name": "Cookbook Name",
|
||||||
"cookbook-with-name": "Cookbook {0}"
|
"cookbook-with-name": "Cookbook {0}",
|
||||||
|
"create-a-cookbook": "Create a Cookbook",
|
||||||
|
"cookbook": "Cookbook"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -77,7 +77,7 @@
|
|||||||
"tag-events": "Eventos de etiqueta",
|
"tag-events": "Eventos de etiqueta",
|
||||||
"category-events": "Eventos de Categoría",
|
"category-events": "Eventos de Categoría",
|
||||||
"when-a-new-user-joins-your-group": "Cuando un nuevo usuario se une a tu grupo",
|
"when-a-new-user-joins-your-group": "Cuando un nuevo usuario se une a tu grupo",
|
||||||
"recipe-events": "Recipe Events"
|
"recipe-events": "Eventos de receta"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"cancel": "Cancelar",
|
"cancel": "Cancelar",
|
||||||
@ -114,10 +114,10 @@
|
|||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Etiqueta",
|
"keyword": "Etiqueta",
|
||||||
"link-copied": "Enlace copiado",
|
"link-copied": "Enlace copiado",
|
||||||
"loading": "Loading",
|
"loading": "Cargando",
|
||||||
"loading-events": "Cargando Eventos",
|
"loading-events": "Cargando Eventos",
|
||||||
"loading-recipe": "Loading recipe...",
|
"loading-recipe": "Cargando receta...",
|
||||||
"loading-ocr-data": "Loading OCR data...",
|
"loading-ocr-data": "Cargando datos OCR...",
|
||||||
"loading-recipes": "Cargando recetas",
|
"loading-recipes": "Cargando recetas",
|
||||||
"message": "Mensaje",
|
"message": "Mensaje",
|
||||||
"monday": "Lunes",
|
"monday": "Lunes",
|
||||||
@ -198,8 +198,9 @@
|
|||||||
"refresh": "Actualizar",
|
"refresh": "Actualizar",
|
||||||
"upload-file": "Subir Archivo",
|
"upload-file": "Subir Archivo",
|
||||||
"created-on-date": "Creado el {0}",
|
"created-on-date": "Creado el {0}",
|
||||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
"unsaved-changes": "Tienes cambios sin guardar. ¿Quieres guardar antes de salir? Aceptar para guardar, Cancelar para descartar cambios.",
|
||||||
"clipboard-copy-failure": "Failed to copy to the clipboard."
|
"clipboard-copy-failure": "No se pudo copiar al portapapeles.",
|
||||||
|
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Por favor, confirma que deseas eliminar <b>{groupName}<b/>",
|
"are-you-sure-you-want-to-delete-the-group": "Por favor, confirma que deseas eliminar <b>{groupName}<b/>",
|
||||||
@ -214,7 +215,7 @@
|
|||||||
"group-id-with-value": "ID del Grupo: {groupID}",
|
"group-id-with-value": "ID del Grupo: {groupID}",
|
||||||
"group-name": "Nombre del Grupo",
|
"group-name": "Nombre del Grupo",
|
||||||
"group-not-found": "Grupo no encontrado",
|
"group-not-found": "Grupo no encontrado",
|
||||||
"group-token": "Group Token",
|
"group-token": "Token del grupo",
|
||||||
"group-with-value": "Grupo: {groupID}",
|
"group-with-value": "Grupo: {groupID}",
|
||||||
"groups": "Grupos",
|
"groups": "Grupos",
|
||||||
"manage-groups": "Administrar grupos",
|
"manage-groups": "Administrar grupos",
|
||||||
@ -250,7 +251,7 @@
|
|||||||
"general-preferences": "Opciones generales",
|
"general-preferences": "Opciones generales",
|
||||||
"group-recipe-preferences": "Preferencias de grupo de las recetas",
|
"group-recipe-preferences": "Preferencias de grupo de las recetas",
|
||||||
"report": "Informe",
|
"report": "Informe",
|
||||||
"report-with-id": "Report ID: {id}",
|
"report-with-id": "ID de informe: {id}",
|
||||||
"group-management": "Administración de grupos",
|
"group-management": "Administración de grupos",
|
||||||
"admin-group-management": "Gestión del grupo administrador",
|
"admin-group-management": "Gestión del grupo administrador",
|
||||||
"admin-group-management-text": "Los cambios en este grupo se reflejarán inmediatamente.",
|
"admin-group-management-text": "Los cambios en este grupo se reflejarán inmediatamente.",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Crear un nuevo menú",
|
"create-a-new-meal-plan": "Crear un nuevo menú",
|
||||||
|
"update-this-meal-plan": "Actualizar este plan de comidas",
|
||||||
"dinner-this-week": "Cena para esta semana",
|
"dinner-this-week": "Cena para esta semana",
|
||||||
"dinner-today": "Cena para hoy",
|
"dinner-today": "Cena para hoy",
|
||||||
"dinner-tonight": "Cena para esta noche",
|
"dinner-tonight": "Cena para esta noche",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Añadir al cronograma",
|
"add-to-timeline": "Añadir al cronograma",
|
||||||
"recipe-added-to-list": "Receta añadida a la lista",
|
"recipe-added-to-list": "Receta añadida a la lista",
|
||||||
"recipes-added-to-list": "Recetas añadidas a la lista",
|
"recipes-added-to-list": "Recetas añadidas a la lista",
|
||||||
|
"successfully-added-to-list": "Añadido correctamente a la lista",
|
||||||
"recipe-added-to-mealplan": "Receta añadida al menú",
|
"recipe-added-to-mealplan": "Receta añadida al menú",
|
||||||
"failed-to-add-recipes-to-list": "Error al añadir las recetas a la lista",
|
"failed-to-add-recipes-to-list": "Error al añadir las recetas a la lista",
|
||||||
"failed-to-add-recipe-to-mealplan": "Error al añadir receta al menú",
|
"failed-to-add-recipe-to-mealplan": "Error al añadir receta al menú",
|
||||||
|
"failed-to-add-to-list": "No se pudo agregar a la lista",
|
||||||
"yield": "Raciones",
|
"yield": "Raciones",
|
||||||
"quantity": "Cantidad",
|
"quantity": "Cantidad",
|
||||||
"choose-unit": "Elija unidad",
|
"choose-unit": "Elija unidad",
|
||||||
@ -511,11 +515,11 @@
|
|||||||
"how-did-it-turn-out": "¿Cómo resultó esto?",
|
"how-did-it-turn-out": "¿Cómo resultó esto?",
|
||||||
"user-made-this": "{user} hizo esto",
|
"user-made-this": "{user} hizo esto",
|
||||||
"last-made-date": "Cocinado por última vez el {date}",
|
"last-made-date": "Cocinado por última vez el {date}",
|
||||||
"api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.",
|
"api-extras-description": "Los extras de las recetas son una característica clave de la API de Mealie. Permiten crear pares json clave/valor personalizados dentro de una receta para acceder desde aplicaciones de terceros. Puede utilizar estas claves para almacenar información, para activar la automatización o mensajes personalizados para transmitir al dispositivo deseado.",
|
||||||
"message-key": "Clave de mensaje",
|
"message-key": "Clave de mensaje",
|
||||||
"parse": "Analizar",
|
"parse": "Analizar",
|
||||||
"attach-images-hint": "Adjuntar imágenes arrastrando y soltando en el editor",
|
"attach-images-hint": "Adjuntar imágenes arrastrando y soltando en el editor",
|
||||||
"drop-image": "Drop image",
|
"drop-image": "Soltar imagen",
|
||||||
"enable-ingredient-amounts-to-use-this-feature": "Habilitar la cantidad de ingredientes para usar esta característica",
|
"enable-ingredient-amounts-to-use-this-feature": "Habilitar la cantidad de ingredientes para usar esta característica",
|
||||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Las recetas con unidades o alimentos definidos no pueden ser analizadas.",
|
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Las recetas con unidades o alimentos definidos no pueden ser analizadas.",
|
||||||
"parse-ingredients": "Analizar ingredientes",
|
"parse-ingredients": "Analizar ingredientes",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "El nombre de la receta debe ser único",
|
"new-recipe-names-must-be-unique": "El nombre de la receta debe ser único",
|
||||||
"scrape-recipe": "Analiza receta",
|
"scrape-recipe": "Analiza receta",
|
||||||
"scrape-recipe-description": "Importa una receta por URL. Proporcione la URL para el sitio que desea importar, y Mealie intentará importar la receta de ese sitio y añadirla a su colección.",
|
"scrape-recipe-description": "Importa una receta por URL. Proporcione la URL para el sitio que desea importar, y Mealie intentará importar la receta de ese sitio y añadirla a su colección.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "¿Tienes muchas recetas que quieres raspar a la vez?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Prueba el importador masivo",
|
||||||
"import-original-keywords-as-tags": "Importar palabras clave originales como etiquetas",
|
"import-original-keywords-as-tags": "Importar palabras clave originales como etiquetas",
|
||||||
"stay-in-edit-mode": "Permanecer en modo edición",
|
"stay-in-edit-mode": "Permanecer en modo edición",
|
||||||
"import-from-zip": "Importar desde zip",
|
"import-from-zip": "Importar desde zip",
|
||||||
@ -541,7 +547,7 @@
|
|||||||
"create-a-recipe-by-uploading-a-scan": "Crea una receta subiendo una escaneada.",
|
"create-a-recipe-by-uploading-a-scan": "Crea una receta subiendo una escaneada.",
|
||||||
"upload-a-png-image-from-a-recipe-book": "Suba una imagen png de un libro de recetas",
|
"upload-a-png-image-from-a-recipe-book": "Suba una imagen png de un libro de recetas",
|
||||||
"recipe-bulk-importer": "Importador masivo de recetas",
|
"recipe-bulk-importer": "Importador masivo de recetas",
|
||||||
"recipe-bulk-importer-description": "The Bulk recipe importer allows you to import multiple recipes at once by queueing the sites on the backend and running the task in the background. This can be useful when initially migrating to Mealie, or when you want to import a large number of recipes.",
|
"recipe-bulk-importer-description": "El importador masivo de recetas te permite importar múltiples recetas a la vez poniendo en cola los sitios en el backend y ejecutando la tarea en segundo plano. Esto puede ser útil al migrar inicialmente a Mealie, o cuando desea importar un gran número de recetas.",
|
||||||
"set-categories-and-tags": "Establecer categorías y etiquetas",
|
"set-categories-and-tags": "Establecer categorías y etiquetas",
|
||||||
"bulk-imports": "Importación masiva",
|
"bulk-imports": "Importación masiva",
|
||||||
"bulk-import-process-has-started": "El proceso de importación masiva se ha iniciado",
|
"bulk-import-process-has-started": "El proceso de importación masiva se ha iniciado",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Unidades",
|
"unit": "Unidades",
|
||||||
"upload-image": "Subir imagen",
|
"upload-image": "Subir imagen",
|
||||||
"screen-awake": "Mantener la pantalla encendida",
|
"screen-awake": "Mantener la pantalla encendida",
|
||||||
"remove-image": "Eliminar imagen"
|
"remove-image": "Eliminar imagen",
|
||||||
|
"nextStep": "Siguiente paso"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Búsqueda avanzada",
|
"advanced-search": "Búsqueda avanzada",
|
||||||
@ -574,16 +581,16 @@
|
|||||||
"search-hint": "Presione '/'",
|
"search-hint": "Presione '/'",
|
||||||
"advanced": "Avanzado",
|
"advanced": "Avanzado",
|
||||||
"auto-search": "Búsqueda automática",
|
"auto-search": "Búsqueda automática",
|
||||||
"no-results": "No results found"
|
"no-results": "No se encontraron resultados"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"add-a-new-theme": "Añadir un nuevo tema",
|
"add-a-new-theme": "Añadir un nuevo tema",
|
||||||
"admin-settings": "Opciones del adminstrador",
|
"admin-settings": "Opciones del adminstrador",
|
||||||
"backup": {
|
"backup": {
|
||||||
"backup-created": "Backup created successfully",
|
"backup-created": "Copia de seguridad creada con éxito",
|
||||||
"backup-created-at-response-export_path": "Copia de seguridad creada en {path}",
|
"backup-created-at-response-export_path": "Copia de seguridad creada en {path}",
|
||||||
"backup-deleted": "Copia de seguridad eliminada",
|
"backup-deleted": "Copia de seguridad eliminada",
|
||||||
"restore-success": "Restore successful",
|
"restore-success": "Restauración exitosa",
|
||||||
"backup-tag": "Etiqueta de la copia de seguridad",
|
"backup-tag": "Etiqueta de la copia de seguridad",
|
||||||
"create-heading": "Crear una copia de seguridad",
|
"create-heading": "Crear una copia de seguridad",
|
||||||
"delete-backup": "Eliminar copia de seguridad",
|
"delete-backup": "Eliminar copia de seguridad",
|
||||||
@ -684,21 +691,21 @@
|
|||||||
"webhooks-caps": "WEBHOOKS",
|
"webhooks-caps": "WEBHOOKS",
|
||||||
"webhooks": "Webhooks",
|
"webhooks": "Webhooks",
|
||||||
"webhook-name": "Nombre del Webhook",
|
"webhook-name": "Nombre del Webhook",
|
||||||
"description": "The webhooks defined below will be executed when a meal is defined for the day. At the scheduled time the webhooks will be sent with the data from the recipe that is scheduled for the day. Note that webhook execution is not exact. The webhooks are executed on a 5 minutes interval so the webhooks will be executed within 5 +/- minutes of the scheduled."
|
"description": "Los webhooks definidos a continuación se ejecutarán cuando una comida esté definida para el día. A la hora prevista se enviarán los webhooks con los datos de la receta programada para el día. Tenga en cuenta que la ejecución de webhook no es exacta. Los webhooks se ejecutan en un intervalo de 5 minutos, por lo que los webhooks se ejecutarán en 5 minutos +/- de los programados."
|
||||||
},
|
},
|
||||||
"bug-report": "Informe de error",
|
"bug-report": "Informe de error",
|
||||||
"bug-report-information": "Utilice esta información para informar de un error. Proporcionar detalles de su instancia a los desarrolladores es la mejor manera de resolver sus problemas rápidamente.",
|
"bug-report-information": "Utilice esta información para informar de un error. Proporcionar detalles de su instancia a los desarrolladores es la mejor manera de resolver sus problemas rápidamente.",
|
||||||
"tracker": "Tracker",
|
"tracker": "Rastreador",
|
||||||
"configuration": "Configuración",
|
"configuration": "Configuración",
|
||||||
"docker-volume": "Volumen de Docker",
|
"docker-volume": "Volumen de Docker",
|
||||||
"docker-volume-help": "Mealie requiere que los contenedores de frontend y backend compartan el mismo volumen o almacenamiento en docker. Esto asegura que el contenedor del frontend pueda acceder adecuadamente a las imágenes y los activos almacenados en el disco.",
|
"docker-volume-help": "Mealie requiere que los contenedores de frontend y backend compartan el mismo volumen o almacenamiento en docker. Esto asegura que el contenedor del frontend pueda acceder adecuadamente a las imágenes y los activos almacenados en el disco.",
|
||||||
"volumes-are-misconfigured": "Volumes are misconfigured.",
|
"volumes-are-misconfigured": "Los volúmenes están mal configurados.",
|
||||||
"volumes-are-configured-correctly": "Los volúmenes se configuran correctamente.",
|
"volumes-are-configured-correctly": "Los volúmenes se configuran correctamente.",
|
||||||
"status-unknown-try-running-a-validation": "Estado desconocido. Intente ejecutar una validación.",
|
"status-unknown-try-running-a-validation": "Estado desconocido. Intente ejecutar una validación.",
|
||||||
"validate": "Validar",
|
"validate": "Validar",
|
||||||
"email-configuration-status": "Estado de la Configuración del Correo Electrónico",
|
"email-configuration-status": "Estado de la Configuración del Correo Electrónico",
|
||||||
"email-configured": "Email Configured",
|
"email-configured": "Email configurado",
|
||||||
"email-test-results": "Email Test Results",
|
"email-test-results": "Resultados de la prueba de email",
|
||||||
"ready": "Listo",
|
"ready": "Listo",
|
||||||
"not-ready": "No Listo - Comprobar variables de ambiente",
|
"not-ready": "No Listo - Comprobar variables de ambiente",
|
||||||
"succeeded": "Logrado",
|
"succeeded": "Logrado",
|
||||||
@ -709,10 +716,10 @@
|
|||||||
"mealie-is-up-to-date": "Mealie está actualizada",
|
"mealie-is-up-to-date": "Mealie está actualizada",
|
||||||
"secure-site": "Sitio Seguro",
|
"secure-site": "Sitio Seguro",
|
||||||
"secure-site-error-text": "Servir a través de local host o seguro con HTTPS. El portapapeles y API adicionales del navegador pueden no funcionar.",
|
"secure-site-error-text": "Servir a través de local host o seguro con HTTPS. El portapapeles y API adicionales del navegador pueden no funcionar.",
|
||||||
"secure-site-success-text": "Site is accessed by localhost or https",
|
"secure-site-success-text": "Se accede al sitio por localhost o https",
|
||||||
"server-side-base-url": "Server Side Base URL",
|
"server-side-base-url": "URL base del servidor",
|
||||||
"server-side-base-url-error-text": "`BASE_URL` is still the default value on API Server. This will cause issues with notifications links generated on the server for emails, etc.",
|
"server-side-base-url-error-text": "`BASE_URL` sigue siendo el valor por defecto en el servidor API. Esto causará problemas con las notificaciones generadas en el servidor de correos electrónicos, etc.",
|
||||||
"server-side-base-url-success-text": "Server Side URL does not match the default",
|
"server-side-base-url-success-text": "La URL del servidor no coincide con la predeterminada",
|
||||||
"ldap-ready": "LDAP Listo",
|
"ldap-ready": "LDAP Listo",
|
||||||
"ldap-ready-error-text": "No todos los valores LDAP están configurados. Esto puede ignorarse si no está usando autenticación LDAP.",
|
"ldap-ready-error-text": "No todos los valores LDAP están configurados. Esto puede ignorarse si no está usando autenticación LDAP.",
|
||||||
"ldap-ready-success-text": "Las variables LDAP requeridas están todas definidas.",
|
"ldap-ready-success-text": "Las variables LDAP requeridas están todas definidas.",
|
||||||
@ -742,7 +749,7 @@
|
|||||||
"reorder-labels": "Reordenar etiquetas",
|
"reorder-labels": "Reordenar etiquetas",
|
||||||
"uncheck-all-items": "Desmarcar todos los elementos",
|
"uncheck-all-items": "Desmarcar todos los elementos",
|
||||||
"check-all-items": "Marcar todos los elementos",
|
"check-all-items": "Marcar todos los elementos",
|
||||||
"linked-recipes-count": "No Linked Recipes|One Linked Recipe|{count} Linked Recipes",
|
"linked-recipes-count": "No hay recetas vinculadas|Una receta vinculada|{count} recetas vinculadas",
|
||||||
"items-checked-count": "Ningún elemento comprobado|Un elemento comprobado|{count} elementos comprobados",
|
"items-checked-count": "Ningún elemento comprobado|Un elemento comprobado|{count} elementos comprobados",
|
||||||
"no-label": "Sin Etiqueta",
|
"no-label": "Sin Etiqueta",
|
||||||
"completed-on": "Completado el {date}"
|
"completed-on": "Completado el {date}"
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Etiquetas",
|
"tags": "Etiquetas",
|
||||||
"untagged-count": "{count} sin etiquetar",
|
"untagged-count": "{count} sin etiquetar",
|
||||||
"create-a-tag": "Crear una etiqueta",
|
"create-a-tag": "Crear una etiqueta",
|
||||||
"tag-name": "Nombre de la etiqueta"
|
"tag-name": "Nombre de la etiqueta",
|
||||||
|
"tag": "Etiqueta"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Utensilios",
|
"tools": "Utensilios",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Nombre del utensilio",
|
"tool-name": "Nombre del utensilio",
|
||||||
"create-new-tool": "Crear nuevo utensilio",
|
"create-new-tool": "Crear nuevo utensilio",
|
||||||
"on-hand-checkbox-label": "Mostrar como disponible (marcado)",
|
"on-hand-checkbox-label": "Mostrar como disponible (marcado)",
|
||||||
"required-tools": "Utensilios necesarios"
|
"required-tools": "Utensilios necesarios",
|
||||||
|
"tool": "Herramienta"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Administrador/a",
|
"admin": "Administrador/a",
|
||||||
@ -833,7 +842,7 @@
|
|||||||
"password-updated": "Contraseña actualizada",
|
"password-updated": "Contraseña actualizada",
|
||||||
"password": "Contraseña",
|
"password": "Contraseña",
|
||||||
"password-strength": "Fortaleza de la contraseña: {strength}",
|
"password-strength": "Fortaleza de la contraseña: {strength}",
|
||||||
"please-enter-password": "Please enter your new password.",
|
"please-enter-password": "Por favor ingrese su nueva contraseña.",
|
||||||
"register": "Registrarse",
|
"register": "Registrarse",
|
||||||
"reset-password": "Restablecer contraseña",
|
"reset-password": "Restablecer contraseña",
|
||||||
"sign-in": "Iniciar sesión",
|
"sign-in": "Iniciar sesión",
|
||||||
@ -854,7 +863,7 @@
|
|||||||
"username": "Usuario",
|
"username": "Usuario",
|
||||||
"users-header": "USUARIOS",
|
"users-header": "USUARIOS",
|
||||||
"users": "Usuarios",
|
"users": "Usuarios",
|
||||||
"user-not-found": "User not found",
|
"user-not-found": "Usuario no encontrado",
|
||||||
"webhook-time": "Tiempo de Webhook",
|
"webhook-time": "Tiempo de Webhook",
|
||||||
"webhooks-enabled": "Webhooks habilitados",
|
"webhooks-enabled": "Webhooks habilitados",
|
||||||
"you-are-not-allowed-to-create-a-user": "No tiene permisos para crear usuarios",
|
"you-are-not-allowed-to-create-a-user": "No tiene permisos para crear usuarios",
|
||||||
@ -877,7 +886,7 @@
|
|||||||
"user-management": "Gestión de Usuarios",
|
"user-management": "Gestión de Usuarios",
|
||||||
"reset-locked-users": "Restablecer usuarios bloqueados",
|
"reset-locked-users": "Restablecer usuarios bloqueados",
|
||||||
"admin-user-creation": "Creación de Usuario Administrador",
|
"admin-user-creation": "Creación de Usuario Administrador",
|
||||||
"admin-user-management": "Admin User Management",
|
"admin-user-management": "Administración de usuario de admin",
|
||||||
"user-details": "Detalles de usuario",
|
"user-details": "Detalles de usuario",
|
||||||
"user-name": "Nombre de usuario",
|
"user-name": "Nombre de usuario",
|
||||||
"authentication-method": "Método de autenticación",
|
"authentication-method": "Método de autenticación",
|
||||||
@ -888,11 +897,11 @@
|
|||||||
"user-can-manage-group": "El usuario puede administrar el grupo",
|
"user-can-manage-group": "El usuario puede administrar el grupo",
|
||||||
"user-can-organize-group-data": "El usuario puede organizar los datos del grupo",
|
"user-can-organize-group-data": "El usuario puede organizar los datos del grupo",
|
||||||
"enable-advanced-features": "Habilitar Características Avanzadas",
|
"enable-advanced-features": "Habilitar Características Avanzadas",
|
||||||
"it-looks-like-this-is-your-first-time-logging-in": "It looks like this is your first time logging in.",
|
"it-looks-like-this-is-your-first-time-logging-in": "Parece que esta es la primera vez que inicias sesión.",
|
||||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Don't want to see this anymore? Be sure to change your email in your user settings!",
|
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "¿No quieres ver esto más? ¡Asegúrate de cambiar tu correo electrónico en tu configuración de usuario!",
|
||||||
"forgot-password": "Forgot Password",
|
"forgot-password": "Olvidé mi contraseña",
|
||||||
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
|
"forgot-password-text": "Por favor, introduce tu correo electrónico y te enviaremos un enlace para restablecer tu contraseña.",
|
||||||
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
|
"changes-reflected-immediately": "Los cambios en este grupo se reflejarán inmediatamente."
|
||||||
},
|
},
|
||||||
"language-dialog": {
|
"language-dialog": {
|
||||||
"translated": "traducido",
|
"translated": "traducido",
|
||||||
@ -919,19 +928,19 @@
|
|||||||
},
|
},
|
||||||
"units": {
|
"units": {
|
||||||
"seed-dialog-text": "Añade a la base de datos unidades comunes basadas en su idioma local.",
|
"seed-dialog-text": "Añade a la base de datos unidades comunes basadas en su idioma local.",
|
||||||
"combine-unit-description": "Combining the selected units will merge the Source Unit and Target Unit into a single unit. The {source-unit-will-be-deleted} and all of the references to the Source Unit will be updated to point to the Target Unit.",
|
"combine-unit-description": "Combinar los alimentos seleccionados fusionará el alimento origen y destinatario en un solo alimento. El alimento {source-unit-will-be-deleted} será eliminado y todas las referencias a él serán actualizadas para apuntar al nuevo alimento.",
|
||||||
"combine-unit": "Unidad de Combinación",
|
"combine-unit": "Unidad de Combinación",
|
||||||
"source-unit": "Source Unit",
|
"source-unit": "Unidad de origen",
|
||||||
"target-unit": "Target Unit",
|
"target-unit": "Unidad de objetivo",
|
||||||
"merging-unit-into-unit": "Merging {0} into {1}",
|
"merging-unit-into-unit": "Combinando {0} con {1}",
|
||||||
"create-unit": "Create Unit",
|
"create-unit": "Crear unidad",
|
||||||
"abbreviation": "Abreviatura",
|
"abbreviation": "Abreviatura",
|
||||||
"plural-abbreviation": "Abreviatura en plural",
|
"plural-abbreviation": "Abreviatura en plural",
|
||||||
"description": "Descripción",
|
"description": "Descripción",
|
||||||
"display-as-fraction": "Display as Fraction",
|
"display-as-fraction": "Mostrar como fracción",
|
||||||
"use-abbreviation": "Usar Abreviaturas",
|
"use-abbreviation": "Usar Abreviaturas",
|
||||||
"edit-unit": "Editar unidad",
|
"edit-unit": "Editar unidad",
|
||||||
"unit-data": "Unit Data",
|
"unit-data": "Datos de la unidad",
|
||||||
"use-abbv": "Usar Abr.",
|
"use-abbv": "Usar Abr.",
|
||||||
"fraction": "Fracción",
|
"fraction": "Fracción",
|
||||||
"example-unit-singular": "ej: Cucharada",
|
"example-unit-singular": "ej: Cucharada",
|
||||||
@ -948,10 +957,10 @@
|
|||||||
"recipes": {
|
"recipes": {
|
||||||
"purge-exports": "Limpiar exportaciones",
|
"purge-exports": "Limpiar exportaciones",
|
||||||
"are-you-sure-you-want-to-delete-all-export-data": "¿Está seguro de que desea eliminar todos sus datos de exportación?",
|
"are-you-sure-you-want-to-delete-all-export-data": "¿Está seguro de que desea eliminar todos sus datos de exportación?",
|
||||||
"confirm-delete-recipes": "Are you sure you want to delete the following recipes? This action cannot be undone.",
|
"confirm-delete-recipes": "¿Estás seguro de que quieres eliminar las siguientes recetas? Esta acción no podrá deshacerse.",
|
||||||
"the-following-recipes-selected-length-will-be-exported": "The following recipes ({0}) will be exported.",
|
"the-following-recipes-selected-length-will-be-exported": "Las siguientes recetas ({0}) serán exportadas.",
|
||||||
"settings-chosen-explanation": "Settings chosen here, excluding the locked option, will be applied to all selected recipes.",
|
"settings-chosen-explanation": "Los ajustes seleccionados aquí, excluyendo la opción bloqueada, se aplicarán a todas las recetas seleccionadas.",
|
||||||
"selected-length-recipe-s-settings-will-be-updated": "{count} recipe(s) settings will be updated.",
|
"selected-length-recipe-s-settings-will-be-updated": "Se actualizarán los ajustes de {count} receta(s).",
|
||||||
"recipe-data": "Datos de la receta",
|
"recipe-data": "Datos de la receta",
|
||||||
"recipe-data-description": "Use this section to manage the data associated with your recipes. You can perform several bulk actions on your recipes including exporting, deleting, tagging, and assigning categories.",
|
"recipe-data-description": "Use this section to manage the data associated with your recipes. You can perform several bulk actions on your recipes including exporting, deleting, tagging, and assigning categories.",
|
||||||
"recipe-columns": "Recipe Columns",
|
"recipe-columns": "Recipe Columns",
|
||||||
@ -1112,14 +1121,14 @@
|
|||||||
"ingredients-natural-language-processor-explanation-2": "It's not perfect, but it yields great results in general and is a good starting point for manually parsing ingredients into individual fields. Alternatively, you can also use the \"Brute\" processor that uses a pattern matching technique to identify ingredients.",
|
"ingredients-natural-language-processor-explanation-2": "It's not perfect, but it yields great results in general and is a good starting point for manually parsing ingredients into individual fields. Alternatively, you can also use the \"Brute\" processor that uses a pattern matching technique to identify ingredients.",
|
||||||
"nlp": "NLP",
|
"nlp": "NLP",
|
||||||
"brute": "Brute",
|
"brute": "Brute",
|
||||||
"show-individual-confidence": "Show individual confidence",
|
"show-individual-confidence": "Mostrar confianza individual",
|
||||||
"ingredient-text": "Ingredient Text",
|
"ingredient-text": "Texto del ingrediente",
|
||||||
"average-confident": "{0} Confident",
|
"average-confident": "{0} Confianza",
|
||||||
"try-an-example": "Try an example",
|
"try-an-example": "Prueba un ejemplo",
|
||||||
"parser": "Procesador",
|
"parser": "Procesador",
|
||||||
"background-tasks": "Tareas en Segundo Plano",
|
"background-tasks": "Tareas en Segundo Plano",
|
||||||
"background-tasks-description": "Here you can view all the running background tasks and their status",
|
"background-tasks-description": "Aquí puedes ver todas las tareas de fondo en ejecución y su estado",
|
||||||
"no-logs-found": "No Logs Found",
|
"no-logs-found": "No se encontraron registros",
|
||||||
"tasks": "Tareas"
|
"tasks": "Tareas"
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
@ -1129,7 +1138,7 @@
|
|||||||
"get-public-link": "Obtener enlace público",
|
"get-public-link": "Obtener enlace público",
|
||||||
"account-summary": "Información de la cuenta",
|
"account-summary": "Información de la cuenta",
|
||||||
"account-summary-description": "Este es un resumen de la información de tu grupo",
|
"account-summary-description": "Este es un resumen de la información de tu grupo",
|
||||||
"group-statistics": "Group Statistics",
|
"group-statistics": "Estadísticas del grupo",
|
||||||
"group-statistics-description": "Your Group Statistics provide some insight how you're using Mealie.",
|
"group-statistics-description": "Your Group Statistics provide some insight how you're using Mealie.",
|
||||||
"storage-capacity": "Capacidad de almacenamiento",
|
"storage-capacity": "Capacidad de almacenamiento",
|
||||||
"storage-capacity-description": "Your storage capacity is a calculation of the images and assets you have uploaded.",
|
"storage-capacity-description": "Your storage capacity is a calculation of the images and assets you have uploaded.",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Requerir todas las etiquetas",
|
"require-all-tags": "Requerir todas las etiquetas",
|
||||||
"require-all-tools": "Requiere todos los utensilios",
|
"require-all-tools": "Requiere todos los utensilios",
|
||||||
"cookbook-name": "Nombre del recetario",
|
"cookbook-name": "Nombre del recetario",
|
||||||
"cookbook-with-name": "Recetario {0}"
|
"cookbook-with-name": "Recetario {0}",
|
||||||
|
"create-a-cookbook": "Create a Cookbook",
|
||||||
|
"cookbook": "Cookbook"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "Tuo tiedosto",
|
"upload-file": "Tuo tiedosto",
|
||||||
"created-on-date": "Luotu {0}",
|
"created-on-date": "Luotu {0}",
|
||||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
||||||
"clipboard-copy-failure": "Failed to copy to the clipboard."
|
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||||
|
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Haluatko varmasti poistaa ryhmän <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Haluatko varmasti poistaa ryhmän <b>{groupName}<b/>?",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Luo uusi ateriasuunnitelma",
|
"create-a-new-meal-plan": "Luo uusi ateriasuunnitelma",
|
||||||
|
"update-this-meal-plan": "Päivitä tämä ateriasuunnitelma",
|
||||||
"dinner-this-week": "Viikon päivällinen",
|
"dinner-this-week": "Viikon päivällinen",
|
||||||
"dinner-today": "Päivällinen tänään",
|
"dinner-today": "Päivällinen tänään",
|
||||||
"dinner-tonight": "PÄIVÄLLINEN TÄNÄÄN",
|
"dinner-tonight": "PÄIVÄLLINEN TÄNÄÄN",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Lisää aikajanalle",
|
"add-to-timeline": "Lisää aikajanalle",
|
||||||
"recipe-added-to-list": "Resepti lisätty listalle",
|
"recipe-added-to-list": "Resepti lisätty listalle",
|
||||||
"recipes-added-to-list": "Recipes added to list",
|
"recipes-added-to-list": "Recipes added to list",
|
||||||
|
"successfully-added-to-list": "Successfully added to list",
|
||||||
"recipe-added-to-mealplan": "Resepti lisätty ateriasuunnitelmaan",
|
"recipe-added-to-mealplan": "Resepti lisätty ateriasuunnitelmaan",
|
||||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||||
"failed-to-add-recipe-to-mealplan": "Reseptiä ei voitu lisätä ateriasuunnitelmaan",
|
"failed-to-add-recipe-to-mealplan": "Reseptiä ei voitu lisätä ateriasuunnitelmaan",
|
||||||
|
"failed-to-add-to-list": "Failed to add to list",
|
||||||
"yield": "Sato",
|
"yield": "Sato",
|
||||||
"quantity": "Määrä",
|
"quantity": "Määrä",
|
||||||
"choose-unit": "Valitse Yksikkö",
|
"choose-unit": "Valitse Yksikkö",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Reseptin nimen on oltava yksilöllinen",
|
"new-recipe-names-must-be-unique": "Reseptin nimen on oltava yksilöllinen",
|
||||||
"scrape-recipe": "Reseptin kaappain",
|
"scrape-recipe": "Reseptin kaappain",
|
||||||
"scrape-recipe-description": "Kaappaa resepti urlin avulla. Anna sen reseptin url-osoite, jonka haluat kaapata, ja Mealie yrittää kaapata reseptin kyseiseltä sivustolta ja lisätä sen kokoelmaasi.",
|
"scrape-recipe-description": "Kaappaa resepti urlin avulla. Anna sen reseptin url-osoite, jonka haluat kaapata, ja Mealie yrittää kaapata reseptin kyseiseltä sivustolta ja lisätä sen kokoelmaasi.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||||
"import-original-keywords-as-tags": "Tuo alkuperäiset avainsanat tunnisteiksi",
|
"import-original-keywords-as-tags": "Tuo alkuperäiset avainsanat tunnisteiksi",
|
||||||
"stay-in-edit-mode": "Pysy muokkaustilassa",
|
"stay-in-edit-mode": "Pysy muokkaustilassa",
|
||||||
"import-from-zip": "Tuo zip-arkistosta",
|
"import-from-zip": "Tuo zip-arkistosta",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Yksikkö",
|
"unit": "Yksikkö",
|
||||||
"upload-image": "Lataa kuva",
|
"upload-image": "Lataa kuva",
|
||||||
"screen-awake": "Pidä näyttö aina päällä",
|
"screen-awake": "Pidä näyttö aina päällä",
|
||||||
"remove-image": "Poista kuva"
|
"remove-image": "Poista kuva",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Tarkennettu haku",
|
"advanced-search": "Tarkennettu haku",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Tunnisteet",
|
"tags": "Tunnisteet",
|
||||||
"untagged-count": "Tunnisteettomat {count}",
|
"untagged-count": "Tunnisteettomat {count}",
|
||||||
"create-a-tag": "Luo tunniste",
|
"create-a-tag": "Luo tunniste",
|
||||||
"tag-name": "Tunnisteen nimi"
|
"tag-name": "Tunnisteen nimi",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Työkalut",
|
"tools": "Työkalut",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Työkalun Nimi",
|
"tool-name": "Työkalun Nimi",
|
||||||
"create-new-tool": "Luo Uusi Työkalu",
|
"create-new-tool": "Luo Uusi Työkalu",
|
||||||
"on-hand-checkbox-label": "Näytä työkalut, jotka omistan jo (valittu)",
|
"on-hand-checkbox-label": "Näytä työkalut, jotka omistan jo (valittu)",
|
||||||
"required-tools": "Tarvittavat Työkalut"
|
"required-tools": "Tarvittavat Työkalut",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Ylläpitäjä",
|
"admin": "Ylläpitäjä",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Vaadi Kaikki Tunnisteet",
|
"require-all-tags": "Vaadi Kaikki Tunnisteet",
|
||||||
"require-all-tools": "Vaadi Kaikki Työkalut",
|
"require-all-tools": "Vaadi Kaikki Työkalut",
|
||||||
"cookbook-name": "Keittokirjan Nimi",
|
"cookbook-name": "Keittokirjan Nimi",
|
||||||
"cookbook-with-name": "Keittokirja {0}"
|
"cookbook-with-name": "Keittokirja {0}",
|
||||||
|
"create-a-cookbook": "Create a Cookbook",
|
||||||
|
"cookbook": "Cookbook"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "Transférer un fichier",
|
"upload-file": "Transférer un fichier",
|
||||||
"created-on-date": "Créé le {0}",
|
"created-on-date": "Créé le {0}",
|
||||||
"unsaved-changes": "Vous avez des modifications non enregistrées. Voulez-vous les enregistrer ? Ok pour enregistrer, annuler pour ignorer les modifications.",
|
"unsaved-changes": "Vous avez des modifications non enregistrées. Voulez-vous les enregistrer ? Ok pour enregistrer, annuler pour ignorer les modifications.",
|
||||||
"clipboard-copy-failure": "Échec de la copie vers le presse-papiers."
|
"clipboard-copy-failure": "Échec de la copie vers le presse-papiers.",
|
||||||
|
"confirm-delete-generic-items": "Êtes-vous sûr de vouloir supprimer les éléments suivants ?"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Êtes-vous certain de vouloir supprimer <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Êtes-vous certain de vouloir supprimer <b>{groupName}<b/>?",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Créer un nouveau menu",
|
"create-a-new-meal-plan": "Créer un nouveau menu",
|
||||||
|
"update-this-meal-plan": "Mettre à jour ce menu",
|
||||||
"dinner-this-week": "Menu de la semaine",
|
"dinner-this-week": "Menu de la semaine",
|
||||||
"dinner-today": "Menu du jour",
|
"dinner-today": "Menu du jour",
|
||||||
"dinner-tonight": "AU MENU CE SOIR",
|
"dinner-tonight": "AU MENU CE SOIR",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Ajouter à l’historique",
|
"add-to-timeline": "Ajouter à l’historique",
|
||||||
"recipe-added-to-list": "Recette ajoutée à la liste",
|
"recipe-added-to-list": "Recette ajoutée à la liste",
|
||||||
"recipes-added-to-list": "Recettes ajoutées à la liste",
|
"recipes-added-to-list": "Recettes ajoutées à la liste",
|
||||||
|
"successfully-added-to-list": "Ajouté à la liste",
|
||||||
"recipe-added-to-mealplan": "Recette ajoutée à la planification des repas",
|
"recipe-added-to-mealplan": "Recette ajoutée à la planification des repas",
|
||||||
"failed-to-add-recipes-to-list": "Impossible d’ajouter la recette à la liste",
|
"failed-to-add-recipes-to-list": "Impossible d’ajouter la recette à la liste",
|
||||||
"failed-to-add-recipe-to-mealplan": "Échec de l'ajout de la recette à la planification des repas",
|
"failed-to-add-recipe-to-mealplan": "Échec de l'ajout de la recette à la planification des repas",
|
||||||
|
"failed-to-add-to-list": "Ajout dans la liste en échec",
|
||||||
"yield": "Rendement",
|
"yield": "Rendement",
|
||||||
"quantity": "Quantité",
|
"quantity": "Quantité",
|
||||||
"choose-unit": "Choisir une unité",
|
"choose-unit": "Choisir une unité",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Les noms de nouvelles recettes doivent être uniques",
|
"new-recipe-names-must-be-unique": "Les noms de nouvelles recettes doivent être uniques",
|
||||||
"scrape-recipe": "Récupérer une recette",
|
"scrape-recipe": "Récupérer une recette",
|
||||||
"scrape-recipe-description": "Récupérer une recette par URL. Fournissez l'URL de la page que vous voulez récupérer, et Mealie essaiera d'en extraire la recette pour l'ajouter à votre collection.",
|
"scrape-recipe-description": "Récupérer une recette par URL. Fournissez l'URL de la page que vous voulez récupérer, et Mealie essaiera d'en extraire la recette pour l'ajouter à votre collection.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Vous avez un tas de recettes à récupérer d’un coup ?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Essayez l’importateur de masse",
|
||||||
"import-original-keywords-as-tags": "Importer les mots-clés d'origine en tant que tags",
|
"import-original-keywords-as-tags": "Importer les mots-clés d'origine en tant que tags",
|
||||||
"stay-in-edit-mode": "Rester en mode édition",
|
"stay-in-edit-mode": "Rester en mode édition",
|
||||||
"import-from-zip": "Importer depuis un zip",
|
"import-from-zip": "Importer depuis un zip",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Unité",
|
"unit": "Unité",
|
||||||
"upload-image": "Ajouter une image",
|
"upload-image": "Ajouter une image",
|
||||||
"screen-awake": "Garder l’écran allumé",
|
"screen-awake": "Garder l’écran allumé",
|
||||||
"remove-image": "Supprimer l’image"
|
"remove-image": "Supprimer l’image",
|
||||||
|
"nextStep": "Étape suivante"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Recherche avancée",
|
"advanced-search": "Recherche avancée",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Mots-clés",
|
"tags": "Mots-clés",
|
||||||
"untagged-count": "{count} sans mot-clés",
|
"untagged-count": "{count} sans mot-clés",
|
||||||
"create-a-tag": "Créer une étiquette",
|
"create-a-tag": "Créer une étiquette",
|
||||||
"tag-name": "Nom d'étiquette"
|
"tag-name": "Nom d'étiquette",
|
||||||
|
"tag": "Étiquette"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Outils",
|
"tools": "Outils",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Nom de l’ustensile",
|
"tool-name": "Nom de l’ustensile",
|
||||||
"create-new-tool": "Créer un nouvel ustensile",
|
"create-new-tool": "Créer un nouvel ustensile",
|
||||||
"on-hand-checkbox-label": "Afficher comme disponible (coché)",
|
"on-hand-checkbox-label": "Afficher comme disponible (coché)",
|
||||||
"required-tools": "Ustensiles nécessaires"
|
"required-tools": "Ustensiles nécessaires",
|
||||||
|
"tool": "Ustensile"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Administrateur",
|
"admin": "Administrateur",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Nécessite tous les mots-clés",
|
"require-all-tags": "Nécessite tous les mots-clés",
|
||||||
"require-all-tools": "Nécessite tous les ustensiles",
|
"require-all-tools": "Nécessite tous les ustensiles",
|
||||||
"cookbook-name": "Nom du livre de recettes",
|
"cookbook-name": "Nom du livre de recettes",
|
||||||
"cookbook-with-name": "Livre de recettes {0}"
|
"cookbook-with-name": "Livre de recettes {0}",
|
||||||
|
"create-a-cookbook": "Créer un nouveau livre de recettes",
|
||||||
|
"cookbook": "Livre de recettes"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "Transférer un fichier",
|
"upload-file": "Transférer un fichier",
|
||||||
"created-on-date": "Créé le {0}",
|
"created-on-date": "Créé le {0}",
|
||||||
"unsaved-changes": "Vous avez des modifications non enregistrées. Voulez-vous enregistrer avant de partir ? OK pour enregistrer, Annuler pour ignorer les modifications.",
|
"unsaved-changes": "Vous avez des modifications non enregistrées. Voulez-vous enregistrer avant de partir ? OK pour enregistrer, Annuler pour ignorer les modifications.",
|
||||||
"clipboard-copy-failure": "Échec de la copie dans le presse-papiers."
|
"clipboard-copy-failure": "Échec de la copie dans le presse-papiers.",
|
||||||
|
"confirm-delete-generic-items": "Êtes-vous sûr de vouloir supprimer les éléments suivants ?"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Voulez-vous vraiment supprimer <b>{groupName}<b/> ?",
|
"are-you-sure-you-want-to-delete-the-group": "Voulez-vous vraiment supprimer <b>{groupName}<b/> ?",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Créer un nouveau menu",
|
"create-a-new-meal-plan": "Créer un nouveau menu",
|
||||||
|
"update-this-meal-plan": "Mettre à jour ce menu",
|
||||||
"dinner-this-week": "Au menu cette semaine",
|
"dinner-this-week": "Au menu cette semaine",
|
||||||
"dinner-today": "Menu du jour",
|
"dinner-today": "Menu du jour",
|
||||||
"dinner-tonight": "AU MENU CE SOIR",
|
"dinner-tonight": "AU MENU CE SOIR",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Ajouter à l’historique",
|
"add-to-timeline": "Ajouter à l’historique",
|
||||||
"recipe-added-to-list": "Recette ajoutée à la liste",
|
"recipe-added-to-list": "Recette ajoutée à la liste",
|
||||||
"recipes-added-to-list": "Recettes ajoutées à la liste",
|
"recipes-added-to-list": "Recettes ajoutées à la liste",
|
||||||
|
"successfully-added-to-list": "Ajouté à la liste",
|
||||||
"recipe-added-to-mealplan": "Recette ajoutée au menu",
|
"recipe-added-to-mealplan": "Recette ajoutée au menu",
|
||||||
"failed-to-add-recipes-to-list": "Impossible d’ajouter la recette à la liste",
|
"failed-to-add-recipes-to-list": "Impossible d’ajouter la recette à la liste",
|
||||||
"failed-to-add-recipe-to-mealplan": "Échec de l’ajout de la recette au menu",
|
"failed-to-add-recipe-to-mealplan": "Échec de l’ajout de la recette au menu",
|
||||||
|
"failed-to-add-to-list": "Ajout dans la liste en échec",
|
||||||
"yield": "Nombre de portions",
|
"yield": "Nombre de portions",
|
||||||
"quantity": "Quantité",
|
"quantity": "Quantité",
|
||||||
"choose-unit": "Choisissez une unité",
|
"choose-unit": "Choisissez une unité",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Les noms de nouvelles recettes doivent être uniques",
|
"new-recipe-names-must-be-unique": "Les noms de nouvelles recettes doivent être uniques",
|
||||||
"scrape-recipe": "Récupérer une recette",
|
"scrape-recipe": "Récupérer une recette",
|
||||||
"scrape-recipe-description": "Récupérer une recette par URL. Fournissez l'URL de la page que vous voulez récupérer, et Mealie essaiera d'en extraire la recette pour l'ajouter à votre collection.",
|
"scrape-recipe-description": "Récupérer une recette par URL. Fournissez l'URL de la page que vous voulez récupérer, et Mealie essaiera d'en extraire la recette pour l'ajouter à votre collection.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Vous avez un tas de recettes à récupérer d’un coup ?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Essayez l’importateur de masse",
|
||||||
"import-original-keywords-as-tags": "Importer les mots-clés d'origine en tant que tags",
|
"import-original-keywords-as-tags": "Importer les mots-clés d'origine en tant que tags",
|
||||||
"stay-in-edit-mode": "Rester en mode édition",
|
"stay-in-edit-mode": "Rester en mode édition",
|
||||||
"import-from-zip": "Importer depuis un zip",
|
"import-from-zip": "Importer depuis un zip",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Unité",
|
"unit": "Unité",
|
||||||
"upload-image": "Envoyer une image",
|
"upload-image": "Envoyer une image",
|
||||||
"screen-awake": "Garder l’écran allumé",
|
"screen-awake": "Garder l’écran allumé",
|
||||||
"remove-image": "Supprimer l’image"
|
"remove-image": "Supprimer l’image",
|
||||||
|
"nextStep": "Étape suivante"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Recherche avancée",
|
"advanced-search": "Recherche avancée",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Mots-clés",
|
"tags": "Mots-clés",
|
||||||
"untagged-count": "{count} sans mot-clés",
|
"untagged-count": "{count} sans mot-clés",
|
||||||
"create-a-tag": "Créer un mot-clé",
|
"create-a-tag": "Créer un mot-clé",
|
||||||
"tag-name": "Mot-clé"
|
"tag-name": "Mot-clé",
|
||||||
|
"tag": "Étiquette"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Ustensiles",
|
"tools": "Ustensiles",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Nom de l’ustensile",
|
"tool-name": "Nom de l’ustensile",
|
||||||
"create-new-tool": "Créer un nouvel ustensile",
|
"create-new-tool": "Créer un nouvel ustensile",
|
||||||
"on-hand-checkbox-label": "Afficher comme disponible (coché)",
|
"on-hand-checkbox-label": "Afficher comme disponible (coché)",
|
||||||
"required-tools": "Ustensiles nécessaires"
|
"required-tools": "Ustensiles nécessaires",
|
||||||
|
"tool": "Ustensile"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Administrateur",
|
"admin": "Administrateur",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Nécessite tous les mots-clés",
|
"require-all-tags": "Nécessite tous les mots-clés",
|
||||||
"require-all-tools": "Nécessite tous les ustensiles",
|
"require-all-tools": "Nécessite tous les ustensiles",
|
||||||
"cookbook-name": "Nom du livre de recettes",
|
"cookbook-name": "Nom du livre de recettes",
|
||||||
"cookbook-with-name": "Livre de recettes {0}"
|
"cookbook-with-name": "Livre de recettes {0}",
|
||||||
|
"create-a-cookbook": "Create a Cookbook",
|
||||||
|
"cookbook": "Cookbook"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,61 +1,61 @@
|
|||||||
{
|
{
|
||||||
"about": {
|
"about": {
|
||||||
"about": "About",
|
"about": "Acerca de",
|
||||||
"about-mealie": "About Mealie",
|
"about-mealie": "Acerca de Mealie",
|
||||||
"api-docs": "API Docs",
|
"api-docs": "Documentación da API",
|
||||||
"api-port": "API Port",
|
"api-port": "Porto da API",
|
||||||
"application-mode": "Application Mode",
|
"application-mode": "Modo da Aplicación",
|
||||||
"database-type": "Database Type",
|
"database-type": "Tipo de base de datos",
|
||||||
"database-url": "Database URL",
|
"database-url": "URL da base de datos",
|
||||||
"default-group": "Default Group",
|
"default-group": "Grupo por defecto",
|
||||||
"demo": "Demo",
|
"demo": "Demostración",
|
||||||
"demo-status": "Demo Status",
|
"demo-status": "Estado da demostración",
|
||||||
"development": "Development",
|
"development": "Desenvolvemento",
|
||||||
"docs": "Docs",
|
"docs": "Documentación",
|
||||||
"download-log": "Download Log",
|
"download-log": "Descargar rexistro",
|
||||||
"download-recipe-json": "Last Scraped JSON",
|
"download-recipe-json": "Último JSON raspado",
|
||||||
"github": "Github",
|
"github": "GitHub",
|
||||||
"log-lines": "Log Lines",
|
"log-lines": "Liñas de rexistro",
|
||||||
"not-demo": "Not Demo",
|
"not-demo": "Non demostración",
|
||||||
"portfolio": "Portfolio",
|
"portfolio": "Portafolio",
|
||||||
"production": "Production",
|
"production": "Produción",
|
||||||
"support": "Support",
|
"support": "Soporte",
|
||||||
"version": "Version",
|
"version": "Versión",
|
||||||
"unknown-version": "unknown",
|
"unknown-version": "descoñecido",
|
||||||
"sponsor": "Sponsor"
|
"sponsor": "Patrocinador"
|
||||||
},
|
},
|
||||||
"asset": {
|
"asset": {
|
||||||
"assets": "Assets",
|
"assets": "Activos",
|
||||||
"code": "Code",
|
"code": "Código",
|
||||||
"file": "File",
|
"file": "Ficheiro",
|
||||||
"image": "Image",
|
"image": "Imaxe",
|
||||||
"new-asset": "New Asset",
|
"new-asset": "Novo documento",
|
||||||
"pdf": "PDF",
|
"pdf": "PDF",
|
||||||
"recipe": "Recipe",
|
"recipe": "Receita",
|
||||||
"show-assets": "Show Assets",
|
"show-assets": "Amosar documentos",
|
||||||
"error-submitting-form": "Error Submitting Form"
|
"error-submitting-form": "Erro ao enviar formulario"
|
||||||
},
|
},
|
||||||
"category": {
|
"category": {
|
||||||
"categories": "Categories",
|
"categories": "Categorías",
|
||||||
"category-created": "Category created",
|
"category-created": "Categoría creada",
|
||||||
"category-creation-failed": "Category creation failed",
|
"category-creation-failed": "Fallou a creación da categoría",
|
||||||
"category-deleted": "Category Deleted",
|
"category-deleted": "Categoría eliminada",
|
||||||
"category-deletion-failed": "Category deletion failed",
|
"category-deletion-failed": "Fallou a eliminación da categoría",
|
||||||
"category-filter": "Category Filter",
|
"category-filter": "Filtro de categoría",
|
||||||
"category-update-failed": "Category update failed",
|
"category-update-failed": "Fallou a actualización da categoría",
|
||||||
"category-updated": "Category updated",
|
"category-updated": "Categoría actualizada",
|
||||||
"uncategorized-count": "Uncategorized {count}",
|
"uncategorized-count": "Sen categorizar {count}",
|
||||||
"create-a-category": "Create a Category",
|
"create-a-category": "Crear unha categoría",
|
||||||
"category-name": "Category Name",
|
"category-name": "Nome da categoría",
|
||||||
"category": "Category"
|
"category": "Categoría"
|
||||||
},
|
},
|
||||||
"events": {
|
"events": {
|
||||||
"apprise-url": "Apprise URL",
|
"apprise-url": "URL de avisos",
|
||||||
"database": "Database",
|
"database": "Base de datos",
|
||||||
"delete-event": "Delete Event",
|
"delete-event": "Eliminar evento",
|
||||||
"event-delete-confirmation": "Are you sure you want to delete this event?",
|
"event-delete-confirmation": "Estás seguro de que queres eliminar este evento?",
|
||||||
"event-deleted": "Event Deleted",
|
"event-deleted": "Evento eliminado",
|
||||||
"event-updated": "Event Updated",
|
"event-updated": "Evento actualizado",
|
||||||
"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!",
|
"new-version": "New version available!",
|
||||||
"notification": "Notification",
|
"notification": "Notification",
|
||||||
@ -108,56 +108,56 @@
|
|||||||
"general": "General",
|
"general": "General",
|
||||||
"get": "Get",
|
"get": "Get",
|
||||||
"home": "Home",
|
"home": "Home",
|
||||||
"image": "Image",
|
"image": "Imaxe",
|
||||||
"image-upload-failed": "Image upload failed",
|
"image-upload-failed": "Fallou a subida da imaxe",
|
||||||
"import": "Import",
|
"import": "Importar",
|
||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Keyword",
|
"keyword": "Palabra chave",
|
||||||
"link-copied": "Link Copied",
|
"link-copied": "Enlace copiado",
|
||||||
"loading": "Loading",
|
"loading": "Cargando",
|
||||||
"loading-events": "Loading Events",
|
"loading-events": "Cargando eventos",
|
||||||
"loading-recipe": "Loading recipe...",
|
"loading-recipe": "Cargando receita...",
|
||||||
"loading-ocr-data": "Loading OCR data...",
|
"loading-ocr-data": "Cargando información de OCR...",
|
||||||
"loading-recipes": "Loading Recipes",
|
"loading-recipes": "Cargando receitas",
|
||||||
"message": "Message",
|
"message": "Mensaxe",
|
||||||
"monday": "Monday",
|
"monday": "Luns",
|
||||||
"name": "Name",
|
"name": "Nome",
|
||||||
"new": "New",
|
"new": "Nova",
|
||||||
"never": "Never",
|
"never": "Nunca",
|
||||||
"no": "No",
|
"no": "Non",
|
||||||
"no-recipe-found": "No Recipe Found",
|
"no-recipe-found": "Non se atopou ningunha receita",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"options": "Options:",
|
"options": "Opcións:",
|
||||||
"plural-name": "Plural Name",
|
"plural-name": "Nome plural",
|
||||||
"print": "Print",
|
"print": "Imprimir",
|
||||||
"print-preferences": "Print Preferences",
|
"print-preferences": "Preferencias de impresión",
|
||||||
"random": "Random",
|
"random": "Ao chou",
|
||||||
"rating": "Rating",
|
"rating": "Puntuación",
|
||||||
"recent": "Recent",
|
"recent": "Recentes",
|
||||||
"recipe": "Recipe",
|
"recipe": "Receita",
|
||||||
"recipes": "Recipes",
|
"recipes": "Receitas",
|
||||||
"rename-object": "Rename {0}",
|
"rename-object": "Renomear {0}",
|
||||||
"reset": "Reset",
|
"reset": "Restablecer",
|
||||||
"saturday": "Saturday",
|
"saturday": "Sábado",
|
||||||
"save": "Save",
|
"save": "Gardar",
|
||||||
"settings": "Settings",
|
"settings": "Axustes",
|
||||||
"share": "Share",
|
"share": "Compartir",
|
||||||
"shuffle": "Shuffle",
|
"shuffle": "Barallar",
|
||||||
"sort": "Sort",
|
"sort": "Ordenar",
|
||||||
"sort-alphabetically": "Alphabetical",
|
"sort-alphabetically": "Alfabético",
|
||||||
"status": "Status",
|
"status": "Estado",
|
||||||
"subject": "Subject",
|
"subject": "Asunto",
|
||||||
"submit": "Submit",
|
"submit": "Enviar",
|
||||||
"success-count": "Success: {count}",
|
"success-count": "Éxito: {count}",
|
||||||
"sunday": "Sunday",
|
"sunday": "Domingo",
|
||||||
"templates": "Templates:",
|
"templates": "Modelos:",
|
||||||
"test": "Test",
|
"test": "Probar",
|
||||||
"themes": "Themes",
|
"themes": "Temas",
|
||||||
"thursday": "Thursday",
|
"thursday": "Xoves",
|
||||||
"token": "Token",
|
"token": "Identificador",
|
||||||
"tuesday": "Tuesday",
|
"tuesday": "Martes",
|
||||||
"type": "Type",
|
"type": "Tipo",
|
||||||
"update": "Update",
|
"update": "Actualizar",
|
||||||
"updated": "Updated",
|
"updated": "Updated",
|
||||||
"upload": "Upload",
|
"upload": "Upload",
|
||||||
"url": "URL",
|
"url": "URL",
|
||||||
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "Upload File",
|
"upload-file": "Upload File",
|
||||||
"created-on-date": "Created on: {0}",
|
"created-on-date": "Created on: {0}",
|
||||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
||||||
"clipboard-copy-failure": "Failed to copy to the clipboard."
|
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||||
|
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||||
},
|
},
|
||||||
"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": "Are you sure you want to delete <b>{groupName}<b/>?",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Create a New Meal Plan",
|
"create-a-new-meal-plan": "Create a New Meal Plan",
|
||||||
|
"update-this-meal-plan": "Update this Meal Plan",
|
||||||
"dinner-this-week": "Dinner This Week",
|
"dinner-this-week": "Dinner This Week",
|
||||||
"dinner-today": "Dinner Today",
|
"dinner-today": "Dinner Today",
|
||||||
"dinner-tonight": "DINNER TONIGHT",
|
"dinner-tonight": "DINNER TONIGHT",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Add to Timeline",
|
"add-to-timeline": "Add to Timeline",
|
||||||
"recipe-added-to-list": "Recipe added to list",
|
"recipe-added-to-list": "Recipe added to list",
|
||||||
"recipes-added-to-list": "Recipes added to list",
|
"recipes-added-to-list": "Recipes added to list",
|
||||||
|
"successfully-added-to-list": "Successfully added to list",
|
||||||
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
||||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||||
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
||||||
|
"failed-to-add-to-list": "Failed to add to list",
|
||||||
"yield": "Yield",
|
"yield": "Yield",
|
||||||
"quantity": "Quantity",
|
"quantity": "Quantity",
|
||||||
"choose-unit": "Choose Unit",
|
"choose-unit": "Choose Unit",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "New recipe names must be unique",
|
"new-recipe-names-must-be-unique": "New recipe names must be unique",
|
||||||
"scrape-recipe": "Scrape Recipe",
|
"scrape-recipe": "Scrape Recipe",
|
||||||
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
"scrape-recipe-description": "Scrape a recipe by url. Provide the url for the site you want to scrape, and Mealie will attempt to scrape the recipe from that site and add it to your collection.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||||
"import-original-keywords-as-tags": "Import original keywords as tags",
|
"import-original-keywords-as-tags": "Import original keywords as tags",
|
||||||
"stay-in-edit-mode": "Stay in Edit mode",
|
"stay-in-edit-mode": "Stay in Edit mode",
|
||||||
"import-from-zip": "Import from Zip",
|
"import-from-zip": "Import from Zip",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Unit",
|
"unit": "Unit",
|
||||||
"upload-image": "Upload image",
|
"upload-image": "Upload image",
|
||||||
"screen-awake": "Keep Screen Awake",
|
"screen-awake": "Keep Screen Awake",
|
||||||
"remove-image": "Remove image"
|
"remove-image": "Remove image",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Advanced Search",
|
"advanced-search": "Advanced Search",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Tags",
|
"tags": "Tags",
|
||||||
"untagged-count": "Untagged {count}",
|
"untagged-count": "Untagged {count}",
|
||||||
"create-a-tag": "Create a Tag",
|
"create-a-tag": "Create a Tag",
|
||||||
"tag-name": "Tag Name"
|
"tag-name": "Tag Name",
|
||||||
|
"tag": "Etiqueta"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Tools",
|
"tools": "Tools",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Tool Name",
|
"tool-name": "Tool Name",
|
||||||
"create-new-tool": "Create New Tool",
|
"create-new-tool": "Create New Tool",
|
||||||
"on-hand-checkbox-label": "Show as On Hand (Checked)",
|
"on-hand-checkbox-label": "Show as On Hand (Checked)",
|
||||||
"required-tools": "Required Tools"
|
"required-tools": "Required Tools",
|
||||||
|
"tool": "Ferramenta"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Admin",
|
"admin": "Admin",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Require All Tags",
|
"require-all-tags": "Require All Tags",
|
||||||
"require-all-tools": "Require All Tools",
|
"require-all-tools": "Require All Tools",
|
||||||
"cookbook-name": "Cookbook Name",
|
"cookbook-name": "Cookbook Name",
|
||||||
"cookbook-with-name": "Cookbook {0}"
|
"cookbook-with-name": "Cookbook {0}",
|
||||||
|
"create-a-cookbook": "Create a Cookbook",
|
||||||
|
"cookbook": "Cookbook"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "העלאת קבצים",
|
"upload-file": "העלאת קבצים",
|
||||||
"created-on-date": "נוצר ב-{0}",
|
"created-on-date": "נוצר ב-{0}",
|
||||||
"unsaved-changes": "יש שינויים שלא נשמרו. לצאת לפני שמירה? אשר לשמירה, בטל למחיקת שינויים.",
|
"unsaved-changes": "יש שינויים שלא נשמרו. לצאת לפני שמירה? אשר לשמירה, בטל למחיקת שינויים.",
|
||||||
"clipboard-copy-failure": "כשלון בהעתקה ללוח ההדבקה."
|
"clipboard-copy-failure": "כשלון בהעתקה ללוח ההדבקה.",
|
||||||
|
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "האם את/ה בטוח/ה שברצונך למחוק את <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "האם את/ה בטוח/ה שברצונך למחוק את <b>{groupName}<b/>?",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "יצירת תכנית ארוחות חדשה",
|
"create-a-new-meal-plan": "יצירת תכנית ארוחות חדשה",
|
||||||
|
"update-this-meal-plan": "Update this Meal Plan",
|
||||||
"dinner-this-week": "ארוחות ערב השבוע",
|
"dinner-this-week": "ארוחות ערב השבוע",
|
||||||
"dinner-today": "ארוחת ערב היום",
|
"dinner-today": "ארוחת ערב היום",
|
||||||
"dinner-tonight": "ארוחת ערב היום",
|
"dinner-tonight": "ארוחת ערב היום",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "הוסף לציר הזמן",
|
"add-to-timeline": "הוסף לציר הזמן",
|
||||||
"recipe-added-to-list": "מתכון נוסף לרשימה",
|
"recipe-added-to-list": "מתכון נוסף לרשימה",
|
||||||
"recipes-added-to-list": "מתכונים הוספו לרשימה",
|
"recipes-added-to-list": "מתכונים הוספו לרשימה",
|
||||||
|
"successfully-added-to-list": "Successfully added to list",
|
||||||
"recipe-added-to-mealplan": "מתכון נוסף לתכנון ארוחות",
|
"recipe-added-to-mealplan": "מתכון נוסף לתכנון ארוחות",
|
||||||
"failed-to-add-recipes-to-list": "כשלון בהוספת מתכון לרשימה",
|
"failed-to-add-recipes-to-list": "כשלון בהוספת מתכון לרשימה",
|
||||||
"failed-to-add-recipe-to-mealplan": "הוספת מתכון לתכנון ארוחות נכשלה",
|
"failed-to-add-recipe-to-mealplan": "הוספת מתכון לתכנון ארוחות נכשלה",
|
||||||
|
"failed-to-add-to-list": "Failed to add to list",
|
||||||
"yield": "תשואה",
|
"yield": "תשואה",
|
||||||
"quantity": "כמות",
|
"quantity": "כמות",
|
||||||
"choose-unit": "בחירת יחידת מידה",
|
"choose-unit": "בחירת יחידת מידה",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "שם מתכון חדש חייב להיות ייחודי",
|
"new-recipe-names-must-be-unique": "שם מתכון חדש חייב להיות ייחודי",
|
||||||
"scrape-recipe": "קריאת מתכון",
|
"scrape-recipe": "קריאת מתכון",
|
||||||
"scrape-recipe-description": "קריאת מתכון בעזרת לינק. ספק את הלינק של האתר שברצונך לקרוא, ומילי תנסה לקרוא את המתכון מהאתר ולהוסיף אותו לאוסף.",
|
"scrape-recipe-description": "קריאת מתכון בעזרת לינק. ספק את הלינק של האתר שברצונך לקרוא, ומילי תנסה לקרוא את המתכון מהאתר ולהוסיף אותו לאוסף.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||||
"import-original-keywords-as-tags": "ייבא שמות מפתח מקוריות כתגיות",
|
"import-original-keywords-as-tags": "ייבא שמות מפתח מקוריות כתגיות",
|
||||||
"stay-in-edit-mode": "השאר במצב עריכה",
|
"stay-in-edit-mode": "השאר במצב עריכה",
|
||||||
"import-from-zip": "ייבא מקובץ",
|
"import-from-zip": "ייבא מקובץ",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "יחידה",
|
"unit": "יחידה",
|
||||||
"upload-image": "העלה תמונה",
|
"upload-image": "העלה תמונה",
|
||||||
"screen-awake": "השאר את המסך פעיל",
|
"screen-awake": "השאר את המסך פעיל",
|
||||||
"remove-image": "האם למחוק את התמונה?"
|
"remove-image": "האם למחוק את התמונה?",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "חיפוש מתקדם",
|
"advanced-search": "חיפוש מתקדם",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "תגיות",
|
"tags": "תגיות",
|
||||||
"untagged-count": "לא מתוייג {count}",
|
"untagged-count": "לא מתוייג {count}",
|
||||||
"create-a-tag": "צור תגית",
|
"create-a-tag": "צור תגית",
|
||||||
"tag-name": "שם תגית"
|
"tag-name": "שם תגית",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "כלים",
|
"tools": "כלים",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "שם כלי",
|
"tool-name": "שם כלי",
|
||||||
"create-new-tool": "יצירת כלי חדש",
|
"create-new-tool": "יצירת כלי חדש",
|
||||||
"on-hand-checkbox-label": "הראה מה יש לי במטבח",
|
"on-hand-checkbox-label": "הראה מה יש לי במטבח",
|
||||||
"required-tools": "צריך כלים"
|
"required-tools": "צריך כלים",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "אדמין",
|
"admin": "אדמין",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "זקוק לכל התגיות",
|
"require-all-tags": "זקוק לכל התגיות",
|
||||||
"require-all-tools": "זקוק לכל הכלים",
|
"require-all-tools": "זקוק לכל הכלים",
|
||||||
"cookbook-name": "שם ספר בישול",
|
"cookbook-name": "שם ספר בישול",
|
||||||
"cookbook-with-name": "ספר בישול {0}"
|
"cookbook-with-name": "ספר בישול {0}",
|
||||||
|
"create-a-cookbook": "Create a Cookbook",
|
||||||
|
"cookbook": "Cookbook"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "Prenesi Datoteku",
|
"upload-file": "Prenesi Datoteku",
|
||||||
"created-on-date": "Kreirano dana: {0}",
|
"created-on-date": "Kreirano dana: {0}",
|
||||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
||||||
"clipboard-copy-failure": "Failed to copy to the clipboard."
|
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||||
|
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Jeste li sigurni da želite izbrisati <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Jeste li sigurni da želite izbrisati <b>{groupName}<b/>?",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Kreirajte Novi Plan Obroka",
|
"create-a-new-meal-plan": "Kreirajte Novi Plan Obroka",
|
||||||
|
"update-this-meal-plan": "Update this Meal Plan",
|
||||||
"dinner-this-week": "Večera Ove Sedmice",
|
"dinner-this-week": "Večera Ove Sedmice",
|
||||||
"dinner-today": "Večera Danas",
|
"dinner-today": "Večera Danas",
|
||||||
"dinner-tonight": "VEČERA NOĆAS",
|
"dinner-tonight": "VEČERA NOĆAS",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Add to Timeline",
|
"add-to-timeline": "Add to Timeline",
|
||||||
"recipe-added-to-list": "Recept je dodan na popis",
|
"recipe-added-to-list": "Recept je dodan na popis",
|
||||||
"recipes-added-to-list": "Recipes added to list",
|
"recipes-added-to-list": "Recipes added to list",
|
||||||
|
"successfully-added-to-list": "Successfully added to list",
|
||||||
"recipe-added-to-mealplan": "Recept je dodan u Plan",
|
"recipe-added-to-mealplan": "Recept je dodan u Plan",
|
||||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||||
"failed-to-add-recipe-to-mealplan": "Nije uspjelo dodavanje recepta u plan obroka",
|
"failed-to-add-recipe-to-mealplan": "Nije uspjelo dodavanje recepta u plan obroka",
|
||||||
|
"failed-to-add-to-list": "Failed to add to list",
|
||||||
"yield": "Konačna Količina",
|
"yield": "Konačna Količina",
|
||||||
"quantity": "Količina",
|
"quantity": "Količina",
|
||||||
"choose-unit": "Odaberi Jedinicu",
|
"choose-unit": "Odaberi Jedinicu",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Naziv novog recepta mora imati jedinstveno ime",
|
"new-recipe-names-must-be-unique": "Naziv novog recepta mora imati jedinstveno ime",
|
||||||
"scrape-recipe": "Prikupi (skraperaj) recept",
|
"scrape-recipe": "Prikupi (skraperaj) recept",
|
||||||
"scrape-recipe-description": "Prikupi (skraperaj) recept putem URL-a. Priložite URL web stranice s koje želite prikupiti recept, a Mealie će pokušati prikupiti recept s te stranice i dodati ga u vašu kolekciju.",
|
"scrape-recipe-description": "Prikupi (skraperaj) recept putem URL-a. Priložite URL web stranice s koje želite prikupiti recept, a Mealie će pokušati prikupiti recept s te stranice i dodati ga u vašu kolekciju.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||||
"import-original-keywords-as-tags": "Uvezi originalne ključne riječi kao oznake",
|
"import-original-keywords-as-tags": "Uvezi originalne ključne riječi kao oznake",
|
||||||
"stay-in-edit-mode": "Ostanite u načinu uređivanja",
|
"stay-in-edit-mode": "Ostanite u načinu uređivanja",
|
||||||
"import-from-zip": "Uvoz iz Zip-a",
|
"import-from-zip": "Uvoz iz Zip-a",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Jedinica",
|
"unit": "Jedinica",
|
||||||
"upload-image": "Učitavanje Slike",
|
"upload-image": "Učitavanje Slike",
|
||||||
"screen-awake": "Keep Screen Awake",
|
"screen-awake": "Keep Screen Awake",
|
||||||
"remove-image": "Remove image"
|
"remove-image": "Remove image",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Napredno Pretraživanje",
|
"advanced-search": "Napredno Pretraživanje",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Oznake",
|
"tags": "Oznake",
|
||||||
"untagged-count": "Neoznačeno {count}",
|
"untagged-count": "Neoznačeno {count}",
|
||||||
"create-a-tag": "Kreiraj Oznaku",
|
"create-a-tag": "Kreiraj Oznaku",
|
||||||
"tag-name": "Naziv Oznake"
|
"tag-name": "Naziv Oznake",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Alati",
|
"tools": "Alati",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Naziv Alata",
|
"tool-name": "Naziv Alata",
|
||||||
"create-new-tool": "Kreiraj Novi Alat",
|
"create-new-tool": "Kreiraj Novi Alat",
|
||||||
"on-hand-checkbox-label": "Prikaži Alat Dostupnim (Označeno)",
|
"on-hand-checkbox-label": "Prikaži Alat Dostupnim (Označeno)",
|
||||||
"required-tools": "Potrebni Alati"
|
"required-tools": "Potrebni Alati",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Administrator",
|
"admin": "Administrator",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Zahtijevaj sve oznake",
|
"require-all-tags": "Zahtijevaj sve oznake",
|
||||||
"require-all-tools": "Zahtijevaj sve Alate",
|
"require-all-tools": "Zahtijevaj sve Alate",
|
||||||
"cookbook-name": "Naziv Zbirke recepata",
|
"cookbook-name": "Naziv Zbirke recepata",
|
||||||
"cookbook-with-name": "ZbirkaRecepata {0}"
|
"cookbook-with-name": "ZbirkaRecepata {0}",
|
||||||
|
"create-a-cookbook": "Create a Cookbook",
|
||||||
|
"cookbook": "Cookbook"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@
|
|||||||
"event-delete-confirmation": "Biztosan törölni szeretné ezt az eseményt?",
|
"event-delete-confirmation": "Biztosan törölni szeretné ezt az eseményt?",
|
||||||
"event-deleted": "Esemény törölve",
|
"event-deleted": "Esemény törölve",
|
||||||
"event-updated": "Esemény Frissítve",
|
"event-updated": "Esemény Frissítve",
|
||||||
"new-notification-form-description": "A Mealie az Apprise könyvtárat használja az értesítésekhez. Számos lehetőséget kínál különbőző értesítési szolgáltatásokhoz. Nézd meg a wiki oldalukon, hogy kell URL-t létrehozni az általad használt szolgáltatáshoz. Az értesítés tipusának kiválasztásával egyéb beállítási lehetőségek jelenhetnek meg.",
|
"new-notification-form-description": "A Mealie az Apprise könyvtárat használja az értesítésekhez. Számos lehetőséget kínál különböző értesítési szolgáltatásokhoz. Nézd meg a wiki oldalukon, hogy kell URL-t létrehozni az általad használt szolgáltatáshoz. Az értesítés típusának kiválasztásával egyéb beállítási lehetőségek jelenhetnek meg.",
|
||||||
"new-version": "Új verzió elérhető!",
|
"new-version": "Új verzió elérhető!",
|
||||||
"notification": "Értesítések",
|
"notification": "Értesítések",
|
||||||
"refresh": "Frissítés",
|
"refresh": "Frissítés",
|
||||||
@ -199,7 +199,8 @@
|
|||||||
"upload-file": "Fájl feltöltése",
|
"upload-file": "Fájl feltöltése",
|
||||||
"created-on-date": "Létrehozva: {0}",
|
"created-on-date": "Létrehozva: {0}",
|
||||||
"unsaved-changes": "El nem mentett módosításai vannak. Szeretné elmenteni, mielőtt kilép? A mentéshez kattintson az Ok, a módosítások elvetéséhez a Mégsem gombra.",
|
"unsaved-changes": "El nem mentett módosításai vannak. Szeretné elmenteni, mielőtt kilép? A mentéshez kattintson az Ok, a módosítások elvetéséhez a Mégsem gombra.",
|
||||||
"clipboard-copy-failure": "Nem sikerült a vágólapra másolás."
|
"clipboard-copy-failure": "Nem sikerült a vágólapra másolás.",
|
||||||
|
"confirm-delete-generic-items": "Are you sure you want to delete the following items?"
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Biztosan törölni szeretnéd ezt: <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Biztosan törölni szeretnéd ezt: <b>{groupName}<b/>?",
|
||||||
@ -258,6 +259,7 @@
|
|||||||
},
|
},
|
||||||
"meal-plan": {
|
"meal-plan": {
|
||||||
"create-a-new-meal-plan": "Menüterv létrehozása",
|
"create-a-new-meal-plan": "Menüterv létrehozása",
|
||||||
|
"update-this-meal-plan": "Frissítsd ezt a Menütervet",
|
||||||
"dinner-this-week": "Vacsora ezen a héten",
|
"dinner-this-week": "Vacsora ezen a héten",
|
||||||
"dinner-today": "Vacsora ma",
|
"dinner-today": "Vacsora ma",
|
||||||
"dinner-tonight": "Vacsora ma",
|
"dinner-tonight": "Vacsora ma",
|
||||||
@ -472,9 +474,11 @@
|
|||||||
"add-to-timeline": "Hozzáadás idővonalhoz",
|
"add-to-timeline": "Hozzáadás idővonalhoz",
|
||||||
"recipe-added-to-list": "Recept hozzáadva listához",
|
"recipe-added-to-list": "Recept hozzáadva listához",
|
||||||
"recipes-added-to-list": "Recept hozzáadva listához",
|
"recipes-added-to-list": "Recept hozzáadva listához",
|
||||||
|
"successfully-added-to-list": "Sikeresen hozzáadva a listához",
|
||||||
"recipe-added-to-mealplan": "Recept hozzáadva menütervhez",
|
"recipe-added-to-mealplan": "Recept hozzáadva menütervhez",
|
||||||
"failed-to-add-recipes-to-list": "Nem sikerült hozzáadni a receptet a listához",
|
"failed-to-add-recipes-to-list": "Nem sikerült hozzáadni a receptet a listához",
|
||||||
"failed-to-add-recipe-to-mealplan": "Nem sikerült hozzáadni a receptet a menütervhez",
|
"failed-to-add-recipe-to-mealplan": "Nem sikerült hozzáadni a receptet a menütervhez",
|
||||||
|
"failed-to-add-to-list": "Nem sikerült hozzáadni a listához",
|
||||||
"yield": "Adag",
|
"yield": "Adag",
|
||||||
"quantity": "Mennyiség",
|
"quantity": "Mennyiség",
|
||||||
"choose-unit": "Válasszon mennyiségi egységet",
|
"choose-unit": "Válasszon mennyiségi egységet",
|
||||||
@ -533,6 +537,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Az új recept nevének egyedinek kell lennie",
|
"new-recipe-names-must-be-unique": "Az új recept nevének egyedinek kell lennie",
|
||||||
"scrape-recipe": "Recept kinyerése",
|
"scrape-recipe": "Recept kinyerése",
|
||||||
"scrape-recipe-description": "Recept (adatok) kinyerése Url alapján. Adja meg a beolvasni kívánt oldal Url-címét, és Mealie megpróbálja beolvasni a receptet az adott oldalról, majd hozzáadja azt gyűjteményéhez.",
|
"scrape-recipe-description": "Recept (adatok) kinyerése Url alapján. Adja meg a beolvasni kívánt oldal Url-címét, és Mealie megpróbálja beolvasni a receptet az adott oldalról, majd hozzáadja azt gyűjteményéhez.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Sok receptje van, amit egyszerre szeretne átvenni?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Próbálja ki a tömeges importálót",
|
||||||
"import-original-keywords-as-tags": "Eredeti kulcsszavak importálása címkeként",
|
"import-original-keywords-as-tags": "Eredeti kulcsszavak importálása címkeként",
|
||||||
"stay-in-edit-mode": "Maradjon Szerkesztés módban",
|
"stay-in-edit-mode": "Maradjon Szerkesztés módban",
|
||||||
"import-from-zip": "Importálás ZIP-ből",
|
"import-from-zip": "Importálás ZIP-ből",
|
||||||
@ -555,7 +561,8 @@
|
|||||||
"unit": "Mennyiségi egység",
|
"unit": "Mennyiségi egység",
|
||||||
"upload-image": "Kép feltöltése",
|
"upload-image": "Kép feltöltése",
|
||||||
"screen-awake": "Képernyő ébren tartása",
|
"screen-awake": "Képernyő ébren tartása",
|
||||||
"remove-image": "Kép etávolítása"
|
"remove-image": "Kép etávolítása",
|
||||||
|
"nextStep": "Következő lépés"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Részletes keresés",
|
"advanced-search": "Részletes keresés",
|
||||||
@ -789,7 +796,8 @@
|
|||||||
"tags": "Címkék",
|
"tags": "Címkék",
|
||||||
"untagged-count": "Címkézetlen {count}",
|
"untagged-count": "Címkézetlen {count}",
|
||||||
"create-a-tag": "Címke létrehozása",
|
"create-a-tag": "Címke létrehozása",
|
||||||
"tag-name": "Címke Neve"
|
"tag-name": "Címke Neve",
|
||||||
|
"tag": "Címke"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Eszközök",
|
"tools": "Eszközök",
|
||||||
@ -798,7 +806,8 @@
|
|||||||
"tool-name": "Eszköz neve",
|
"tool-name": "Eszköz neve",
|
||||||
"create-new-tool": "Új eszköz létrehozása",
|
"create-new-tool": "Új eszköz létrehozása",
|
||||||
"on-hand-checkbox-label": "Készleten lévőnek mutatni (Ellenőrizve)",
|
"on-hand-checkbox-label": "Készleten lévőnek mutatni (Ellenőrizve)",
|
||||||
"required-tools": "Szükséges eszközök"
|
"required-tools": "Szükséges eszközök",
|
||||||
|
"tool": "Eszköz"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Adminisztrátor",
|
"admin": "Adminisztrátor",
|
||||||
@ -1146,7 +1155,7 @@
|
|||||||
"members-description": "Láthatja, hogy kik vannak a csoportjában, és kezelheti az ő jogosultságaikat.",
|
"members-description": "Láthatja, hogy kik vannak a csoportjában, és kezelheti az ő jogosultságaikat.",
|
||||||
"webhooks-description": "Állítson be webhookokat, amelyek azokon a napokon lépnek működésbe, amikorra a menüterveket ütemezte.",
|
"webhooks-description": "Állítson be webhookokat, amelyek azokon a napokon lépnek működésbe, amikorra a menüterveket ütemezte.",
|
||||||
"notifiers": "Értesítések",
|
"notifiers": "Értesítések",
|
||||||
"notifiers-description": "Setup email and push notifications that trigger on specific events.",
|
"notifiers-description": "Állítson be olyan e-mail és push-értesítéseket, amelyek meghatározott események esetén lépnek működésbe.",
|
||||||
"manage-data": "Adatok kezelése",
|
"manage-data": "Adatok kezelése",
|
||||||
"manage-data-description": "Alapanyagainak és mennyiségi egységeinek kezelése (további opciók hamarosan)",
|
"manage-data-description": "Alapanyagainak és mennyiségi egységeinek kezelése (további opciók hamarosan)",
|
||||||
"data-migrations": "Adat migráció",
|
"data-migrations": "Adat migráció",
|
||||||
@ -1177,6 +1186,8 @@
|
|||||||
"require-all-tags": "Minden címke szükséges",
|
"require-all-tags": "Minden címke szükséges",
|
||||||
"require-all-tools": "Minden szükséges eszköz",
|
"require-all-tools": "Minden szükséges eszköz",
|
||||||
"cookbook-name": "Szakácskönyv neve",
|
"cookbook-name": "Szakácskönyv neve",
|
||||||
"cookbook-with-name": "Szakácskönyv {0}"
|
"cookbook-with-name": "Szakácskönyv {0}",
|
||||||
|
"create-a-cookbook": "Szakácskönyv létrehozása",
|
||||||
|
"cookbook": "Szakácskönyv"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|