mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-07-09 03:04:54 -04:00
Merge branch 'mealie-next' into mealie-next
This commit is contained in:
commit
d2188508fc
2
.github/ISSUE_TEMPLATE/bug-report.yaml
vendored
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
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
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}}"
|
2
.github/workflows/partial-backend.yml
vendored
2
.github/workflows/partial-backend.yml
vendored
@ -67,7 +67,7 @@ jobs:
|
|||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get install libsasl2-dev libldap2-dev libssl-dev tesseract-ocr-all
|
sudo apt-get install libsasl2-dev libldap2-dev libssl-dev
|
||||||
poetry install
|
poetry install
|
||||||
poetry add "psycopg2-binary==2.8.6"
|
poetry add "psycopg2-binary==2.8.6"
|
||||||
if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' || 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'
|
||||||
|
41
.github/workflows/stale.yml
vendored
Normal file
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
|
87
.pylintrc
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
|
||||||
|
@ -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.svg?style=flat-square
|
||||||
|
[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
|
||||||
|
@ -7,12 +7,11 @@ 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 Mapped, mapped_column, DeclarativeBase
|
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
|
||||||
from text_unidecode import unidecode
|
from text_unidecode import unidecode
|
||||||
|
|
||||||
import mealie.db.migration_types
|
import mealie.db.migration_types
|
||||||
from alembic import op
|
from alembic import op
|
||||||
|
|
||||||
from mealie.db.models._model_utils import GUID
|
from mealie.db.models._model_utils import GUID
|
||||||
|
|
||||||
# revision identifiers, used by Alembic.
|
# revision identifiers, used by Alembic.
|
||||||
@ -52,30 +51,46 @@ def do_data_migration():
|
|||||||
session = orm.Session(bind=bind)
|
session = orm.Session(bind=bind)
|
||||||
|
|
||||||
recipes = session.execute(select(RecipeModel)).scalars().all()
|
recipes = session.execute(select(RecipeModel)).scalars().all()
|
||||||
ingredients = session.execute(select(RecipeIngredient)).scalars().all()
|
|
||||||
for recipe in recipes:
|
for recipe in recipes:
|
||||||
if recipe.name is not None:
|
if recipe.name is not None:
|
||||||
recipe.name_normalized = unidecode(recipe.name).lower().strip()
|
session.execute(
|
||||||
|
sa.text(
|
||||||
|
f"UPDATE {RecipeModel.__tablename__} SET name_normalized=:name_normalized WHERE id=:id"
|
||||||
|
).bindparams(name_normalized=unidecode(recipe.name).lower().strip(), id=recipe.id)
|
||||||
|
)
|
||||||
|
|
||||||
if recipe.description is not None:
|
if recipe.description is not None:
|
||||||
recipe.description_normalized = unidecode(recipe.description).lower().strip()
|
session.execute(
|
||||||
session.add(recipe)
|
sa.text(
|
||||||
|
f"UPDATE {RecipeModel.__tablename__} SET description_normalized=:description_normalized WHERE id=:id"
|
||||||
|
).bindparams(description_normalized=unidecode(recipe.description).lower().strip(), id=recipe.id)
|
||||||
|
)
|
||||||
|
|
||||||
|
ingredients = session.execute(select(RecipeIngredient)).scalars().all()
|
||||||
for ingredient in ingredients:
|
for ingredient in ingredients:
|
||||||
if ingredient.note is not None:
|
if ingredient.note is not None:
|
||||||
ingredient.note_normalized = unidecode(ingredient.note).lower().strip()
|
session.execute(
|
||||||
|
sa.text(
|
||||||
|
f"UPDATE {RecipeIngredient.__tablename__} SET note_normalized=:note_normalized WHERE id=:id"
|
||||||
|
).bindparams(note_normalized=unidecode(ingredient.note).lower().strip(), id=ingredient.id)
|
||||||
|
)
|
||||||
|
|
||||||
if ingredient.original_text is not None:
|
if ingredient.original_text is not None:
|
||||||
ingredient.original_text_normalized = unidecode(ingredient.original_text).lower().strip()
|
session.execute(
|
||||||
session.add(ingredient)
|
sa.text(
|
||||||
|
f"UPDATE {RecipeIngredient.__tablename__} SET original_text_normalized=:original_text_normalized WHERE id=:id"
|
||||||
|
).bindparams(
|
||||||
|
original_text_normalized=unidecode(ingredient.original_text).lower().strip(), id=ingredient.id
|
||||||
|
)
|
||||||
|
)
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
|
|
||||||
def upgrade():
|
def upgrade():
|
||||||
# ### commands auto generated by Alembic - please adjust! ###
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
|
||||||
# Set column to nullable first, since we do not have values here yet
|
# Set column default first, since we do not have values here yet
|
||||||
op.add_column("recipes", sa.Column("name_normalized", sa.String(), nullable=True))
|
op.add_column("recipes", sa.Column("name_normalized", sa.String(), nullable=False, server_default=""))
|
||||||
op.add_column("recipes", sa.Column("description_normalized", sa.String(), nullable=True))
|
op.add_column("recipes", sa.Column("description_normalized", sa.String(), nullable=True))
|
||||||
op.drop_index("ix_recipes_description", table_name="recipes")
|
op.drop_index("ix_recipes_description", table_name="recipes")
|
||||||
op.drop_index("ix_recipes_name", table_name="recipes")
|
op.drop_index("ix_recipes_name", table_name="recipes")
|
||||||
@ -95,9 +110,9 @@ def upgrade():
|
|||||||
unique=False,
|
unique=False,
|
||||||
)
|
)
|
||||||
do_data_migration()
|
do_data_migration()
|
||||||
# Make recipes.name_normalized not nullable now that column should be filled for all rows
|
# Remove server default now that column should be filled for all rows
|
||||||
with op.batch_alter_table("recipes", schema=None) as batch_op:
|
with op.batch_alter_table("recipes", schema=None) as batch_op:
|
||||||
batch_op.alter_column("name_normalized", nullable=False, existing_type=sa.String())
|
batch_op.alter_column("name_normalized", existing_type=sa.String(), server_default=None)
|
||||||
# ### end Alembic commands ###
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
@ -24,10 +24,10 @@ depends_on = None
|
|||||||
|
|
||||||
def populate_shopping_lists_multi_purpose_labels(shopping_lists_multi_purpose_labels_table: sa.Table, session: Session):
|
def populate_shopping_lists_multi_purpose_labels(shopping_lists_multi_purpose_labels_table: sa.Table, session: Session):
|
||||||
shopping_lists = session.query(ShoppingList).all()
|
shopping_lists = session.query(ShoppingList).all()
|
||||||
labels = session.query(MultiPurposeLabel).all()
|
|
||||||
|
|
||||||
shopping_lists_labels_data: list[dict] = []
|
shopping_lists_labels_data: list[dict] = []
|
||||||
for shopping_list in shopping_lists:
|
for shopping_list in shopping_lists:
|
||||||
|
labels = session.query(MultiPurposeLabel).filter(MultiPurposeLabel.group_id == ShoppingList.group_id).all()
|
||||||
for i, label in enumerate(labels):
|
for i, label in enumerate(labels):
|
||||||
shopping_lists_labels_data.append(
|
shopping_lists_labels_data.append(
|
||||||
{"id": uuid4(), "shopping_list_id": shopping_list.id, "label_id": label.id, "position": i}
|
{"id": uuid4(), "shopping_list_id": shopping_list.id, "label_id": label.id, "position": i}
|
||||||
|
@ -24,17 +24,22 @@ def populate_group_slugs(session: Session):
|
|||||||
seen_slugs: set[str] = set()
|
seen_slugs: set[str] = set()
|
||||||
for group in groups:
|
for group in groups:
|
||||||
original_name = group.name
|
original_name = group.name
|
||||||
|
new_name = original_name
|
||||||
attempts = 0
|
attempts = 0
|
||||||
while True:
|
while True:
|
||||||
slug = slugify(group.name)
|
slug = slugify(new_name)
|
||||||
if slug not in seen_slugs:
|
if slug not in seen_slugs:
|
||||||
break
|
break
|
||||||
|
|
||||||
attempts += 1
|
attempts += 1
|
||||||
group.name = f"{original_name} ({attempts})"
|
new_name = f"{original_name} ({attempts})"
|
||||||
|
|
||||||
seen_slugs.add(slug)
|
seen_slugs.add(slug)
|
||||||
group.slug = slug
|
session.execute(
|
||||||
|
sa.text(f"UPDATE {Group.__tablename__} SET name=:name, slug=:slug WHERE id=:id").bindparams(
|
||||||
|
name=new_name, slug=slug, id=group.id
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
||||||
|
@ -69,9 +69,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(
|
||||||
@ -85,9 +87,11 @@ def _resolve_duplicate_unit(
|
|||||||
for recipe_ingredient in session.query(RecipeIngredientModel).filter_by(unit_id=dupe_unit_id).all():
|
for recipe_ingredient in session.query(RecipeIngredientModel).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(
|
||||||
@ -101,7 +105,9 @@ def _resolve_duplicate_label(
|
|||||||
for ingredient_food in session.query(IngredientFoodModel).filter_by(label_id=dupe_label_id).all():
|
for ingredient_food in session.query(IngredientFoodModel).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 +146,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]):
|
||||||
|
@ -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:
|
||||||
|
74
dev/code-generation/utils/anonymize_backups.py
Normal file
74
dev/code-generation/utils/anonymize_backups.py
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
import json
|
||||||
|
import logging
|
||||||
|
import random
|
||||||
|
import string
|
||||||
|
from datetime import datetime
|
||||||
|
from uuid import UUID
|
||||||
|
|
||||||
|
logger = logging.getLogger("anonymize_backups")
|
||||||
|
|
||||||
|
|
||||||
|
def is_uuid4(value: str):
|
||||||
|
try:
|
||||||
|
UUID(value)
|
||||||
|
return True
|
||||||
|
except ValueError:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def is_iso_datetime(value: str):
|
||||||
|
try:
|
||||||
|
datetime.fromisoformat(value)
|
||||||
|
return True
|
||||||
|
except ValueError:
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def random_string(length=10):
|
||||||
|
return "".join(random.choice(string.ascii_lowercase) for _ in range(length))
|
||||||
|
|
||||||
|
|
||||||
|
def clean_value(value):
|
||||||
|
try:
|
||||||
|
match value:
|
||||||
|
# preserve non-strings
|
||||||
|
case int(value) | float(value):
|
||||||
|
return value
|
||||||
|
case None:
|
||||||
|
return value
|
||||||
|
# preserve UUIDs and datetimes
|
||||||
|
case str(value) if is_uuid4(value) or is_iso_datetime(value):
|
||||||
|
return value
|
||||||
|
# randomize strings
|
||||||
|
case str(value):
|
||||||
|
return random_string()
|
||||||
|
case _:
|
||||||
|
pass
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
logger.exception(e)
|
||||||
|
|
||||||
|
logger.error(f"Failed to anonymize value: {value}")
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def walk_data_and_anonymize(data):
|
||||||
|
for k, v in data.items():
|
||||||
|
if isinstance(v, list):
|
||||||
|
for item in v:
|
||||||
|
walk_data_and_anonymize(item)
|
||||||
|
else:
|
||||||
|
# preserve alembic version number and enums
|
||||||
|
if k in ["auth_method", "version_num"]:
|
||||||
|
continue
|
||||||
|
|
||||||
|
data[k] = clean_value(v)
|
||||||
|
|
||||||
|
|
||||||
|
def anonymize_database_json(input_filepath: str, output_filepath: str):
|
||||||
|
with open(input_filepath) as f:
|
||||||
|
data = json.load(f)
|
||||||
|
|
||||||
|
walk_data_and_anonymize(data)
|
||||||
|
with open(output_filepath, "w") as f:
|
||||||
|
json.dump(data, f)
|
@ -50,7 +50,6 @@ RUN apt-get update \
|
|||||||
build-essential \
|
build-essential \
|
||||||
libpq-dev \
|
libpq-dev \
|
||||||
libwebp-dev \
|
libwebp-dev \
|
||||||
tesseract-ocr-all \
|
|
||||||
# LDAP Dependencies
|
# LDAP Dependencies
|
||||||
libsasl2-dev libldap2-dev libssl-dev \
|
libsasl2-dev libldap2-dev libssl-dev \
|
||||||
gnupg gnupg2 gnupg1 \
|
gnupg gnupg2 gnupg1 \
|
||||||
@ -89,8 +88,8 @@ RUN apt-get update \
|
|||||||
&& apt-get install --no-install-recommends -y \
|
&& apt-get install --no-install-recommends -y \
|
||||||
gosu \
|
gosu \
|
||||||
iproute2 \
|
iproute2 \
|
||||||
tesseract-ocr-all \
|
|
||||||
libldap-common \
|
libldap-common \
|
||||||
|
libldap-2.5 \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
# copying poetry and venv into image
|
# copying poetry and venv into image
|
||||||
@ -139,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"]
|
||||||
|
@ -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
|
||||||
@ -22,7 +19,7 @@ change_user() {
|
|||||||
|
|
||||||
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
|
elif [ "$(id -u)" = $PUID ]; then
|
||||||
echo "
|
echo "
|
||||||
User uid: $PUID
|
User uid: $PUID
|
||||||
User gid: $PGID
|
User gid: $PGID
|
||||||
@ -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/pre-v1-backup-location.png
Normal file
BIN
docs/docs/assets/img/pre-v1-backup-location.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 133 KiB |
@ -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)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
!!! 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!
|
||||||
|
|
||||||
In a lot of ways, Home Assistant is why this project exists! Since Mealie has a robust API it makes it a great fit for interacting with Home Assistant and pulling information into your dashboard.
|
In a lot of ways, Home Assistant is why this project exists! Since Mealie has a robust API it makes it a great fit for interacting with Home Assistant and pulling information into your dashboard.
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
To make the setup of a Reverse Proxy much easier, Linuxserver.io developed [SWAG](https://github.com/linuxserver/docker-swag)
|
To make the setup of a Reverse Proxy much easier, Linuxserver.io developed [SWAG](https://github.com/linuxserver/docker-swag)
|
||||||
SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let's Encrypt™) sets up an Nginx web server and reverse proxy with PHP support and a built-in certbot client that automates free SSL server certificate generation and renewal processes (Let's Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention.
|
SWAG - Secure Web Application Gateway (formerly known as letsencrypt, no relation to Let's Encrypt™) sets up an Nginx web server and reverse proxy with PHP support and a built-in certbot client that automates free SSL server certificate generation and renewal processes (Let's Encrypt and ZeroSSL). It also contains fail2ban for intrusion prevention.
|
||||||
|
|
||||||
## Step 1: Get a domain
|
## Step 1: Get a domain
|
||||||
@ -14,39 +14,38 @@ 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:
|
||||||
swag:
|
swag:
|
||||||
image: ghcr.io/linuxserver/swag
|
image: ghcr.io/linuxserver/swag
|
||||||
container_name: swag
|
container_name: swag
|
||||||
cap_add:
|
cap_add:
|
||||||
- NET_ADMIN
|
- NET_ADMIN
|
||||||
environment:
|
environment:
|
||||||
- PUID=1000
|
- PUID=1000
|
||||||
- PGID=1000
|
- PGID=1000
|
||||||
- TZ=Europe/Brussels
|
- TZ=Europe/Brussels
|
||||||
- URL=<mydomain.duckdns>
|
- URL=<mydomain.duckdns>
|
||||||
- SUBDOMAINS=wildcard
|
- SUBDOMAINS=wildcard
|
||||||
- VALIDATION=duckdns
|
- VALIDATION=duckdns
|
||||||
- CERTPROVIDER= #optional
|
- CERTPROVIDER= #optional
|
||||||
- DNSPLUGIN= #optional
|
- DNSPLUGIN= #optional
|
||||||
- DUCKDNSTOKEN=<duckdnstoken>
|
- DUCKDNSTOKEN=<duckdnstoken>
|
||||||
- EMAIL=<e-mail> #optional
|
- EMAIL=<e-mail> #optional
|
||||||
- ONLY_SUBDOMAINS=false #optional
|
- ONLY_SUBDOMAINS=false #optional
|
||||||
- EXTRA_DOMAINS=<extradomains> #optional
|
- EXTRA_DOMAINS=<extradomains> #optional
|
||||||
- STAGING=false #optional
|
- STAGING=false #optional
|
||||||
volumes:
|
volumes:
|
||||||
- /etc/config/swag:/config
|
- /etc/config/swag:/config
|
||||||
ports:
|
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.
|
||||||
@ -61,26 +60,25 @@ Alternatively, you can create a new file <code>mealie.subdomain.conf</code> in p
|
|||||||
|
|
||||||
!!! example "mealie.subdomain.conf"
|
!!! example "mealie.subdomain.conf"
|
||||||
```yaml
|
```yaml
|
||||||
server {
|
server {
|
||||||
listen 443 ssl http2;
|
listen 443 ssl http2;
|
||||||
listen [::]:443 ssl http2;
|
listen [::]:443 ssl http2;
|
||||||
|
|
||||||
server_name mealie.*;
|
server_name mealie.*;
|
||||||
|
|
||||||
include /config/nginx/ssl.conf;
|
include /config/nginx/ssl.conf;
|
||||||
|
|
||||||
client_max_body_size 0;
|
client_max_body_size 0;
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
include /config/nginx/proxy.conf;
|
include /config/nginx/proxy.conf;
|
||||||
include /config/nginx/resolver.conf;
|
include /config/nginx/resolver.conf;
|
||||||
set $upstream_app mealie-frontend;
|
set $upstream_app mealie-frontend;
|
||||||
set $upstream_port 3000;
|
set $upstream_port 3000;
|
||||||
set $upstream_proto http;
|
set $upstream_proto http;
|
||||||
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Step 4: Port-forward port 443
|
## Step 4: Port-forward port 443
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## How do I enable "smart" ingredient handling?
|
## How do I enable "smart" ingredient handling?
|
||||||
|
|
||||||
You might have noticed that scaling up a recipe or making a shopping list doesn't by default handle the ingredients in a way you might expect. Depending on your settings, scaling up might yield things like `2 1 cup broth` instead of `2 cup broth`. And making shopping lists from reciepes that have shared ingredients can yield multiple lines of the same ingredient. **But** mealie has a mechanism to intelligently handle ingredients and make your day better. How?
|
You might have noticed that scaling up a recipe or making a shopping list doesn't by default handle the ingredients in a way you might expect. Depending on your settings, scaling up might yield things like `2 1 cup broth` instead of `2 cup broth`. And making shopping lists from reciepes that have shared ingredients can yield multiple lines of the same ingredient. **But**, mealie has a mechanism to intelligently handle ingredients and make your day better. How?
|
||||||
### Set up your Foods and Units
|
### Set up your Foods and Units
|
||||||
Do the following just **once**. Doing this applies to your whole group, so be careful.
|
Do the following just **once**. Doing this applies to your whole group, so be careful.
|
||||||
|
|
||||||
@ -26,9 +26,9 @@ Do the following for each recipe you want to intelligently handle ingredients.
|
|||||||
6. Click the Edit button/icon again
|
6. Click the Edit button/icon again
|
||||||
7. Scroll to the ingredients and you should see new fields for Amount, Unit, Food, and Note. The Note in particular will contain the original text of the Recipe.
|
7. Scroll to the ingredients and you should see new fields for Amount, Unit, Food, and Note. The Note in particular will contain the original text of the Recipe.
|
||||||
8. Click `Parse` and you will be taken to the ingredient parsing page.
|
8. Click `Parse` and you will be taken to the ingredient parsing page.
|
||||||
9. Choose your parser. the `Natural Language Parser` works very well, but you can also use the `Brute Parser`.
|
9. Choose your parser. The `Natural Language Parser` works very well, but you can also use the `Brute Parser`.
|
||||||
10. Click `Parse All` and your ingredients should be separated out into Units and Foods based on your seeding in Step 1 above.
|
10. Click `Parse All`, and your ingredients should be separated out into Units and Foods based on your seeding in Step 1 above.
|
||||||
11. For ingredients where the Unit or Food were not found, you can click a button to accept an automatically suggested Food to add to the database. Or manually enter the Unit/Food and hit `Enter` (or click `Create`) to add it to the database
|
11. For ingredients where the Unit or Food was not found, you can click a button to accept an automatically suggested Food to add to the database. Or, manually enter the Unit/Food and hit `Enter` (or click `Create`) to add it to the database
|
||||||
12. When done, click `Save All` and you will be taken back to the recipe. Now the Unit and Food fields of the recipe should be filled out.
|
12. When done, click `Save All` and you will be taken back to the recipe. Now the Unit and Food fields of the recipe should be filled out.
|
||||||
|
|
||||||
Scaling up this recipe or adding it to a Shopping List will now smartly take care of ingredient amounts and duplicate combinations.
|
Scaling up this recipe or adding it to a Shopping List will now smartly take care of ingredient amounts and duplicate combinations.
|
||||||
@ -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?
|
||||||
|
|
||||||
@ -64,9 +57,7 @@ No. Due to limitations from the Javascript Framework, mealie doesn't support ser
|
|||||||
|
|
||||||
## Can I install Mealie without docker?
|
## Can I install Mealie without docker?
|
||||||
|
|
||||||
Yes, you can install Mealie on your local machine. HOWEVER, it is recommended that you don't. Managing non-system versions of python, node, and npm is a pain. Moreover updating and upgrading your system with this configuration is unsupported and will likely require manual interventions. If you insist on installing Mealie on your local machine, you can use the links below to help guide your path.
|
Yes, you can install Mealie on your local machine. HOWEVER, it is recommended that you don't. Managing non-system versions of python, node, and npm is a pain. Moreover, updating and upgrading your system with this configuration is unsupported and will likely require manual interventions.
|
||||||
|
|
||||||
- [Advanced Installation](../installation/advanced/)
|
|
||||||
|
|
||||||
## What is fuzzy search and how do I use it?
|
## What is fuzzy search and how do I use it?
|
||||||
Mealie can use fuzzy search, which is robust to minor typos. For example, searching for "brocolli" will still find your recipe for "broccoli soup". But fuzzy search is only functional on a Postgres database backend. To enable fuzzy search you will need to migrate to Postgres:
|
Mealie can use fuzzy search, which is robust to minor typos. For example, searching for "brocolli" will still find your recipe for "broccoli soup". But fuzzy search is only functional on a Postgres database backend. To enable fuzzy search you will need to migrate to Postgres:
|
||||||
@ -75,9 +66,9 @@ Mealie can use fuzzy search, which is robust to minor typos. For example, search
|
|||||||
2. Set up a [Postgres](./installation/postgres.md) instance of Mealie
|
2. Set up a [Postgres](./installation/postgres.md) instance of Mealie
|
||||||
3. Upload the backup .zip and click to apply it (as as migration)
|
3. Upload the backup .zip and click to apply it (as as migration)
|
||||||
|
|
||||||
## How i can attach an image or video to a Recipe?
|
## How can I attach an image or video to a Recipe?
|
||||||
|
|
||||||
Yes. Mealie's Recipe Steps and other fields support the markdown syntax and therefor supports images and videos. To attach an image to the recipe, you can upload it as an asset and use the provided copy button to generate the html image tag required to render the image. For videos, Mealie provides no way to host videos. You'll need to host your videos with another provider and embed them in your recipe. Generally, the video provider will provide a link to the video and the html tag required to render the video. For example, youtube provides the following link that works inside a step. You can adjust the width and height attributes as necessary to ensure a fit.
|
Mealie's Recipe Steps and other fields support markdown syntax and therefore support images and videos. To attach an image to the recipe, you can upload it as an asset and use the provided copy button to generate the html image tag required to render the image. For videos, Mealie provides no way to host videos. You'll need to host your videos with another provider and embed them in your recipe. Generally, the video provider will provide a link to the video and the html tag required to render the video. For example, YouTube provides the following link that works inside a step. You can adjust the width and height attributes as necessary to ensure a fit.
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<iframe width="560" height="315" src="https://www.youtube.com/embed/nAUwKeO93bY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
<iframe width="560" height="315" src="https://www.youtube.com/embed/nAUwKeO93bY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
|
||||||
@ -85,7 +76,7 @@ Yes. Mealie's Recipe Steps and other fields support the markdown syntax and ther
|
|||||||
|
|
||||||
## How can I unlock my account?
|
## How can I unlock my account?
|
||||||
|
|
||||||
If your account has been locked by bad password attempts, you can use an administrator account to unlock another account. Alternatively you can unlock all account via a scripts within the container.
|
If your account has been locked by bad password attempts, you can use an administrator account to unlock another account. Alternatively, you can unlock all accounts via a script within the container.
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
docker exec -it mealie-next bash
|
docker exec -it mealie-next bash
|
||||||
@ -93,7 +84,7 @@ docker exec -it mealie-next bash
|
|||||||
python /app/mealie/scripts/reset_locked_users.py
|
python /app/mealie/scripts/reset_locked_users.py
|
||||||
```
|
```
|
||||||
|
|
||||||
## How can I change my password
|
## How can I change my password?
|
||||||
|
|
||||||
You can change your password by going to the user profile page and clicking the "Change Password" button. Alternatively you can use the following script to change your password via the CLI if you are locked out of your account.
|
You can change your password by going to the user profile page and clicking the "Change Password" button. Alternatively you can use the following script to change your password via the CLI if you are locked out of your account.
|
||||||
|
|
||||||
@ -107,8 +98,9 @@ python /app/mealie/scripts/change_password.py
|
|||||||
|
|
||||||
Managing private groups and recipes can be confusing. The following diagram and notes should help explain how they work to determine if a recipe can be shared publicly.
|
Managing private groups and recipes can be confusing. The following diagram and notes should help explain how they work to determine if a recipe can be shared publicly.
|
||||||
|
|
||||||
- Private links that are generated using th`Share` button bypass all group and recipe permissions.
|
- Private links that are generated from the recipe page using the `Share` button bypass all group and recipe permissions
|
||||||
- Private groups block all access to recipes, including those that are public. Expect as noted above.
|
- Private groups block all access to recipes, including those that are public, except as noted above.
|
||||||
|
- Groups with "Allow users outside of your group to see your recipes" disabled block all access to recipes, except as noted above.
|
||||||
- Private recipes block all access to the recipe from public links. This does not affect Private Links.
|
- Private recipes block all access to the recipe from public links. This does not affect Private Links.
|
||||||
|
|
||||||
```mermaid
|
```mermaid
|
||||||
@ -132,8 +124,10 @@ stateDiagram-v2
|
|||||||
p3 --> n1: No
|
p3 --> n1: No
|
||||||
```
|
```
|
||||||
|
|
||||||
|
For more information, check out the [Permissions and Public Access guide](./usage/permissions-and-public-access.md).
|
||||||
|
|
||||||
## Can I use fail2ban with mealie?
|
## Can I use fail2ban with mealie?
|
||||||
Yes, mealie is configured to properly forward external IP addresses into the `mealie.log` logfile. Note that, due to restrictions in docker, IP address forwarding only works on linux.
|
Yes, mealie is configured to properly forward external IP addresses into the `mealie.log` logfile. Note that due to restrictions in docker, IP address forwarding only works on Linux.
|
||||||
|
|
||||||
Your fail2ban usage should look like the following:
|
Your fail2ban usage should look like the following:
|
||||||
```
|
```
|
||||||
@ -142,12 +136,12 @@ Use failregex line : ^ERROR:\s+Incorrect username or password from <HOST>
|
|||||||
```
|
```
|
||||||
|
|
||||||
## Why An API?
|
## Why An API?
|
||||||
An API allows integration into applications like [Home Assistant](https://www.home-assistant.io/) that can act as notification engines to provide custom notifications based of Meal Plan data to remind you to defrost the chicken, marinade the steak, or start the CrockPot. Additionally, you can access nearly any backend service via the API giving you total control to extend the application. To explore the API spin up your server and navigate to http://yourserver.com/docs for interactive API documentation.
|
An API allows integration into applications like [Home Assistant](https://www.home-assistant.io/) that can act as notification engines to provide custom notifications based on Meal Plan data to remind you to defrost the chicken, marinade the steak, or start the CrockPot. Additionally, you can access nearly any backend service via the API giving you total control to extend the application. To explore the API spin up your server and navigate to http://yourserver.com/docs for interactive API documentation.
|
||||||
|
|
||||||
## Why a Database?
|
## Why a Database?
|
||||||
Some users of static-site generator applications like ChowDown have expressed concerns about their data being stuck in a database. Considering this is a new project it is a valid concern to be worried about your data. Mealie specifically addresses this concern by provided automatic daily backups that export your data in json, plain-text markdown files, and/or custom Jinja2 templates. **This puts you in controls of how your data is represented** when exported from Mealie, which means you can easily migrate to any other service provided Mealie doesn't work for you.
|
Some users of static-site generator applications like ChowDown have expressed concerns about their data being stuck in a database. Considering this is a new project, it is a valid concern to be worried about your data. Mealie specifically addresses this concern by provided automatic daily backups that export your data in json, plain-text markdown files, and/or custom Jinja2 templates. **This puts you in control of how your data is represented** when exported from Mealie, which means you can easily migrate to any other service provided Mealie doesn't work for you.
|
||||||
|
|
||||||
As to why we need a database?
|
As to why we need a database?
|
||||||
|
|
||||||
- **Developer Experience:** Without a database a lot of the work to maintain your data is taken on by the developer instead of a battle tested platform for storing data.
|
- **Developer Experience:** Without a database, a lot of the work to maintain your data is taken on by the developer instead of a battle-tested platform for storing data.
|
||||||
- **Multi User Support:** With a solid database as backend storage for your data Mealie can better support multi-user sites and avoid read/write access errors when multiple actions are taken at the same time.
|
- **Multi User Support:** With a solid database as backend storage for your data, Mealie can better support multi-user sites and avoid read/write access errors when multiple actions are taken at the same time.
|
||||||
|
@ -38,15 +38,15 @@ Categories are the overarching organizer for recipes. You can assign as many cat
|
|||||||
|
|
||||||
#### Tags
|
#### Tags
|
||||||
|
|
||||||
Tags, are nearly identical to categories in function but play a secondary role in some cases. As such, we recommend that you use tags freely to help you organize your recipes by more specific topics. For example, if a recipe can be frozen or is a great left-over meal, you could assign the tags **frozen** and **left-over** and easily filter for those at a later time.
|
Tags are nearly identical to categories in function but play a secondary role in some cases. As such, we recommend that you use tags freely to help you organize your recipes by more specific topics. For example, if a recipe can be frozen or is a great left-over meal, you could assign the tags **frozen** and **left-over** and easily filter for those at a later time.
|
||||||
|
|
||||||
[Tags Demo](https://demo.mealie.io/g/home/recipes/tags){ .md-button .md-button--primary }
|
[Tags Demo](https://demo.mealie.io/g/home/recipes/tags){ .md-button .md-button--primary }
|
||||||
|
|
||||||
#### Tools
|
#### Tools
|
||||||
|
|
||||||
Tools, are another way that some users like to organize their recipes. If a recipe requires some specific equipment if can be helpful to assign the tools to the recipes. This is particularly useful for things that are less common, like a pressure cooker, or a sous vide.
|
Tools are another way that some users like to organize their recipes. If a recipe requires some specific equipment, it can be helpful to assign tools to the recipes. This is particularly useful for things that are less common, like a pressure cooker or a sous vide.
|
||||||
|
|
||||||
Each of the above organizers can be filtered in searches, and have their own pages where you can view all the recipes that are associated with those organizers.
|
Each of the above organizers can be filtered in searches and have their own pages where you can view all the recipes that are associated with those organizers.
|
||||||
|
|
||||||
[Tools Demo](https://demo.mealie.io/g/home/recipes/tools){ .md-button .md-button--primary }
|
[Tools Demo](https://demo.mealie.io/g/home/recipes/tools){ .md-button .md-button--primary }
|
||||||
|
|
||||||
@ -64,7 +64,7 @@ Mealie also has the concept of cookbooks. These can be created inside of a group
|
|||||||
|
|
||||||
## Meal Planning
|
## Meal Planning
|
||||||
|
|
||||||
Mealie uses a calendar like view to help you plan your meals. It shows you the previous day, and the next 6 days by default. You can toggle through the calendar by clicking the arrows on the top of the page. In editor mode, you can use the random recipe buttons, or manually add an entry.
|
Mealie uses a calendar like view to help you plan your meals. It shows you the previous day and the next 6 days by default. You can toggle through the calendar by clicking the arrows on the top of the page. In editor mode, you can use the random recipe buttons or manually add an entry.
|
||||||
|
|
||||||
!!! tip
|
!!! tip
|
||||||
You can also add a "Note" type entry to your meal-plan when you want to include something that might not have a specific recipes. This is great for leftovers, or for ordering out.
|
You can also add a "Note" type entry to your meal-plan when you want to include something that might not have a specific recipes. This is great for leftovers, or for ordering out.
|
||||||
@ -73,16 +73,16 @@ Mealie uses a calendar like view to help you plan your meals. It shows you the p
|
|||||||
|
|
||||||
### Planner Rules
|
### Planner Rules
|
||||||
|
|
||||||
The meal planner has the concept of plan rules. These offer a flexible way to use your organizers to customize how a random recipe is inserted into your meal plan. You can set rules to restrict the pool of recipes based on the Tags and/or Categories of a recipe. Additionally, since meal plans have a Breakfast, Lunch, Dinner, and Snack labels you can specifically set a rule to be active for a **specific meal type** or even a **specific day of the week.**
|
The meal planner has the concept of plan rules. These offer a flexible way to use your organizers to customize how a random recipe is inserted into your meal plan. You can set rules to restrict the pool of recipes based on the Tags and/or Categories of a recipe. Additionally, since meal plans have a Breakfast, Lunch, Dinner, and Snack labels, you can specifically set a rule to be active for a **specific meal type** or even a **specific day of the week.**
|
||||||
|
|
||||||
[Planner Settings Demo](https://demo.mealie.io/group/mealplan/settings){ .md-button .md-button--primary }
|
[Planner Settings Demo](https://demo.mealie.io/group/mealplan/settings){ .md-button .md-button--primary }
|
||||||
|
|
||||||
## Shopping Lists
|
## Shopping Lists
|
||||||
|
|
||||||
The shopping lists feature is a great way to keep track of what you need to buy for your next meal. You can add items directly to the shopping list, or link a recipe and all of it's ingredients to track meals during the week.
|
The shopping lists feature is a great way to keep track of what you need to buy for your next meal. You can add items directly to the shopping list or link a recipe and all of it's ingredients to track meals during the week.
|
||||||
|
|
||||||
!!! warning
|
!!! warning
|
||||||
At this time there isn't a tight integration between meal-plans and shopping lists, however it's something we have planned for the future.
|
At this time there isn't a tight integration between meal-plans and shopping lists; however, it's something we have planned for the future.
|
||||||
|
|
||||||
|
|
||||||
[Shopping List Demo](https://demo.mealie.io/shopping-lists){ .md-button .md-button--primary }
|
[Shopping List Demo](https://demo.mealie.io/shopping-lists){ .md-button .md-button--primary }
|
||||||
@ -90,7 +90,7 @@ The shopping lists feature is a great way to keep track of what you need to buy
|
|||||||
|
|
||||||
## Data Management
|
## Data Management
|
||||||
|
|
||||||
Managing a robust collection of recipes inevitable requires a lot of data. Mealie has a robust data management system that allows you to easily some of the more important data sets in your collection. Here's some of the features that are available in the `group/data/<type>` pages:
|
Managing a robust collection of recipes inevitable requires a lot of data. Mealie has a robust data management system that allows you to easily export some of the more important data sets in your collection. Here's some of the features that are available in the `group/data/<type>` pages:
|
||||||
|
|
||||||
- Recipes
|
- Recipes
|
||||||
- Bulk Actions
|
- Bulk Actions
|
||||||
@ -113,7 +113,7 @@ Managing a robust collection of recipes inevitable requires a lot of data. Meali
|
|||||||
|
|
||||||
### Site Settings
|
### Site Settings
|
||||||
|
|
||||||
The site settings page contains general information about your installation like the application version, some configuration details, and some utilities to help you confirm your installation is working as expected. For example, you can use the Email Configuration section to validate that your email credentials are setup correctly and that the email service is working as expected. Additionally, there is a docker-volume utility that will confirm your volumes are configured and shared correctly between the front and backend of the application.
|
The site settings page contains general information about your installation like the application version, some configuration details, and some utilities to help you confirm your installation is working as expected. For example, you can use the Email Configuration section to validate that your email credentials are set up correctly and that the email service is working as expected. Additionally, there is a docker-volume utility that will confirm your volumes are configured and shared correctly between the front and backend of the application.
|
||||||
|
|
||||||
[Settings Demo](https://demo.mealie.io/admin/site-settings){ .md-button .md-button--primary }
|
[Settings Demo](https://demo.mealie.io/admin/site-settings){ .md-button .md-button--primary }
|
||||||
|
|
||||||
@ -125,7 +125,7 @@ There is a small management area for users and groups that allows you to create,
|
|||||||
|
|
||||||
### Backups
|
### Backups
|
||||||
|
|
||||||
The backups page provides a full system backup of your installation including all assets and images related to recipes. These are archived into a zip file and stored on the server but can also be downloaded through the UI. Due to some issues in the past Mealie no longer performs automatic backups, **it is advised that during setup you also setup a backup strategy to ensure your data is not lost.**
|
The backups page provides a full system backup of your installation including all assets and images related to recipes. These are archived into a zip file and stored on the server but can also be downloaded through the UI. Due to some issues in the past, Mealie no longer performs automatic backups; **it is advised that during setup you also set up a backup strategy to ensure your data is not lost.**
|
||||||
|
|
||||||
|
|
||||||
[Backups Demo](https://demo.mealie.io/admin/backups){ .md-button .md-button--primary }
|
[Backups Demo](https://demo.mealie.io/admin/backups){ .md-button .md-button--primary }
|
||||||
|
@ -1,17 +1,17 @@
|
|||||||
# Installation Checklist
|
# Installation Checklist
|
||||||
|
|
||||||
To install Mealie on your server there are a few steps for proper configuration. Let's go through them.
|
To install Mealie on your server, there are a few steps for proper configuration. Let's go through them.
|
||||||
|
|
||||||
!!! tip TLDR
|
!!! tip TLDR
|
||||||
|
|
||||||
Don't need step by step? Checkout the
|
Don't need step-by-step? Check out:
|
||||||
|
|
||||||
- [SQLite docker-compose](./sqlite.md)
|
- [SQLite docker-compose](./sqlite.md)
|
||||||
- [Postgres docker-compose](./postgres.md)
|
- [Postgres docker-compose](./postgres.md)
|
||||||
|
|
||||||
## Pre-work
|
## Pre-work
|
||||||
|
|
||||||
To deploy mealie on your local network it is highly recommended to use docker to deploy the image straight from the GitHub registry. Using the docker-compose templates provided, you should be able to get a stack up and running easily by changing a few default values and deploying. You can deploy with either SQLite (default) or Postgres. SQLite is sufficient for most use cases. Additionally, with Mealie's automated backup and restore functionality, you can easily move between SQLite and Postgres as you wish.
|
To deploy mealie on your local network, it is highly recommended to use Docker to deploy the image straight from the GitHub registry. Using the docker-compose templates provided, you should be able to get a stack up and running easily by changing a few default values and deploying. You can deploy with either SQLite (default) or Postgres. SQLite is sufficient for most use cases. Additionally, with Mealie's automated backup and restore functionality, you can easily move between SQLite and Postgres as you wish.
|
||||||
|
|
||||||
[Get Docker](https://docs.docker.com/get-docker/)
|
[Get Docker](https://docs.docker.com/get-docker/)
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ To deploy mealie on your local network it is highly recommended to use docker to
|
|||||||
|
|
||||||
## Migrating From Other V1 Versions
|
## Migrating From Other V1 Versions
|
||||||
|
|
||||||
We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers _or_ the omni image) to the new nightly, there are a few things you need to do:
|
We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment, and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers _or_ the omni image) to the new nightly, there are a few things you need to do:
|
||||||
|
|
||||||
1. Take a backup just in case!
|
1. Take a backup just in case!
|
||||||
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v1.0.0-RC1.1`
|
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v1.0.0-RC1.1`
|
||||||
@ -50,13 +50,13 @@ You can find the relevant ready to use docker-compose files for supported instal
|
|||||||
|
|
||||||
## Step 2: Setting up your files.
|
## Step 2: Setting up your files.
|
||||||
|
|
||||||
The following steps were tested on a Ubuntu 20.04 server, but should work for most other Linux distributions. These steps are not required, but is how I generally will setup services on my server.
|
The following steps were tested on a Ubuntu 20.04 server, but should work for most other Linux distributions. These steps are not required, but this is how I generally will setup services on my server.
|
||||||
|
|
||||||
1. SSH into your server and navigate to the home directory of the user you want to run Mealie as. If that is your current user, you can use `cd ~` to ensure you're in the right directory.
|
1. SSH into your server and navigate to the home directory of the user you want to run Mealie as. If that is your current user, you can use `cd ~` to ensure you're in the right directory.
|
||||||
2. Create a directory called `docker` and navigate into it: `mkdir docker && cd docker` (this is optional, if you organizer your docker installs separate from everything else)
|
2. Create a directory called `docker` and navigate into it: `mkdir docker && cd docker` (this is optional, if you organize your docker installs separate from everything else)
|
||||||
3. Do the same for mealie: `mkdir mealie && cd mealie`
|
3. Do the same for mealie: `mkdir mealie && cd mealie`
|
||||||
4. Create a docker-compose.yaml file in the mealie directory: `touch docker-compose.yaml`
|
4. Create a docker-compose.yaml file in the mealie directory: `touch docker-compose.yaml`
|
||||||
5. Use the text editor or your choice to edit the file and copy the contents of the docker-compose template for the deployment type you want to use: `nano docker-compose.yaml` or `vi docker-compose.yaml`
|
5. Use the text editor of your choice to edit the file and copy the contents of the docker-compose template for the deployment type you want to use: `nano docker-compose.yaml` or `vi docker-compose.yaml`
|
||||||
|
|
||||||
## Step 2: Customizing The `docker-compose.yaml` files.
|
## Step 2: Customizing The `docker-compose.yaml` files.
|
||||||
|
|
||||||
@ -69,10 +69,10 @@ After you've decided setup the files it's important to set a few ENV variables t
|
|||||||
|
|
||||||
## Step 3: Startup
|
## Step 3: Startup
|
||||||
|
|
||||||
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).
|
||||||
@ -89,13 +89,13 @@ You should see the containers start up without error. You should now be able to
|
|||||||
|
|
||||||
## Step 4: Validate Installation
|
## Step 4: Validate Installation
|
||||||
|
|
||||||
After the startup is complete you should see a login screen. Use the default credentials above to login and navigate to `/admin/site-settings`. Here you'll find a summary of your configuration details and their respective status. Before proceeding you should validate that the configuration is correct. For any warnings or errors the page will display an error and notify you of what you need to verify.
|
After the startup is complete, you should see a login screen. Use the default credentials above to log in and navigate to `/admin/site-settings`. Here, you'll find a summary of your configuration details and their respective status. Before proceeding, you should validate that the configuration is correct. For any warnings or errors the page will display an error and notify you of what you need to verify.
|
||||||
|
|
||||||
## Step 5: Backup
|
## Step 5: Backup
|
||||||
|
|
||||||
While v1.0.0 is a great step to data-stability and security, it's not a backup. Mealie provides a full site data backup mechanism through the UI.
|
While v1.0.0 is a great step to data-stability and security, it's not a backup. Mealie provides a full site data backup mechanism through the UI.
|
||||||
|
|
||||||
These backups are just plain .zip files that you can download from the UI or access via the mounted volume on your system. For complete data protection you MUST store these backups somewhere safe, and outside of the server where they are deployed.
|
These backups are just plain .zip files that you can download from the UI or access via the mounted volume on your system. For complete data protection you MUST store these backups somewhere safe, outside of the server where they are deployed.
|
||||||
|
|
||||||
## Appendix
|
## Appendix
|
||||||
|
|
||||||
@ -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.0.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:
|
||||||
@ -46,7 +44,7 @@ services:
|
|||||||
image: postgres:15
|
image: postgres:15
|
||||||
restart: always
|
restart: always
|
||||||
volumes:
|
volumes:
|
||||||
- ./mealie-pgdata:/var/lib/postgresql/data
|
- mealie-pgdata:/var/lib/postgresql/data
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_PASSWORD: mealie
|
POSTGRES_PASSWORD: mealie
|
||||||
POSTGRES_USER: mealie
|
POSTGRES_USER: mealie
|
||||||
@ -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. 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.0.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. 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)
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
# Migrating to Mealie v1 Release
|
# Migrating to Mealie v1 Release
|
||||||
|
|
||||||
The version 1 release of Mealie should be seen as an entirely different application. A whole host of changes have been made to improve the application, performance, and developer experience. Most of these improvements required significant breaking changes in the application that made a clean and easy migration impossible. However, if you've used Mealie prior to v1 there is a migration path to get most of your data from the old version to the new v1 version.
|
The version 1 release of Mealie should be seen as an entirely different application. A whole host of changes have been made to improve the application, performance, and developer experience. Most of these improvements required significant breaking changes in the application that made a clean and easy migration impossible. However, if you've used Mealie prior to v1, there is a migration path to get most of your data from the old version to the new v1 version.
|
||||||
|
|
||||||
!!! info "Currently Supported Migration Data"
|
!!! info "Currently Supported Migration Data"
|
||||||
Supporting more data is a work in progress, but not a current priority. I'm open to PR's to add support for additional data.
|
Supporting more data is a work in progress, but not a current priority. I'm open to PRs to add support for additional data.
|
||||||
|
|
||||||
- [x] Recipes
|
- [x] Recipes
|
||||||
- [x] Categories
|
- [x] Categories
|
||||||
@ -16,19 +16,15 @@ The version 1 release of Mealie should be seen as an entirely different applicat
|
|||||||
|
|
||||||
## Migration Considerations
|
## Migration Considerations
|
||||||
|
|
||||||
Before you migrate to v1.0.0-beta-x please consider the following:
|
Before you migrate to v1.0.0 please consider the following:
|
||||||
|
|
||||||
**API Integration Will Break**
|
**API Integration Will Break**
|
||||||
|
|
||||||
Several of the endpoints in the API have changed. This means that you will need to update your code to use the new endpoints.
|
Several of the endpoints in the API have changed. This means that you will need to update your code to use the new endpoints.
|
||||||
|
|
||||||
**Meal Plan Notifications Are Not Yet Implemented**
|
**Recipes Are Private By Default**
|
||||||
|
|
||||||
If you're using the Meal Plan webhook feature it has yet to be implemented in v1. This feature is being significantly improved in v1 and has yet to be fully fleshed out. If you were a heavy user, you may want to wait until v1 to use this feature.
|
By default, recipes can only be viewed by logged-in users. You can fine-tune public recipe access, or keep your instance fully private. For more information, check out the [Permissions and Public Access guide](../getting-started/usage/permissions-and-public-access.md).
|
||||||
|
|
||||||
**Recipes are Now Private**
|
|
||||||
|
|
||||||
This can be a plus or a minus depending on your use case. If you relied on the old implementation that allowed viewing of recipes without logging in, you will loose that access. We are planning on implementing a public facing interface for groups/tenants to allow unauthenticated users to view public recipes.
|
|
||||||
|
|
||||||
|
|
||||||
## Step 1: Setting Up The New Application
|
## Step 1: Setting Up The New Application
|
||||||
@ -37,7 +33,9 @@ Given the nature of the upgrade, it is highly recommended that you stand up a ne
|
|||||||
|
|
||||||
## Step 2: Exporting Your Data from Pre-v1
|
## Step 2: Exporting Your Data from Pre-v1
|
||||||
|
|
||||||
In your instance of Mealie prior to v1, perform an export of your data in the Admin section. Be sure to include the recipes when performing the export. Checking additional items won't impact the migration, but they will be ignored if they are included.
|
In your instance of Mealie prior to v1, perform an export (backup) of your data in the Admin section. Be sure to include the recipes when performing the export. Checking additional items won't impact the migration, but they will be ignored if they are included. The backups section is located on the admin dashboard in the section labeled "Backups":
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
## Step 3: Using the Migration Tool
|
## Step 3: Using the Migration Tool
|
||||||
@ -47,11 +45,11 @@ In your new v1 instance, navigate to `/group/migrations` and select "Mealie" fro
|
|||||||
In most cases, it's faster to manually migrate the recipes that didn't take instead of trying to identify why the recipes failed to import. If you're experiencing issues with the migration tool, please open an issue on GitHub.
|
In most cases, it's faster to manually migrate the recipes that didn't take instead of trying to identify why the recipes failed to import. If you're experiencing issues with the migration tool, please open an issue on GitHub.
|
||||||
|
|
||||||
!!! note "Recipe Owners"
|
!!! note "Recipe Owners"
|
||||||
When perform any migration, it will automatically assign the owner of the recipe to the user that performed the migration. All group members will still be able to access the recipe, however the owner has special permissions to lock the recipe from edits from other users.
|
When perform any migration, it will automatically assign the owner of the recipe to the user that performed the migration. All group members will still be able to access the recipe; however, the owner has special permissions to lock the recipe from edits from other users.
|
||||||
|
|
||||||
|
|
||||||
## Step 4: Reviewing New Features
|
## Step 4: Reviewing New Features
|
||||||
|
|
||||||
v1 Comes with a whole host of new features and improvements. Checkout the changelog to get a sense for what's new.
|
v1 Comes with a whole host of new features and improvements. Check out the changelog to get a sense for what's new.
|
||||||
|
|
||||||
- [Github releases changelog](https://github.com/mealie-recipes/mealie/releases)
|
- [Github releases changelog](https://github.com/mealie-recipes/mealie/releases)
|
||||||
|
@ -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`
|
||||||
|
@ -0,0 +1,57 @@
|
|||||||
|
# Permissions and Public Access
|
||||||
|
|
||||||
|
Mealie provides various levels of user access and permissions. This includes:
|
||||||
|
- Authentication and registration ([check out the LDAP guide](./ldap.md) for how to configure access using LDAP)
|
||||||
|
- Customizable user permissions
|
||||||
|
- Fine-tuned public access for non-users
|
||||||
|
|
||||||
|
## Customizable User Permissions
|
||||||
|
|
||||||
|
Each user can be configured to have varying levels of access. Some of these permissions include:
|
||||||
|
- Access to Administrator tools
|
||||||
|
- Access to inviting other users
|
||||||
|
- Access to manage their group and group data
|
||||||
|
|
||||||
|
Administrators can navigate to the Settings page and access the User Management page to configure these settings.
|
||||||
|
|
||||||
|
|
||||||
|
[User Management Demo](https://demo.mealie.io/admin/manage/users){ .md-button .md-button--primary }
|
||||||
|
|
||||||
|
## Public Recipe Access
|
||||||
|
|
||||||
|
By default, groups are set to private, meaning only logged-in users may access the group. In order for a recipe to be viewable by public (not logged-in) users, two criteria must be met:
|
||||||
|
|
||||||
|
1. The group must not be private, *and* the group setting for allowing users outside of your group to see your recipes must be enabled. These can be toggled on the Group Settings page
|
||||||
|
2. The recipe must be set to public. This can be toggled for each recipe individually, or in bulk using the Recipe Data Management page
|
||||||
|
|
||||||
|
Additionally, if the group is not private, public users can view all public group data (public recipes, public cookbooks, etc.) from the home page ([e.g. the demo home page](https://demo.mealie.io/g/home)).
|
||||||
|
|
||||||
|
[Group Settings Demo](https://demo.mealie.io/group){ .md-button .md-button--primary }
|
||||||
|
|
||||||
|
More broadly, here are the rules for how recipe access is determined:
|
||||||
|
|
||||||
|
- Private links that are generated from the recipe page using the `Share` button bypass all group and recipe permissions
|
||||||
|
- Private groups block all access to recipes, including those that are public, except as noted above.
|
||||||
|
- Groups with "Allow users outside of your group to see your recipes" disabled block all access to recipes, except as noted above.
|
||||||
|
- Private recipes block all access to the recipe from public links. This does not affect Private Links.
|
||||||
|
|
||||||
|
```mermaid
|
||||||
|
stateDiagram-v2
|
||||||
|
r1: Request Access
|
||||||
|
p1: Using Private Link?
|
||||||
|
p2: Is Group Private?
|
||||||
|
p3: Is Recipe Private?
|
||||||
|
s1: Deny Access
|
||||||
|
n1: Allow Access
|
||||||
|
|
||||||
|
|
||||||
|
r1 --> p1
|
||||||
|
p1 --> p2: No
|
||||||
|
p1 --> n1: Yes
|
||||||
|
|
||||||
|
p2 --> s1: Yes
|
||||||
|
p2 --> p3: No
|
||||||
|
|
||||||
|
p3 --> s1: Yes
|
||||||
|
p3 --> n1: No
|
||||||
|
```
|
File diff suppressed because one or more lines are too long
@ -102,7 +102,6 @@ const SAVE_EVENT = "save";
|
|||||||
const DELETE_EVENT = "delete";
|
const DELETE_EVENT = "delete";
|
||||||
const CLOSE_EVENT = "close";
|
const CLOSE_EVENT = "close";
|
||||||
const JSON_EVENT = "json";
|
const JSON_EVENT = "json";
|
||||||
const OCR_EVENT = "ocr";
|
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: { RecipeContextMenu, RecipeFavoriteBadge, RecipeTimerMenu, RecipeTimelineBadge },
|
components: { RecipeContextMenu, RecipeFavoriteBadge, RecipeTimerMenu, RecipeTimelineBadge },
|
||||||
@ -139,12 +138,8 @@ export default defineComponent({
|
|||||||
type: Boolean,
|
type: Boolean,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
showOcrButton: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
setup(props, context) {
|
setup(_, context) {
|
||||||
const deleteDialog = ref(false);
|
const deleteDialog = ref(false);
|
||||||
|
|
||||||
const { i18n, $globals } = useContext();
|
const { i18n, $globals } = useContext();
|
||||||
@ -175,15 +170,6 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
if (props.showOcrButton) {
|
|
||||||
editorButtons.splice(2, 0, {
|
|
||||||
text: i18n.t("ocr-editor.ocr-editor"),
|
|
||||||
icon: $globals.icons.eye,
|
|
||||||
event: OCR_EVENT,
|
|
||||||
color: "accent",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function emitHandler(event: string) {
|
function emitHandler(event: string) {
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case CLOSE_EVENT:
|
case CLOSE_EVENT:
|
||||||
|
@ -143,7 +143,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
const { share, isSupported: shareIsSupported } = useShare();
|
const { share, isSupported: shareIsSupported } = useShare();
|
||||||
const { copy } = useClipboard();
|
const { copy, copied, isSupported } = useClipboard();
|
||||||
|
|
||||||
function getRecipeText() {
|
function getRecipeText() {
|
||||||
return i18n.t("recipe.share-recipe-message", [props.name]);
|
return i18n.t("recipe.share-recipe-message", [props.name]);
|
||||||
@ -154,8 +154,18 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function copyTokenLink(token: string) {
|
async function copyTokenLink(token: string) {
|
||||||
await copy(getTokenLink(token));
|
if (isSupported.value) {
|
||||||
alert.success(i18n.t("recipe-share.recipe-link-copied-message") as string);
|
await copy(getTokenLink(token));
|
||||||
|
if (copied.value) {
|
||||||
|
alert.success(i18n.t("recipe-share.recipe-link-copied-message") as string);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
alert.error(i18n.t("general.clipboard-copy-failure") as string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
alert.error(i18n.t("general.clipboard-not-supported") as string);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function shareRecipe(token: string) {
|
async function shareRecipe(token: string) {
|
||||||
|
@ -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">
|
||||||
|
@ -1,390 +0,0 @@
|
|||||||
<template>
|
|
||||||
<v-container
|
|
||||||
v-if="recipe && recipe.slug && recipe.settings && recipe.recipeIngredient"
|
|
||||||
:class="{
|
|
||||||
'pa-0': $vuetify.breakpoint.smAndDown,
|
|
||||||
}"
|
|
||||||
>
|
|
||||||
<BannerExperimental />
|
|
||||||
|
|
||||||
<div v-if="loading">
|
|
||||||
<v-spacer />
|
|
||||||
<v-progress-circular indeterminate class="" color="primary"> </v-progress-circular>
|
|
||||||
{{ loadingText }}
|
|
||||||
<v-spacer />
|
|
||||||
</div>
|
|
||||||
<v-row v-if="!loading">
|
|
||||||
<v-col cols="12" sm="7" md="7" lg="7">
|
|
||||||
<RecipeOcrEditorPageCanvas
|
|
||||||
:image="canvasImage"
|
|
||||||
:tsv="tsv"
|
|
||||||
@setText="canvasSetText"
|
|
||||||
@update-recipe="updateRecipe"
|
|
||||||
@close-editor="closeEditor"
|
|
||||||
@text-selected="updateSelectedText"
|
|
||||||
>
|
|
||||||
</RecipeOcrEditorPageCanvas>
|
|
||||||
|
|
||||||
<RecipeOcrEditorPageHelp />
|
|
||||||
</v-col>
|
|
||||||
<v-col cols="12" sm="5" md="5" lg="5">
|
|
||||||
<v-tabs v-model="tab" fixed-tabs>
|
|
||||||
<v-tab key="header">
|
|
||||||
{{ $t("general.recipe") }}
|
|
||||||
</v-tab>
|
|
||||||
<v-tab key="ingredients">
|
|
||||||
{{ $t("recipe.ingredients") }}
|
|
||||||
</v-tab>
|
|
||||||
<v-tab key="instructions">
|
|
||||||
{{ $t("recipe.instructions") }}
|
|
||||||
</v-tab>
|
|
||||||
</v-tabs>
|
|
||||||
<v-tabs-items v-model="tab">
|
|
||||||
<v-tab-item key="header">
|
|
||||||
<v-text-field
|
|
||||||
v-model="recipe.name"
|
|
||||||
class="my-3"
|
|
||||||
:label="$t('recipe.recipe-name')"
|
|
||||||
:rules="[validators.required]"
|
|
||||||
@focus="selectedRecipeField = 'name'"
|
|
||||||
>
|
|
||||||
</v-text-field>
|
|
||||||
|
|
||||||
<div class="d-flex flex-wrap">
|
|
||||||
<v-text-field
|
|
||||||
v-model="recipe.totalTime"
|
|
||||||
class="mx-2"
|
|
||||||
:label="$t('recipe.total-time')"
|
|
||||||
@click="selectedRecipeField = 'totalTime'"
|
|
||||||
></v-text-field>
|
|
||||||
<v-text-field
|
|
||||||
v-model="recipe.prepTime"
|
|
||||||
class="mx-2"
|
|
||||||
:label="$t('recipe.prep-time')"
|
|
||||||
@click="selectedRecipeField = 'prepTime'"
|
|
||||||
></v-text-field>
|
|
||||||
<v-text-field
|
|
||||||
v-model="recipe.performTime"
|
|
||||||
class="mx-2"
|
|
||||||
:label="$t('recipe.perform-time')"
|
|
||||||
@click="selectedRecipeField = 'performTime'"
|
|
||||||
></v-text-field>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<v-textarea
|
|
||||||
v-model="recipe.description"
|
|
||||||
auto-grow
|
|
||||||
min-height="100"
|
|
||||||
:label="$t('recipe.description')"
|
|
||||||
@click="selectedRecipeField = 'description'"
|
|
||||||
>
|
|
||||||
</v-textarea>
|
|
||||||
<v-text-field
|
|
||||||
v-model="recipe.recipeYield"
|
|
||||||
dense
|
|
||||||
:label="$t('recipe.servings')"
|
|
||||||
@click="selectedRecipeField = 'recipeYield'"
|
|
||||||
>
|
|
||||||
</v-text-field>
|
|
||||||
</v-tab-item>
|
|
||||||
<v-tab-item key="ingredients">
|
|
||||||
<div class="d-flex justify-end mt-2">
|
|
||||||
<RecipeDialogBulkAdd class="ml-1 mr-1" :input-text-prop="canvasSelectedText" @bulk-data="addIngredient" />
|
|
||||||
<BaseButton @click="addIngredient"> {{ $t("general.new") }} </BaseButton>
|
|
||||||
</div>
|
|
||||||
<draggable
|
|
||||||
v-if="recipe.recipeIngredient.length > 0"
|
|
||||||
v-model="recipe.recipeIngredient"
|
|
||||||
handle=".handle"
|
|
||||||
v-bind="{
|
|
||||||
animation: 200,
|
|
||||||
group: 'description',
|
|
||||||
disabled: false,
|
|
||||||
ghostClass: 'ghost',
|
|
||||||
}"
|
|
||||||
@start="drag = true"
|
|
||||||
@end="drag = false"
|
|
||||||
>
|
|
||||||
<TransitionGroup type="transition" :name="!drag ? 'flip-list' : ''">
|
|
||||||
<RecipeIngredientEditor
|
|
||||||
v-for="(ingredient, index) in recipe.recipeIngredient"
|
|
||||||
:key="ingredient.referenceId"
|
|
||||||
v-model="recipe.recipeIngredient[index]"
|
|
||||||
class="list-group-item"
|
|
||||||
:disable-amount="recipe.settings.disableAmount"
|
|
||||||
@delete="recipe.recipeIngredient.splice(index, 1)"
|
|
||||||
@clickIngredientField="setSingleIngredient($event, index)"
|
|
||||||
/>
|
|
||||||
</TransitionGroup>
|
|
||||||
</draggable>
|
|
||||||
</v-tab-item>
|
|
||||||
<v-tab-item key="instructions">
|
|
||||||
<div class="d-flex justify-end mt-2">
|
|
||||||
<RecipeDialogBulkAdd class="ml-1 mr-1" :input-text-prop="canvasSelectedText" @bulk-data="addStep" />
|
|
||||||
<BaseButton @click="addStep()"> {{ $t("general.new") }}</BaseButton>
|
|
||||||
</div>
|
|
||||||
<RecipePageInstructions
|
|
||||||
v-model="recipe.recipeInstructions"
|
|
||||||
:ingredients="recipe.recipeIngredient"
|
|
||||||
:disable-amount="recipe.settings.disableAmount"
|
|
||||||
:edit="true"
|
|
||||||
:recipe="recipe"
|
|
||||||
:assets.sync="recipe.assets"
|
|
||||||
@click-instruction-field="setSingleStep"
|
|
||||||
/>
|
|
||||||
</v-tab-item>
|
|
||||||
</v-tabs-items>
|
|
||||||
</v-col>
|
|
||||||
</v-row>
|
|
||||||
</v-container>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import { defineComponent, ref, onMounted, reactive, toRefs, useContext, useRouter, computed, useRoute } from "@nuxtjs/composition-api";
|
|
||||||
import { until } from "@vueuse/core";
|
|
||||||
import { invoke } from "@vueuse/shared";
|
|
||||||
import draggable from "vuedraggable";
|
|
||||||
import RecipePageInstructions from "~/components/Domain/Recipe/RecipePage/RecipePageParts/RecipePageInstructions.vue";
|
|
||||||
import { useUserApi, useStaticRoutes } from "~/composables/api";
|
|
||||||
import { OcrTsvResponse as NullableOcrTsvResponse } from "~/lib/api/types/ocr";
|
|
||||||
import { validators } from "~/composables/use-validators";
|
|
||||||
import { Recipe, RecipeIngredient, RecipeStep } from "~/lib/api/types/recipe";
|
|
||||||
import { Paths, Leaves, SelectedRecipeLeaves } from "~/types/ocr-types";
|
|
||||||
import BannerExperimental from "~/components/global/BannerExperimental.vue";
|
|
||||||
import RecipeDialogBulkAdd from "~/components/Domain/Recipe/RecipeDialogBulkAdd.vue";
|
|
||||||
import RecipeIngredientEditor from "~/components/Domain/Recipe/RecipeIngredientEditor.vue";
|
|
||||||
import RecipeOcrEditorPageCanvas from "~/components/Domain/Recipe/RecipeOcrEditorPage/RecipeOcrEditorPageParts/RecipeOcrEditorPageCanvas.vue";
|
|
||||||
import RecipeOcrEditorPageHelp from "~/components/Domain/Recipe/RecipeOcrEditorPage/RecipeOcrEditorPageParts/RecipeOcrEditorPageHelp.vue";
|
|
||||||
import { uuid4 } from "~/composables/use-utils";
|
|
||||||
import { NoUndefinedField } from "~/lib/api/types/non-generated";
|
|
||||||
|
|
||||||
// Temporary Shim until we have a better solution
|
|
||||||
// https://github.com/phillipdupuis/pydantic-to-typescript/issues/28
|
|
||||||
type OcrTsvResponse = NoUndefinedField<NullableOcrTsvResponse>;
|
|
||||||
|
|
||||||
export default defineComponent({
|
|
||||||
components: {
|
|
||||||
RecipeIngredientEditor,
|
|
||||||
draggable,
|
|
||||||
BannerExperimental,
|
|
||||||
RecipeDialogBulkAdd,
|
|
||||||
RecipePageInstructions,
|
|
||||||
RecipeOcrEditorPageCanvas,
|
|
||||||
RecipeOcrEditorPageHelp,
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
recipe: {
|
|
||||||
type: Object as () => NoUndefinedField<Recipe>,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
setup(props) {
|
|
||||||
const { $auth } = useContext();
|
|
||||||
const route = useRoute();
|
|
||||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
|
||||||
|
|
||||||
const router = useRouter();
|
|
||||||
const api = useUserApi();
|
|
||||||
|
|
||||||
const tsv = ref<OcrTsvResponse[]>([]);
|
|
||||||
|
|
||||||
const drag = ref(false);
|
|
||||||
|
|
||||||
const { i18n } = useContext();
|
|
||||||
|
|
||||||
const { recipeAssetPath } = useStaticRoutes();
|
|
||||||
|
|
||||||
function assetURL(assetName: string) {
|
|
||||||
return recipeAssetPath(props.recipe.id, assetName);
|
|
||||||
}
|
|
||||||
|
|
||||||
const state = reactive({
|
|
||||||
loading: true,
|
|
||||||
loadingText: i18n.tc("general.loading-recipe"),
|
|
||||||
tab: null,
|
|
||||||
selectedRecipeField: "" as SelectedRecipeLeaves | "",
|
|
||||||
canvasSelectedText: "",
|
|
||||||
canvasImage: new Image(),
|
|
||||||
});
|
|
||||||
|
|
||||||
const setPropertyValueByPath = function <T extends Recipe>(object: T, path: Paths<T>, value: any) {
|
|
||||||
const a = path.split(".");
|
|
||||||
let nextProperty: any = object;
|
|
||||||
for (let i = 0, n = a.length - 1; i < n; ++i) {
|
|
||||||
const k = a[i];
|
|
||||||
if (k in nextProperty) {
|
|
||||||
nextProperty = nextProperty[k];
|
|
||||||
} else {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
nextProperty[a[a.length - 1]] = value;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This function will find the title of a recipe with the assumption that the title
|
|
||||||
* has the biggest ratio of surface area / number of words on the image.
|
|
||||||
* @return Returns the text parts of the block with the highest score.
|
|
||||||
*/
|
|
||||||
function findRecipeTitle() {
|
|
||||||
const filtered = tsv.value.filter((element) => element.level === 2 || element.level === 5);
|
|
||||||
const blocks = [[]] as OcrTsvResponse[][];
|
|
||||||
let blockNum = 1;
|
|
||||||
filtered.forEach((element, index, array) => {
|
|
||||||
if (index !== 0 && array[index - 1].blockNum !== element.blockNum) {
|
|
||||||
blocks.push([]);
|
|
||||||
blockNum = element.blockNum;
|
|
||||||
}
|
|
||||||
blocks[blockNum - 1].push(element);
|
|
||||||
});
|
|
||||||
|
|
||||||
let bestScore = 0;
|
|
||||||
let bestBlock = blocks[0];
|
|
||||||
blocks.forEach((element) => {
|
|
||||||
// element[0] is the block declaration line containing the blocks total dimensions
|
|
||||||
// element.length is the number of words (+ 2) contained in that block
|
|
||||||
const elementScore = (element[0].height * element[0].width) / element.length; // Prettier is adding useless parenthesis for a mysterious reason
|
|
||||||
const elementText = element.map((element) => element.text).join(""); // Identify empty blocks and don't count them
|
|
||||||
if (elementScore > bestScore && elementText !== "") {
|
|
||||||
bestBlock = element;
|
|
||||||
bestScore = elementScore;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return bestBlock
|
|
||||||
.filter((element) => element.level === 5 && element.conf >= 40)
|
|
||||||
.map((element) => {
|
|
||||||
return element.text.trim();
|
|
||||||
})
|
|
||||||
.join(" ");
|
|
||||||
}
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
invoke(async () => {
|
|
||||||
await until(props.recipe).not.toBeNull();
|
|
||||||
state.loadingText = i18n.tc("general.loading-ocr-data");
|
|
||||||
|
|
||||||
const assetName = props.recipe.assets[0].fileName;
|
|
||||||
const imagesrc = assetURL(assetName);
|
|
||||||
state.canvasImage.src = imagesrc;
|
|
||||||
|
|
||||||
const res = await api.ocr.assetToTsv(props.recipe.slug, assetName);
|
|
||||||
tsv.value = res.data as OcrTsvResponse[];
|
|
||||||
state.loading = false;
|
|
||||||
|
|
||||||
if (props.recipe.name.match(/New\sOCR\sRecipe(\s\([0-9]+\))?/g)) {
|
|
||||||
props.recipe.name = findRecipeTitle();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
function addIngredient(ingredients: Array<string> | null = null) {
|
|
||||||
if (ingredients?.length) {
|
|
||||||
const newIngredients = ingredients.map((x) => {
|
|
||||||
return {
|
|
||||||
referenceId: uuid4(),
|
|
||||||
title: "",
|
|
||||||
note: x,
|
|
||||||
unit: undefined,
|
|
||||||
food: undefined,
|
|
||||||
disableAmount: true,
|
|
||||||
quantity: 1,
|
|
||||||
originalText: "",
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
if (newIngredients) {
|
|
||||||
// @ts-expect-error - prop can be null-type by NoUndefinedField type forces it to be set
|
|
||||||
props.recipe.recipeIngredient.push(...newIngredients);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
props.recipe.recipeIngredient.push({
|
|
||||||
referenceId: uuid4(),
|
|
||||||
title: "",
|
|
||||||
note: "",
|
|
||||||
// @ts-expect-error - prop can be null-type by NoUndefinedField type forces it to be set
|
|
||||||
unit: undefined,
|
|
||||||
// @ts-expect-error - prop can be null-type by NoUndefinedField type forces it to be set
|
|
||||||
food: undefined,
|
|
||||||
disableAmount: true,
|
|
||||||
quantity: 1,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function addStep(steps: Array<string> | null = null) {
|
|
||||||
if (!props.recipe.recipeInstructions) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (steps) {
|
|
||||||
const cleanedSteps = steps.map((step) => {
|
|
||||||
return { id: uuid4(), text: step, title: "", ingredientReferences: [] };
|
|
||||||
});
|
|
||||||
|
|
||||||
props.recipe.recipeInstructions.push(...cleanedSteps);
|
|
||||||
} else {
|
|
||||||
props.recipe.recipeInstructions.push({ id: uuid4(), text: "", title: "", ingredientReferences: [] });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// EVENT HANDLERS
|
|
||||||
|
|
||||||
// Canvas component event handlers
|
|
||||||
async function updateRecipe() {
|
|
||||||
const { data } = await api.recipes.updateOne(props.recipe.slug, props.recipe);
|
|
||||||
if (data?.slug) {
|
|
||||||
router.push(`/g/${groupSlug.value}/r/${data.slug}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function closeEditor() {
|
|
||||||
router.push(`/g/${groupSlug.value}/r/${props.recipe.slug}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const canvasSetText = function () {
|
|
||||||
if (state.selectedRecipeField !== "") {
|
|
||||||
setPropertyValueByPath<Recipe>(props.recipe, state.selectedRecipeField, state.canvasSelectedText);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function updateSelectedText(value: string) {
|
|
||||||
state.canvasSelectedText = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Recipe field selection event handlers
|
|
||||||
function setSingleIngredient(f: keyof RecipeIngredient, index: number) {
|
|
||||||
state.selectedRecipeField = `recipeIngredient.${index}.${f}` as SelectedRecipeLeaves;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Leaves<RecipeStep[]> will return some function types making eslint very unhappy
|
|
||||||
type RecipeStepsLeaves = `${number}.${Leaves<RecipeStep>}`;
|
|
||||||
|
|
||||||
function setSingleStep(path: RecipeStepsLeaves) {
|
|
||||||
state.selectedRecipeField = `recipeInstructions.${path}` as SelectedRecipeLeaves;
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
...toRefs(state),
|
|
||||||
addIngredient,
|
|
||||||
addStep,
|
|
||||||
drag,
|
|
||||||
assetURL,
|
|
||||||
updateRecipe,
|
|
||||||
closeEditor,
|
|
||||||
updateSelectedText,
|
|
||||||
tsv,
|
|
||||||
validators,
|
|
||||||
setSingleIngredient,
|
|
||||||
setSingleStep,
|
|
||||||
canvasSetText,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="css">
|
|
||||||
.ghost {
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -1,488 +0,0 @@
|
|||||||
<template>
|
|
||||||
<v-card flat tile>
|
|
||||||
<v-toolbar v-for="(section, idx) in toolbarIcons" :key="section.sectionTitle" dense style="float: left">
|
|
||||||
<v-toolbar-title bottom>
|
|
||||||
{{ section.sectionTitle }}
|
|
||||||
</v-toolbar-title>
|
|
||||||
<v-tooltip v-for="icon in section.icons" :key="icon.name" bottom>
|
|
||||||
<template #activator="{ on, attrs }">
|
|
||||||
<v-btn icon @click="section.eventHandler(icon.name)">
|
|
||||||
<v-icon :color="section.highlight === icon.name ? 'primary' : 'default'" v-bind="attrs" v-on="on">
|
|
||||||
{{ icon.icon }}
|
|
||||||
</v-icon>
|
|
||||||
</v-btn>
|
|
||||||
</template>
|
|
||||||
<span>{{ icon.tooltip }}</span>
|
|
||||||
</v-tooltip>
|
|
||||||
<v-divider v-if="idx != toolbarIcons.length - 1" vertical class="mx-2" />
|
|
||||||
</v-toolbar>
|
|
||||||
<v-toolbar dense style="float: right">
|
|
||||||
<BaseButton class="ml-1 mr-1" save @click="updateRecipe()">
|
|
||||||
{{ $t("general.save") }}
|
|
||||||
</BaseButton>
|
|
||||||
<BaseButton cancel @click="closeEditor()">
|
|
||||||
{{ $t("general.close") }}
|
|
||||||
</BaseButton>
|
|
||||||
</v-toolbar>
|
|
||||||
<canvas
|
|
||||||
ref="canvas"
|
|
||||||
@mousedown="handleMouseDown"
|
|
||||||
@mouseup="handleMouseUp"
|
|
||||||
@mousemove="handleMouseMove"
|
|
||||||
@wheel="handleMouseScroll"
|
|
||||||
>
|
|
||||||
</canvas>
|
|
||||||
<span style="white-space: pre-wrap">
|
|
||||||
{{ selectedText.trim() }}
|
|
||||||
</span>
|
|
||||||
</v-card>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import { defineComponent, reactive, useContext, ref, toRefs, watch, onMounted } from "@nuxtjs/composition-api";
|
|
||||||
import { NoUndefinedField } from "~/lib/api/types/non-generated";
|
|
||||||
import { OcrTsvResponse as NullableOcrTsvResponse } from "~/lib/api/types/ocr";
|
|
||||||
import { CanvasModes, SelectedTextSplitModes, ImagePosition, Mouse, CanvasRect, ToolbarIcons } from "~/types/ocr-types";
|
|
||||||
|
|
||||||
// Temporary Shim until we have a better solution
|
|
||||||
// https://github.com/phillipdupuis/pydantic-to-typescript/issues/28
|
|
||||||
type OcrTsvResponse = NoUndefinedField<NullableOcrTsvResponse>;
|
|
||||||
|
|
||||||
export default defineComponent({
|
|
||||||
props: {
|
|
||||||
image: {
|
|
||||||
type: HTMLImageElement,
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
tsv: {
|
|
||||||
type: Array as () => OcrTsvResponse[],
|
|
||||||
required: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
setup(props, context) {
|
|
||||||
const state = reactive({
|
|
||||||
canvas: null as HTMLCanvasElement | null,
|
|
||||||
ctx: null as CanvasRenderingContext2D | null,
|
|
||||||
canvasRect: null as DOMRect | null,
|
|
||||||
rect: {
|
|
||||||
startX: 0,
|
|
||||||
startY: 0,
|
|
||||||
w: 0,
|
|
||||||
h: 0,
|
|
||||||
},
|
|
||||||
mouse: {
|
|
||||||
current: {
|
|
||||||
x: 0,
|
|
||||||
y: 0,
|
|
||||||
},
|
|
||||||
down: false,
|
|
||||||
},
|
|
||||||
selectedText: "",
|
|
||||||
canvasMode: "selection" as CanvasModes,
|
|
||||||
imagePosition: {
|
|
||||||
sx: 0,
|
|
||||||
sy: 0,
|
|
||||||
sWidth: 0,
|
|
||||||
sHeight: 0,
|
|
||||||
dx: 0,
|
|
||||||
dy: 0,
|
|
||||||
dWidth: 0,
|
|
||||||
dHeight: 0,
|
|
||||||
scale: 1,
|
|
||||||
panStartPoint: {
|
|
||||||
x: 0,
|
|
||||||
y: 0,
|
|
||||||
},
|
|
||||||
} as ImagePosition,
|
|
||||||
isImageSmallerThanCanvas: false,
|
|
||||||
selectedTextSplitMode: "lineNum" as SelectedTextSplitModes,
|
|
||||||
});
|
|
||||||
|
|
||||||
watch(
|
|
||||||
() => state.selectedText,
|
|
||||||
(value) => {
|
|
||||||
context.emit("text-selected", value);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
if (state.canvas === null) return; // never happens because the ref "canvas" is in the template
|
|
||||||
state.ctx = state.canvas.getContext("2d") as CanvasRenderingContext2D;
|
|
||||||
state.ctx.imageSmoothingEnabled = false;
|
|
||||||
state.canvasRect = state.canvas.getBoundingClientRect();
|
|
||||||
|
|
||||||
state.canvas.width = state.canvasRect.width;
|
|
||||||
if (props.image.width < state.canvas.width) {
|
|
||||||
state.isImageSmallerThanCanvas = true;
|
|
||||||
}
|
|
||||||
state.imagePosition.dWidth = state.canvas.width;
|
|
||||||
|
|
||||||
updateImageScale();
|
|
||||||
state.canvas.height = Math.min(props.image.height * state.imagePosition.scale, 700); // Max height of 700px
|
|
||||||
|
|
||||||
state.imagePosition.sWidth = props.image.width;
|
|
||||||
state.imagePosition.sHeight = props.image.height;
|
|
||||||
state.imagePosition.dWidth = state.canvas.width;
|
|
||||||
drawImage(state.ctx);
|
|
||||||
drawWordBoxesOnCanvas(props.tsv);
|
|
||||||
});
|
|
||||||
|
|
||||||
function handleMouseDown(event: MouseEvent) {
|
|
||||||
if (state.canvasRect === null || state.canvas === null || state.ctx === null) return;
|
|
||||||
state.mouse.down = true;
|
|
||||||
|
|
||||||
updateMousePos(event);
|
|
||||||
|
|
||||||
if (state.canvasMode === "selection") {
|
|
||||||
if (isMouseInRect(state.mouse, state.rect)) {
|
|
||||||
context.emit("setText", state.selectedText);
|
|
||||||
} else {
|
|
||||||
state.ctx.fillStyle = "rgb(255, 255, 255)";
|
|
||||||
state.ctx.fillRect(0, 0, state.canvas.width, state.canvas.height);
|
|
||||||
drawImage(state.ctx);
|
|
||||||
state.rect.startX = state.mouse.current.x;
|
|
||||||
state.rect.startY = state.mouse.current.y;
|
|
||||||
resetSelection();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state.canvasMode === "panAndZoom") {
|
|
||||||
state.imagePosition.panStartPoint.x = state.mouse.current.x - state.imagePosition.dx;
|
|
||||||
state.imagePosition.panStartPoint.y = state.mouse.current.y - state.imagePosition.dy;
|
|
||||||
resetSelection();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleMouseUp(_event: MouseEvent) {
|
|
||||||
if (state.canvasRect === null) return;
|
|
||||||
state.mouse.down = false;
|
|
||||||
state.selectedText = getWordsInSelection(props.tsv, state.rect);
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleMouseMove(event: MouseEvent) {
|
|
||||||
if (state.canvasRect === null || state.canvas === null || state.ctx === null) return;
|
|
||||||
|
|
||||||
updateMousePos(event);
|
|
||||||
|
|
||||||
if (state.mouse.down) {
|
|
||||||
if (state.canvasMode === "selection") {
|
|
||||||
state.rect.w = state.mouse.current.x - state.rect.startX;
|
|
||||||
state.rect.h = state.mouse.current.y - state.rect.startY;
|
|
||||||
draw();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state.canvasMode === "panAndZoom") {
|
|
||||||
state.canvas.style.cursor = "move";
|
|
||||||
state.imagePosition.dx = state.mouse.current.x - state.imagePosition.panStartPoint.x;
|
|
||||||
state.imagePosition.dy = state.mouse.current.y - state.imagePosition.panStartPoint.y;
|
|
||||||
keepImageInCanvas();
|
|
||||||
state.ctx.fillStyle = "rgb(255, 255, 255)";
|
|
||||||
state.ctx.fillRect(0, 0, state.canvas.width, state.canvas.height);
|
|
||||||
drawImage(state.ctx);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isMouseInRect(state.mouse, state.rect) && state.canvasMode === "selection") {
|
|
||||||
state.canvas.style.cursor = "pointer";
|
|
||||||
} else {
|
|
||||||
state.canvas.style.cursor = "default";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const scrollSensitivity = 0.05;
|
|
||||||
|
|
||||||
function handleMouseScroll(event: WheelEvent) {
|
|
||||||
if (state.isImageSmallerThanCanvas) return;
|
|
||||||
if (state.canvasRect === null || state.canvas === null || state.ctx === null) return;
|
|
||||||
|
|
||||||
if (state.canvasMode === "panAndZoom") {
|
|
||||||
event.preventDefault();
|
|
||||||
|
|
||||||
updateMousePos(event);
|
|
||||||
|
|
||||||
const m = Math.sign(event.deltaY);
|
|
||||||
|
|
||||||
const ndx = state.imagePosition.dx + m * state.imagePosition.dWidth * scrollSensitivity;
|
|
||||||
const ndy = state.imagePosition.dy + m * state.imagePosition.dHeight * scrollSensitivity;
|
|
||||||
const ndw = state.imagePosition.dWidth + -m * state.imagePosition.dWidth * scrollSensitivity * 2;
|
|
||||||
const ndh = state.imagePosition.dHeight + -m * state.imagePosition.dHeight * scrollSensitivity * 2;
|
|
||||||
|
|
||||||
if (ndw < props.image.width) {
|
|
||||||
state.imagePosition.dx = ndx;
|
|
||||||
state.imagePosition.dy = ndy;
|
|
||||||
state.imagePosition.dWidth = ndw;
|
|
||||||
state.imagePosition.dHeight = ndh;
|
|
||||||
}
|
|
||||||
|
|
||||||
keepImageInCanvas();
|
|
||||||
updateImageScale();
|
|
||||||
|
|
||||||
state.ctx.fillStyle = "rgb(255, 255, 255)";
|
|
||||||
state.ctx.fillRect(0, 0, state.canvas.width, state.canvas.height);
|
|
||||||
drawImage(state.ctx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function draw() {
|
|
||||||
if (state.canvasRect === null || state.canvas === null || state.ctx === null) return;
|
|
||||||
if (state.mouse.down) {
|
|
||||||
state.ctx.imageSmoothingEnabled = false;
|
|
||||||
state.ctx.fillStyle = "rgb(255, 255, 255)";
|
|
||||||
state.ctx.fillRect(0, 0, state.canvas.width, state.canvas.height);
|
|
||||||
drawImage(state.ctx);
|
|
||||||
state.ctx.fillStyle = "rgba(255, 255, 255, 0.1)";
|
|
||||||
state.ctx.setLineDash([6]);
|
|
||||||
state.ctx.fillRect(state.rect.startX, state.rect.startY, state.rect.w, state.rect.h);
|
|
||||||
state.ctx.strokeRect(state.rect.startX, state.rect.startY, state.rect.w, state.rect.h);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function drawImage(ctx: CanvasRenderingContext2D) {
|
|
||||||
ctx.drawImage(
|
|
||||||
props.image,
|
|
||||||
state.imagePosition.sx,
|
|
||||||
state.imagePosition.sy,
|
|
||||||
state.imagePosition.sWidth,
|
|
||||||
state.imagePosition.sHeight,
|
|
||||||
state.imagePosition.dx,
|
|
||||||
state.imagePosition.dy,
|
|
||||||
state.imagePosition.dWidth,
|
|
||||||
state.imagePosition.dHeight
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function keepImageInCanvas() {
|
|
||||||
if (state.canvasRect === null || state.canvas === null) return;
|
|
||||||
|
|
||||||
// Prevent image from being smaller than the canvas width
|
|
||||||
if (state.imagePosition.dWidth - state.canvas.width < 0) {
|
|
||||||
state.imagePosition.dWidth = state.canvas.width;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prevent image from being smaller than the canvas height
|
|
||||||
if (state.imagePosition.dHeight - state.canvas.height < 0) {
|
|
||||||
state.imagePosition.dHeight = props.image.height * state.imagePosition.scale;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prevent to move the image too much to the left
|
|
||||||
if (state.canvas.width - state.imagePosition.dx - state.imagePosition.dWidth > 0) {
|
|
||||||
state.imagePosition.dx = state.canvas.width - state.imagePosition.dWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prevent to move the image too much to the top
|
|
||||||
if (state.canvas.height - state.imagePosition.dy - state.imagePosition.dHeight > 0) {
|
|
||||||
state.imagePosition.dy = state.canvas.height - state.imagePosition.dHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prevent to move the image too much to the right
|
|
||||||
if (state.imagePosition.dx > 0) {
|
|
||||||
state.imagePosition.dx = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prevent to move the image too much to the bottom
|
|
||||||
if (state.imagePosition.dy > 0) {
|
|
||||||
state.imagePosition.dy = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateImageScale() {
|
|
||||||
state.imagePosition.scale = state.imagePosition.dWidth / props.image.width;
|
|
||||||
|
|
||||||
// force the original ratio to be respected
|
|
||||||
state.imagePosition.dHeight = props.image.height * state.imagePosition.scale;
|
|
||||||
|
|
||||||
// Don't let images bigger than the canvas be zoomed in more than 1:1 scale
|
|
||||||
// Meaning only let images smaller than the canvas to have a scale > 1
|
|
||||||
if (!state.isImageSmallerThanCanvas && state.imagePosition.scale > 1) {
|
|
||||||
state.imagePosition.scale = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function resetSelection() {
|
|
||||||
if (state.canvasRect === null) return;
|
|
||||||
state.rect.w = 0;
|
|
||||||
state.rect.h = 0;
|
|
||||||
state.selectedText = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateMousePos<T extends MouseEvent>(event: T) {
|
|
||||||
if (state.canvas === null) return;
|
|
||||||
state.canvasRect = state.canvas.getBoundingClientRect();
|
|
||||||
state.mouse.current = {
|
|
||||||
x: event.clientX - state.canvasRect.left,
|
|
||||||
y: event.clientY - state.canvasRect.top,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function isMouseInRect(mouse: Mouse, rect: CanvasRect) {
|
|
||||||
if (state.canvasRect === null) return;
|
|
||||||
const correctRect = correctRectCoordinates(rect);
|
|
||||||
|
|
||||||
return (
|
|
||||||
mouse.current.x > correctRect.startX &&
|
|
||||||
mouse.current.x < correctRect.startX + correctRect.w &&
|
|
||||||
mouse.current.y > correctRect.startY &&
|
|
||||||
mouse.current.y < correctRect.startY + correctRect.h
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns rectangle coordinates with positive dimensions
|
|
||||||
* @param rect A rectangle
|
|
||||||
* @returns An equivalent rectangle with width and height > 0
|
|
||||||
*/
|
|
||||||
function correctRectCoordinates(rect: CanvasRect) {
|
|
||||||
if (rect.w < 0) {
|
|
||||||
rect.startX = rect.startX + rect.w;
|
|
||||||
rect.w = -rect.w;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rect.h < 0) {
|
|
||||||
rect.startY = rect.startY + rect.h;
|
|
||||||
rect.h = -rect.h;
|
|
||||||
}
|
|
||||||
return rect;
|
|
||||||
}
|
|
||||||
|
|
||||||
function drawWordBoxesOnCanvas(tsv: OcrTsvResponse[]) {
|
|
||||||
if (state.canvasRect === null || state.canvas === null || state.ctx === null) return;
|
|
||||||
|
|
||||||
state.ctx.fillStyle = "rgb(255, 255, 255, 0.3)";
|
|
||||||
tsv
|
|
||||||
.filter((element) => element.level === 5)
|
|
||||||
.forEach((element) => {
|
|
||||||
if (state.canvasRect === null || state.canvas === null || state.ctx === null) return;
|
|
||||||
state.ctx.fillRect(
|
|
||||||
element.left * state.imagePosition.scale,
|
|
||||||
element.top * state.imagePosition.scale,
|
|
||||||
element.width * state.imagePosition.scale,
|
|
||||||
element.height * state.imagePosition.scale
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Event emitters
|
|
||||||
const updateRecipe = function () {
|
|
||||||
context.emit("update-recipe");
|
|
||||||
};
|
|
||||||
|
|
||||||
const closeEditor = function () {
|
|
||||||
context.emit("close-editor");
|
|
||||||
};
|
|
||||||
|
|
||||||
// TOOLBAR STUFF
|
|
||||||
|
|
||||||
const { $globals, i18n } = useContext();
|
|
||||||
|
|
||||||
const toolbarIcons = ref<ToolbarIcons<CanvasModes | SelectedTextSplitModes>>([
|
|
||||||
{
|
|
||||||
sectionTitle: i18n.tc("ocr-editor.toolbar"),
|
|
||||||
eventHandler: switchCanvasMode,
|
|
||||||
highlight: state.canvasMode,
|
|
||||||
icons: [
|
|
||||||
{
|
|
||||||
name: "selection",
|
|
||||||
icon: $globals.icons.selectMode,
|
|
||||||
tooltip: i18n.tc("ocr-editor.selection-mode"),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "panAndZoom",
|
|
||||||
icon: $globals.icons.panAndZoom,
|
|
||||||
tooltip: i18n.tc("ocr-editor.pan-and-zoom-picture"),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
sectionTitle: i18n.tc("ocr-editor.split-text"),
|
|
||||||
eventHandler: switchSplitTextMode,
|
|
||||||
highlight: state.selectedTextSplitMode,
|
|
||||||
icons: [
|
|
||||||
{
|
|
||||||
name: "lineNum",
|
|
||||||
icon: $globals.icons.preserveLines,
|
|
||||||
tooltip: i18n.tc("ocr-editor.preserve-line-breaks"),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "blockNum",
|
|
||||||
icon: $globals.icons.preserveBlocks,
|
|
||||||
tooltip: i18n.tc("ocr-editor.split-by-block"),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "flatten",
|
|
||||||
icon: $globals.icons.flatten,
|
|
||||||
tooltip: i18n.tc("ocr-editor.flatten"),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
|
|
||||||
function switchCanvasMode(mode: CanvasModes) {
|
|
||||||
if (state.canvasRect === null || state.canvas === null) return;
|
|
||||||
state.canvasMode = mode;
|
|
||||||
toolbarIcons.value[0].highlight = mode;
|
|
||||||
if (mode === "panAndZoom") {
|
|
||||||
state.canvas.style.cursor = "pointer";
|
|
||||||
} else {
|
|
||||||
state.canvas.style.cursor = "default";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function switchSplitTextMode(mode: SelectedTextSplitModes) {
|
|
||||||
if (state.canvasRect === null) return;
|
|
||||||
state.selectedTextSplitMode = mode;
|
|
||||||
toolbarIcons.value[1].highlight = mode;
|
|
||||||
state.selectedText = getWordsInSelection(props.tsv, state.rect);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Using rectangle coordinates, filters the tsv to get text elements contained
|
|
||||||
* inside the rectangle
|
|
||||||
* Additionaly adds newlines depending on the current "text split" mode
|
|
||||||
* @param tsv An Object containing tesseracts tsv fields
|
|
||||||
* @param rect Coordinates of a rectangle
|
|
||||||
* @returns Text from tsv contained in the rectangle
|
|
||||||
*/
|
|
||||||
function getWordsInSelection(tsv: OcrTsvResponse[], rect: CanvasRect) {
|
|
||||||
const correctedRect = correctRectCoordinates(rect);
|
|
||||||
|
|
||||||
return tsv
|
|
||||||
.filter(
|
|
||||||
(element) =>
|
|
||||||
element.level === 5 &&
|
|
||||||
correctedRect.startY - state.imagePosition.dy < element.top * state.imagePosition.scale &&
|
|
||||||
correctedRect.startX - state.imagePosition.dx < element.left * state.imagePosition.scale &&
|
|
||||||
correctedRect.startX + correctedRect.w >
|
|
||||||
(element.left + element.width) * state.imagePosition.scale + state.imagePosition.dx &&
|
|
||||||
correctedRect.startY + correctedRect.h >
|
|
||||||
(element.top + element.height) * state.imagePosition.scale + state.imagePosition.dy
|
|
||||||
)
|
|
||||||
.map((element, index, array) => {
|
|
||||||
let separator = " ";
|
|
||||||
if (
|
|
||||||
state.selectedTextSplitMode !== "flatten" &&
|
|
||||||
index !== array.length - 1 &&
|
|
||||||
element[state.selectedTextSplitMode] !== array[index + 1][state.selectedTextSplitMode]
|
|
||||||
) {
|
|
||||||
separator = "\n";
|
|
||||||
}
|
|
||||||
return element.text + separator;
|
|
||||||
})
|
|
||||||
.join("");
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
...toRefs(state),
|
|
||||||
handleMouseDown,
|
|
||||||
handleMouseUp,
|
|
||||||
handleMouseMove,
|
|
||||||
handleMouseScroll,
|
|
||||||
toolbarIcons,
|
|
||||||
updateRecipe,
|
|
||||||
closeEditor,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
</script>
|
|
@ -1,54 +0,0 @@
|
|||||||
<template>
|
|
||||||
<v-card>
|
|
||||||
<v-app-bar dense dark color="primary" class="mb-2">
|
|
||||||
<v-icon large left>
|
|
||||||
{{ $globals.icons.help }}
|
|
||||||
</v-icon>
|
|
||||||
<v-toolbar-title class="headline"> {{ $t("ocr-editor.help.help") }} </v-toolbar-title>
|
|
||||||
<v-spacer></v-spacer>
|
|
||||||
</v-app-bar>
|
|
||||||
<v-card-text>
|
|
||||||
<h1> {{ $t("ocr-editor.help.mouse-modes") }}</h1>
|
|
||||||
<v-divider class="mb-2 mt-1" />
|
|
||||||
<h2 class="my-2">
|
|
||||||
<v-icon> {{ $globals.icons.selectMode }} </v-icon>{{ $t("ocr-editor.help.selection-mode") }}
|
|
||||||
</h2>
|
|
||||||
<p class="my-1">{{ $t("ocr-editor.help.selection-mode") }}</p>
|
|
||||||
<ol>
|
|
||||||
<li>{{ $t("ocr-editor.help.selection-mode-steps.draw") }}</li>
|
|
||||||
<li>{{ $t("ocr-editor.help.selection-mode-steps.click") }}</li>
|
|
||||||
<li>{{ $t("ocr-editor.help.selection-mode-steps.result") }}</li>
|
|
||||||
</ol>
|
|
||||||
<h2 class="my-2">
|
|
||||||
<v-icon> {{ $globals.icons.panAndZoom }} </v-icon>{{ $t("ocr-editor.help.pan-and-zoom-mode") }}
|
|
||||||
</h2>
|
|
||||||
{{ $t("ocr-editor.help.pan-and-zoom-desc") }}
|
|
||||||
<h1 class="mt-5">{{ $t("ocr-editor.help.split-text-mode") }}</h1>
|
|
||||||
<v-divider class="mb-2 mt-1" />
|
|
||||||
<h2 class="my-2">
|
|
||||||
<v-icon> {{ $globals.icons.preserveLines }} </v-icon>
|
|
||||||
{{ $t("ocr-editor.help.split-modes.line-mode") }}
|
|
||||||
</h2>
|
|
||||||
<p>
|
|
||||||
{{ $t("ocr-editor.help.split-modes.line-mode-desc") }}
|
|
||||||
</p>
|
|
||||||
<h2 class="my-2">
|
|
||||||
<v-icon> {{ $globals.icons.preserveBlocks }} </v-icon>
|
|
||||||
{{ $t("ocr-editor.help.split-modes.block-mode") }}
|
|
||||||
</h2>
|
|
||||||
<p>
|
|
||||||
{{ $t("ocr-editor.help.split-modes.block-mode-desc") }}
|
|
||||||
</p>
|
|
||||||
<h2 class="my-2">
|
|
||||||
<v-icon> {{ $globals.icons.flatten }} </v-icon> {{ $t("ocr-editor.help.split-modes.flat-mode") }}
|
|
||||||
</h2>
|
|
||||||
<p>{{ $t("ocr-editor.help.split-modes.flat-mode-desc") }}</p>
|
|
||||||
</v-card-text>
|
|
||||||
</v-card>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import { defineComponent } from "@nuxtjs/composition-api";
|
|
||||||
|
|
||||||
export default defineComponent({});
|
|
||||||
</script>
|
|
@ -1,3 +0,0 @@
|
|||||||
import RecipeOcrEditorPage from "./RecipeOcrEditorPage.vue";
|
|
||||||
|
|
||||||
export default RecipeOcrEditorPage;
|
|
@ -5,12 +5,15 @@
|
|||||||
<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()">
|
||||||
@ -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
|
||||||
|
@ -50,7 +50,6 @@
|
|||||||
:logged-in="isOwnGroup"
|
:logged-in="isOwnGroup"
|
||||||
:open="isEditMode"
|
:open="isEditMode"
|
||||||
:recipe-id="recipe.id"
|
:recipe-id="recipe.id"
|
||||||
:show-ocr-button="recipe.isOcrRecipe"
|
|
||||||
class="ml-auto mt-n8 pb-4"
|
class="ml-auto mt-n8 pb-4"
|
||||||
@close="setMode(PageMode.VIEW)"
|
@close="setMode(PageMode.VIEW)"
|
||||||
@json="toggleEditMode()"
|
@json="toggleEditMode()"
|
||||||
@ -58,13 +57,12 @@
|
|||||||
@save="$emit('save')"
|
@save="$emit('save')"
|
||||||
@delete="$emit('delete')"
|
@delete="$emit('delete')"
|
||||||
@print="printRecipe"
|
@print="printRecipe"
|
||||||
@ocr="goToOcrEditor"
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { defineComponent, useContext, computed, ref, watch, useRouter, useRoute } from "@nuxtjs/composition-api";
|
import { defineComponent, useContext, computed, ref, watch } from "@nuxtjs/composition-api";
|
||||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||||
import RecipeRating from "~/components/Domain/Recipe/RecipeRating.vue";
|
import RecipeRating from "~/components/Domain/Recipe/RecipeRating.vue";
|
||||||
import RecipeLastMade from "~/components/Domain/Recipe/RecipeLastMade.vue";
|
import RecipeLastMade from "~/components/Domain/Recipe/RecipeLastMade.vue";
|
||||||
@ -96,16 +94,12 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
setup(props) {
|
setup(props) {
|
||||||
const { $auth, $vuetify } = useContext();
|
const { $vuetify } = useContext();
|
||||||
const { recipeImage } = useStaticRoutes();
|
const { recipeImage } = useStaticRoutes();
|
||||||
const { imageKey, pageMode, editMode, setMode, toggleEditMode, isEditMode } = usePageState(props.recipe.slug);
|
const { imageKey, pageMode, editMode, setMode, toggleEditMode, isEditMode } = usePageState(props.recipe.slug);
|
||||||
const { user } = usePageUser();
|
const { user } = usePageUser();
|
||||||
const { isOwnGroup } = useLoggedInState();
|
const { isOwnGroup } = useLoggedInState();
|
||||||
|
|
||||||
const route = useRoute();
|
|
||||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
|
||||||
const router = useRouter();
|
|
||||||
|
|
||||||
function printRecipe() {
|
function printRecipe() {
|
||||||
window.print();
|
window.print();
|
||||||
}
|
}
|
||||||
@ -119,10 +113,6 @@ export default defineComponent({
|
|||||||
return recipeImage(props.recipe.id, props.recipe.image, imageKey.value);
|
return recipeImage(props.recipe.id, props.recipe.image, imageKey.value);
|
||||||
});
|
});
|
||||||
|
|
||||||
function goToOcrEditor() {
|
|
||||||
router.push(`/g/${groupSlug.value}/r/${props.recipe.slug}/ocr-editor`);
|
|
||||||
}
|
|
||||||
|
|
||||||
watch(
|
watch(
|
||||||
() => recipeImageUrl.value,
|
() => recipeImageUrl.value,
|
||||||
() => {
|
() => {
|
||||||
@ -146,7 +136,6 @@ export default defineComponent({
|
|||||||
hideImage,
|
hideImage,
|
||||||
isEditMode,
|
isEditMode,
|
||||||
recipeImageUrl,
|
recipeImageUrl,
|
||||||
goToOcrEditor,
|
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -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,
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<v-tooltip
|
<v-tooltip
|
||||||
ref="copyToolTip"
|
ref="copyToolTip"
|
||||||
v-model="show"
|
v-model="show"
|
||||||
color="success lighten-1"
|
:color="copied? 'success lighten-1' : 'red lighten-1'"
|
||||||
top
|
top
|
||||||
:open-on-hover="false"
|
:open-on-hover="false"
|
||||||
:open-on-click="true"
|
:open-on-click="true"
|
||||||
@ -29,12 +29,14 @@
|
|||||||
<v-icon left dark>
|
<v-icon left dark>
|
||||||
{{ $globals.icons.clipboardCheck }}
|
{{ $globals.icons.clipboardCheck }}
|
||||||
</v-icon>
|
</v-icon>
|
||||||
<slot> {{ $t("general.copied_message") }} </slot>
|
<slot v-if="!isSupported"> {{ $t("general.your-browser-does-not-support-clipboard") }} </slot>
|
||||||
|
<slot v-else> {{ copied ? $t("general.copied_message") : $t("general.clipboard-copy-failure") }} </slot>
|
||||||
</span>
|
</span>
|
||||||
</v-tooltip>
|
</v-tooltip>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
|
import { useClipboard } from "@vueuse/core"
|
||||||
import { defineComponent, ref } from "@nuxtjs/composition-api";
|
import { defineComponent, ref } from "@nuxtjs/composition-api";
|
||||||
import { VTooltip } from "~/types/vuetify";
|
import { VTooltip } from "~/types/vuetify";
|
||||||
|
|
||||||
@ -58,6 +60,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
setup(props) {
|
setup(props) {
|
||||||
|
const { copy, copied, isSupported } = useClipboard()
|
||||||
const show = ref(false);
|
const show = ref(false);
|
||||||
const copyToolTip = ref<VTooltip | null>(null);
|
const copyToolTip = ref<VTooltip | null>(null);
|
||||||
|
|
||||||
@ -65,13 +68,21 @@ export default defineComponent({
|
|||||||
copyToolTip.value?.deactivate();
|
copyToolTip.value?.deactivate();
|
||||||
}
|
}
|
||||||
|
|
||||||
function textToClipboard() {
|
async function textToClipboard() {
|
||||||
|
if (isSupported.value) {
|
||||||
|
await copy(props.copyText);
|
||||||
|
if (copied.value) {
|
||||||
|
console.log(`Copied\n${props.copyText}`)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
console.warn("Copy failed: ", copied.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
console.warn("Clipboard is currently not supported by your browser. Ensure you're on a secure (https) site.");
|
||||||
|
}
|
||||||
|
|
||||||
show.value = true;
|
show.value = true;
|
||||||
const copyText = props.copyText;
|
|
||||||
navigator.clipboard.writeText(copyText).then(
|
|
||||||
() => console.log(`Copied\n${copyText}`),
|
|
||||||
() => console.log(`Copied Failed\n${copyText}`)
|
|
||||||
);
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
toggleBlur();
|
toggleBlur();
|
||||||
}, 500);
|
}, 500);
|
||||||
@ -81,6 +92,8 @@ export default defineComponent({
|
|||||||
show,
|
show,
|
||||||
copyToolTip,
|
copyToolTip,
|
||||||
textToClipboard,
|
textToClipboard,
|
||||||
|
copied,
|
||||||
|
isSupported,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -7,23 +7,30 @@ export function useCopy() {
|
|||||||
const { i18n } = useContext();
|
const { i18n } = useContext();
|
||||||
|
|
||||||
function copyText(text: string) {
|
function copyText(text: string) {
|
||||||
if (!isSupported) {
|
if (!isSupported.value) {
|
||||||
alert.error(i18n.tc("general.clipboard-not-supported"));
|
alert.error(i18n.tc("general.clipboard-not-supported"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
copy(text);
|
copy(text).then(() => {
|
||||||
alert.success(i18n.tc("general.copied-to-clipboard"));
|
// Verify copy success as no error is thrown on failure.
|
||||||
|
if (copied.value) {
|
||||||
|
alert.success(i18n.tc("general.copied-to-clipboard"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
alert.error(i18n.tc("general.clipboard-copy-failure"));
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
return { copyText, copied };
|
return { copyText, copied };
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useCopyList() {
|
export function useCopyList() {
|
||||||
const { copy, isSupported } = useClipboard();
|
const { copy, isSupported, copied } = useClipboard();
|
||||||
const { i18n } = useContext();
|
const { i18n } = useContext();
|
||||||
|
|
||||||
function checkClipboard() {
|
function checkClipboard() {
|
||||||
if (!isSupported) {
|
if (!isSupported.value) {
|
||||||
alert.error(i18n.tc("general.your-browser-does-not-support-clipboard"));
|
alert.error(i18n.tc("general.your-browser-does-not-support-clipboard"));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -54,7 +61,13 @@ export function useCopyList() {
|
|||||||
|
|
||||||
function copyText(text: string, len: number) {
|
function copyText(text: string, len: number) {
|
||||||
copy(text).then(() => {
|
copy(text).then(() => {
|
||||||
alert.success(i18n.tc("general.copied-items-to-clipboard", len));
|
// Verify copy success as no error is thrown on failure.
|
||||||
|
if (copied.value) {
|
||||||
|
alert.success(i18n.tc("general.copied-items-to-clipboard", len));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
alert.error(i18n.tc("general.clipboard-copy-failure"));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Verfris",
|
"refresh": "Verfris",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "Hoe het dit uitgedraai?",
|
"how-did-it-turn-out": "Hoe het dit uitgedraai?",
|
||||||
"user-made-this": "{user} het dit gemaak",
|
"user-made-this": "{user} het dit gemaak",
|
||||||
"last-made-date": "Laas gemaak {date}",
|
"last-made-date": "Laas gemaak {date}",
|
||||||
"api-extras-description": "Resepte ekstras is 'n belangrike funksie van die Mealie API. Hulle laat jou toe om pasgemaakte json-sleutel/waarde-pare binne 'n resep te skep om na derdeparty-toepassings te verwys. Jy kan hierdie sleutels gebruik om inligting te bevat om outomatisering of pasgemaakte boodskappe na die gewenste toestel te stuur.",
|
"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": "Boodskap sleutel",
|
"message-key": "Boodskap sleutel",
|
||||||
"parse": "Verwerk",
|
"parse": "Verwerk",
|
||||||
"attach-images-hint": "Voeg prente by deur dit in die bewerker te sleep en los",
|
"attach-images-hint": "Voeg prente by deur dit in die bewerker te sleep en los",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
|
@ -128,7 +128,7 @@
|
|||||||
"no-recipe-found": "لم يتم العثور على وصفة",
|
"no-recipe-found": "لم يتم العثور على وصفة",
|
||||||
"ok": "موافق",
|
"ok": "موافق",
|
||||||
"options": "الخيارات:",
|
"options": "الخيارات:",
|
||||||
"plural-name": "Plural Name",
|
"plural-name": "إسم المعدود",
|
||||||
"print": "طباعة",
|
"print": "طباعة",
|
||||||
"print-preferences": "إعدادات الطباعة",
|
"print-preferences": "إعدادات الطباعة",
|
||||||
"random": "عشوائي",
|
"random": "عشوائي",
|
||||||
@ -191,14 +191,15 @@
|
|||||||
"clipboard-not-supported": "الحافظة غير مدعومة",
|
"clipboard-not-supported": "الحافظة غير مدعومة",
|
||||||
"copied-to-clipboard": "نُسِخَ إلى الحافظة",
|
"copied-to-clipboard": "نُسِخَ إلى الحافظة",
|
||||||
"your-browser-does-not-support-clipboard": "المتصفح الخاص بك لا يدعم الحافظة",
|
"your-browser-does-not-support-clipboard": "المتصفح الخاص بك لا يدعم الحافظة",
|
||||||
"copied-items-to-clipboard": "No item copied to clipboard|One item copied to clipboard|Copied {count} items to clipboard",
|
"copied-items-to-clipboard": "لم يتم نسخ أي عنصر إلى الحافظة<unk> عنصر واحد تم نسخه إلى الحافظة<unk> تم نسخه إلى الحافظة {count}",
|
||||||
"actions": "الإجراءت",
|
"actions": "الإجراءت",
|
||||||
"selected-count": "تم اختيار: {count}",
|
"selected-count": "تم اختيار: {count}",
|
||||||
"export-all": "تصدير الكل",
|
"export-all": "تصدير الكل",
|
||||||
"refresh": "تحديث",
|
"refresh": "تحديث",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/>؟",
|
||||||
@ -213,7 +214,7 @@
|
|||||||
"group-id-with-value": "رقم تعريف المجموعة: {groupID}",
|
"group-id-with-value": "رقم تعريف المجموعة: {groupID}",
|
||||||
"group-name": "اسم المجموعة",
|
"group-name": "اسم المجموعة",
|
||||||
"group-not-found": "لم يتم العثور على المجموعة",
|
"group-not-found": "لم يتم العثور على المجموعة",
|
||||||
"group-token": "Group Token",
|
"group-token": "رمز المجموعة",
|
||||||
"group-with-value": "المجموعة: {groupID}",
|
"group-with-value": "المجموعة: {groupID}",
|
||||||
"groups": "المجموعات",
|
"groups": "المجموعات",
|
||||||
"manage-groups": "إدارة المجموعات",
|
"manage-groups": "إدارة المجموعات",
|
||||||
@ -226,7 +227,7 @@
|
|||||||
},
|
},
|
||||||
"manage-members": "إدارة الأعضاء",
|
"manage-members": "إدارة الأعضاء",
|
||||||
"manage-members-description": "Manage the permissions of the members in your groups. {manage} allows the user to access the data-management page {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.",
|
"manage-members-description": "Manage the permissions of the members in your groups. {manage} allows the user to access the data-management page {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.",
|
||||||
"manage": "Manage",
|
"manage": "إدارة الحساب",
|
||||||
"invite": "دعوة",
|
"invite": "دعوة",
|
||||||
"looking-to-update-your-profile": "هل ترغب في تحديث ملفك الشخصي؟",
|
"looking-to-update-your-profile": "هل ترغب في تحديث ملفك الشخصي؟",
|
||||||
"default-recipe-preferences-description": "هذه هي الإعدادات الافتراضية عند إنشاء وصفة جديدة في مجموعتك. يمكن تغيير هذه الوصفات الفردية في قائمة إعدادات الوصفات.",
|
"default-recipe-preferences-description": "هذه هي الإعدادات الافتراضية عند إنشاء وصفة جديدة في مجموعتك. يمكن تغيير هذه الوصفات الفردية في قائمة إعدادات الوصفات.",
|
||||||
@ -234,7 +235,7 @@
|
|||||||
"group-preferences": "إعدادات المجموعة",
|
"group-preferences": "إعدادات المجموعة",
|
||||||
"private-group": "مجموعة خاصة",
|
"private-group": "مجموعة خاصة",
|
||||||
"private-group-description": "Setting your group to private will default all public view options to default. This overrides an individual recipes public view settings.",
|
"private-group-description": "Setting your group to private will default all public view options to default. This overrides an individual recipes public view settings.",
|
||||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Allow users outside of your group to see your recipes",
|
"allow-users-outside-of-your-group-to-see-your-recipes": "السماح للمستخدمين خارج مجموعتك لمشاهدة وصفاتك",
|
||||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your group or with a pre-generated private link",
|
"allow-users-outside-of-your-group-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your group or with a pre-generated private link",
|
||||||
"show-nutrition-information": "عرض معلومات التغذية",
|
"show-nutrition-information": "عرض معلومات التغذية",
|
||||||
"show-nutrition-information-description": "When enabled the nutrition information will be shown on the recipe if available. If there is no nutrition information available, the nutrition information will not be shown",
|
"show-nutrition-information-description": "When enabled the nutrition information will be shown on the recipe if available. If there is no nutrition information available, the nutrition information will not be shown",
|
||||||
@ -290,24 +291,24 @@
|
|||||||
"type-any": "أي",
|
"type-any": "أي",
|
||||||
"day-any": "أي",
|
"day-any": "أي",
|
||||||
"editor": "Editor",
|
"editor": "Editor",
|
||||||
"meal-recipe": "Meal Recipe",
|
"meal-recipe": "وصفة الوجبة",
|
||||||
"meal-title": "Meal Title",
|
"meal-title": "عنوان الوجبة",
|
||||||
"meal-note": "Meal Note",
|
"meal-note": "ملاحظة الوجبة",
|
||||||
"note-only": "Note Only",
|
"note-only": "ملاحظة فقط",
|
||||||
"random-meal": "وجبة عشوائية",
|
"random-meal": "وجبة عشوائية",
|
||||||
"random-dinner": "عشاء عشوائي",
|
"random-dinner": "عشاء عشوائي",
|
||||||
"random-side": "Random Side",
|
"random-side": "Random Side",
|
||||||
"this-rule-will-apply": "This rule will apply {dayCriteria} {mealTypeCriteria}.",
|
"this-rule-will-apply": "This rule will apply {dayCriteria} {mealTypeCriteria}.",
|
||||||
"to-all-days": "إلى جميع الأيام",
|
"to-all-days": "إلى جميع الأيام",
|
||||||
"on-days": "on {0}s",
|
"on-days": "on {0}s",
|
||||||
"for-all-meal-types": "for all meal types",
|
"for-all-meal-types": "لجميع أنواع الوجبات",
|
||||||
"for-type-meal-types": "for {0} meal types",
|
"for-type-meal-types": "for {0} meal types",
|
||||||
"meal-plan-rules": "Meal Plan Rules",
|
"meal-plan-rules": "Meal Plan Rules",
|
||||||
"new-rule": "قاعدة جديدة",
|
"new-rule": "قاعدة جديدة",
|
||||||
"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": "قواعد الوصفات",
|
||||||
"applies-to-all-days": "Applies to all days",
|
"applies-to-all-days": "ينطبق على جميع الأيام",
|
||||||
"applies-on-days": "Applies on {0}s",
|
"applies-on-days": "Applies on {0}s",
|
||||||
"meal-plan-settings": "Meal Plan Settings"
|
"meal-plan-settings": "Meal Plan Settings"
|
||||||
},
|
},
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "How did it turn out?",
|
"how-did-it-turn-out": "How did it turn out?",
|
||||||
"user-made-this": "{user} made this",
|
"user-made-this": "{user} made this",
|
||||||
"last-made-date": "Last Made {date}",
|
"last-made-date": "Last Made {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 part applications. You can use these keys to contain information to trigger automation 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": "Message Key",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Опресни",
|
"refresh": "Опресни",
|
||||||
"upload-file": "Качване на файл",
|
"upload-file": "Качване на файл",
|
||||||
"created-on-date": "Създадено на {0}",
|
"created-on-date": "Създадено на {0}",
|
||||||
"unsaved-changes": "Имате незапазени промени. Желаете ли да ги запазите преди да излезете? Натиснете Ок за запазване и Отказ за отхвърляне на промените."
|
"unsaved-changes": "Имате незапазени промени. Желаете ли да ги запазите преди да излезете? Натиснете Ок за запазване и Отказ за отхвърляне на промените.",
|
||||||
|
"clipboard-copy-failure": "Линкът към рецептата е копиран в клипборда."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -249,7 +250,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": "Промените по тази група ще бъдат отразени моментално.",
|
||||||
@ -510,11 +511,11 @@
|
|||||||
"how-did-it-turn-out": "Как се получи?",
|
"how-did-it-turn-out": "Как се получи?",
|
||||||
"user-made-this": "{user} направи това",
|
"user-made-this": "{user} направи това",
|
||||||
"last-made-date": "Последно приготвена на {date}",
|
"last-made-date": "Последно приготвена на {date}",
|
||||||
"api-extras-description": "Екстрите за рецепти са ключова характеристика на Mealie API. Те Ви позволяват да създавате персонализирани json двойки ключ/стойност в рамките на рецепта, за да ги препращате към други приложения. Можете да използвате тези ключове, за да съдържате информация за задействане на автоматизация или персонализирани съобщения, за препращане към желаното от Вас устройство.",
|
"api-extras-description": "Екстрите за рецепти са ключова характеристика на Mealie API. Те Ви позволяват да създавате персонализирани JSON двойки ключ/стойност в рамките на рецепта, за да ги препращате към други приложения. Можете да използвате тези ключове, за да предоставите информация за задействане на автоматизация или персонализирани съобщения, за препращане към желаното от Вас устройство.",
|
||||||
"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": "Анализирай съставките",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,8 @@
|
|||||||
"unit": "Единица",
|
"unit": "Единица",
|
||||||
"upload-image": "Качване на изображение",
|
"upload-image": "Качване на изображение",
|
||||||
"screen-awake": "Запази екрана активен",
|
"screen-awake": "Запази екрана активен",
|
||||||
"remove-image": "Премахване на изображение"
|
"remove-image": "Премахване на изображение",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Разширено търсене",
|
"advanced-search": "Разширено търсене",
|
||||||
@ -788,7 +792,8 @@
|
|||||||
"tags": "Тагове",
|
"tags": "Тагове",
|
||||||
"untagged-count": "Без таг {count}",
|
"untagged-count": "Без таг {count}",
|
||||||
"create-a-tag": "Създаване на таг",
|
"create-a-tag": "Създаване на таг",
|
||||||
"tag-name": "Име на тага"
|
"tag-name": "Име на тага",
|
||||||
|
"tag": "Тагове"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Инструменти",
|
"tools": "Инструменти",
|
||||||
@ -797,7 +802,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": "Админ",
|
||||||
|
@ -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...",
|
||||||
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Actualitza",
|
"refresh": "Actualitza",
|
||||||
"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": "No s'ha pogut copiar al porta-retalls."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -293,7 +294,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",
|
||||||
@ -510,8 +511,8 @@
|
|||||||
"how-did-it-turn-out": "Com ha sortit?",
|
"how-did-it-turn-out": "Com ha sortit?",
|
||||||
"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 part applications. You can use these keys to contain information to trigger automation 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",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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",
|
||||||
@ -695,8 +699,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",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
@ -889,7 +895,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."
|
||||||
},
|
},
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Obnovit",
|
"refresh": "Obnovit",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "Jak to dopadlo?",
|
"how-did-it-turn-out": "Jak to dopadlo?",
|
||||||
"user-made-this": "{user} udělal toto",
|
"user-made-this": "{user} udělal toto",
|
||||||
"last-made-date": "Naposledy uvařeno {date}",
|
"last-made-date": "Naposledy uvařeno {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 part applications. You can use these keys to contain information to trigger automation 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": "Message Key",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Pokročilé vyhledávání",
|
"advanced-search": "Pokročilé vyhledávání",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Opdater",
|
"refresh": "Opdater",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "Hvordan blev det?",
|
"how-did-it-turn-out": "Hvordan blev det?",
|
||||||
"user-made-this": "{user} lavede denne",
|
"user-made-this": "{user} lavede denne",
|
||||||
"last-made-date": "Sidst tilberedt den {date}",
|
"last-made-date": "Sidst tilberedt den {date}",
|
||||||
"api-extras-description": "Brugerdefinerede oplysninger i opskrifter i Mealie's gør det muligt at oprette JSON data bestående af en nøgle og tilhørende værdier. Data udstilles i Mealie's API og kan bruges af andre applikationer til at udløse automatiseringer eller vise brugerdefineret indhold.",
|
"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": "Beskednøgle",
|
"message-key": "Beskednøgle",
|
||||||
"parse": "Behandl data",
|
"parse": "Behandl data",
|
||||||
"attach-images-hint": "Vedhæft billeder ved at trække dem ind i redigeringsværktøjet",
|
"attach-images-hint": "Vedhæft billeder ved at trække dem ind i redigeringsværktøjet",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Aktualisieren",
|
"refresh": "Aktualisieren",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "Wie ist es geworden?",
|
"how-did-it-turn-out": "Wie ist es geworden?",
|
||||||
"user-made-this": "{user} hat's gemacht",
|
"user-made-this": "{user} hat's gemacht",
|
||||||
"last-made-date": "Zuletzt gemacht {date}",
|
"last-made-date": "Zuletzt gemacht {date}",
|
||||||
"api-extras-description": "Rezepte-Extras sind ein Hauptmerkmal der Mealie API. Sie ermöglichen es dir, benutzerdefinierte JSON Schlüssel/Wert-Paare zu einem Rezept zu erstellen, um Anwendungen von Drittanbietern zu steuern. Du kannst diese Schlüssel dazu verwenden, Automatisierungen auszulösen oder benutzerdefinierte Nachrichten an deine gewünschten Geräte zu senden.",
|
"api-extras-description": "Rezepte-Extras sind ein Hauptmerkmal der Mealie API. Sie ermöglichen es dir, benutzerdefinierte JSON Key-Value-Paare zu einem Rezept zu erstellen, um Drittanbietern-Anwendungen zu steuern. Du kannst diese dazu verwenden, um Automatisierungen auszulösen oder benutzerdefinierte Nachrichten an bestimmte Geräte zu senden.",
|
||||||
"message-key": "Nachrichten-Schlüssel",
|
"message-key": "Nachrichten-Schlüssel",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Bilder durch Ziehen & Ablegen in den Editor hinzufügen",
|
"attach-images-hint": "Bilder durch Ziehen & Ablegen in den Editor hinzufügen",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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",
|
||||||
@ -644,16 +648,16 @@
|
|||||||
"primary": "Primär",
|
"primary": "Primär",
|
||||||
"secondary": "Sekundär",
|
"secondary": "Sekundär",
|
||||||
"success": "Erfolg",
|
"success": "Erfolg",
|
||||||
"switch-to-dark-mode": "Zum dunklen Modus wechseln",
|
"switch-to-dark-mode": "Zum dunklen Design wechseln",
|
||||||
"switch-to-light-mode": "Zum hellen Modus wechseln",
|
"switch-to-light-mode": "Zum hellen Design wechseln",
|
||||||
"theme-deleted": "Thema gelöscht",
|
"theme-deleted": "Thema gelöscht",
|
||||||
"theme-name": "Themenname",
|
"theme-name": "Themenname",
|
||||||
"theme-name-is-required": "Themenname wird benötigt.",
|
"theme-name-is-required": "Themenname wird benötigt.",
|
||||||
"theme-saved": "Thema gespeichert",
|
"theme-saved": "Thema gespeichert",
|
||||||
"theme-updated": "Thema aktualisiert",
|
"theme-updated": "Thema aktualisiert",
|
||||||
"warning": "Warnung",
|
"warning": "Warnung",
|
||||||
"light-mode": "Heller Modus",
|
"light-mode": "Helles Design",
|
||||||
"dark-mode": "Dunkler Modus"
|
"dark-mode": "Dunkles Design"
|
||||||
},
|
},
|
||||||
"token": {
|
"token": {
|
||||||
"active-tokens": "AKTIVE TOKEN",
|
"active-tokens": "AKTIVE TOKEN",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Ανανέωση",
|
"refresh": "Ανανέωση",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/>;",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "How did it turn out?",
|
"how-did-it-turn-out": "How did it turn out?",
|
||||||
"user-made-this": "{user} made this",
|
"user-made-this": "{user} made this",
|
||||||
"last-made-date": "Last Made {date}",
|
"last-made-date": "Last Made {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 part applications. You can use these keys to contain information to trigger automation 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": "Message Key",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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": "Σύνθετη Αναζήτηση",
|
||||||
@ -788,7 +792,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": "Εργαλεία",
|
||||||
@ -797,7 +802,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": "Διαχειριστής",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Refresh",
|
"refresh": "Refresh",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "How did it turn out?",
|
"how-did-it-turn-out": "How did it turn out?",
|
||||||
"user-made-this": "{user} made this",
|
"user-made-this": "{user} made this",
|
||||||
"last-made-date": "Last Made {date}",
|
"last-made-date": "Last Made {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 part applications. You can use these keys to contain information to trigger automation 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": "Message Key",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
@ -880,7 +886,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",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Refresh",
|
"refresh": "Refresh",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -511,7 +512,7 @@
|
|||||||
"how-did-it-turn-out": "How did it turn out?",
|
"how-did-it-turn-out": "How did it turn out?",
|
||||||
"user-made-this": "{user} made this",
|
"user-made-this": "{user} made this",
|
||||||
"last-made-date": "Last Made {date}",
|
"last-made-date": "Last Made {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 part applications. You can use these keys to contain information to trigger automation 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": "Message Key",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||||
@ -533,6 +534,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 +558,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 +793,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 +803,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",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"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": "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."
|
||||||
},
|
},
|
||||||
"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/>",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"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": "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.",
|
"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": "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",
|
||||||
@ -532,6 +533,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": "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": "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",
|
||||||
@ -554,7 +557,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": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Búsqueda avanzada",
|
"advanced-search": "Búsqueda avanzada",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Päivitä",
|
"refresh": "Päivitä",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "Miten se onnistui?",
|
"how-did-it-turn-out": "Miten se onnistui?",
|
||||||
"user-made-this": "{user} teki tämän",
|
"user-made-this": "{user} teki tämän",
|
||||||
"last-made-date": "Viimeksi valmistettu {date}",
|
"last-made-date": "Viimeksi valmistettu {date}",
|
||||||
"api-extras-description": "Reseptilisät ovat Mealie API: n avainominaisuus. Niiden avulla voit luoda mukautettuja json-avain/arvo-pareja reseptin sisällä viitaten kolmannen osapuolen sovelluksiin. Voit käyttää näitä pareja sisältämään tietoja automaation käynnistämiseksi tai mukautettuja viestejä välitettäväksi haluamaasi laitteeseen.",
|
"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": "Viestiavain",
|
"message-key": "Viestiavain",
|
||||||
"parse": "Jäsennä",
|
"parse": "Jäsennä",
|
||||||
"attach-images-hint": "Liitä kuvia vetämällä ja pudottamalla ne editoriin",
|
"attach-images-hint": "Liitä kuvia vetämällä ja pudottamalla ne editoriin",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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ä",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Actualiser",
|
"refresh": "Actualiser",
|
||||||
"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 les enregistrer ? Ok pour enregistrer, annuler pour ignorer les modifications.",
|
||||||
|
"clipboard-copy-failure": "Échec de la copie vers le presse-papiers."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -249,7 +250,7 @@
|
|||||||
"general-preferences": "Préférences générales",
|
"general-preferences": "Préférences générales",
|
||||||
"group-recipe-preferences": "Préférences de recette du groupe",
|
"group-recipe-preferences": "Préférences de recette du groupe",
|
||||||
"report": "Rapport",
|
"report": "Rapport",
|
||||||
"report-with-id": "Identifiant du rapport : {id}",
|
"report-with-id": "ID du rapport: {id}",
|
||||||
"group-management": "Gestion des groupes",
|
"group-management": "Gestion des groupes",
|
||||||
"admin-group-management": "Administration des groupes",
|
"admin-group-management": "Administration des groupes",
|
||||||
"admin-group-management-text": "Les modifications apportées à ce groupe seront immédiatement prises en compte.",
|
"admin-group-management-text": "Les modifications apportées à ce groupe seront immédiatement prises en compte.",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "C’était bon ?",
|
"how-did-it-turn-out": "C’était bon ?",
|
||||||
"user-made-this": "{user} l’a cuisiné",
|
"user-made-this": "{user} l’a cuisiné",
|
||||||
"last-made-date": "Cuisiné le {date}",
|
"last-made-date": "Cuisiné le {date}",
|
||||||
"api-extras-description": "Les extras de recette sont une caractéristique clé de l'API Mealie. Ils vous permettent de créer des paires clé/valeur json personnalisées dans une recette à référencer depuis des applications externes. Vous pouvez utiliser ces clés pour stocker des informations utiles à l'automatisation ou des messages personnalisés à relayer vers l'appareil souhaité.",
|
"api-extras-description": "Les suppléments des recettes sont une fonctionnalité clé de l’API Mealie. Ils permettent de créer des paires JSON clé/valeur personnalisées dans une recette, qui peuvent être référencées depuis des applications tierces. Ces clés peuvent être utilisées par exemple pour déclencher des tâches automatisées ou des messages personnalisés à transmettre à l’appareil souhaité.",
|
||||||
"message-key": "Clé de message",
|
"message-key": "Clé de message",
|
||||||
"parse": "Analyser",
|
"parse": "Analyser",
|
||||||
"attach-images-hint": "Ajouter des images en les glissant-déposant dans l'éditeur",
|
"attach-images-hint": "Ajouter des images en les glissant-déposant dans l'éditeur",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -552,9 +555,10 @@
|
|||||||
"tree-view": "Vue en arborescence",
|
"tree-view": "Vue en arborescence",
|
||||||
"recipe-yield": "Nombre de parts",
|
"recipe-yield": "Nombre de parts",
|
||||||
"unit": "Unité",
|
"unit": "Unité",
|
||||||
"upload-image": "Envoyer 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",
|
||||||
@ -573,7 +577,7 @@
|
|||||||
"search-hint": "Appuyez sur « /»",
|
"search-hint": "Appuyez sur « /»",
|
||||||
"advanced": "Avancé",
|
"advanced": "Avancé",
|
||||||
"auto-search": "Recherche automatique",
|
"auto-search": "Recherche automatique",
|
||||||
"no-results": "Aucun résultat trouvé"
|
"no-results": "Pas de résultats trouvés"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"add-a-new-theme": "Ajouter un nouveau thème",
|
"add-a-new-theme": "Ajouter un nouveau thème",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Actualiser",
|
"refresh": "Actualiser",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/> ?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "C’était bon ?",
|
"how-did-it-turn-out": "C’était bon ?",
|
||||||
"user-made-this": "{user} l’a cuisiné",
|
"user-made-this": "{user} l’a cuisiné",
|
||||||
"last-made-date": "Cuisiné le {date}",
|
"last-made-date": "Cuisiné le {date}",
|
||||||
"api-extras-description": "Les extras de recette sont une caractéristique clé de l'API Mealie. Ils vous permettent de créer des paires clé/valeur json personnalisées dans une recette à référencer depuis des applications externes. Vous pouvez utiliser ces clés pour stocker des informations utiles à l'automatisation ou des messages personnalisés à relayer vers l'appareil souhaité.",
|
"api-extras-description": "Les suppléments des recettes sont une fonctionnalité clé de l’API Mealie. Ils permettent de créer des paires JSON clé/valeur personnalisées dans une recette, qui peuvent être référencées depuis des applications tierces. Ces clés peuvent être utilisées par exemple pour déclencher des tâches automatisées ou des messages personnalisés à transmettre à l’appareil souhaité.",
|
||||||
"message-key": "Clé de message",
|
"message-key": "Clé de message",
|
||||||
"parse": "Analyser",
|
"parse": "Analyser",
|
||||||
"attach-images-hint": "Ajouter des images en les glissant-déposant dans l'éditeur",
|
"attach-images-hint": "Ajouter des images en les glissant-déposant dans l'éditeur",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
|
@ -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",
|
||||||
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Refresh",
|
"refresh": "Refresh",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "How did it turn out?",
|
"how-did-it-turn-out": "How did it turn out?",
|
||||||
"user-made-this": "{user} made this",
|
"user-made-this": "{user} made this",
|
||||||
"last-made-date": "Last Made {date}",
|
"last-made-date": "Last Made {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 part applications. You can use these keys to contain information to trigger automation 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": "Message Key",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
|
@ -77,7 +77,7 @@
|
|||||||
"tag-events": "אירועי תגיות",
|
"tag-events": "אירועי תגיות",
|
||||||
"category-events": "אירועי קטגוריות",
|
"category-events": "אירועי קטגוריות",
|
||||||
"when-a-new-user-joins-your-group": "כאשר משתמש חדש מצטרף לקבוצה",
|
"when-a-new-user-joins-your-group": "כאשר משתמש חדש מצטרף לקבוצה",
|
||||||
"recipe-events": "Recipe Events"
|
"recipe-events": "אירועי מתכון"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"cancel": "ביטול",
|
"cancel": "ביטול",
|
||||||
@ -114,10 +114,10 @@
|
|||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "מילת מפתח",
|
"keyword": "מילת מפתח",
|
||||||
"link-copied": "קישור הועתק",
|
"link-copied": "קישור הועתק",
|
||||||
"loading": "Loading",
|
"loading": "טעינה",
|
||||||
"loading-events": "טוען",
|
"loading-events": "טוען",
|
||||||
"loading-recipe": "Loading recipe...",
|
"loading-recipe": "טוען מתכון...",
|
||||||
"loading-ocr-data": "Loading OCR data...",
|
"loading-ocr-data": "טוען נתוני OCR...",
|
||||||
"loading-recipes": "מתכונים בטעינה",
|
"loading-recipes": "מתכונים בטעינה",
|
||||||
"message": "הודעה",
|
"message": "הודעה",
|
||||||
"monday": "שני",
|
"monday": "שני",
|
||||||
@ -128,7 +128,7 @@
|
|||||||
"no-recipe-found": "לא נמצא מתכון",
|
"no-recipe-found": "לא נמצא מתכון",
|
||||||
"ok": "אישור",
|
"ok": "אישור",
|
||||||
"options": "אפשרויות:",
|
"options": "אפשרויות:",
|
||||||
"plural-name": "Plural Name",
|
"plural-name": "שם ברבים",
|
||||||
"print": "הדפסה",
|
"print": "הדפסה",
|
||||||
"print-preferences": "העדפות הדפסה",
|
"print-preferences": "העדפות הדפסה",
|
||||||
"random": "אקראי",
|
"random": "אקראי",
|
||||||
@ -198,7 +198,8 @@
|
|||||||
"refresh": "רענן",
|
"refresh": "רענן",
|
||||||
"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": "יש שינויים שלא נשמרו. לצאת לפני שמירה? אשר לשמירה, בטל למחיקת שינויים.",
|
||||||
|
"clipboard-copy-failure": "כשלון בהעתקה ללוח ההדבקה."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -213,7 +214,7 @@
|
|||||||
"group-id-with-value": "מזהה קבוצה: {groupID}",
|
"group-id-with-value": "מזהה קבוצה: {groupID}",
|
||||||
"group-name": "שם קבוצה",
|
"group-name": "שם קבוצה",
|
||||||
"group-not-found": "קבוצה לא נמצאה",
|
"group-not-found": "קבוצה לא נמצאה",
|
||||||
"group-token": "Group Token",
|
"group-token": "טוקן קבוצתי",
|
||||||
"group-with-value": "קבוצה: {groupID}",
|
"group-with-value": "קבוצה: {groupID}",
|
||||||
"groups": "קבוצות",
|
"groups": "קבוצות",
|
||||||
"manage-groups": "ניהול קבוצות",
|
"manage-groups": "ניהול קבוצות",
|
||||||
@ -249,7 +250,7 @@
|
|||||||
"general-preferences": "העדפות כלליות",
|
"general-preferences": "העדפות כלליות",
|
||||||
"group-recipe-preferences": "העדפות קבוצה",
|
"group-recipe-preferences": "העדפות קבוצה",
|
||||||
"report": "דיווח",
|
"report": "דיווח",
|
||||||
"report-with-id": "Report ID: {id}",
|
"report-with-id": "מספר דוח: {id}",
|
||||||
"group-management": "ניהול קבוצה",
|
"group-management": "ניהול קבוצה",
|
||||||
"admin-group-management": "ניהול קבוצת מנהל",
|
"admin-group-management": "ניהול קבוצת מנהל",
|
||||||
"admin-group-management-text": "השינויים לקבוצה זו יתבצעו מיידית.",
|
"admin-group-management-text": "השינויים לקבוצה זו יתבצעו מיידית.",
|
||||||
@ -470,9 +471,9 @@
|
|||||||
"add-to-plan": "הוספה לתכנית",
|
"add-to-plan": "הוספה לתכנית",
|
||||||
"add-to-timeline": "הוסף לציר הזמן",
|
"add-to-timeline": "הוסף לציר הזמן",
|
||||||
"recipe-added-to-list": "מתכון נוסף לרשימה",
|
"recipe-added-to-list": "מתכון נוסף לרשימה",
|
||||||
"recipes-added-to-list": "Recipes added to list",
|
"recipes-added-to-list": "מתכונים הוספו לרשימה",
|
||||||
"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-mealplan": "הוספת מתכון לתכנון ארוחות נכשלה",
|
"failed-to-add-recipe-to-mealplan": "הוספת מתכון לתכנון ארוחות נכשלה",
|
||||||
"yield": "תשואה",
|
"yield": "תשואה",
|
||||||
"quantity": "כמות",
|
"quantity": "כמות",
|
||||||
@ -510,11 +511,11 @@
|
|||||||
"how-did-it-turn-out": "איך יצא?",
|
"how-did-it-turn-out": "איך יצא?",
|
||||||
"user-made-this": "{user} הכין את זה",
|
"user-made-this": "{user} הכין את זה",
|
||||||
"last-made-date": "נעשה לאחרונה ב{date}",
|
"last-made-date": "נעשה לאחרונה ב{date}",
|
||||||
"api-extras-description": "מתכונים אקסטרה הם פונקציה שמאפשרת שימוש ב- Mealie API. צמדי json של key/value במתכון מאפשרים לצד שלישי לקרוא להם. ניתן להשתמש במפתחות להכיל מידע על מנת להפעיל אוטומציות או הודעות מותאמות אישית למכשירים הרלוונטיים.",
|
"api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.",
|
||||||
"message-key": "מפתח הודעה",
|
"message-key": "מפתח הודעה",
|
||||||
"parse": "ניתוח",
|
"parse": "ניתוח",
|
||||||
"attach-images-hint": "הוסף תמונות ע\"י גרירה ושחרור אל תוך העורך",
|
"attach-images-hint": "הוסף תמונות ע\"י גרירה ושחרור אל תוך העורך",
|
||||||
"drop-image": "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": "חילוץ רכיבים",
|
||||||
@ -532,6 +533,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": "ייבא מקובץ",
|
||||||
@ -554,7 +557,8 @@
|
|||||||
"unit": "יחידה",
|
"unit": "יחידה",
|
||||||
"upload-image": "העלה תמונה",
|
"upload-image": "העלה תמונה",
|
||||||
"screen-awake": "השאר את המסך פעיל",
|
"screen-awake": "השאר את המסך פעיל",
|
||||||
"remove-image": "האם למחוק את התמונה?"
|
"remove-image": "האם למחוק את התמונה?",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "חיפוש מתקדם",
|
"advanced-search": "חיפוש מתקדם",
|
||||||
@ -573,16 +577,16 @@
|
|||||||
"search-hint": "לחץ '/'",
|
"search-hint": "לחץ '/'",
|
||||||
"advanced": "מתקדם",
|
"advanced": "מתקדם",
|
||||||
"auto-search": "חיפוש אוטומטי",
|
"auto-search": "חיפוש אוטומטי",
|
||||||
"no-results": "No results found"
|
"no-results": "לא נמצאו תוצאות"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"add-a-new-theme": "הוסף ערכת נושא חדשה",
|
"add-a-new-theme": "הוסף ערכת נושא חדשה",
|
||||||
"admin-settings": "הגדרות מנהל",
|
"admin-settings": "הגדרות מנהל",
|
||||||
"backup": {
|
"backup": {
|
||||||
"backup-created": "Backup created successfully",
|
"backup-created": "הגיבוי בוצע בהצלחה",
|
||||||
"backup-created-at-response-export_path": "גיבוי נוצר ב {path}",
|
"backup-created-at-response-export_path": "גיבוי נוצר ב {path}",
|
||||||
"backup-deleted": "גיבוי נמחק",
|
"backup-deleted": "גיבוי נמחק",
|
||||||
"restore-success": "Restore successful",
|
"restore-success": "השחזור הצליח",
|
||||||
"backup-tag": "תגית גיבוי",
|
"backup-tag": "תגית גיבוי",
|
||||||
"create-heading": "Create a Backup",
|
"create-heading": "Create a Backup",
|
||||||
"delete-backup": "מחיקת גיבוי",
|
"delete-backup": "מחיקת גיבוי",
|
||||||
@ -691,13 +695,13 @@
|
|||||||
"configuration": "הגדרות",
|
"configuration": "הגדרות",
|
||||||
"docker-volume": "Docker Volume",
|
"docker-volume": "Docker Volume",
|
||||||
"docker-volume-help": "מילי דורשת שקונטיינר הקצה הקדמי והקצה האחורי חולקים את באותו כונן / שטח אחסון בדוקר.\nכל זאת כל מנת לוודא שלקונטיינר תהיה גישה לתמונות הגיבוי או לנכסים בדיסק.",
|
"docker-volume-help": "מילי דורשת שקונטיינר הקצה הקדמי והקצה האחורי חולקים את באותו כונן / שטח אחסון בדוקר.\nכל זאת כל מנת לוודא שלקונטיינר תהיה גישה לתמונות הגיבוי או לנכסים בדיסק.",
|
||||||
"volumes-are-misconfigured": "Volumes are misconfigured.",
|
"volumes-are-misconfigured": "כוננים אינם מוגדרים בצורה תקינה.",
|
||||||
"volumes-are-configured-correctly": "ה-Volumeים מוגדרים תקין.",
|
"volumes-are-configured-correctly": "ה-Volumeים מוגדרים תקין.",
|
||||||
"status-unknown-try-running-a-validation": "מצב לא ידוע. נסה להריץ אימות.",
|
"status-unknown-try-running-a-validation": "מצב לא ידוע. נסה להריץ אימות.",
|
||||||
"validate": "אימות",
|
"validate": "אימות",
|
||||||
"email-configuration-status": "מצב הגדרות דוא״ל",
|
"email-configuration-status": "מצב הגדרות דוא״ל",
|
||||||
"email-configured": "Email Configured",
|
"email-configured": "דואר אלקטרוני הוגדר",
|
||||||
"email-test-results": "Email Test Results",
|
"email-test-results": "תוצאות בדיקת דואר אלקטרוני",
|
||||||
"ready": "מוכן",
|
"ready": "מוכן",
|
||||||
"not-ready": "לא מוכן - בדוק משתני סביבה",
|
"not-ready": "לא מוכן - בדוק משתני סביבה",
|
||||||
"succeeded": "הצליח",
|
"succeeded": "הצליח",
|
||||||
@ -788,7 +792,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": "כלים",
|
||||||
@ -797,7 +802,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": "אדמין",
|
||||||
@ -832,7 +838,7 @@
|
|||||||
"password-updated": "הסיסמה עודכנה",
|
"password-updated": "הסיסמה עודכנה",
|
||||||
"password": "סיסמה",
|
"password": "סיסמה",
|
||||||
"password-strength": "חוזק הסיסמה {strength}",
|
"password-strength": "חוזק הסיסמה {strength}",
|
||||||
"please-enter-password": "Please enter your new password.",
|
"please-enter-password": "אנא הזן סיסמה חדשה.",
|
||||||
"register": "הרשמה",
|
"register": "הרשמה",
|
||||||
"reset-password": "איפוס סיסמה",
|
"reset-password": "איפוס סיסמה",
|
||||||
"sign-in": "התחברות",
|
"sign-in": "התחברות",
|
||||||
@ -853,7 +859,7 @@
|
|||||||
"username": "שם משתמש",
|
"username": "שם משתמש",
|
||||||
"users-header": "משתמשים",
|
"users-header": "משתמשים",
|
||||||
"users": "משתמשים",
|
"users": "משתמשים",
|
||||||
"user-not-found": "User not found",
|
"user-not-found": "משתמש לא נמצא",
|
||||||
"webhook-time": "זמן Webhook",
|
"webhook-time": "זמן Webhook",
|
||||||
"webhooks-enabled": "הפעלת Webhooks",
|
"webhooks-enabled": "הפעלת Webhooks",
|
||||||
"you-are-not-allowed-to-create-a-user": "אין הרשאה ליצור משתמש",
|
"you-are-not-allowed-to-create-a-user": "אין הרשאה ליצור משתמש",
|
||||||
@ -876,7 +882,7 @@
|
|||||||
"user-management": "ניהול משתמשים",
|
"user-management": "ניהול משתמשים",
|
||||||
"reset-locked-users": "אתחל משתמשים נעולים",
|
"reset-locked-users": "אתחל משתמשים נעולים",
|
||||||
"admin-user-creation": "יצירת משתמש אדמין",
|
"admin-user-creation": "יצירת משתמש אדמין",
|
||||||
"admin-user-management": "Admin User Management",
|
"admin-user-management": "ניהול משתמשים",
|
||||||
"user-details": "פרטי משתמש",
|
"user-details": "פרטי משתמש",
|
||||||
"user-name": "שם משתמש",
|
"user-name": "שם משתמש",
|
||||||
"authentication-method": "שיטת אימות",
|
"authentication-method": "שיטת אימות",
|
||||||
@ -887,9 +893,9 @@
|
|||||||
"user-can-manage-group": "משתמש יכול לנהל קבוצה",
|
"user-can-manage-group": "משתמש יכול לנהל קבוצה",
|
||||||
"user-can-organize-group-data": "משתמש יכול לשנות מידע של קבוצה",
|
"user-can-organize-group-data": "משתמש יכול לשנות מידע של קבוצה",
|
||||||
"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": "נראה שזו ההתחברות הראשונה שלך.",
|
||||||
"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": "שכחתי סיסמא",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
@ -965,8 +971,8 @@
|
|||||||
"delete-recipes": "מחיקת מתכונים",
|
"delete-recipes": "מחיקת מתכונים",
|
||||||
"source-unit-will-be-deleted": "יחידת המקור תמחק"
|
"source-unit-will-be-deleted": "יחידת המקור תמחק"
|
||||||
},
|
},
|
||||||
"create-alias": "Create Alias",
|
"create-alias": "יצירת שם נרדף",
|
||||||
"manage-aliases": "Manage Aliases",
|
"manage-aliases": "נהל שמות נרדפים",
|
||||||
"seed-data": "אכלס נתונים",
|
"seed-data": "אכלס נתונים",
|
||||||
"seed": "אכלס",
|
"seed": "אכלס",
|
||||||
"data-management": "ניהול מידע",
|
"data-management": "ניהול מידע",
|
||||||
@ -976,24 +982,24 @@
|
|||||||
"columns": "עמודות",
|
"columns": "עמודות",
|
||||||
"combine": "שילוב",
|
"combine": "שילוב",
|
||||||
"categories": {
|
"categories": {
|
||||||
"edit-category": "Edit Category",
|
"edit-category": "ערוך קטגוריה",
|
||||||
"new-category": "New Category",
|
"new-category": "קטגוריה חדשה",
|
||||||
"category-data": "Category Data"
|
"category-data": "נתוני קטגוריה"
|
||||||
},
|
},
|
||||||
"tags": {
|
"tags": {
|
||||||
"new-tag": "New Tag",
|
"new-tag": "טאג חדש",
|
||||||
"edit-tag": "Edit Tag",
|
"edit-tag": "ערוך טאג",
|
||||||
"tag-data": "Tag Data"
|
"tag-data": "נתוני טאגים"
|
||||||
},
|
},
|
||||||
"tools": {
|
"tools": {
|
||||||
"new-tool": "New Tool",
|
"new-tool": "כלי חדש",
|
||||||
"edit-tool": "Edit Tool",
|
"edit-tool": "ערוך כלי",
|
||||||
"tool-data": "Tool Data"
|
"tool-data": "נתוני כלים"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"user-registration": {
|
"user-registration": {
|
||||||
"user-registration": "רישום משתמשים",
|
"user-registration": "רישום משתמשים",
|
||||||
"registration-success": "Registration Success",
|
"registration-success": "ההרשמה הושלמה",
|
||||||
"join-a-group": "הצטרפות לקבוצה",
|
"join-a-group": "הצטרפות לקבוצה",
|
||||||
"create-a-new-group": "יצירת קבוצה חדשה",
|
"create-a-new-group": "יצירת קבוצה חדשה",
|
||||||
"provide-registration-token-description": "ספק בבקשה את טוקן הרישום המשוייך לקבוצה אליה ברצונך להצטרף. בכדי לקבל אותו יהיה צורך להשיג אותו מאחד מחברה הקבוצה הקיימים.",
|
"provide-registration-token-description": "ספק בבקשה את טוקן הרישום המשוייך לקבוצה אליה ברצונך להצטרף. בכדי לקבל אותו יהיה צורך להשיג אותו מאחד מחברה הקבוצה הקיימים.",
|
||||||
@ -1040,7 +1046,7 @@
|
|||||||
},
|
},
|
||||||
"ocr-editor": {
|
"ocr-editor": {
|
||||||
"ocr-editor": "עורך סריקת תווים",
|
"ocr-editor": "עורך סריקת תווים",
|
||||||
"toolbar": "Toolbar",
|
"toolbar": "סרגל כלים",
|
||||||
"selection-mode": "מצב בחירה",
|
"selection-mode": "מצב בחירה",
|
||||||
"pan-and-zoom-picture": "סובב והגדל תמונה",
|
"pan-and-zoom-picture": "סובב והגדל תמונה",
|
||||||
"split-text": "פיצול טקסט",
|
"split-text": "פיצול טקסט",
|
||||||
@ -1048,8 +1054,8 @@
|
|||||||
"split-by-block": "פצל לפי מבנה המלל",
|
"split-by-block": "פצל לפי מבנה המלל",
|
||||||
"flatten": "שטח בלי קשר למבנה המקורי",
|
"flatten": "שטח בלי קשר למבנה המקורי",
|
||||||
"help": {
|
"help": {
|
||||||
"help": "Help",
|
"help": "עזרה",
|
||||||
"mouse-modes": "Mouse modes",
|
"mouse-modes": "מצבי עכבר",
|
||||||
"selection-mode": "מצב בחירה (ברירת מחדל)",
|
"selection-mode": "מצב בחירה (ברירת מחדל)",
|
||||||
"selection-mode-desc": "מצב בחירה זה הינו הראשי אשר ישמש להכנסת מידע:",
|
"selection-mode-desc": "מצב בחירה זה הינו הראשי אשר ישמש להכנסת מידע:",
|
||||||
"selection-mode-steps": {
|
"selection-mode-steps": {
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Osvježi",
|
"refresh": "Osvježi",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "Kako je ispalo?",
|
"how-did-it-turn-out": "Kako je ispalo?",
|
||||||
"user-made-this": "{user} je napravio/la ovo",
|
"user-made-this": "{user} je napravio/la ovo",
|
||||||
"last-made-date": "Zadnji put napravljeno {date}",
|
"last-made-date": "Zadnji put napravljeno {date}",
|
||||||
"api-extras-description": "Dodatci recepata su ključna značajka Mealie API-ja. Omogućuju vam stvaranje prilagođenih JSON ključ/vrijednost parova unutar recepta kako biste ih mogli koristiti iz aplikacija trećih strana. Možete koristiti ove ključeve kako biste sadržavali informacije koje će pokrenuti automatizaciju ili prilagođene poruke koje će biti prenesene na željeni uređaj.",
|
"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": "Ključ poruke",
|
"message-key": "Ključ poruke",
|
||||||
"parse": "Razluči (parsiraj)",
|
"parse": "Razluči (parsiraj)",
|
||||||
"attach-images-hint": "Priložite slike povlačenjem i ispuštanjem u uređivaču",
|
"attach-images-hint": "Priložite slike povlačenjem i ispuštanjem u uređivaču",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
"category-deleted": "Kategória törölve",
|
"category-deleted": "Kategória törölve",
|
||||||
"category-deletion-failed": "Kategória törlése sikertelen",
|
"category-deletion-failed": "Kategória törlése sikertelen",
|
||||||
"category-filter": "Kategória szűrő",
|
"category-filter": "Kategória szűrő",
|
||||||
"category-update-failed": "Kategória elmentése sikertelen",
|
"category-update-failed": "Kategória frissítése sikertelen",
|
||||||
"category-updated": "Kategória frissítve",
|
"category-updated": "Kategória frissítve",
|
||||||
"uncategorized-count": "Kategórizálatlan {count}",
|
"uncategorized-count": "Kategórizálatlan {count}",
|
||||||
"create-a-category": "Kategória létrehozása",
|
"create-a-category": "Kategória létrehozása",
|
||||||
@ -53,7 +53,7 @@
|
|||||||
"apprise-url": "Apprise URL",
|
"apprise-url": "Apprise URL",
|
||||||
"database": "Adatbázis",
|
"database": "Adatbázis",
|
||||||
"delete-event": "Esemény törlése",
|
"delete-event": "Esemény törlése",
|
||||||
"event-delete-confirmation": "Biztosan törölni akarod 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 tipusának kiválasztásával egyéb beállítási lehetőségek jelenhetnek meg.",
|
||||||
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Frissít",
|
"refresh": "Frissít",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "Hogyan sikerült?",
|
"how-did-it-turn-out": "Hogyan sikerült?",
|
||||||
"user-made-this": "ezt {user} készítette el",
|
"user-made-this": "ezt {user} készítette el",
|
||||||
"last-made-date": "Utoljára elkészítve {date}",
|
"last-made-date": "Utoljára elkészítve {date}",
|
||||||
"api-extras-description": "A receptek extrák a Mealie API egyik legfontosabb jellemzője. Lehetővé teszik, hogy egyéni json kulcs/érték párokat hozzon létre egy receptben, amelyekre 3. féltől származó alkalmazásokból hivatkozhat. Ezeket a kulcsokat arra használhatja, hogy automatizmusokat indítsanak el vagy küldjenek egyéni üzenetek a meghatározott eszközéhez.",
|
"api-extras-description": "A receptek extrái a Mealie API egyik legfontosabb szolgáltatása. Lehetővé teszik, hogy egyéni JSON kulcs/érték párokat hozzon létre egy receptben, amelyekre harmadik féltől származó alkalmazásokból hivatkozhat. Ezeket a kulcsokat információszolgáltatásra használhatja, például automatizmusok vagy egyéni üzenetek indítására, amelyeket a kívánt eszközre küldhet.",
|
||||||
"message-key": "Üzenetkulcs",
|
"message-key": "Üzenetkulcs",
|
||||||
"parse": "Előkészítés",
|
"parse": "Előkészítés",
|
||||||
"attach-images-hint": "Képek csatolása a szerkesztőbe történő húzásával és ejtésével",
|
"attach-images-hint": "Képek csatolása a szerkesztőbe történő húzásával és ejtésével",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
@ -1113,7 +1119,7 @@
|
|||||||
"brute": "Brute",
|
"brute": "Brute",
|
||||||
"show-individual-confidence": "",
|
"show-individual-confidence": "",
|
||||||
"ingredient-text": "Hozzávaló szöveg",
|
"ingredient-text": "Hozzávaló szöveg",
|
||||||
"average-confident": "{0} Confident",
|
"average-confident": "{0}-os bizonyosság",
|
||||||
"try-an-example": "Próbáljon ki egy példát",
|
"try-an-example": "Próbáljon ki egy példát",
|
||||||
"parser": "Szintaxis elemző",
|
"parser": "Szintaxis elemző",
|
||||||
"background-tasks": "Háttér folyamatok",
|
"background-tasks": "Háttér folyamatok",
|
||||||
|
1187
frontend/lang/messages/is-IS.json
Normal file
1187
frontend/lang/messages/is-IS.json
Normal file
File diff suppressed because it is too large
Load Diff
@ -77,7 +77,7 @@
|
|||||||
"tag-events": "Tag Eventi",
|
"tag-events": "Tag Eventi",
|
||||||
"category-events": "Categoria Eventi",
|
"category-events": "Categoria Eventi",
|
||||||
"when-a-new-user-joins-your-group": "Quando un nuovo utente entra nel tuo gruppo",
|
"when-a-new-user-joins-your-group": "Quando un nuovo utente entra nel tuo gruppo",
|
||||||
"recipe-events": "Recipe Events"
|
"recipe-events": "Eventi di ricette"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"cancel": "Cancella",
|
"cancel": "Cancella",
|
||||||
@ -114,10 +114,10 @@
|
|||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Parola chiave",
|
"keyword": "Parola chiave",
|
||||||
"link-copied": "Link Copiato",
|
"link-copied": "Link Copiato",
|
||||||
"loading": "Loading",
|
"loading": "Caricamento in corso",
|
||||||
"loading-events": "Caricamento eventi",
|
"loading-events": "Caricamento eventi",
|
||||||
"loading-recipe": "Loading recipe...",
|
"loading-recipe": "Caricamento della ricetta...",
|
||||||
"loading-ocr-data": "Loading OCR data...",
|
"loading-ocr-data": "Caricamento dati OCR...",
|
||||||
"loading-recipes": "Caricamento Ricette",
|
"loading-recipes": "Caricamento Ricette",
|
||||||
"message": "Messaggio",
|
"message": "Messaggio",
|
||||||
"monday": "Lunedì",
|
"monday": "Lunedì",
|
||||||
@ -128,7 +128,7 @@
|
|||||||
"no-recipe-found": "Nessuna Ricetta Trovata",
|
"no-recipe-found": "Nessuna Ricetta Trovata",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"options": "Opzioni:",
|
"options": "Opzioni:",
|
||||||
"plural-name": "Plural Name",
|
"plural-name": "Nome Plurale",
|
||||||
"print": "Stampa",
|
"print": "Stampa",
|
||||||
"print-preferences": "Preferenze Di Stampa",
|
"print-preferences": "Preferenze Di Stampa",
|
||||||
"random": "Casuale",
|
"random": "Casuale",
|
||||||
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Ricarica",
|
"refresh": "Ricarica",
|
||||||
"upload-file": "Carica file",
|
"upload-file": "Carica file",
|
||||||
"created-on-date": "Creato il: {0}",
|
"created-on-date": "Creato il: {0}",
|
||||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes."
|
"unsaved-changes": "Sono state apportate modifiche non salvate. Salvare prima di uscire? Premi Ok per salvare, Annulla per scartare le modifiche.",
|
||||||
|
"clipboard-copy-failure": "Impossibile copiare negli appunti."
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Sei sicuro di volerlo eliminare <b>{groupName}<b/>'?",
|
"are-you-sure-you-want-to-delete-the-group": "Sei sicuro di volerlo eliminare <b>{groupName}<b/>'?",
|
||||||
@ -213,7 +214,7 @@
|
|||||||
"group-id-with-value": "ID Gruppo:{groupID}",
|
"group-id-with-value": "ID Gruppo:{groupID}",
|
||||||
"group-name": "Nome Gruppo",
|
"group-name": "Nome Gruppo",
|
||||||
"group-not-found": "Gruppo non trovato",
|
"group-not-found": "Gruppo non trovato",
|
||||||
"group-token": "Group Token",
|
"group-token": "Token del gruppo",
|
||||||
"group-with-value": "Gruppo: {groupID}",
|
"group-with-value": "Gruppo: {groupID}",
|
||||||
"groups": "Gruppi",
|
"groups": "Gruppi",
|
||||||
"manage-groups": "Gestisci Gruppi",
|
"manage-groups": "Gestisci Gruppi",
|
||||||
@ -249,7 +250,7 @@
|
|||||||
"general-preferences": "Impostazioni Generali",
|
"general-preferences": "Impostazioni Generali",
|
||||||
"group-recipe-preferences": "Impostazioni per le ricette del gruppo",
|
"group-recipe-preferences": "Impostazioni per le ricette del gruppo",
|
||||||
"report": "Report",
|
"report": "Report",
|
||||||
"report-with-id": "Report ID: {id}",
|
"report-with-id": "ID Report: {id}",
|
||||||
"group-management": "Gestione Gruppo",
|
"group-management": "Gestione Gruppo",
|
||||||
"admin-group-management": "Gestione Gruppo Amministratore",
|
"admin-group-management": "Gestione Gruppo Amministratore",
|
||||||
"admin-group-management-text": "Le modifiche a questo gruppo si rifletteranno immediatamente.",
|
"admin-group-management-text": "Le modifiche a questo gruppo si rifletteranno immediatamente.",
|
||||||
@ -304,7 +305,7 @@
|
|||||||
"for-type-meal-types": "per {0} tipi di pasto",
|
"for-type-meal-types": "per {0} tipi di pasto",
|
||||||
"meal-plan-rules": "Regole del piano alimentare",
|
"meal-plan-rules": "Regole del piano alimentare",
|
||||||
"new-rule": "Nuova regola",
|
"new-rule": "Nuova regola",
|
||||||
"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": "Puoi creare regole per la selezione automatica delle ricette per i tuoi piani alimentari. Queste regole vengono utilizzate dal server per determinare le ricette da selezionare durante la creazione dei piani alimentari. Tieni presente che se le regole hanno gli stessi vincoli di giorno/tipo, le categorie delle regole verranno unite. In pratica non è necessario creare regole duplicate, ma è possibile farlo.",
|
||||||
"new-rule-description": "Quando si crea una nuova regola per un piano alimentare è possibile limitare la sua applicazione ad un giorno specifico della settimana e/o un tipo specifico di pasto. Per applicare una regola a tutti i giorni o a tutti i tipi di pasto, è possibile impostare la regola a \"Qualsiasi\", applicandola a tutti i possibili valori per il tipo di giorno e/o di pasto.",
|
"new-rule-description": "Quando si crea una nuova regola per un piano alimentare è possibile limitare la sua applicazione ad un giorno specifico della settimana e/o un tipo specifico di pasto. Per applicare una regola a tutti i giorni o a tutti i tipi di pasto, è possibile impostare la regola a \"Qualsiasi\", applicandola a tutti i possibili valori per il tipo di giorno e/o di pasto.",
|
||||||
"recipe-rules": "Regole per le ricette",
|
"recipe-rules": "Regole per le ricette",
|
||||||
"applies-to-all-days": "Si applica a ogni giorno",
|
"applies-to-all-days": "Si applica a ogni giorno",
|
||||||
@ -356,7 +357,7 @@
|
|||||||
"mealie-text": "Mealie può importare ricette dall'applicazione Mealie da un versione pre v1.0. Esporta le tue ricette dalla tua vecchia istanza e carica il file zip qui sotto. Nota che solo le ricette possono essere importate dall'esportazione.",
|
"mealie-text": "Mealie può importare ricette dall'applicazione Mealie da un versione pre v1.0. Esporta le tue ricette dalla tua vecchia istanza e carica il file zip qui sotto. Nota che solo le ricette possono essere importate dall'esportazione.",
|
||||||
"plantoeat": {
|
"plantoeat": {
|
||||||
"title": "Plan to Eat",
|
"title": "Plan to Eat",
|
||||||
"description-long": "Mealie can import recipies from Plan to Eat."
|
"description-long": "Mealie può importare le ricette da Plan to Eat."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"new-recipe": {
|
"new-recipe": {
|
||||||
@ -468,11 +469,11 @@
|
|||||||
"date-format-hint-yyyy-mm-dd": "Formato YYYY-MM-DD",
|
"date-format-hint-yyyy-mm-dd": "Formato YYYY-MM-DD",
|
||||||
"add-to-list": "Aggiungi alla lista",
|
"add-to-list": "Aggiungi alla lista",
|
||||||
"add-to-plan": "Aggiungi al piano giornaliero",
|
"add-to-plan": "Aggiungi al piano giornaliero",
|
||||||
"add-to-timeline": "Add to Timeline",
|
"add-to-timeline": "Aggiungi alla linea temporale",
|
||||||
"recipe-added-to-list": "Ricetta aggiunta alla lista",
|
"recipe-added-to-list": "Ricetta aggiunta alla lista",
|
||||||
"recipes-added-to-list": "Recipes added to list",
|
"recipes-added-to-list": "Ricette aggiunte alla lista",
|
||||||
"recipe-added-to-mealplan": "Ricetta aggiunta al piano alimentare",
|
"recipe-added-to-mealplan": "Ricetta aggiunta al piano alimentare",
|
||||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
"failed-to-add-recipes-to-list": "Impossibile aggiungere la ricetta alla lista",
|
||||||
"failed-to-add-recipe-to-mealplan": "Impossibile aggiungere la ricetta al piano alimentare",
|
"failed-to-add-recipe-to-mealplan": "Impossibile aggiungere la ricetta al piano alimentare",
|
||||||
"yield": "Porzioni",
|
"yield": "Porzioni",
|
||||||
"quantity": "Quantità",
|
"quantity": "Quantità",
|
||||||
@ -495,26 +496,26 @@
|
|||||||
"locked": "Bloccato",
|
"locked": "Bloccato",
|
||||||
"public-link": "Link Pubblico",
|
"public-link": "Link Pubblico",
|
||||||
"timer": {
|
"timer": {
|
||||||
"kitchen-timer": "Kitchen Timer",
|
"kitchen-timer": "Contaminuti da cucina",
|
||||||
"start-timer": "Start Timer",
|
"start-timer": "Avvia timer",
|
||||||
"pause-timer": "Pause Timer",
|
"pause-timer": "Metti in pausa il contaminuti",
|
||||||
"resume-timer": "Resume Timer",
|
"resume-timer": "Riprendi il contaminuti",
|
||||||
"stop-timer": "Stop Timer"
|
"stop-timer": "Arresta il Timer"
|
||||||
},
|
},
|
||||||
"edit-timeline-event": "Modifica Evento Timeline",
|
"edit-timeline-event": "Modifica evento sulla linea temporale",
|
||||||
"timeline": "Timeline",
|
"timeline": "Linea temporale",
|
||||||
"timeline-is-empty": "Niente sulla timeline. Prova a fare questa ricetta!",
|
"timeline-is-empty": "Niente sulla linea temporale. Prova a fare questa ricetta!",
|
||||||
"group-global-timeline": "{groupName} Sequenza Temporale Globale",
|
"group-global-timeline": "{groupName} Linea temporale globale",
|
||||||
"open-timeline": "Apri la Timeline",
|
"open-timeline": "Apri la linea temporale",
|
||||||
"made-this": "L'Ho Preparato",
|
"made-this": "L'Ho Preparato",
|
||||||
"how-did-it-turn-out": "Come è venuto?",
|
"how-did-it-turn-out": "Come è venuto?",
|
||||||
"user-made-this": "{user} l'ha preparato",
|
"user-made-this": "{user} l'ha preparato",
|
||||||
"last-made-date": "Ultima Preparazione {date}",
|
"last-made-date": "Ultima Preparazione {date}",
|
||||||
"api-extras-description": "Le opzioni extra delle ricette sono una caratteristica fondamentale dell'API Mealie. Consentono di creare json personalizzati con coppie di chiavi/valore all'interno di una ricetta a cui fare riferimento tramite applicazioni terze. È possibile utilizzare queste chiavi per inserire informazioni e attivare l'automazione oppure messaggi personalizzati da passare al dispositivo desiderato.",
|
"api-extras-description": "Le opzioni extra delle ricette sono una caratteristica fondamentale dell'API Mealie. Consentono di creare json personalizzati con coppie di chiavi/valore all'interno di una ricetta a cui fare riferimento tramite applicazioni terze. È possibile utilizzare queste chiavi per inserire informazioni, per esempio per attivare automazioni oppure per inoltrare messaggi personalizzati al dispositivo desiderato.",
|
||||||
"message-key": "Chiave Messaggio",
|
"message-key": "Chiave Messaggio",
|
||||||
"parse": "Analizza",
|
"parse": "Analizza",
|
||||||
"attach-images-hint": "Allega immagini trascinandole nell'editor",
|
"attach-images-hint": "Allega immagini trascinandole nell'editor",
|
||||||
"drop-image": "Drop image",
|
"drop-image": "Trascina l'immagine",
|
||||||
"enable-ingredient-amounts-to-use-this-feature": "Abilita le quantità degli ingredienti per utilizzare questa funzione",
|
"enable-ingredient-amounts-to-use-this-feature": "Abilita le quantità degli ingredienti per utilizzare questa funzione",
|
||||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Le ricette con unità o alimenti definiti non possono essere analizzate.",
|
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Le ricette con unità o alimenti definiti non possono essere analizzate.",
|
||||||
"parse-ingredients": "Analizza ingredienti",
|
"parse-ingredients": "Analizza ingredienti",
|
||||||
@ -532,6 +533,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "I nuovi nomi delle ricette devono essere univoci",
|
"new-recipe-names-must-be-unique": "I nuovi nomi delle ricette devono essere univoci",
|
||||||
"scrape-recipe": "Recupera Ricetta",
|
"scrape-recipe": "Recupera Ricetta",
|
||||||
"scrape-recipe-description": "Recupera una ricetta da url. Fornire l'url per il sito che si desidera analizzare, e Mealie cercherà di recuperare la ricetta da quel sito e aggiungerlo alla vostra raccolta.",
|
"scrape-recipe-description": "Recupera una ricetta da url. Fornire l'url per il sito che si desidera analizzare, e Mealie cercherà di recuperare la ricetta da quel sito e aggiungerlo alla vostra raccolta.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Hai un sacco di ricette che vuoi importare contemporaneamente?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Prova l'importatore massivo",
|
||||||
"import-original-keywords-as-tags": "Importa parole chiave originali come tag",
|
"import-original-keywords-as-tags": "Importa parole chiave originali come tag",
|
||||||
"stay-in-edit-mode": "Rimani in modalità Modifica",
|
"stay-in-edit-mode": "Rimani in modalità Modifica",
|
||||||
"import-from-zip": "Importa da Zip",
|
"import-from-zip": "Importa da Zip",
|
||||||
@ -553,8 +556,9 @@
|
|||||||
"recipe-yield": "Resa Ricetta",
|
"recipe-yield": "Resa Ricetta",
|
||||||
"unit": "Unità",
|
"unit": "Unità",
|
||||||
"upload-image": "Carica immagine",
|
"upload-image": "Carica immagine",
|
||||||
"screen-awake": "Keep Screen Awake",
|
"screen-awake": "Mantieni lo schermo acceso",
|
||||||
"remove-image": "Remove image"
|
"remove-image": "Rimuovi immagine",
|
||||||
|
"nextStep": "Passo successivo"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Ricerca Avanzata",
|
"advanced-search": "Ricerca Avanzata",
|
||||||
@ -573,16 +577,16 @@
|
|||||||
"search-hint": "Premi '/'",
|
"search-hint": "Premi '/'",
|
||||||
"advanced": "Ricerca Avanzata",
|
"advanced": "Ricerca Avanzata",
|
||||||
"auto-search": "Ricerca automatica",
|
"auto-search": "Ricerca automatica",
|
||||||
"no-results": "No results found"
|
"no-results": "Nessun risultato trovato"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"add-a-new-theme": "Aggiungi un Nuovo Tema",
|
"add-a-new-theme": "Aggiungi un Nuovo Tema",
|
||||||
"admin-settings": "Impostazioni Amministratore",
|
"admin-settings": "Impostazioni Amministratore",
|
||||||
"backup": {
|
"backup": {
|
||||||
"backup-created": "Backup created successfully",
|
"backup-created": "Backup creato con successo",
|
||||||
"backup-created-at-response-export_path": "Backup Creato in {path}",
|
"backup-created-at-response-export_path": "Backup Creato in {path}",
|
||||||
"backup-deleted": "Backup eliminato",
|
"backup-deleted": "Backup eliminato",
|
||||||
"restore-success": "Restore successful",
|
"restore-success": "Ripristino riuscito",
|
||||||
"backup-tag": "Tag Backup",
|
"backup-tag": "Tag Backup",
|
||||||
"create-heading": "Crea un Backup",
|
"create-heading": "Crea un Backup",
|
||||||
"delete-backup": "Elimina Backup",
|
"delete-backup": "Elimina Backup",
|
||||||
@ -691,13 +695,13 @@
|
|||||||
"configuration": "Configurazione",
|
"configuration": "Configurazione",
|
||||||
"docker-volume": "Docker Volume",
|
"docker-volume": "Docker Volume",
|
||||||
"docker-volume-help": "Mealie richiede che il frontend e il backend condividano lo stesso volume docker o archiviazione. Ciò assicura che il frontend possa accedere correttamente alle immagini e alle risorse memorizzate sul disco.",
|
"docker-volume-help": "Mealie richiede che il frontend e il backend condividano lo stesso volume docker o archiviazione. Ciò assicura che il frontend possa accedere correttamente alle immagini e alle risorse memorizzate sul disco.",
|
||||||
"volumes-are-misconfigured": "Volumes are misconfigured.",
|
"volumes-are-misconfigured": "I volumi sono configurati male.",
|
||||||
"volumes-are-configured-correctly": "I volumi sono stati configurati correttamente.",
|
"volumes-are-configured-correctly": "I volumi sono stati configurati correttamente.",
|
||||||
"status-unknown-try-running-a-validation": "Stato sconosciuto. Prova ad eseguire una convalida.",
|
"status-unknown-try-running-a-validation": "Stato sconosciuto. Prova ad eseguire una convalida.",
|
||||||
"validate": "Convalida",
|
"validate": "Convalida",
|
||||||
"email-configuration-status": "Configurazione e-mail",
|
"email-configuration-status": "Configurazione e-mail",
|
||||||
"email-configured": "Email Configured",
|
"email-configured": "Email configurata",
|
||||||
"email-test-results": "Email Test Results",
|
"email-test-results": "Risultati del test email",
|
||||||
"ready": "Pronto",
|
"ready": "Pronto",
|
||||||
"not-ready": "Non Pronto - Verifica Variabili Di Ambiente",
|
"not-ready": "Non Pronto - Verifica Variabili Di Ambiente",
|
||||||
"succeeded": "Operazione riuscita",
|
"succeeded": "Operazione riuscita",
|
||||||
@ -788,7 +792,8 @@
|
|||||||
"tags": "Tag",
|
"tags": "Tag",
|
||||||
"untagged-count": "Senza Tag {count}",
|
"untagged-count": "Senza Tag {count}",
|
||||||
"create-a-tag": "Crea un Tag",
|
"create-a-tag": "Crea un Tag",
|
||||||
"tag-name": "Nome del Tag"
|
"tag-name": "Nome del Tag",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Strumenti",
|
"tools": "Strumenti",
|
||||||
@ -797,7 +802,8 @@
|
|||||||
"tool-name": "Nome dell'Utensile",
|
"tool-name": "Nome dell'Utensile",
|
||||||
"create-new-tool": "Crea un Nuovo Utensile",
|
"create-new-tool": "Crea un Nuovo Utensile",
|
||||||
"on-hand-checkbox-label": "Mostra come Disponibile (Spuntato)",
|
"on-hand-checkbox-label": "Mostra come Disponibile (Spuntato)",
|
||||||
"required-tools": "Strumenti necessari"
|
"required-tools": "Strumenti necessari",
|
||||||
|
"tool": "Strumento"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Amministratore",
|
"admin": "Amministratore",
|
||||||
@ -832,7 +838,7 @@
|
|||||||
"password-updated": "Password aggiornata",
|
"password-updated": "Password aggiornata",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
"password-strength": "La password è {strength}",
|
"password-strength": "La password è {strength}",
|
||||||
"please-enter-password": "Please enter your new password.",
|
"please-enter-password": "Si prega di inserire la nuova password.",
|
||||||
"register": "Registrati",
|
"register": "Registrati",
|
||||||
"reset-password": "Reimposta Password",
|
"reset-password": "Reimposta Password",
|
||||||
"sign-in": "Accedi",
|
"sign-in": "Accedi",
|
||||||
@ -853,7 +859,7 @@
|
|||||||
"username": "Nome Utente",
|
"username": "Nome Utente",
|
||||||
"users-header": "UTENTI",
|
"users-header": "UTENTI",
|
||||||
"users": "Utenti",
|
"users": "Utenti",
|
||||||
"user-not-found": "User not found",
|
"user-not-found": "Utente non trovato",
|
||||||
"webhook-time": "Ora Webhook",
|
"webhook-time": "Ora Webhook",
|
||||||
"webhooks-enabled": "Webhooks Abilitati",
|
"webhooks-enabled": "Webhooks Abilitati",
|
||||||
"you-are-not-allowed-to-create-a-user": "Non sei autorizzato per la creazione di utenti",
|
"you-are-not-allowed-to-create-a-user": "Non sei autorizzato per la creazione di utenti",
|
||||||
@ -876,7 +882,7 @@
|
|||||||
"user-management": "Gestione Utenti",
|
"user-management": "Gestione Utenti",
|
||||||
"reset-locked-users": "Ripristina Utenti Bloccati",
|
"reset-locked-users": "Ripristina Utenti Bloccati",
|
||||||
"admin-user-creation": "Creazione Utente Amministratore",
|
"admin-user-creation": "Creazione Utente Amministratore",
|
||||||
"admin-user-management": "Admin User Management",
|
"admin-user-management": "Gestione Utente Amministratore",
|
||||||
"user-details": "Dettagli Utente",
|
"user-details": "Dettagli Utente",
|
||||||
"user-name": "Nome Utente",
|
"user-name": "Nome Utente",
|
||||||
"authentication-method": "Metodo di autenticazione",
|
"authentication-method": "Metodo di autenticazione",
|
||||||
@ -887,11 +893,11 @@
|
|||||||
"user-can-manage-group": "L'utente può gestire il gruppo",
|
"user-can-manage-group": "L'utente può gestire il gruppo",
|
||||||
"user-can-organize-group-data": "L'utente può organizzare i dati del gruppo",
|
"user-can-organize-group-data": "L'utente può organizzare i dati del gruppo",
|
||||||
"enable-advanced-features": "Abilita funzionalità avanzate",
|
"enable-advanced-features": "Abilita funzionalità avanzate",
|
||||||
"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": "Sembra che questa sia la tua prima volta che accedi.",
|
||||||
"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": "Non vuoi più vederlo? Assicurati di modificare la tua email nelle impostazioni utente!",
|
||||||
"forgot-password": "Forgot Password",
|
"forgot-password": "Password Dimenticata",
|
||||||
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
|
"forgot-password-text": "Inserisci il tuo indirizzo email e ti invieremo un collegamento per reimpostare la tua password.",
|
||||||
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
|
"changes-reflected-immediately": "Le modifiche a questo utente diventeranno immediatamente effettive."
|
||||||
},
|
},
|
||||||
"language-dialog": {
|
"language-dialog": {
|
||||||
"translated": "tradotto",
|
"translated": "tradotto",
|
||||||
@ -913,8 +919,8 @@
|
|||||||
"food-label": "Etichetta Alimento",
|
"food-label": "Etichetta Alimento",
|
||||||
"edit-food": "Modifica Alimento",
|
"edit-food": "Modifica Alimento",
|
||||||
"food-data": "Dati Alimento",
|
"food-data": "Dati Alimento",
|
||||||
"example-food-singular": "ex: Onion",
|
"example-food-singular": "esempio: Cipolla",
|
||||||
"example-food-plural": "ex: Onions"
|
"example-food-plural": "esempio: Cipolle"
|
||||||
},
|
},
|
||||||
"units": {
|
"units": {
|
||||||
"seed-dialog-text": "Riempie il database con unità comuni basate sulla lingua.",
|
"seed-dialog-text": "Riempie il database con unità comuni basate sulla lingua.",
|
||||||
@ -925,7 +931,7 @@
|
|||||||
"merging-unit-into-unit": "Unione di {0} in {1}",
|
"merging-unit-into-unit": "Unione di {0} in {1}",
|
||||||
"create-unit": "Crea Unità",
|
"create-unit": "Crea Unità",
|
||||||
"abbreviation": "Abbreviazione",
|
"abbreviation": "Abbreviazione",
|
||||||
"plural-abbreviation": "Plural Abbreviation",
|
"plural-abbreviation": "Abbreviazione Plurale",
|
||||||
"description": "Descrizione",
|
"description": "Descrizione",
|
||||||
"display-as-fraction": "Mostra come Frazione",
|
"display-as-fraction": "Mostra come Frazione",
|
||||||
"use-abbreviation": "Usa Abbreviazione",
|
"use-abbreviation": "Usa Abbreviazione",
|
||||||
@ -933,10 +939,10 @@
|
|||||||
"unit-data": "Dati Unità",
|
"unit-data": "Dati Unità",
|
||||||
"use-abbv": "Utilizzare Abbrev.",
|
"use-abbv": "Utilizzare Abbrev.",
|
||||||
"fraction": "Frazione",
|
"fraction": "Frazione",
|
||||||
"example-unit-singular": "ex: Tablespoon",
|
"example-unit-singular": "esempio: Cucchiaino",
|
||||||
"example-unit-plural": "ex: Tablespoons",
|
"example-unit-plural": "esempio: Cucchiaini",
|
||||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
"example-unit-abbreviation-singular": "esempio: Ccno",
|
||||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
"example-unit-abbreviation-plural": "esempio: Ccni"
|
||||||
},
|
},
|
||||||
"labels": {
|
"labels": {
|
||||||
"seed-dialog-text": "Riempie il database con etichette comuni basate sulla lingua.",
|
"seed-dialog-text": "Riempie il database con etichette comuni basate sulla lingua.",
|
||||||
@ -965,8 +971,8 @@
|
|||||||
"delete-recipes": "Elimina Ricette",
|
"delete-recipes": "Elimina Ricette",
|
||||||
"source-unit-will-be-deleted": "L'unità di origine verrà eliminata"
|
"source-unit-will-be-deleted": "L'unità di origine verrà eliminata"
|
||||||
},
|
},
|
||||||
"create-alias": "Create Alias",
|
"create-alias": "Crea Alias",
|
||||||
"manage-aliases": "Manage Aliases",
|
"manage-aliases": "Gestisci Alias",
|
||||||
"seed-data": "Dati Predefiniti",
|
"seed-data": "Dati Predefiniti",
|
||||||
"seed": "Inizializza",
|
"seed": "Inizializza",
|
||||||
"data-management": "Gestione Dati",
|
"data-management": "Gestione Dati",
|
||||||
@ -976,24 +982,24 @@
|
|||||||
"columns": "Colonne",
|
"columns": "Colonne",
|
||||||
"combine": "Unisci",
|
"combine": "Unisci",
|
||||||
"categories": {
|
"categories": {
|
||||||
"edit-category": "Edit Category",
|
"edit-category": "Modifica categoria",
|
||||||
"new-category": "New Category",
|
"new-category": "Nuova categoria",
|
||||||
"category-data": "Category Data"
|
"category-data": "Categoria Dati"
|
||||||
},
|
},
|
||||||
"tags": {
|
"tags": {
|
||||||
"new-tag": "New Tag",
|
"new-tag": "Nuovo Tag",
|
||||||
"edit-tag": "Edit Tag",
|
"edit-tag": "Modifica Tag",
|
||||||
"tag-data": "Tag Data"
|
"tag-data": "Dati del Tag"
|
||||||
},
|
},
|
||||||
"tools": {
|
"tools": {
|
||||||
"new-tool": "New Tool",
|
"new-tool": "Nuovo strumento",
|
||||||
"edit-tool": "Edit Tool",
|
"edit-tool": "Modifica Strumento",
|
||||||
"tool-data": "Tool Data"
|
"tool-data": "Dati dello Strumento"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"user-registration": {
|
"user-registration": {
|
||||||
"user-registration": "Registrazione Utente",
|
"user-registration": "Registrazione Utente",
|
||||||
"registration-success": "Registration Success",
|
"registration-success": "Registrazione completata",
|
||||||
"join-a-group": "Unisciti a un Gruppo",
|
"join-a-group": "Unisciti a un Gruppo",
|
||||||
"create-a-new-group": "Crea un Nuovo Gruppo",
|
"create-a-new-group": "Crea un Nuovo Gruppo",
|
||||||
"provide-registration-token-description": "Fornisci il token di registrazione associato al gruppo a cui desideri partecipare. Dovrai ottenerlo da un membro di gruppo esistente.",
|
"provide-registration-token-description": "Fornisci il token di registrazione associato al gruppo a cui desideri partecipare. Dovrai ottenerlo da un membro di gruppo esistente.",
|
||||||
@ -1040,7 +1046,7 @@
|
|||||||
},
|
},
|
||||||
"ocr-editor": {
|
"ocr-editor": {
|
||||||
"ocr-editor": "Editor Ocr",
|
"ocr-editor": "Editor Ocr",
|
||||||
"toolbar": "Toolbar",
|
"toolbar": "Barra degli strumenti",
|
||||||
"selection-mode": "Modalità di selezione",
|
"selection-mode": "Modalità di selezione",
|
||||||
"pan-and-zoom-picture": "Sposta e Ingrandisci l'immagine",
|
"pan-and-zoom-picture": "Sposta e Ingrandisci l'immagine",
|
||||||
"split-text": "Dividi testo",
|
"split-text": "Dividi testo",
|
||||||
@ -1048,8 +1054,8 @@
|
|||||||
"split-by-block": "Dividi per blocco di testo",
|
"split-by-block": "Dividi per blocco di testo",
|
||||||
"flatten": "Appiattire indipendentemente dalla formattazione originale",
|
"flatten": "Appiattire indipendentemente dalla formattazione originale",
|
||||||
"help": {
|
"help": {
|
||||||
"help": "Help",
|
"help": "Aiuto",
|
||||||
"mouse-modes": "Mouse modes",
|
"mouse-modes": "Modalità Mouse",
|
||||||
"selection-mode": "Modalità di Selezione (Predefinito)",
|
"selection-mode": "Modalità di Selezione (Predefinito)",
|
||||||
"selection-mode-desc": "La modalità di selezione è la modalità principale per inserire i dati:",
|
"selection-mode-desc": "La modalità di selezione è la modalità principale per inserire i dati:",
|
||||||
"selection-mode-steps": {
|
"selection-mode-steps": {
|
||||||
@ -1106,26 +1112,26 @@
|
|||||||
"mainentance": {
|
"mainentance": {
|
||||||
"actions-title": "Azioni"
|
"actions-title": "Azioni"
|
||||||
},
|
},
|
||||||
"ingredients-natural-language-processor": "Ingredients Natural Language Processor",
|
"ingredients-natural-language-processor": "Processore Di Lingua Naturale degli Ingredienti",
|
||||||
"ingredients-natural-language-processor-explanation": "Mealie utilizza campi casuali condizionali (CRFs) per l'analisi e la lavorazione di ingredienti. Il modello utilizzato per gli ingredienti è basato su una serie di dati di oltre 100.000 ingredienti da un set di dati compilato dal New York Times. Si noti che poiché il modello è addestrato solo in inglese, si possono avere risultati vari quando si utilizza il modello in altre lingue. Questa pagina è un campo di gioco per testare il modello.",
|
"ingredients-natural-language-processor-explanation": "Mealie utilizza campi casuali condizionali (CRFs) per l'analisi e la lavorazione di ingredienti. Il modello utilizzato per gli ingredienti è basato su una serie di dati di oltre 100.000 ingredienti da un set di dati compilato dal New York Times. Si noti che poiché il modello è addestrato solo in inglese, si possono avere risultati vari quando si utilizza il modello in altre lingue. Questa pagina è un campo di gioco per testare il modello.",
|
||||||
"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": "Non è perfetto, ma produce ottimi risultati in generale ed è un buon punto di partenza per separare manualmente gli ingredienti in singoli campi. In alternativa, è anche possibile utilizzare il processore \"Bruto\" che utilizza una tecnica di corrispondenza di modello per identificare gli ingredienti.",
|
||||||
"nlp": "NLP",
|
"nlp": "NLP",
|
||||||
"brute": "Brute",
|
"brute": "Bruto",
|
||||||
"show-individual-confidence": "Show individual confidence",
|
"show-individual-confidence": "Mostra fiducia individuale",
|
||||||
"ingredient-text": "Ingredient Text",
|
"ingredient-text": "Testo Ingrediente",
|
||||||
"average-confident": "{0} Confident",
|
"average-confident": "{0} Fiducia",
|
||||||
"try-an-example": "Try an example",
|
"try-an-example": "Prova un esempio",
|
||||||
"parser": "Parser",
|
"parser": "Analizzatore",
|
||||||
"background-tasks": "Attività in Background",
|
"background-tasks": "Attività in Background",
|
||||||
"background-tasks-description": "Qui puoi visualizzare tutte le attività in background in esecuzione e il loro stato",
|
"background-tasks-description": "Qui puoi visualizzare tutte le attività in background in esecuzione e il loro stato",
|
||||||
"no-logs-found": "Nessun Log Trovato",
|
"no-logs-found": "Nessun Log Trovato",
|
||||||
"tasks": "Tasks"
|
"tasks": "Compiti"
|
||||||
},
|
},
|
||||||
"profile": {
|
"profile": {
|
||||||
"welcome-user": "👋 Benvenuto, {0}",
|
"welcome-user": "👋 Benvenuto, {0}",
|
||||||
"description": "Gestisci il tuo profilo, le ricette e le impostazioni di gruppo.",
|
"description": "Gestisci il tuo profilo, le ricette e le impostazioni di gruppo.",
|
||||||
"get-invite-link": "Ottieni Link Di Invito",
|
"get-invite-link": "Ottieni Link Di Invito",
|
||||||
"get-public-link": "Get Public Link",
|
"get-public-link": "Ottieni link pubblico",
|
||||||
"account-summary": "Riepilogo Account",
|
"account-summary": "Riepilogo Account",
|
||||||
"account-summary-description": "Ecco un riepilogo delle informazioni del tuo gruppo",
|
"account-summary-description": "Ecco un riepilogo delle informazioni del tuo gruppo",
|
||||||
"group-statistics": "Statistiche Gruppo",
|
"group-statistics": "Statistiche Gruppo",
|
||||||
@ -1157,13 +1163,13 @@
|
|||||||
"show-advanced-description": "Mostra funzionalità avanzate (Chiavi API, Webhook e Gestione dati)",
|
"show-advanced-description": "Mostra funzionalità avanzate (Chiavi API, Webhook e Gestione dati)",
|
||||||
"back-to-profile": "Torna al Profilo",
|
"back-to-profile": "Torna al Profilo",
|
||||||
"looking-for-privacy-settings": "Stai cercando le Impostazioni Della Privacy?",
|
"looking-for-privacy-settings": "Stai cercando le Impostazioni Della Privacy?",
|
||||||
"manage-your-api-tokens": "Manage Your API Tokens",
|
"manage-your-api-tokens": "Gestisci i tuoi Token Api",
|
||||||
"manage-user-profile": "Manage User Profile",
|
"manage-user-profile": "Gestisci Profilo Utente",
|
||||||
"manage-cookbooks": "Manage Cookbooks",
|
"manage-cookbooks": "Gestisci Libri Di Cucina",
|
||||||
"manage-members": "Manage Members",
|
"manage-members": "Gestisci i membri",
|
||||||
"manage-webhooks": "Manage Webhooks",
|
"manage-webhooks": "Gestisci i Webhook",
|
||||||
"manage-notifiers": "Manage Notifiers",
|
"manage-notifiers": "Gestisci Notifiche",
|
||||||
"manage-data-migrations": "Manage Data Migrations"
|
"manage-data-migrations": "Gestione Migrazioni Dei Dati"
|
||||||
},
|
},
|
||||||
"cookbook": {
|
"cookbook": {
|
||||||
"cookbooks": "Ricettari",
|
"cookbooks": "Ricettari",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Refresh",
|
"refresh": "Refresh",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/> を削除しますか?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "How did it turn out?",
|
"how-did-it-turn-out": "How did it turn out?",
|
||||||
"user-made-this": "{user} made this",
|
"user-made-this": "{user} made this",
|
||||||
"last-made-date": "Last Made {date}",
|
"last-made-date": "Last Made {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 part applications. You can use these keys to contain information to trigger automation 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": "Message Key",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Refresh",
|
"refresh": "Refresh",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "How did it turn out?",
|
"how-did-it-turn-out": "How did it turn out?",
|
||||||
"user-made-this": "{user} made this",
|
"user-made-this": "{user} made this",
|
||||||
"last-made-date": "Last Made {date}",
|
"last-made-date": "Last Made {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 part applications. You can use these keys to contain information to trigger automation 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": "Message Key",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Atnaujinti",
|
"refresh": "Atnaujinti",
|
||||||
"upload-file": "Įkelti failą",
|
"upload-file": "Įkelti failą",
|
||||||
"created-on-date": "Sukurta: {0}",
|
"created-on-date": "Sukurta: {0}",
|
||||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes."
|
"unsaved-changes": "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."
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Ar tikrai norite ištrinti <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Ar tikrai norite ištrinti <b>{groupName}<b/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "Kaip tai pavyko?",
|
"how-did-it-turn-out": "Kaip tai pavyko?",
|
||||||
"user-made-this": "{user} gamino šį patiekalą",
|
"user-made-this": "{user} gamino šį patiekalą",
|
||||||
"last-made-date": "Paskutinį kartą gaminta {date}",
|
"last-made-date": "Paskutinį kartą gaminta {date}",
|
||||||
"api-extras-description": "Papildomi receptų laukai yra patogi Mealie API funkcija - recepto turinyje galima kurti specialias \"key/value\" duomenų poras, kurias gali perskaityti išorinės sistemos. Šiuos laukus galima panaudoti automatinių veiksmų aktyvinimui, arba specialioms žinutėms perduoti į norimą įrenginį.",
|
"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": "Žinutės raktas",
|
"message-key": "Žinutės raktas",
|
||||||
"parse": "Nuskaityti",
|
"parse": "Nuskaityti",
|
||||||
"attach-images-hint": "Pridėkite vaizdus vilkdami ir numesdami juos į redaktorių",
|
"attach-images-hint": "Pridėkite vaizdus vilkdami ir numesdami juos į redaktorių",
|
||||||
@ -532,6 +533,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Naujo recepto pavadinimas turi būti unikalus",
|
"new-recipe-names-must-be-unique": "Naujo recepto pavadinimas turi būti unikalus",
|
||||||
"scrape-recipe": "Nuskaityti receptą",
|
"scrape-recipe": "Nuskaityti receptą",
|
||||||
"scrape-recipe-description": "Nuskaityti receptą iš URL nuorodos. Pateikite recepto nuorodą, ir Mealie pabandys paimti recepto informaciją iš šios svetainės ir patalpinti ją jūsų kolekcijoje.",
|
"scrape-recipe-description": "Nuskaityti receptą iš URL nuorodos. Pateikite recepto nuorodą, ir Mealie pabandys paimti recepto informaciją iš šios svetainės ir patalpinti ją jūsų kolekcijoje.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||||
"import-original-keywords-as-tags": "Įkelti pradinius raktažodžius kaip žymas",
|
"import-original-keywords-as-tags": "Įkelti pradinius raktažodžius kaip žymas",
|
||||||
"stay-in-edit-mode": "Toliau redaguoti",
|
"stay-in-edit-mode": "Toliau redaguoti",
|
||||||
"import-from-zip": "Įkelti iš .ZIP archyvo",
|
"import-from-zip": "Įkelti iš .ZIP archyvo",
|
||||||
@ -554,7 +557,8 @@
|
|||||||
"unit": "Vienetas",
|
"unit": "Vienetas",
|
||||||
"upload-image": "Įkelti nuotrauką",
|
"upload-image": "Įkelti nuotrauką",
|
||||||
"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": "Išplėstinė paieška",
|
"advanced-search": "Išplėstinė paieška",
|
||||||
@ -788,7 +792,8 @@
|
|||||||
"tags": "Žymos",
|
"tags": "Žymos",
|
||||||
"untagged-count": "Nepažymėtų {count}",
|
"untagged-count": "Nepažymėtų {count}",
|
||||||
"create-a-tag": "Kurti žymą",
|
"create-a-tag": "Kurti žymą",
|
||||||
"tag-name": "Žymos pavadinimas"
|
"tag-name": "Žymos pavadinimas",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Įrankiai",
|
"tools": "Įrankiai",
|
||||||
@ -797,7 +802,8 @@
|
|||||||
"tool-name": "Įrankio pavadinimas",
|
"tool-name": "Įrankio pavadinimas",
|
||||||
"create-new-tool": "Pridėti naują įrankį",
|
"create-new-tool": "Pridėti naują įrankį",
|
||||||
"on-hand-checkbox-label": "Rodyti kaip turimą virtuvėje",
|
"on-hand-checkbox-label": "Rodyti kaip turimą virtuvėje",
|
||||||
"required-tools": "Reikalingi įrankiai"
|
"required-tools": "Reikalingi įrankiai",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Administratorius",
|
"admin": "Administratorius",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Refresh",
|
"refresh": "Refresh",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "How did it turn out?",
|
"how-did-it-turn-out": "How did it turn out?",
|
||||||
"user-made-this": "{user} made this",
|
"user-made-this": "{user} made this",
|
||||||
"last-made-date": "Last Made {date}",
|
"last-made-date": "Last Made {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 part applications. You can use these keys to contain information to trigger automation 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": "Message Key",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Verversen",
|
"refresh": "Verversen",
|
||||||
"upload-file": "Bestand uploaden",
|
"upload-file": "Bestand uploaden",
|
||||||
"created-on-date": "Gemaakt op {0}",
|
"created-on-date": "Gemaakt op {0}",
|
||||||
"unsaved-changes": "Er zijn niet-opgeslagen wijzigingen. Wil je eerst opslaan voordat je vertrekt? Okay om op te slaan, Annuleren om wijzigingen ongedaan te maken."
|
"unsaved-changes": "Er zijn niet-opgeslagen wijzigingen. Wil je eerst opslaan voordat je vertrekt? Okay om op te slaan, Annuleren om wijzigingen ongedaan te maken.",
|
||||||
|
"clipboard-copy-failure": "Kopiëren naar klembord mislukt."
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Weet je zeker dat je <b>{groupName}<b/> wil verwijderen?",
|
"are-you-sure-you-want-to-delete-the-group": "Weet je zeker dat je <b>{groupName}<b/> wil verwijderen?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "Hoe was je gerecht?",
|
"how-did-it-turn-out": "Hoe was je gerecht?",
|
||||||
"user-made-this": "{user} heeft dit gemaakt",
|
"user-made-this": "{user} heeft dit gemaakt",
|
||||||
"last-made-date": "Laatste Gemaakt {date}",
|
"last-made-date": "Laatste Gemaakt {date}",
|
||||||
"api-extras-description": "Extra's recepten zijn een belangrijke functie van de Mealie API. Hiermee kunt u aangepaste json key/value paren maken binnen een recept om te verwijzen naar applicaties van 3e onderdelen. Je kunt deze sleutels gebruiken om informatie te bevatten om automatisering of aangepaste berichten te laten verzenden naar het gewenste apparaat.",
|
"api-extras-description": "Extra's bij recepten zijn een belangrijke functie van de Mealie API. Hiermee kun je aangepaste JSON key/value paren maken bij een recept en kun je naar verwijzen vanuit applicaties van derden. Je kunt deze sleutels gebruiken om extra informatie te bieden, bijvoorbeeld om automatisering aan te sturen of aangepaste berichten naar je gewenste apparaat te laten versturen.",
|
||||||
"message-key": "recept -> bericht-sleutel",
|
"message-key": "recept -> bericht-sleutel",
|
||||||
"parse": "Verwerk",
|
"parse": "Verwerk",
|
||||||
"attach-images-hint": "Voeg afbeeldingen toe door ze te slepen en in de editor te plaatsen",
|
"attach-images-hint": "Voeg afbeeldingen toe door ze te slepen en in de editor te plaatsen",
|
||||||
@ -532,6 +533,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Nieuwe receptnamen moeten uniek zijn",
|
"new-recipe-names-must-be-unique": "Nieuwe receptnamen moeten uniek zijn",
|
||||||
"scrape-recipe": "Scrape recept",
|
"scrape-recipe": "Scrape recept",
|
||||||
"scrape-recipe-description": "Voeg een recept toe via een url. Geef de url op van de site welke je wil scannen voor een recept., en Mealie zal proberen het recept vanaf die plek te scannen en aan je collectie toe te voegen.",
|
"scrape-recipe-description": "Voeg een recept toe via een url. Geef de url op van de site welke je wil scannen voor een recept., en Mealie zal proberen het recept vanaf die plek te scannen en aan je collectie toe te voegen.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Heb je veel recepten die je in 1 keer wil importeren?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Probeer de bulk importer uit",
|
||||||
"import-original-keywords-as-tags": "Importeer oorspronkelijke trefwoorden als tags",
|
"import-original-keywords-as-tags": "Importeer oorspronkelijke trefwoorden als tags",
|
||||||
"stay-in-edit-mode": "Blijf in bewerkingsmodus",
|
"stay-in-edit-mode": "Blijf in bewerkingsmodus",
|
||||||
"import-from-zip": "Importeren uit zip",
|
"import-from-zip": "Importeren uit zip",
|
||||||
@ -554,7 +557,8 @@
|
|||||||
"unit": "Eenheid",
|
"unit": "Eenheid",
|
||||||
"upload-image": "Afbeelding uploaden",
|
"upload-image": "Afbeelding uploaden",
|
||||||
"screen-awake": "Scherm laten aan staan",
|
"screen-awake": "Scherm laten aan staan",
|
||||||
"remove-image": "Afbeelding verwijderen"
|
"remove-image": "Afbeelding verwijderen",
|
||||||
|
"nextStep": "Volgende stap"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Geavanceerd zoeken",
|
"advanced-search": "Geavanceerd zoeken",
|
||||||
@ -788,7 +792,8 @@
|
|||||||
"tags": "Labels",
|
"tags": "Labels",
|
||||||
"untagged-count": "Niet gelabeld {count}",
|
"untagged-count": "Niet gelabeld {count}",
|
||||||
"create-a-tag": "Maak een nieuw label aan",
|
"create-a-tag": "Maak een nieuw label aan",
|
||||||
"tag-name": "Labelnaam"
|
"tag-name": "Labelnaam",
|
||||||
|
"tag": "Label"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Keukengerei",
|
"tools": "Keukengerei",
|
||||||
@ -797,7 +802,8 @@
|
|||||||
"tool-name": "Naam van het keukengerei",
|
"tool-name": "Naam van het keukengerei",
|
||||||
"create-new-tool": "Nieuw keukengerei aanmaken",
|
"create-new-tool": "Nieuw keukengerei aanmaken",
|
||||||
"on-hand-checkbox-label": "Tonen als in bezit (gemarkeerd)",
|
"on-hand-checkbox-label": "Tonen als in bezit (gemarkeerd)",
|
||||||
"required-tools": "Benodig kookgerei"
|
"required-tools": "Benodig kookgerei",
|
||||||
|
"tool": "Keukengerei"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Beheerder",
|
"admin": "Beheerder",
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -114,9 +114,9 @@
|
|||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Słowo kluczowe",
|
"keyword": "Słowo kluczowe",
|
||||||
"link-copied": "Odnośnik skopiowany",
|
"link-copied": "Odnośnik skopiowany",
|
||||||
"loading": "Loading",
|
"loading": "Ładowanie",
|
||||||
"loading-events": "Ładowanie wydarzeń",
|
"loading-events": "Ładowanie wydarzeń",
|
||||||
"loading-recipe": "Loading recipe...",
|
"loading-recipe": "Ładowanie przepisów...",
|
||||||
"loading-ocr-data": "Loading OCR data...",
|
"loading-ocr-data": "Loading OCR data...",
|
||||||
"loading-recipes": "Ładowanie przepisów",
|
"loading-recipes": "Ładowanie przepisów",
|
||||||
"message": "Wiadomość",
|
"message": "Wiadomość",
|
||||||
@ -128,7 +128,7 @@
|
|||||||
"no-recipe-found": "Nie znaleziono przepisu",
|
"no-recipe-found": "Nie znaleziono przepisu",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"options": "Opcje:",
|
"options": "Opcje:",
|
||||||
"plural-name": "Plural Name",
|
"plural-name": "Nazwa w liczbie mnogiej",
|
||||||
"print": "Drukuj",
|
"print": "Drukuj",
|
||||||
"print-preferences": "Właściwości drukowania",
|
"print-preferences": "Właściwości drukowania",
|
||||||
"random": "Losowa",
|
"random": "Losowa",
|
||||||
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Odśwież",
|
"refresh": "Odśwież",
|
||||||
"upload-file": "Prześlij plik",
|
"upload-file": "Prześlij plik",
|
||||||
"created-on-date": "Utworzono dnia: {0}",
|
"created-on-date": "Utworzono dnia: {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."
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Czy na pewno chcesz usunąć <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Czy na pewno chcesz usunąć <b>{groupName}<b/>?",
|
||||||
@ -213,7 +214,7 @@
|
|||||||
"group-id-with-value": "ID grupy: {groupID}",
|
"group-id-with-value": "ID grupy: {groupID}",
|
||||||
"group-name": "Nazwa grupy",
|
"group-name": "Nazwa grupy",
|
||||||
"group-not-found": "Nie znaleziono grupy",
|
"group-not-found": "Nie znaleziono grupy",
|
||||||
"group-token": "Group Token",
|
"group-token": "Token grupy",
|
||||||
"group-with-value": "Grupa: {groupID}",
|
"group-with-value": "Grupa: {groupID}",
|
||||||
"groups": "Grupy",
|
"groups": "Grupy",
|
||||||
"manage-groups": "Zarządzaj grupami",
|
"manage-groups": "Zarządzaj grupami",
|
||||||
@ -249,7 +250,7 @@
|
|||||||
"general-preferences": "Ustawienia ogólne",
|
"general-preferences": "Ustawienia ogólne",
|
||||||
"group-recipe-preferences": "Ustawienia grupy przepisów",
|
"group-recipe-preferences": "Ustawienia grupy przepisów",
|
||||||
"report": "Zgłoś",
|
"report": "Zgłoś",
|
||||||
"report-with-id": "Report ID: {id}",
|
"report-with-id": "ID zgłoszenia: {id}",
|
||||||
"group-management": "Zarządzanie grupą",
|
"group-management": "Zarządzanie grupą",
|
||||||
"admin-group-management": "Administracja Zarządzanie Grupami",
|
"admin-group-management": "Administracja Zarządzanie Grupami",
|
||||||
"admin-group-management-text": "Zmiany w tej grupie zostaną natychmiast odzwierciedlone.",
|
"admin-group-management-text": "Zmiany w tej grupie zostaną natychmiast odzwierciedlone.",
|
||||||
@ -304,7 +305,7 @@
|
|||||||
"for-type-meal-types": "dla {0} rodzajów posiłków",
|
"for-type-meal-types": "dla {0} rodzajów posiłków",
|
||||||
"meal-plan-rules": "Zasady planu posiłków",
|
"meal-plan-rules": "Zasady planu posiłków",
|
||||||
"new-rule": "Nowa reguła",
|
"new-rule": "Nowa reguła",
|
||||||
"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": "Możesz tworzyć reguły automatycznego wyboru przepisów dla planów posiłkowych. Te reguły są używane przez serwer do określenia losowej puli przepisów do wyboru podczas tworzenia planów posiłków. Zauważ, że jeśli reguły mają ograniczenia tego samego dnia/typu, kategorie reguł zostaną połączone. W praktyce tworzenie duplikatów reguł jest zbędne, ale jest to możliwe.",
|
||||||
"new-rule-description": "Przy tworzeniu nowej reguły dotyczącej planu posiłków można ograniczyć regułę, tak aby miała zastosowanie do określonego dnia tygodnia i/lub określonego rodzaju posiłku. Aby zastosować regułę do wszystkich dni lub wszystkich rodzajów posiłków można ustawić regułę na \"Dowolny\", co będzie miało zastosowanie do wszystkich możliwych wartości dla dnia i/lub typu posiłku.",
|
"new-rule-description": "Przy tworzeniu nowej reguły dotyczącej planu posiłków można ograniczyć regułę, tak aby miała zastosowanie do określonego dnia tygodnia i/lub określonego rodzaju posiłku. Aby zastosować regułę do wszystkich dni lub wszystkich rodzajów posiłków można ustawić regułę na \"Dowolny\", co będzie miało zastosowanie do wszystkich możliwych wartości dla dnia i/lub typu posiłku.",
|
||||||
"recipe-rules": "Reguły przepisów",
|
"recipe-rules": "Reguły przepisów",
|
||||||
"applies-to-all-days": "Dotyczy wszystkich dni",
|
"applies-to-all-days": "Dotyczy wszystkich dni",
|
||||||
@ -341,8 +342,8 @@
|
|||||||
"title": "Mealie Pre v1.0"
|
"title": "Mealie Pre v1.0"
|
||||||
},
|
},
|
||||||
"tandoor": {
|
"tandoor": {
|
||||||
"description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.",
|
"description-long": "Mealie może zaimportować przepisy z Tandoor. Wyeksportuj swoje przepisy w formacie HTML, a następnie prześlij plik .zip poniżej.",
|
||||||
"title": "Tandoor Recipes"
|
"title": "Przepisy Tandoor"
|
||||||
},
|
},
|
||||||
"recipe-data-migrations": "Migracja danych przepisów",
|
"recipe-data-migrations": "Migracja danych przepisów",
|
||||||
"recipe-data-migrations-explanation": "Receptury mogą być przeniesione z innej wspieranej aplikacji na Mealie. To świetny sposób na rozpoczęcie z Mealie.",
|
"recipe-data-migrations-explanation": "Receptury mogą być przeniesione z innej wspieranej aplikacji na Mealie. To świetny sposób na rozpoczęcie z Mealie.",
|
||||||
@ -355,8 +356,8 @@
|
|||||||
"paprika-text": "Mealie może importować przepisy z aplikacji Paprika. Eksportuj swoje przepisy z papriki, zmień nazwę rozszerzenia eksportu na .zip i prześlij je poniżej.",
|
"paprika-text": "Mealie może importować przepisy z aplikacji Paprika. Eksportuj swoje przepisy z papriki, zmień nazwę rozszerzenia eksportu na .zip i prześlij je poniżej.",
|
||||||
"mealie-text": "Mealie może importować receptury z aplikacji Mealie z wersji przed v1.0. Wyeksportuj swoje przepisy ze starej instancji i prześlij plik zip poniżej. Pamiętaj, że tylko receptury mogą być zaimportowane z eksportu.",
|
"mealie-text": "Mealie może importować receptury z aplikacji Mealie z wersji przed v1.0. Wyeksportuj swoje przepisy ze starej instancji i prześlij plik zip poniżej. Pamiętaj, że tylko receptury mogą być zaimportowane z eksportu.",
|
||||||
"plantoeat": {
|
"plantoeat": {
|
||||||
"title": "Plan to Eat",
|
"title": "Zaplanuj jedzenie",
|
||||||
"description-long": "Mealie can import recipies from Plan to Eat."
|
"description-long": "Mealie może importować przepisy z Plan to Eat."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"new-recipe": {
|
"new-recipe": {
|
||||||
@ -468,11 +469,11 @@
|
|||||||
"date-format-hint-yyyy-mm-dd": "Format RRRR-MM-DD",
|
"date-format-hint-yyyy-mm-dd": "Format RRRR-MM-DD",
|
||||||
"add-to-list": "Dodaj do listy",
|
"add-to-list": "Dodaj do listy",
|
||||||
"add-to-plan": "Dodaj do planu",
|
"add-to-plan": "Dodaj do planu",
|
||||||
"add-to-timeline": "Add to Timeline",
|
"add-to-timeline": "Dodaj do osi czasu",
|
||||||
"recipe-added-to-list": "Przepis dodany do listy",
|
"recipe-added-to-list": "Przepis dodany do listy",
|
||||||
"recipes-added-to-list": "Przepisy dodane do listy",
|
"recipes-added-to-list": "Przepisy dodane do listy",
|
||||||
"recipe-added-to-mealplan": "Przepis dodany do planu posiłków",
|
"recipe-added-to-mealplan": "Przepis dodany do planu posiłków",
|
||||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
"failed-to-add-recipes-to-list": "Nie udało się dodać przepisu do listy",
|
||||||
"failed-to-add-recipe-to-mealplan": "Nie udało się dodać przepisu do planu posiłków",
|
"failed-to-add-recipe-to-mealplan": "Nie udało się dodać przepisu do planu posiłków",
|
||||||
"yield": "Wydajność",
|
"yield": "Wydajność",
|
||||||
"quantity": "Ilość",
|
"quantity": "Ilość",
|
||||||
@ -495,10 +496,10 @@
|
|||||||
"locked": "Zablokowany",
|
"locked": "Zablokowany",
|
||||||
"public-link": "Link publiczny",
|
"public-link": "Link publiczny",
|
||||||
"timer": {
|
"timer": {
|
||||||
"kitchen-timer": "Kitchen Timer",
|
"kitchen-timer": "Minutnik",
|
||||||
"start-timer": "Włącz minutnik",
|
"start-timer": "Włącz minutnik",
|
||||||
"pause-timer": "Pause Timer",
|
"pause-timer": "Zatrzymaj minutnik",
|
||||||
"resume-timer": "Resume Timer",
|
"resume-timer": "Wznów minutnik",
|
||||||
"stop-timer": "Zatrzymaj minutnik"
|
"stop-timer": "Zatrzymaj minutnik"
|
||||||
},
|
},
|
||||||
"edit-timeline-event": "Edytuj zdarzenie osi czasu",
|
"edit-timeline-event": "Edytuj zdarzenie osi czasu",
|
||||||
@ -510,11 +511,11 @@
|
|||||||
"how-did-it-turn-out": "Jak się to udało?",
|
"how-did-it-turn-out": "Jak się to udało?",
|
||||||
"user-made-this": "{user} ugotował(a) to",
|
"user-made-this": "{user} ugotował(a) to",
|
||||||
"last-made-date": "Ostatnio ugotowano {date}",
|
"last-made-date": "Ostatnio ugotowano {date}",
|
||||||
"api-extras-description": "Dodatki w przepisach są kluczową cechą API Mealie. Pozwalają na tworzenie niestandardowych par kluczy/wartości JSON w recepturze do odwoływania się przez zewnętrzne aplikacje. Możesz użyć tych kluczy do wyzwalania automatyzacji lub przekazywania niestandardowych wiadomości do twoich wybranych urządzeń.",
|
"api-extras-description": "Dodatki w przepisach są kluczową cechą API Mealie. Pozwalają na tworzenie niestandardowych par kluczy/wartości JSON w przepisie do odwoływania się przez zewnętrzne aplikacje. Możesz użyć tych kluczy do wyzwalania automatyzacji lub przekazywania niestandardowych wiadomości do twoich wybranych urządzeń.",
|
||||||
"message-key": "Klucz Wiadomości",
|
"message-key": "Klucz Wiadomości",
|
||||||
"parse": "Analizuj",
|
"parse": "Analizuj",
|
||||||
"attach-images-hint": "Dołącz obrazy przeciągając i upuszczając je do edytora",
|
"attach-images-hint": "Dołącz obrazy przeciągając i upuszczając je do edytora",
|
||||||
"drop-image": "Drop image",
|
"drop-image": "Upuść zdjęcie",
|
||||||
"enable-ingredient-amounts-to-use-this-feature": "Włącz ilości składników, aby użyć tej funkcji",
|
"enable-ingredient-amounts-to-use-this-feature": "Włącz ilości składników, aby użyć tej funkcji",
|
||||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Nie można przeanalizować przepisów z już zdefiniowanymi jednostkami lub żywnością.",
|
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Nie można przeanalizować przepisów z już zdefiniowanymi jednostkami lub żywnością.",
|
||||||
"parse-ingredients": "Analizuj tekst składników",
|
"parse-ingredients": "Analizuj tekst składników",
|
||||||
@ -532,6 +533,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Nazwa przepisu musi być unikalna",
|
"new-recipe-names-must-be-unique": "Nazwa przepisu musi być unikalna",
|
||||||
"scrape-recipe": "Scrapuj Przepis",
|
"scrape-recipe": "Scrapuj Przepis",
|
||||||
"scrape-recipe-description": "Wczytaj przepis przez URL. Podaj adres URL witryny z przepisem, który chcesz wczytać, a Mealie spróbuje wyodrębnić przepis z tej strony i dodać go do kolekcji.",
|
"scrape-recipe-description": "Wczytaj przepis przez URL. Podaj adres URL witryny z przepisem, który chcesz wczytać, a Mealie spróbuje wyodrębnić przepis z tej strony i dodać go do kolekcji.",
|
||||||
|
"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": "Importuj oryginalne słowa kluczowe jako tagi",
|
"import-original-keywords-as-tags": "Importuj oryginalne słowa kluczowe jako tagi",
|
||||||
"stay-in-edit-mode": "Pozostań w trybie edycji",
|
"stay-in-edit-mode": "Pozostań w trybie edycji",
|
||||||
"import-from-zip": "Importuj z pliku Zip",
|
"import-from-zip": "Importuj z pliku Zip",
|
||||||
@ -553,8 +556,9 @@
|
|||||||
"recipe-yield": "Wydajność przepisu",
|
"recipe-yield": "Wydajność przepisu",
|
||||||
"unit": "Jednostka",
|
"unit": "Jednostka",
|
||||||
"upload-image": "Prześlij obraz",
|
"upload-image": "Prześlij obraz",
|
||||||
"screen-awake": "Keep Screen Awake",
|
"screen-awake": "Pozostaw ekran włączony",
|
||||||
"remove-image": "Usuń obraz"
|
"remove-image": "Usuń obraz",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Wyszukiwanie zaawansowane",
|
"advanced-search": "Wyszukiwanie zaawansowane",
|
||||||
@ -573,7 +577,7 @@
|
|||||||
"search-hint": "Naciśnij '/'",
|
"search-hint": "Naciśnij '/'",
|
||||||
"advanced": "Zaawansowane",
|
"advanced": "Zaawansowane",
|
||||||
"auto-search": "Auto wyszukiwanie",
|
"auto-search": "Auto wyszukiwanie",
|
||||||
"no-results": "No results found"
|
"no-results": "Nie znaleziono wyników"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"add-a-new-theme": "Dodaj nowy motyw",
|
"add-a-new-theme": "Dodaj nowy motyw",
|
||||||
@ -582,7 +586,7 @@
|
|||||||
"backup-created": "Kopia zapasowa utworzona pomyślnie",
|
"backup-created": "Kopia zapasowa utworzona pomyślnie",
|
||||||
"backup-created-at-response-export_path": "Kopia zapasowa została utworzona w {path}",
|
"backup-created-at-response-export_path": "Kopia zapasowa została utworzona w {path}",
|
||||||
"backup-deleted": "Kopia zapasowa została usunięta",
|
"backup-deleted": "Kopia zapasowa została usunięta",
|
||||||
"restore-success": "Restore successful",
|
"restore-success": "Przywracanie zakończone sukcesem",
|
||||||
"backup-tag": "Etykieta kopii zapasowej",
|
"backup-tag": "Etykieta kopii zapasowej",
|
||||||
"create-heading": "Utwórz kopię zapasową",
|
"create-heading": "Utwórz kopię zapasową",
|
||||||
"delete-backup": "Usuń kopię zapasową",
|
"delete-backup": "Usuń kopię zapasową",
|
||||||
@ -691,13 +695,13 @@
|
|||||||
"configuration": "Konfiguracja",
|
"configuration": "Konfiguracja",
|
||||||
"docker-volume": "Docker Volume",
|
"docker-volume": "Docker Volume",
|
||||||
"docker-volume-help": "Mealie wymaga, aby kontener frontendu i backendu współdzieliły ten sam wolumen docker lub pamięć. Zapewnia to prawidłowy dostęp do zdjęć i zasobów przechowywanych na dysku.",
|
"docker-volume-help": "Mealie wymaga, aby kontener frontendu i backendu współdzieliły ten sam wolumen docker lub pamięć. Zapewnia to prawidłowy dostęp do zdjęć i zasobów przechowywanych na dysku.",
|
||||||
"volumes-are-misconfigured": "Volumes are misconfigured.",
|
"volumes-are-misconfigured": "Woluminy są skonfigurowane nieprawidłowo.",
|
||||||
"volumes-are-configured-correctly": "Wolumeny są skonfigurowane poprawnie.",
|
"volumes-are-configured-correctly": "Wolumeny są skonfigurowane poprawnie.",
|
||||||
"status-unknown-try-running-a-validation": "Status nieznany. Spróbuj wykonać walidację.",
|
"status-unknown-try-running-a-validation": "Status nieznany. Spróbuj wykonać walidację.",
|
||||||
"validate": "Sprawdź",
|
"validate": "Sprawdź",
|
||||||
"email-configuration-status": "Status konfiguracji Email",
|
"email-configuration-status": "Status konfiguracji Email",
|
||||||
"email-configured": "Email Configured",
|
"email-configured": "E-mail skonfigurowany",
|
||||||
"email-test-results": "Email Test Results",
|
"email-test-results": "Wyniki testu e-mail",
|
||||||
"ready": "Gotowe",
|
"ready": "Gotowe",
|
||||||
"not-ready": "Niegotowy - Sprawdź zmienne środowiskowe",
|
"not-ready": "Niegotowy - Sprawdź zmienne środowiskowe",
|
||||||
"succeeded": "Powiodło się",
|
"succeeded": "Powiodło się",
|
||||||
@ -788,7 +792,8 @@
|
|||||||
"tags": "Tagi",
|
"tags": "Tagi",
|
||||||
"untagged-count": "{count} bez etykiety",
|
"untagged-count": "{count} bez etykiety",
|
||||||
"create-a-tag": "Utwórz znacznik",
|
"create-a-tag": "Utwórz znacznik",
|
||||||
"tag-name": "Nazwa znacznika"
|
"tag-name": "Nazwa znacznika",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Narzędzia",
|
"tools": "Narzędzia",
|
||||||
@ -797,7 +802,8 @@
|
|||||||
"tool-name": "Nazwa narzędzia",
|
"tool-name": "Nazwa narzędzia",
|
||||||
"create-new-tool": "Utwórz nowe narzędzie",
|
"create-new-tool": "Utwórz nowe narzędzie",
|
||||||
"on-hand-checkbox-label": "Pokaż jako Posiadane (Zaznaczono)",
|
"on-hand-checkbox-label": "Pokaż jako Posiadane (Zaznaczono)",
|
||||||
"required-tools": "Wymagane Narzędzia"
|
"required-tools": "Wymagane Narzędzia",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Administrator",
|
"admin": "Administrator",
|
||||||
@ -876,7 +882,7 @@
|
|||||||
"user-management": "Zarządzanie użytkownikami",
|
"user-management": "Zarządzanie użytkownikami",
|
||||||
"reset-locked-users": "Zresetuj zablokowanych użytkowników",
|
"reset-locked-users": "Zresetuj zablokowanych użytkowników",
|
||||||
"admin-user-creation": "Administracja Tworzenie Użytkownika",
|
"admin-user-creation": "Administracja Tworzenie Użytkownika",
|
||||||
"admin-user-management": "Admin User Management",
|
"admin-user-management": "Zarządzanie użytkownikami",
|
||||||
"user-details": "Dane użytkownika",
|
"user-details": "Dane użytkownika",
|
||||||
"user-name": "Nazwa użytkownika",
|
"user-name": "Nazwa użytkownika",
|
||||||
"authentication-method": "Sposób uwierzytelniania",
|
"authentication-method": "Sposób uwierzytelniania",
|
||||||
@ -887,11 +893,11 @@
|
|||||||
"user-can-manage-group": "Użytkownik może zarządzać grupą",
|
"user-can-manage-group": "Użytkownik może zarządzać grupą",
|
||||||
"user-can-organize-group-data": "Użytkownik może organizować dane grupy",
|
"user-can-organize-group-data": "Użytkownik może organizować dane grupy",
|
||||||
"enable-advanced-features": "Włącz zaawansowane funkcje",
|
"enable-advanced-features": "Włącz zaawansowane funkcje",
|
||||||
"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": "Wygląda na to, że to jest twoje pierwsze logowanie.",
|
||||||
"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": "Nie chcesz już tego widzieć? Pamiętaj, aby zmienić swój adres e-mail w ustawieniach użytkownika!",
|
||||||
"forgot-password": "Forgot Password",
|
"forgot-password": "Nie pamiętam hasła",
|
||||||
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
|
"forgot-password-text": "Podaj adres e-mail konta, do którego chcesz odzyskać hasło.",
|
||||||
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
|
"changes-reflected-immediately": "Zmiany dla tego użytkownika będą zastosowane natychmiastowo."
|
||||||
},
|
},
|
||||||
"language-dialog": {
|
"language-dialog": {
|
||||||
"translated": "przetłumaczone",
|
"translated": "przetłumaczone",
|
||||||
@ -913,8 +919,8 @@
|
|||||||
"food-label": "Etykieta Żywności",
|
"food-label": "Etykieta Żywności",
|
||||||
"edit-food": "Edytuj Żywność",
|
"edit-food": "Edytuj Żywność",
|
||||||
"food-data": "Dane Żywności",
|
"food-data": "Dane Żywności",
|
||||||
"example-food-singular": "ex: Onion",
|
"example-food-singular": "np. Cebula",
|
||||||
"example-food-plural": "ex: Onions"
|
"example-food-plural": "np. Cebule"
|
||||||
},
|
},
|
||||||
"units": {
|
"units": {
|
||||||
"seed-dialog-text": "Wypełnij bazę zwyczajowymi jednostkami dla wybranego języka.",
|
"seed-dialog-text": "Wypełnij bazę zwyczajowymi jednostkami dla wybranego języka.",
|
||||||
@ -933,8 +939,8 @@
|
|||||||
"unit-data": "Dane Jednostki",
|
"unit-data": "Dane Jednostki",
|
||||||
"use-abbv": "Użyj Skr.",
|
"use-abbv": "Użyj Skr.",
|
||||||
"fraction": "Ułamki",
|
"fraction": "Ułamki",
|
||||||
"example-unit-singular": "ex: Tablespoon",
|
"example-unit-singular": "np. Łyżka stołowa",
|
||||||
"example-unit-plural": "ex: Tablespoons",
|
"example-unit-plural": "np. Łyżki stołowe",
|
||||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
"example-unit-abbreviation-singular": "ex: Tbsp",
|
||||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
"example-unit-abbreviation-plural": "ex: Tbsps"
|
||||||
},
|
},
|
||||||
@ -965,8 +971,8 @@
|
|||||||
"delete-recipes": "Usuń Przepisy",
|
"delete-recipes": "Usuń Przepisy",
|
||||||
"source-unit-will-be-deleted": "Jednostka źródłowa zostanie usunięta"
|
"source-unit-will-be-deleted": "Jednostka źródłowa zostanie usunięta"
|
||||||
},
|
},
|
||||||
"create-alias": "Create Alias",
|
"create-alias": "Utwórz alias",
|
||||||
"manage-aliases": "Manage Aliases",
|
"manage-aliases": "Zarządzaj aliasami",
|
||||||
"seed-data": "Dane przykładowe",
|
"seed-data": "Dane przykładowe",
|
||||||
"seed": "Seed",
|
"seed": "Seed",
|
||||||
"data-management": "Zarządzanie Danymi",
|
"data-management": "Zarządzanie Danymi",
|
||||||
@ -982,18 +988,18 @@
|
|||||||
},
|
},
|
||||||
"tags": {
|
"tags": {
|
||||||
"new-tag": "Nowy Tag",
|
"new-tag": "Nowy Tag",
|
||||||
"edit-tag": "Edit Tag",
|
"edit-tag": "Edytuj tag",
|
||||||
"tag-data": "Tag Data"
|
"tag-data": "Dane tagu"
|
||||||
},
|
},
|
||||||
"tools": {
|
"tools": {
|
||||||
"new-tool": "New Tool",
|
"new-tool": "Nowe Narzędzie",
|
||||||
"edit-tool": "Edit Tool",
|
"edit-tool": "Edytuj Narzędzie",
|
||||||
"tool-data": "Tool Data"
|
"tool-data": "Dane narzędzia"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"user-registration": {
|
"user-registration": {
|
||||||
"user-registration": "Rejestracja użytkownika",
|
"user-registration": "Rejestracja użytkownika",
|
||||||
"registration-success": "Registration Success",
|
"registration-success": "Rejestracja przebiegła pomyślnie",
|
||||||
"join-a-group": "Dołącz do grupy",
|
"join-a-group": "Dołącz do grupy",
|
||||||
"create-a-new-group": "Stwórz nową grupę",
|
"create-a-new-group": "Stwórz nową grupę",
|
||||||
"provide-registration-token-description": "Podaj kod rejestracyjny powiązany z grupą do której chcesz dołączyć. Taki kod uzyskać możesz od użytkownika który przynależy już do owej grupy.",
|
"provide-registration-token-description": "Podaj kod rejestracyjny powiązany z grupą do której chcesz dołączyć. Taki kod uzyskać możesz od użytkownika który przynależy już do owej grupy.",
|
||||||
@ -1040,7 +1046,7 @@
|
|||||||
},
|
},
|
||||||
"ocr-editor": {
|
"ocr-editor": {
|
||||||
"ocr-editor": "Edytor OCR",
|
"ocr-editor": "Edytor OCR",
|
||||||
"toolbar": "Toolbar",
|
"toolbar": "Pasek narzędzi",
|
||||||
"selection-mode": "Tryb wyboru",
|
"selection-mode": "Tryb wyboru",
|
||||||
"pan-and-zoom-picture": "Przesuwanie i powiększanie obrazu",
|
"pan-and-zoom-picture": "Przesuwanie i powiększanie obrazu",
|
||||||
"split-text": "Podziel tekst",
|
"split-text": "Podziel tekst",
|
||||||
@ -1048,8 +1054,8 @@
|
|||||||
"split-by-block": "Podziel według bloku tekstowego",
|
"split-by-block": "Podziel według bloku tekstowego",
|
||||||
"flatten": "Wyrównaj niezależnie od oryginalnego formatowania",
|
"flatten": "Wyrównaj niezależnie od oryginalnego formatowania",
|
||||||
"help": {
|
"help": {
|
||||||
"help": "Help",
|
"help": "Pomoc",
|
||||||
"mouse-modes": "Mouse modes",
|
"mouse-modes": "Tryb myszy",
|
||||||
"selection-mode": "Tryb wyboru (domyślny)",
|
"selection-mode": "Tryb wyboru (domyślny)",
|
||||||
"selection-mode-desc": "Tryb wyboru jest głównym trybem, który służy do wprowadzenia danych:",
|
"selection-mode-desc": "Tryb wyboru jest głównym trybem, który służy do wprowadzenia danych:",
|
||||||
"selection-mode-steps": {
|
"selection-mode-steps": {
|
||||||
@ -1125,7 +1131,7 @@
|
|||||||
"welcome-user": "👋 Witaj, {0}",
|
"welcome-user": "👋 Witaj, {0}",
|
||||||
"description": "Zarządzaj swoim profilem, przepisami i ustawieniami grupy.",
|
"description": "Zarządzaj swoim profilem, przepisami i ustawieniami grupy.",
|
||||||
"get-invite-link": "Uzyskaj link z zaproszeniem",
|
"get-invite-link": "Uzyskaj link z zaproszeniem",
|
||||||
"get-public-link": "Get Public Link",
|
"get-public-link": "Uzyskaj link publiczny",
|
||||||
"account-summary": "Podsumowanie konta",
|
"account-summary": "Podsumowanie konta",
|
||||||
"account-summary-description": "Oto podsumowanie informacji o Twojej grupie",
|
"account-summary-description": "Oto podsumowanie informacji o Twojej grupie",
|
||||||
"group-statistics": "Statystyki Grupy",
|
"group-statistics": "Statystyki Grupy",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Recarregar",
|
"refresh": "Recarregar",
|
||||||
"upload-file": "Enviar arquivo",
|
"upload-file": "Enviar arquivo",
|
||||||
"created-on-date": "Criado em {0}",
|
"created-on-date": "Criado em {0}",
|
||||||
"unsaved-changes": "Você possui alterações não salvas. Deseja salvar antes de sair? Ok para salvar, Cancelar para descartar alterações."
|
"unsaved-changes": "Você possui alterações não salvas. Deseja salvar antes de sair? Ok para salvar, Cancelar para descartar alterações.",
|
||||||
|
"clipboard-copy-failure": "Failed to copy to the clipboard."
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Tem certeza que deseja excluir o grupo <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Tem certeza que deseja excluir o grupo <b>{groupName}<b/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "Como que ficou?",
|
"how-did-it-turn-out": "Como que ficou?",
|
||||||
"user-made-this": "{user} fez isso",
|
"user-made-this": "{user} fez isso",
|
||||||
"last-made-date": "Feito pela última vez em {date}",
|
"last-made-date": "Feito pela última vez em {date}",
|
||||||
"api-extras-description": "Receitas extras são características chave da API Mealie. Eles permitem que você crie pares personalizados de chave/valor de json em uma receita para referência a partir de aplicativos de terceiros. Você pode usar essas chaves para conter informações para acionar automação ou mensagens personalizadas para transmitir ao seu dispositivo desejado.",
|
"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": "Chave de mensagem",
|
"message-key": "Chave de mensagem",
|
||||||
"parse": "Analisar",
|
"parse": "Analisar",
|
||||||
"attach-images-hint": "Anexe imagens arrastando e soltando-as no editor",
|
"attach-images-hint": "Anexe imagens arrastando e soltando-as no editor",
|
||||||
@ -532,6 +533,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Novos nomes de receitas devem ser únicos",
|
"new-recipe-names-must-be-unique": "Novos nomes de receitas devem ser únicos",
|
||||||
"scrape-recipe": "Extrair receita do site",
|
"scrape-recipe": "Extrair receita do site",
|
||||||
"scrape-recipe-description": "Scrape uma receita por url. Forneça o Url para o site que você deseja scrape, e Mealie tentará raspar a receita desse site e adicioná-la à sua coleção.",
|
"scrape-recipe-description": "Scrape uma receita por url. Forneça o Url para o site que você deseja scrape, e Mealie tentará raspar a receita desse site e adicioná-la à sua coleção.",
|
||||||
|
"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": "Importar palavras-chave originais como marcadores",
|
"import-original-keywords-as-tags": "Importar palavras-chave originais como marcadores",
|
||||||
"stay-in-edit-mode": "Permanecer no modo de edição",
|
"stay-in-edit-mode": "Permanecer no modo de edição",
|
||||||
"import-from-zip": "Importar do .zip",
|
"import-from-zip": "Importar do .zip",
|
||||||
@ -554,7 +557,8 @@
|
|||||||
"unit": "Unidade",
|
"unit": "Unidade",
|
||||||
"upload-image": "Enviar imagem",
|
"upload-image": "Enviar imagem",
|
||||||
"screen-awake": "Manter a tela ligada",
|
"screen-awake": "Manter a tela ligada",
|
||||||
"remove-image": "Remover imagem"
|
"remove-image": "Remover imagem",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Pesquisa avançada",
|
"advanced-search": "Pesquisa avançada",
|
||||||
@ -788,7 +792,8 @@
|
|||||||
"tags": "Marcadores",
|
"tags": "Marcadores",
|
||||||
"untagged-count": "{count} sem marcador",
|
"untagged-count": "{count} sem marcador",
|
||||||
"create-a-tag": "Criar um marcador",
|
"create-a-tag": "Criar um marcador",
|
||||||
"tag-name": "Nome do Marcador"
|
"tag-name": "Nome do Marcador",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Ferramentas",
|
"tools": "Ferramentas",
|
||||||
@ -797,7 +802,8 @@
|
|||||||
"tool-name": "Nome da ferramenta",
|
"tool-name": "Nome da ferramenta",
|
||||||
"create-new-tool": "Criar Ferramenta",
|
"create-new-tool": "Criar Ferramenta",
|
||||||
"on-hand-checkbox-label": "Mostrar como disponível (checado)",
|
"on-hand-checkbox-label": "Mostrar como disponível (checado)",
|
||||||
"required-tools": "Ferramentas necessárias"
|
"required-tools": "Ferramentas necessárias",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Administrador",
|
"admin": "Administrador",
|
||||||
|
@ -114,7 +114,7 @@
|
|||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Palavra-chave",
|
"keyword": "Palavra-chave",
|
||||||
"link-copied": "Ligação copiada",
|
"link-copied": "Ligação copiada",
|
||||||
"loading": "Loading",
|
"loading": "A carregar",
|
||||||
"loading-events": "A carregar Eventos",
|
"loading-events": "A carregar Eventos",
|
||||||
"loading-recipe": "A carregar receita...",
|
"loading-recipe": "A carregar receita...",
|
||||||
"loading-ocr-data": "A carregar dados OCR...",
|
"loading-ocr-data": "A carregar dados OCR...",
|
||||||
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Atualizar",
|
"refresh": "Atualizar",
|
||||||
"upload-file": "Carregar ficheiro",
|
"upload-file": "Carregar ficheiro",
|
||||||
"created-on-date": "Criado em: {0}",
|
"created-on-date": "Criado em: {0}",
|
||||||
"unsaved-changes": "Tem alterações por gravar. Quer gravar antes de sair? OK para gravar, Cancelar para descartar alterações."
|
"unsaved-changes": "Tem alterações por gravar. Quer gravar antes de sair? OK para gravar, Cancelar para descartar alterações.",
|
||||||
|
"clipboard-copy-failure": "Erro ao copiar para a área de transferência."
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Tem a certeza que quer eliminar <b>{groupName}</b>?",
|
"are-you-sure-you-want-to-delete-the-group": "Tem a certeza que quer eliminar <b>{groupName}</b>?",
|
||||||
@ -237,7 +238,7 @@
|
|||||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Permitir que utilizadores externos ao seu grupo vejam as suas receitas",
|
"allow-users-outside-of-your-group-to-see-your-recipes": "Permitir que utilizadores externos ao seu grupo vejam as suas receitas",
|
||||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Quando ativado, poderá usar um link público para partilhar receitas específicas sem autorizar o utilizador. Quando desativado, só poderá partilhar receitas com utilizadores do seu grupo ou com um link privado gerado previamente",
|
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Quando ativado, poderá usar um link público para partilhar receitas específicas sem autorizar o utilizador. Quando desativado, só poderá partilhar receitas com utilizadores do seu grupo ou com um link privado gerado previamente",
|
||||||
"show-nutrition-information": "Mostrar informações nutricionais",
|
"show-nutrition-information": "Mostrar informações nutricionais",
|
||||||
"show-nutrition-information-description": "Quando ativado, a informação nutricional será exibida na receita, se disponível. Se não houver informação nutricional disponível, está não será exibida",
|
"show-nutrition-information-description": "Quando ativado, a informação nutricional será exibida na receita, se disponível. Se não houver informação nutricional disponível, esta não será exibida",
|
||||||
"show-recipe-assets": "Mostrar recursos da receita",
|
"show-recipe-assets": "Mostrar recursos da receita",
|
||||||
"show-recipe-assets-description": "Quando ativado, os recursos da receita serão mostrados na receita, se disponíveis",
|
"show-recipe-assets-description": "Quando ativado, os recursos da receita serão mostrados na receita, se disponíveis",
|
||||||
"default-to-landscape-view": "Padrão para visualização em paisagem",
|
"default-to-landscape-view": "Padrão para visualização em paisagem",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "Que tal ficou?",
|
"how-did-it-turn-out": "Que tal ficou?",
|
||||||
"user-made-this": "{user} fez isto",
|
"user-made-this": "{user} fez isto",
|
||||||
"last-made-date": "Última vez {date}",
|
"last-made-date": "Última vez {date}",
|
||||||
"api-extras-description": "Extras para receitas são funcionalidades chave da API Mealie. Estas permitem criar pares personalizados de chave/valor em json numa receita para referência a partir de aplicações de terceiros. Pode usar essas chaves para conter informações, para acionar automações ou mensagens personalizadas para transmitir a um dispositivo desejado.",
|
"api-extras-description": "Extras para receitas são funcionalidades chave da API Mealie. Estas permitem criar, dentro de uma receita, pares personalizados de chave/valor em JSON, para referência a partir de aplicações de terceiros. Pode usar essas chaves para fornecer informações, por exemplo, para acionar automações ou mensagens personalizadas para transmitir a um determinado dispositivo.",
|
||||||
"message-key": "Chave de Mensagem",
|
"message-key": "Chave de Mensagem",
|
||||||
"parse": "Interpretar",
|
"parse": "Interpretar",
|
||||||
"attach-images-hint": "Anexe imagens arrastando e soltando-as no editor",
|
"attach-images-hint": "Anexe imagens arrastando e soltando-as no editor",
|
||||||
@ -532,6 +533,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Os nomes de receitas devem ser únicos",
|
"new-recipe-names-must-be-unique": "Os nomes de receitas devem ser únicos",
|
||||||
"scrape-recipe": "Obter receita da Web (Scrape)",
|
"scrape-recipe": "Obter receita da Web (Scrape)",
|
||||||
"scrape-recipe-description": "Fazer scrape a receita por URL. Indique o URL da página a que quer fazer scrape e o Mealie tentará obter a receita dessa página e adicioná-la à sua coleção.",
|
"scrape-recipe-description": "Fazer scrape a receita por URL. Indique o URL da página a que quer fazer scrape e o Mealie tentará obter a receita dessa página e adicioná-la à sua coleção.",
|
||||||
|
"scrape-recipe-have-a-lot-of-recipes": "Tem muitas receitas para processar em simultâneo?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Experimente o importador em massa",
|
||||||
"import-original-keywords-as-tags": "Importar palavras-chave originais como etiquetas",
|
"import-original-keywords-as-tags": "Importar palavras-chave originais como etiquetas",
|
||||||
"stay-in-edit-mode": "Permanecer no modo de edição",
|
"stay-in-edit-mode": "Permanecer no modo de edição",
|
||||||
"import-from-zip": "Importar de Zip",
|
"import-from-zip": "Importar de Zip",
|
||||||
@ -554,7 +557,8 @@
|
|||||||
"unit": "Unidade",
|
"unit": "Unidade",
|
||||||
"upload-image": "Carregar imagem",
|
"upload-image": "Carregar imagem",
|
||||||
"screen-awake": "Manter ecrã ligado",
|
"screen-awake": "Manter ecrã ligado",
|
||||||
"remove-image": "Remover imagem"
|
"remove-image": "Remover imagem",
|
||||||
|
"nextStep": "Próximo passo"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Pesquisa Avançada",
|
"advanced-search": "Pesquisa Avançada",
|
||||||
@ -788,7 +792,8 @@
|
|||||||
"tags": "Etiquetas",
|
"tags": "Etiquetas",
|
||||||
"untagged-count": "Sem etiqueta {count}",
|
"untagged-count": "Sem etiqueta {count}",
|
||||||
"create-a-tag": "Criar uma Etiqueta",
|
"create-a-tag": "Criar uma Etiqueta",
|
||||||
"tag-name": "Nome da Etiqueta"
|
"tag-name": "Nome da Etiqueta",
|
||||||
|
"tag": "Etiqueta"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Utensílios",
|
"tools": "Utensílios",
|
||||||
@ -797,7 +802,8 @@
|
|||||||
"tool-name": "Nome do Utensílio",
|
"tool-name": "Nome do Utensílio",
|
||||||
"create-new-tool": "Criar Utensílio",
|
"create-new-tool": "Criar Utensílio",
|
||||||
"on-hand-checkbox-label": "Mostrar como À Mão (Verificado)",
|
"on-hand-checkbox-label": "Mostrar como À Mão (Verificado)",
|
||||||
"required-tools": "Utensílios Necessários"
|
"required-tools": "Utensílios Necessários",
|
||||||
|
"tool": "Utensílio"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Administrador",
|
"admin": "Administrador",
|
||||||
|
@ -77,7 +77,7 @@
|
|||||||
"tag-events": "Etichetele de Evenimente",
|
"tag-events": "Etichetele de Evenimente",
|
||||||
"category-events": "Categorie de Evenimente",
|
"category-events": "Categorie de Evenimente",
|
||||||
"when-a-new-user-joins-your-group": "Când un utilizator nou se alătură grupului tău",
|
"when-a-new-user-joins-your-group": "Când un utilizator nou se alătură grupului tău",
|
||||||
"recipe-events": "Recipe Events"
|
"recipe-events": "Evenimente rețetă"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"cancel": "Anulează",
|
"cancel": "Anulează",
|
||||||
@ -114,10 +114,10 @@
|
|||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Cuvânt cheie",
|
"keyword": "Cuvânt cheie",
|
||||||
"link-copied": "Link copiat",
|
"link-copied": "Link copiat",
|
||||||
"loading": "Loading",
|
"loading": "Se încarcă",
|
||||||
"loading-events": "Se încarcă evenimentele",
|
"loading-events": "Se încarcă evenimentele",
|
||||||
"loading-recipe": "Loading recipe...",
|
"loading-recipe": "Se încarcă rețeta...",
|
||||||
"loading-ocr-data": "Loading OCR data...",
|
"loading-ocr-data": "Se încarcă datele OCR...",
|
||||||
"loading-recipes": "Se încarcă rețetele",
|
"loading-recipes": "Se încarcă rețetele",
|
||||||
"message": "Mesaj",
|
"message": "Mesaj",
|
||||||
"monday": "Luni",
|
"monday": "Luni",
|
||||||
@ -128,7 +128,7 @@
|
|||||||
"no-recipe-found": "Nici o rețetă găsită",
|
"no-recipe-found": "Nici o rețetă găsită",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"options": "Opțiuni:",
|
"options": "Opțiuni:",
|
||||||
"plural-name": "Plural Name",
|
"plural-name": "Denumire Plural",
|
||||||
"print": "Imprimare",
|
"print": "Imprimare",
|
||||||
"print-preferences": "Preferințe de imprimare",
|
"print-preferences": "Preferințe de imprimare",
|
||||||
"random": "Aleatoriu",
|
"random": "Aleatoriu",
|
||||||
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Reîncarcă",
|
"refresh": "Reîncarcă",
|
||||||
"upload-file": "Încărcă fișier",
|
"upload-file": "Încărcă fișier",
|
||||||
"created-on-date": "Creat pe {0}",
|
"created-on-date": "Creat pe {0}",
|
||||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes."
|
"unsaved-changes": "Aveți modificări nesalvate. Doriți să salvați înainte de a închide aplicația? Apăsați \"OK\" pentru a salva sau \"Anulare\" pentru a renunța la modificări.",
|
||||||
|
"clipboard-copy-failure": "Copierea în clipboard a eșuat."
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Sunteți sigur că doriți să ștergeți <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Sunteți sigur că doriți să ștergeți <b>{groupName}<b/>?",
|
||||||
@ -213,7 +214,7 @@
|
|||||||
"group-id-with-value": "ID-ul grupului: {groupID}",
|
"group-id-with-value": "ID-ul grupului: {groupID}",
|
||||||
"group-name": "Numele Grupului",
|
"group-name": "Numele Grupului",
|
||||||
"group-not-found": "Grupul nu a fost găsit",
|
"group-not-found": "Grupul nu a fost găsit",
|
||||||
"group-token": "Group Token",
|
"group-token": "Token de grup",
|
||||||
"group-with-value": "Grup: {groupID}",
|
"group-with-value": "Grup: {groupID}",
|
||||||
"groups": "Grupuri",
|
"groups": "Grupuri",
|
||||||
"manage-groups": "Gestionare grupuri",
|
"manage-groups": "Gestionare grupuri",
|
||||||
@ -249,7 +250,7 @@
|
|||||||
"general-preferences": "Preferințe generale",
|
"general-preferences": "Preferințe generale",
|
||||||
"group-recipe-preferences": "Preferințe Rețetă de grup",
|
"group-recipe-preferences": "Preferințe Rețetă de grup",
|
||||||
"report": "Raportează",
|
"report": "Raportează",
|
||||||
"report-with-id": "Report ID: {id}",
|
"report-with-id": "ID Raport: {id}",
|
||||||
"group-management": "Management grup",
|
"group-management": "Management grup",
|
||||||
"admin-group-management": "Gestionare grup administratori",
|
"admin-group-management": "Gestionare grup administratori",
|
||||||
"admin-group-management-text": "Modificările la acest grup se vor reflecta imediat.",
|
"admin-group-management-text": "Modificările la acest grup se vor reflecta imediat.",
|
||||||
@ -300,73 +301,73 @@
|
|||||||
"this-rule-will-apply": "Această regulă va aplica {dayCriteria} {mealTypeCriteria}.",
|
"this-rule-will-apply": "Această regulă va aplica {dayCriteria} {mealTypeCriteria}.",
|
||||||
"to-all-days": "la toate zilele",
|
"to-all-days": "la toate zilele",
|
||||||
"on-days": "on {0}s",
|
"on-days": "on {0}s",
|
||||||
"for-all-meal-types": "for all meal types",
|
"for-all-meal-types": "pentru toate tipurile de mese",
|
||||||
"for-type-meal-types": "for {0} meal types",
|
"for-type-meal-types": "pentru {0} tipuri de mese",
|
||||||
"meal-plan-rules": "Meal Plan Rules",
|
"meal-plan-rules": "Regulile Planului de Masă",
|
||||||
"new-rule": "New Rule",
|
"new-rule": "Regulă nouă",
|
||||||
"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": "Puteți crea reguli pentru selectarea automată a rețetelor pentru planurile dumneavoastră de masă. Aceste reguli sunt folosite de către server pentru a determina rețetele valabile pentru selecție, atunci când creezi planurile de masă. În cazul in care regulile au aceleași constrângeri de zi sau de tip, atunci categoriile regulilor vor fi fuzionate. În practică, este inutilă creerea regulilor dublate, dar este posibil să se întample acest lucru.",
|
||||||
"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": "Atunci când creați o nouă regulă pentru un plan de masă puteți restricționa regula aplicabilă pentru o anumită zi a săptămânii și/sau pentru un anumit tip de masă. Pentru a aplica o regulă pentru toate zilele sau toate tipurile de mese puteţi seta regula la \"Oricare\" ce va fi aplicată la toate valorile posibile pentru ziua şi/sau tipul mesei.",
|
||||||
"recipe-rules": "Recipe Rules",
|
"recipe-rules": "Reguli rețetă",
|
||||||
"applies-to-all-days": "Applies to all days",
|
"applies-to-all-days": "Se aplică pentru toate zilele",
|
||||||
"applies-on-days": "Applies on {0}s",
|
"applies-on-days": "Applies on {0}s",
|
||||||
"meal-plan-settings": "Meal Plan Settings"
|
"meal-plan-settings": "Setările Planului de Masă"
|
||||||
},
|
},
|
||||||
"migration": {
|
"migration": {
|
||||||
"migration-data-removed": "Migration data removed",
|
"migration-data-removed": "Datele migrării au fost șterse",
|
||||||
"new-migration": "New Migration",
|
"new-migration": "New Migration",
|
||||||
"no-file-selected": "No File Selected",
|
"no-file-selected": "No File Selected",
|
||||||
"no-migration-data-available": "No Migration Data Available",
|
"no-migration-data-available": "No Migration Data Available",
|
||||||
"previous-migrations": "Previous Migrations",
|
"previous-migrations": "Previous Migrations",
|
||||||
"recipe-migration": "Recipe Migration",
|
"recipe-migration": "Recipe Migration",
|
||||||
"chowdown": {
|
"chowdown": {
|
||||||
"description": "Migrate data from Chowdown",
|
"description": "Migrează datele din Chowdown",
|
||||||
"description-long": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
"description-long": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||||
"title": "Chowdown"
|
"title": "Chowdown"
|
||||||
},
|
},
|
||||||
"nextcloud": {
|
"nextcloud": {
|
||||||
"description": "Migrate data from a Nextcloud Cookbook instance",
|
"description": "Migrează datele dintr-o instanță de Nextcloud Cookbook",
|
||||||
"description-long": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.",
|
"description-long": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.",
|
||||||
"title": "Nextcloud Cookbook"
|
"title": "Nextcloud Cookbook"
|
||||||
},
|
},
|
||||||
"copymethat": {
|
"copymethat": {
|
||||||
"description-long": "Mealie can import recipes from Copy Me That. Export your recipes in HTML format, then upload the .zip below.",
|
"description-long": "Mealie poate importa rețete din Copy Me That. Exportă rețetele în format HTML, apoi încarcă fișierul de tip \".ZIP\" folosind câmpul de mai jos.",
|
||||||
"title": "Copy Me That Recipe Manager"
|
"title": "Copy Me That Recipe Manager"
|
||||||
},
|
},
|
||||||
"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 poate importa rețete din aplicația Paprika. Exportă rețetele din Paprika, redenumește extensia de export în \".ZIP\" și încarcă-o folosind câmpul de mai jos.",
|
||||||
"title": "Paprika Recipe Manager"
|
"title": "Paprika Recipe Manager"
|
||||||
},
|
},
|
||||||
"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 poate importa rețetele din aplicația Mealie dintr-o lansare pre-v1.0. Exportă rețetele din vechea aplicație, apoi încarcă fișierul de tip \".ZIP\" folosind câmpul de mai jos. Numai rețetele pot fi importate din export.",
|
||||||
"title": "Mealie Pre v1.0"
|
"title": "Mealie Pre v1.0"
|
||||||
},
|
},
|
||||||
"tandoor": {
|
"tandoor": {
|
||||||
"description-long": "Mealie can import recipes from Tandoor. Export your data in the \"Default\" format, then upload the .zip below.",
|
"description-long": "Mealie poate importa rețete din Tandoor. Exportă datele în formatul \"Implicit\", apoi încarcă fișierul de tip \".ZIP\" folosind câmpul de mai jos.",
|
||||||
"title": "Tandoor Recipes"
|
"title": "Rețete Tandoor"
|
||||||
},
|
},
|
||||||
"recipe-data-migrations": "Recipe Data Migrations",
|
"recipe-data-migrations": "Migrarea datelor rețetelor",
|
||||||
"recipe-data-migrations-explanation": "Recipes can be migrated from another supported application to Mealie. This is a great way to get started with Mealie.",
|
"recipe-data-migrations-explanation": "Rețetele pot fi migrate de la o altă aplicație ce este suportată de Mealie. Acesta este un mod excelent de a începe să folosiți Mealie.",
|
||||||
"choose-migration-type": "Choose Migration Type",
|
"choose-migration-type": "Alegeți tipul de migrare",
|
||||||
"tag-all-recipes": "Tag all recipes with {tag-name} tag",
|
"tag-all-recipes": "Etichetați toate rețetele cu eticheta {tag-name}",
|
||||||
"nextcloud-text": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.",
|
"nextcloud-text": "Rețetele din Nextcloud pot fi importate dintr-un fișier de tip \".ZIP\" ce conține toate datele stocate în Nextcloud. Vedeți structura directorului din exemplul de mai jos pentru a vă asigura că rețetele pot fi importate cu succes.",
|
||||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below",
|
"chowdown-text": "Mealie acceptă nativ formatul repo-ului Chowdown. Descărcați depozitul de cod ca fișier \".ZIP\" și încărcați-l mai jos.",
|
||||||
"recipe-1": "Recipe 1",
|
"recipe-1": "Rețeta 1",
|
||||||
"recipe-2": "Recipe 2",
|
"recipe-2": "Rețeta 2",
|
||||||
"paprika-text": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.",
|
"paprika-text": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.",
|
||||||
"mealie-text": "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.",
|
"mealie-text": "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.",
|
||||||
"plantoeat": {
|
"plantoeat": {
|
||||||
"title": "Plan to Eat",
|
"title": "Planifică să Mănânci",
|
||||||
"description-long": "Mealie can import recipies from Plan to Eat."
|
"description-long": "Mealie can import recipies from Plan to Eat."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"new-recipe": {
|
"new-recipe": {
|
||||||
"bulk-add": "Bulk Add",
|
"bulk-add": "Adăugare în masă",
|
||||||
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
"error-details": "Only websites containing ld+json or microdata can be imported by Mealie. Most major recipe websites support this data structure. If your site cannot be imported but there is json data in the log, please submit a github issue with the URL and data.",
|
||||||
"error-title": "Looks Like We Couldn't Find Anything",
|
"error-title": "Looks Like We Couldn't Find Anything",
|
||||||
"from-url": "Import a Recipe",
|
"from-url": "Importați o rețetă",
|
||||||
"github-issues": "GitHub Issues",
|
"github-issues": "GitHub Issues",
|
||||||
"google-ld-json-info": "Google ld+json Info",
|
"google-ld-json-info": "Google ld+json Info",
|
||||||
"must-be-a-valid-url": "Must be a Valid URL",
|
"must-be-a-valid-url": "Trebuie să fie o adresă URL validă",
|
||||||
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
|
"paste-in-your-recipe-data-each-line-will-be-treated-as-an-item-in-a-list": "Paste in your recipe data. Each line will be treated as an item in a list",
|
||||||
"recipe-markup-specification": "Recipe Markup Specification",
|
"recipe-markup-specification": "Recipe Markup Specification",
|
||||||
"recipe-url": "Recipe URL",
|
"recipe-url": "Recipe URL",
|
||||||
@ -406,20 +407,20 @@
|
|||||||
"categories": "Categories",
|
"categories": "Categories",
|
||||||
"comment-action": "Comment",
|
"comment-action": "Comment",
|
||||||
"comment": "Comment",
|
"comment": "Comment",
|
||||||
"comments": "Comments",
|
"comments": "Comentarii",
|
||||||
"delete-confirmation": "Are you sure you want to delete this recipe?",
|
"delete-confirmation": "Sunteți sigur că doriți să ștergeți această rețetă?",
|
||||||
"delete-recipe": "Delete Recipe",
|
"delete-recipe": "Șterge rețeta",
|
||||||
"description": "Description",
|
"description": "Descriere",
|
||||||
"disable-amount": "Disable Ingredient Amounts",
|
"disable-amount": "Disable Ingredient Amounts",
|
||||||
"disable-comments": "Disable Comments",
|
"disable-comments": "Dezactivează comentariile",
|
||||||
"duplicate": "Duplicate recipe",
|
"duplicate": "Reţeta duplicată",
|
||||||
"duplicate-name": "Name of the new recipe",
|
"duplicate-name": "Denumirea noii rețete",
|
||||||
"edit-scale": "Edit Scale",
|
"edit-scale": "Modifică scara",
|
||||||
"fat-content": "Fat",
|
"fat-content": "Grăsime",
|
||||||
"fiber-content": "Fiber",
|
"fiber-content": "Fibră",
|
||||||
"grams": "grams",
|
"grams": "grame",
|
||||||
"ingredient": "Ingredient",
|
"ingredient": "Ingredient",
|
||||||
"ingredients": "Ingredients",
|
"ingredients": "Ingrediente",
|
||||||
"insert-ingredient": "Insert Ingredient",
|
"insert-ingredient": "Insert Ingredient",
|
||||||
"insert-section": "Adăugare secțiune",
|
"insert-section": "Adăugare secțiune",
|
||||||
"instructions": "Instrucțiuni",
|
"instructions": "Instrucțiuni",
|
||||||
@ -470,51 +471,51 @@
|
|||||||
"add-to-plan": "Adaugă la Plan",
|
"add-to-plan": "Adaugă la Plan",
|
||||||
"add-to-timeline": "Adaugă la Cronologie",
|
"add-to-timeline": "Adaugă la Cronologie",
|
||||||
"recipe-added-to-list": "Rețeta a fost adăugată la listă",
|
"recipe-added-to-list": "Rețeta a fost adăugată la listă",
|
||||||
"recipes-added-to-list": "Recipes added to list",
|
"recipes-added-to-list": "Rețeta a fost adăugată în listă",
|
||||||
"recipe-added-to-mealplan": "Rețeta a fist adăugată la planul de mese",
|
"recipe-added-to-mealplan": "Rețeta a fist adăugată la planul de mese",
|
||||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
"failed-to-add-recipes-to-list": "Adăugarea rețetei în listă a eșuat",
|
||||||
"failed-to-add-recipe-to-mealplan": "Adăugarea rețetei la planul de mese a eșuat",
|
"failed-to-add-recipe-to-mealplan": "Adăugarea rețetei la planul de mese a eșuat",
|
||||||
"yield": "Yield",
|
"yield": "Producție",
|
||||||
"quantity": "Quantity",
|
"quantity": "Cantitate",
|
||||||
"choose-unit": "Choose Unit",
|
"choose-unit": "Alegeţi unitatea",
|
||||||
"press-enter-to-create": "Press Enter to Create",
|
"press-enter-to-create": "Press Enter to Create",
|
||||||
"choose-food": "Choose Food",
|
"choose-food": "Choose Food",
|
||||||
"notes": "Notes",
|
"notes": "Notițe",
|
||||||
"toggle-section": "Toggle Section",
|
"toggle-section": "Activează/dezactivează secțiunea",
|
||||||
"see-original-text": "See Original Text",
|
"see-original-text": "Vezi Textul Original",
|
||||||
"original-text-with-value": "Original Text: {originalText}",
|
"original-text-with-value": "Text original: {originalText}",
|
||||||
"ingredient-linker": "Ingredient Linker",
|
"ingredient-linker": "Legarea cu ingrediente",
|
||||||
"linked-to-other-step": "Linked to other step",
|
"linked-to-other-step": "Conectat la alt pas",
|
||||||
"auto": "Auto",
|
"auto": "Auto",
|
||||||
"cook-mode": "Cook Mode",
|
"cook-mode": "Modul de gătire",
|
||||||
"link-ingredients": "Link Ingredients",
|
"link-ingredients": "Link-uri Ingrediente",
|
||||||
"merge-above": "Merge Above",
|
"merge-above": "Îmbină deasupra",
|
||||||
"reset-scale": "Reset Scale",
|
"reset-scale": "Resetează scara",
|
||||||
"decrease-scale-label": "Decrease Scale by 1",
|
"decrease-scale-label": "Scade scara cu 1",
|
||||||
"increase-scale-label": "Increase Scale by 1",
|
"increase-scale-label": "Crește scara cu 1",
|
||||||
"locked": "Locked",
|
"locked": "Blocat",
|
||||||
"public-link": "Public Link",
|
"public-link": "Link public",
|
||||||
"timer": {
|
"timer": {
|
||||||
"kitchen-timer": "Kitchen Timer",
|
"kitchen-timer": "Cronometru bucătărie",
|
||||||
"start-timer": "Start Timer",
|
"start-timer": "Pornește cronometrul",
|
||||||
"pause-timer": "Pause Timer",
|
"pause-timer": "Pauză cronometru",
|
||||||
"resume-timer": "Resume Timer",
|
"resume-timer": "Reluați cronometrul",
|
||||||
"stop-timer": "Stop Timer"
|
"stop-timer": "Oprește Cronometrul"
|
||||||
},
|
},
|
||||||
"edit-timeline-event": "Edit Timeline Event",
|
"edit-timeline-event": "Modifică Evenimentul din Cronologie",
|
||||||
"timeline": "Timeline",
|
"timeline": "Cronologie",
|
||||||
"timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!",
|
"timeline-is-empty": "Nothing on the timeline yet. Try making this recipe!",
|
||||||
"group-global-timeline": "{groupName} Global Timeline",
|
"group-global-timeline": "Cronologia globală a grupului {groupName} ",
|
||||||
"open-timeline": "Open Timeline",
|
"open-timeline": "Deschide Cronologia",
|
||||||
"made-this": "I Made This",
|
"made-this": "Am făcut asta",
|
||||||
"how-did-it-turn-out": "How did it turn out?",
|
"how-did-it-turn-out": "Cum a ieșit?",
|
||||||
"user-made-this": "{user} made this",
|
"user-made-this": "{user} a făcut asta",
|
||||||
"last-made-date": "Last Made {date}",
|
"last-made-date": "Last Made {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 part applications. You can use these keys to contain information to trigger automation 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": "Message Key",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||||
"drop-image": "Drop image",
|
"drop-image": "Trage imaginea",
|
||||||
"enable-ingredient-amounts-to-use-this-feature": "Enable ingredient amounts to use this feature",
|
"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.",
|
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Recipes with units or foods defined cannot be parsed.",
|
||||||
"parse-ingredients": "Parse ingredients",
|
"parse-ingredients": "Parse ingredients",
|
||||||
@ -532,6 +533,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Numele rețetei trebuie să fie unic",
|
"new-recipe-names-must-be-unique": "Numele rețetei trebuie să fie unic",
|
||||||
"scrape-recipe": "Importare rețetă",
|
"scrape-recipe": "Importare rețetă",
|
||||||
"scrape-recipe-description": "Importa o rețetă prin url. Oferiți url-ul pentru site-ul pe care doriți să îl importați, și Mealie va încerca să importe rețeta de pe acel site și să o adauge la colecția ta.",
|
"scrape-recipe-description": "Importa o rețetă prin url. Oferiți url-ul pentru site-ul pe care doriți să îl importați, și Mealie va încerca să importe rețeta de pe acel site și să o adauge la colecția ta.",
|
||||||
|
"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ă cuvintele cheie originale ca tag-uri",
|
"import-original-keywords-as-tags": "Importă cuvintele cheie originale ca tag-uri",
|
||||||
"stay-in-edit-mode": "Rămâi în modul Editare",
|
"stay-in-edit-mode": "Rămâi în modul Editare",
|
||||||
"import-from-zip": "Importă din zip",
|
"import-from-zip": "Importă din zip",
|
||||||
@ -554,7 +557,8 @@
|
|||||||
"unit": "Unitate",
|
"unit": "Unitate",
|
||||||
"upload-image": "Încărcare imagine",
|
"upload-image": "Încărcare imagine",
|
||||||
"screen-awake": "Păstrare ecran aprins",
|
"screen-awake": "Păstrare ecran aprins",
|
||||||
"remove-image": "Șterge Imaginea"
|
"remove-image": "Șterge Imaginea",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Căutare avansată",
|
"advanced-search": "Căutare avansată",
|
||||||
@ -573,16 +577,16 @@
|
|||||||
"search-hint": "Apasă „/”",
|
"search-hint": "Apasă „/”",
|
||||||
"advanced": "Avansat",
|
"advanced": "Avansat",
|
||||||
"auto-search": "Căutare automată",
|
"auto-search": "Căutare automată",
|
||||||
"no-results": "No results found"
|
"no-results": "Nu s-au găsit rezultate"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"add-a-new-theme": "Adaugă o nouă temă",
|
"add-a-new-theme": "Adaugă o nouă temă",
|
||||||
"admin-settings": "Setări administrator",
|
"admin-settings": "Setări administrator",
|
||||||
"backup": {
|
"backup": {
|
||||||
"backup-created": "Backup created successfully",
|
"backup-created": "Copia de rezervă a fost salvată",
|
||||||
"backup-created-at-response-export_path": "Backup creat la {path}",
|
"backup-created-at-response-export_path": "Backup creat la {path}",
|
||||||
"backup-deleted": "Backup şters",
|
"backup-deleted": "Backup şters",
|
||||||
"restore-success": "Restore successful",
|
"restore-success": "Restaurare efectuată",
|
||||||
"backup-tag": "Backup la Tag-uri",
|
"backup-tag": "Backup la Tag-uri",
|
||||||
"create-heading": "Create a Backup",
|
"create-heading": "Create a Backup",
|
||||||
"delete-backup": "Șterge Backup",
|
"delete-backup": "Șterge Backup",
|
||||||
@ -613,37 +617,37 @@
|
|||||||
"card-per-section": "Card Per Section",
|
"card-per-section": "Card Per Section",
|
||||||
"home-page": "Home Page",
|
"home-page": "Home Page",
|
||||||
"home-page-sections": "Home Page Sections",
|
"home-page-sections": "Home Page Sections",
|
||||||
"show-recent": "Show Recent"
|
"show-recent": "Afișare Recente"
|
||||||
},
|
},
|
||||||
"language": "Language",
|
"language": "Limbă",
|
||||||
"latest": "Latest",
|
"latest": "Ultimele",
|
||||||
"local-api": "Local API",
|
"local-api": "Local API",
|
||||||
"locale-settings": "Locale settings",
|
"locale-settings": "Locale settings",
|
||||||
"migrations": "Migrations",
|
"migrations": "Migrations",
|
||||||
"new-page": "New Page",
|
"new-page": "Pagină nouă",
|
||||||
"notify": "Notify",
|
"notify": "Notificare",
|
||||||
"organize": "Organize",
|
"organize": "Organizare",
|
||||||
"page-name": "Page Name",
|
"page-name": "Numele paginii",
|
||||||
"pages": "Pages",
|
"pages": "Pagini",
|
||||||
"profile": "Profile",
|
"profile": "Profil",
|
||||||
"remove-existing-entries-matching-imported-entries": "Remove existing entries matching imported entries",
|
"remove-existing-entries-matching-imported-entries": "Remove existing entries matching imported entries",
|
||||||
"set-new-time": "Set New Time",
|
"set-new-time": "Setează timp nou",
|
||||||
"settings-update-failed": "Settings update failed",
|
"settings-update-failed": "Settings update failed",
|
||||||
"settings-updated": "Settings updated",
|
"settings-updated": "Settings updated",
|
||||||
"site-settings": "Site Settings",
|
"site-settings": "Setările site-ului",
|
||||||
"theme": {
|
"theme": {
|
||||||
"accent": "Accent",
|
"accent": "Accent",
|
||||||
"dark": "Dark",
|
"dark": "Dark",
|
||||||
"default-to-system": "Default to system",
|
"default-to-system": "Implicit în sistem",
|
||||||
"error": "Error",
|
"error": "Eroare",
|
||||||
"error-creating-theme-see-log-file": "Error creating theme. See log file.",
|
"error-creating-theme-see-log-file": "Eroare la crearea temei. Vezi fişierul de jurnal.",
|
||||||
"error-deleting-theme": "Error deleting theme",
|
"error-deleting-theme": "Error deleting theme",
|
||||||
"error-updating-theme": "Error updating theme",
|
"error-updating-theme": "Error updating theme",
|
||||||
"info": "Info",
|
"info": "Info",
|
||||||
"light": "Light",
|
"light": "Light",
|
||||||
"primary": "Primary",
|
"primary": "Primary",
|
||||||
"secondary": "Secondary",
|
"secondary": "Secondary",
|
||||||
"success": "Success",
|
"success": "Succes",
|
||||||
"switch-to-dark-mode": "Switch to dark mode",
|
"switch-to-dark-mode": "Switch to dark mode",
|
||||||
"switch-to-light-mode": "Switch to light mode",
|
"switch-to-light-mode": "Switch to light mode",
|
||||||
"theme-deleted": "Theme deleted",
|
"theme-deleted": "Theme deleted",
|
||||||
@ -651,9 +655,9 @@
|
|||||||
"theme-name-is-required": "Theme Name is required.",
|
"theme-name-is-required": "Theme Name is required.",
|
||||||
"theme-saved": "Theme Saved",
|
"theme-saved": "Theme Saved",
|
||||||
"theme-updated": "Theme updated",
|
"theme-updated": "Theme updated",
|
||||||
"warning": "Warning",
|
"warning": "Atenţie",
|
||||||
"light-mode": "Light Mode",
|
"light-mode": "Mod Luminos",
|
||||||
"dark-mode": "Dark Mode"
|
"dark-mode": "Mod Întunecat"
|
||||||
},
|
},
|
||||||
"token": {
|
"token": {
|
||||||
"active-tokens": "ACTIVE TOKENS",
|
"active-tokens": "ACTIVE TOKENS",
|
||||||
@ -691,13 +695,13 @@
|
|||||||
"configuration": "Configuration",
|
"configuration": "Configuration",
|
||||||
"docker-volume": "Docker Volume",
|
"docker-volume": "Docker Volume",
|
||||||
"docker-volume-help": "Mealie requires that the frontend container and the backend share the same docker volume or storage. This ensures that the frontend container can properly access the images and assets stored on disk.",
|
"docker-volume-help": "Mealie requires that the frontend container and the backend share the same docker volume or storage. This ensures that the frontend container can properly access the images and assets stored on disk.",
|
||||||
"volumes-are-misconfigured": "Volumes are misconfigured.",
|
"volumes-are-misconfigured": "Volumele sunt configurate greșit.",
|
||||||
"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": "Email Configuration Status",
|
||||||
"email-configured": "Email Configured",
|
"email-configured": "E-mail configurat",
|
||||||
"email-test-results": "Email Test Results",
|
"email-test-results": "Trimite rezultatele testului pe e-mail",
|
||||||
"ready": "Ready",
|
"ready": "Ready",
|
||||||
"not-ready": "Not Ready - Check Environmental Variables",
|
"not-ready": "Not Ready - Check Environmental Variables",
|
||||||
"succeeded": "Succeeded",
|
"succeeded": "Succeeded",
|
||||||
@ -788,7 +792,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": "Etichetă"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Tools",
|
"tools": "Tools",
|
||||||
@ -797,7 +802,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": "Instrument"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Admin",
|
"admin": "Admin",
|
||||||
@ -832,7 +838,7 @@
|
|||||||
"password-updated": "Password updated",
|
"password-updated": "Password updated",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
"password-strength": "Password is {strength}",
|
"password-strength": "Password is {strength}",
|
||||||
"please-enter-password": "Please enter your new password.",
|
"please-enter-password": "Vă rugăm să introduceţi parola nouă.",
|
||||||
"register": "Register",
|
"register": "Register",
|
||||||
"reset-password": "Reset Password",
|
"reset-password": "Reset Password",
|
||||||
"sign-in": "Sign in",
|
"sign-in": "Sign in",
|
||||||
@ -853,7 +859,7 @@
|
|||||||
"username": "Username",
|
"username": "Username",
|
||||||
"users-header": "USERS",
|
"users-header": "USERS",
|
||||||
"users": "Users",
|
"users": "Users",
|
||||||
"user-not-found": "User not found",
|
"user-not-found": "Utilizatorul nu a fost găsit",
|
||||||
"webhook-time": "Webhook Time",
|
"webhook-time": "Webhook Time",
|
||||||
"webhooks-enabled": "Webhooks Enabled",
|
"webhooks-enabled": "Webhooks Enabled",
|
||||||
"you-are-not-allowed-to-create-a-user": "You are not allowed to create a user",
|
"you-are-not-allowed-to-create-a-user": "You are not allowed to create a user",
|
||||||
@ -876,7 +882,7 @@
|
|||||||
"user-management": "User Management",
|
"user-management": "User Management",
|
||||||
"reset-locked-users": "Reset Locked Users",
|
"reset-locked-users": "Reset Locked Users",
|
||||||
"admin-user-creation": "Admin User Creation",
|
"admin-user-creation": "Admin User Creation",
|
||||||
"admin-user-management": "Admin User Management",
|
"admin-user-management": "Gestionare utilizatori de tip administrator",
|
||||||
"user-details": "User Details",
|
"user-details": "User Details",
|
||||||
"user-name": "User Name",
|
"user-name": "User Name",
|
||||||
"authentication-method": "Authentication Method",
|
"authentication-method": "Authentication Method",
|
||||||
@ -889,8 +895,8 @@
|
|||||||
"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": "Recuperare parola",
|
||||||
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
|
"forgot-password-text": "Va rugam introduceti adresa de e-mail pentru a va trimite un link de resetare parola.",
|
||||||
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
|
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
|
||||||
},
|
},
|
||||||
"language-dialog": {
|
"language-dialog": {
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Обновить",
|
"refresh": "Обновить",
|
||||||
"upload-file": "Загрузить файл",
|
"upload-file": "Загрузить файл",
|
||||||
"created-on-date": "Создано: {0}",
|
"created-on-date": "Создано: {0}",
|
||||||
"unsaved-changes": "У вас есть несохраненные изменения. Вы хотите сохранить их перед выходом?"
|
"unsaved-changes": "У вас есть несохраненные изменения. Вы хотите сохранить их перед выходом?",
|
||||||
|
"clipboard-copy-failure": "Не удалось скопировать текст."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "Что получилось?",
|
"how-did-it-turn-out": "Что получилось?",
|
||||||
"user-made-this": "{user} сделал это",
|
"user-made-this": "{user} сделал это",
|
||||||
"last-made-date": "Последний раз сделано {date}",
|
"last-made-date": "Последний раз сделано {date}",
|
||||||
"api-extras-description": "Дополнения к рецептам являются ключевым элементом Mealie API. Они позволяют создавать пользовательские пары json ключ/значение в рецепте для ссылания на другие приложения. Вы можете использовать эти ключи, чтобы сохранить нужную информацию для автоматизаций или уведомлений на ваши устройства.",
|
"api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.",
|
||||||
"message-key": "Ключ сообщения",
|
"message-key": "Ключ сообщения",
|
||||||
"parse": "Обработать",
|
"parse": "Обработать",
|
||||||
"attach-images-hint": "Прикрепляйте изображения, перетаскивая их в редактор",
|
"attach-images-hint": "Прикрепляйте изображения, перетаскивая их в редактор",
|
||||||
@ -532,6 +533,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": "Импорт из архива",
|
"import-from-zip": "Импорт из архива",
|
||||||
@ -554,7 +557,8 @@
|
|||||||
"unit": "Единица измерения",
|
"unit": "Единица измерения",
|
||||||
"upload-image": "Загрузить изображение",
|
"upload-image": "Загрузить изображение",
|
||||||
"screen-awake": "Держать экран включенным",
|
"screen-awake": "Держать экран включенным",
|
||||||
"remove-image": "Удалить изображение"
|
"remove-image": "Удалить изображение",
|
||||||
|
"nextStep": "Next step"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Расширенный поиск",
|
"advanced-search": "Расширенный поиск",
|
||||||
@ -788,7 +792,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": "Инструменты",
|
||||||
@ -797,7 +802,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": "Администратор",
|
||||||
|
@ -114,10 +114,10 @@
|
|||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Kľučové slovo",
|
"keyword": "Kľučové slovo",
|
||||||
"link-copied": "Odkaz bol skopírovaný",
|
"link-copied": "Odkaz bol skopírovaný",
|
||||||
"loading": "Loading",
|
"loading": "Načítavam",
|
||||||
"loading-events": "Načítanie udalostí",
|
"loading-events": "Načítanie udalostí",
|
||||||
"loading-recipe": "Loading recipe...",
|
"loading-recipe": "Načítavam recept...",
|
||||||
"loading-ocr-data": "Loading OCR data...",
|
"loading-ocr-data": "Načítavam OCR dáta...",
|
||||||
"loading-recipes": "Nahrávanie receptu",
|
"loading-recipes": "Nahrávanie receptu",
|
||||||
"message": "Správa",
|
"message": "Správa",
|
||||||
"monday": "Pondelok",
|
"monday": "Pondelok",
|
||||||
@ -128,7 +128,7 @@
|
|||||||
"no-recipe-found": "Žiadny recept nenájdený",
|
"no-recipe-found": "Žiadny recept nenájdený",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"options": "Možnosti:",
|
"options": "Možnosti:",
|
||||||
"plural-name": "Plural Name",
|
"plural-name": "Meno v množnom čísle",
|
||||||
"print": "Tlačiť",
|
"print": "Tlačiť",
|
||||||
"print-preferences": "Nastavenia tlače",
|
"print-preferences": "Nastavenia tlače",
|
||||||
"random": "Náhodné",
|
"random": "Náhodné",
|
||||||
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Obnoviť",
|
"refresh": "Obnoviť",
|
||||||
"upload-file": "Nahrať súbor",
|
"upload-file": "Nahrať súbor",
|
||||||
"created-on-date": "Vytvorené: {0}",
|
"created-on-date": "Vytvorené: {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."
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Naozaj chcete odstrániť <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Naozaj chcete odstrániť <b>{groupName}<b/>?",
|
||||||
@ -495,11 +496,11 @@
|
|||||||
"locked": "Zamknuté",
|
"locked": "Zamknuté",
|
||||||
"public-link": "Verejný odkaz",
|
"public-link": "Verejný odkaz",
|
||||||
"timer": {
|
"timer": {
|
||||||
"kitchen-timer": "Kitchen Timer",
|
"kitchen-timer": "Kuchynský časovač",
|
||||||
"start-timer": "Start Timer",
|
"start-timer": "Spustiť časovač",
|
||||||
"pause-timer": "Pause Timer",
|
"pause-timer": "Pozastaviť časovač",
|
||||||
"resume-timer": "Resume Timer",
|
"resume-timer": "Znova spustiť časovač",
|
||||||
"stop-timer": "Stop Timer"
|
"stop-timer": "Zastaviť časovač"
|
||||||
},
|
},
|
||||||
"edit-timeline-event": "Upraviť udalosť na časovej osi",
|
"edit-timeline-event": "Upraviť udalosť na časovej osi",
|
||||||
"timeline": "Časová os",
|
"timeline": "Časová os",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "Ako to dopadlo?",
|
"how-did-it-turn-out": "Ako to dopadlo?",
|
||||||
"user-made-this": "{user} toto uvaril/-a",
|
"user-made-this": "{user} toto uvaril/-a",
|
||||||
"last-made-date": "Posledne pripravené {date}",
|
"last-made-date": "Posledne pripravené {date}",
|
||||||
"api-extras-description": "Extras receptov sú kľúčovou funkcionalitou Mealie API. Umožňujú užívateľom vytvárať vlastné json páry kľúč/hodnota z receptu, aby ich bolo možné použiť v aplikáciách tretej strany. Údaje uložené pod jednotlivými kľúčmi je možné využiť ako spúšťač automatizovaných procesov, či zasielania vlastných správ do vami zvolených zariadení.",
|
"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": "Kľúč správy",
|
"message-key": "Kľúč správy",
|
||||||
"parse": "Analyzovať",
|
"parse": "Analyzovať",
|
||||||
"attach-images-hint": "Pridaj obrázky ich potiahnutím a pustením na editor",
|
"attach-images-hint": "Pridaj obrázky ich potiahnutím a pustením na editor",
|
||||||
@ -532,6 +533,8 @@
|
|||||||
"new-recipe-names-must-be-unique": "Názvy nových receptov musia byť jedinečné",
|
"new-recipe-names-must-be-unique": "Názvy nových receptov musia byť jedinečné",
|
||||||
"scrape-recipe": "Scrapovať recept",
|
"scrape-recipe": "Scrapovať recept",
|
||||||
"scrape-recipe-description": "Stiahne recept zo zadaného url odkazu. Zadajte url stránky, z ktorej chcete stiahnuť recept, a Mealie sa pokúsi recept stiahnuť a vložiť do vašej zbierky.",
|
"scrape-recipe-description": "Stiahne recept zo zadaného url odkazu. Zadajte url stránky, z ktorej chcete stiahnuť recept, a Mealie sa pokúsi recept stiahnuť a vložiť do vašej zbierky.",
|
||||||
|
"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": "Importuj pôvodné kľúčové slová ako tagy",
|
"import-original-keywords-as-tags": "Importuj pôvodné kľúčové slová ako tagy",
|
||||||
"stay-in-edit-mode": "Zostať v režime editovania",
|
"stay-in-edit-mode": "Zostať v režime editovania",
|
||||||
"import-from-zip": "Importovať zo Zip-súboru",
|
"import-from-zip": "Importovať zo Zip-súboru",
|
||||||
@ -554,7 +557,8 @@
|
|||||||
"unit": "Jednotka",
|
"unit": "Jednotka",
|
||||||
"upload-image": "Nahrať obrázok",
|
"upload-image": "Nahrať obrázok",
|
||||||
"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": "Rozšírené vyhľadávanie",
|
"advanced-search": "Rozšírené vyhľadávanie",
|
||||||
@ -788,7 +792,8 @@
|
|||||||
"tags": "Štítky",
|
"tags": "Štítky",
|
||||||
"untagged-count": "Neoznačené {count}",
|
"untagged-count": "Neoznačené {count}",
|
||||||
"create-a-tag": "Vytvoriť štítok",
|
"create-a-tag": "Vytvoriť štítok",
|
||||||
"tag-name": "Názov štítku"
|
"tag-name": "Názov štítku",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Nástroje",
|
"tools": "Nástroje",
|
||||||
@ -797,7 +802,8 @@
|
|||||||
"tool-name": "Názov náčinia",
|
"tool-name": "Názov náčinia",
|
||||||
"create-new-tool": "Vytvoriť nové náčinie",
|
"create-new-tool": "Vytvoriť nové náčinie",
|
||||||
"on-hand-checkbox-label": "Zobraz ako \"K dispozícii\" (Checked)",
|
"on-hand-checkbox-label": "Zobraz ako \"K dispozícii\" (Checked)",
|
||||||
"required-tools": "Potrebné nástroje"
|
"required-tools": "Potrebné nástroje",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Administrátor",
|
"admin": "Administrátor",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Refresh",
|
"refresh": "Refresh",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Ste prepričani, da želite izbrisati <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Ste prepričani, da želite izbrisati <b>{groupName}<b/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "How did it turn out?",
|
"how-did-it-turn-out": "How did it turn out?",
|
||||||
"user-made-this": "{user} made this",
|
"user-made-this": "{user} made this",
|
||||||
"last-made-date": "Last Made {date}",
|
"last-made-date": "Last Made {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 part applications. You can use these keys to contain information to trigger automation 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": "Message Key",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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": "Napredno iskanje",
|
"advanced-search": "Napredno iskanje",
|
||||||
@ -788,7 +792,8 @@
|
|||||||
"tags": "Značke",
|
"tags": "Značke",
|
||||||
"untagged-count": "Brez značke {count}",
|
"untagged-count": "Brez značke {count}",
|
||||||
"create-a-tag": "Ustvari značko",
|
"create-a-tag": "Ustvari značko",
|
||||||
"tag-name": "Ime značke"
|
"tag-name": "Ime značke",
|
||||||
|
"tag": "Tag"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Orodja",
|
"tools": "Orodja",
|
||||||
@ -797,7 +802,8 @@
|
|||||||
"tool-name": "Ime orodja",
|
"tool-name": "Ime orodja",
|
||||||
"create-new-tool": "Ustvari orodje",
|
"create-new-tool": "Ustvari orodje",
|
||||||
"on-hand-checkbox-label": "Prikaži kot Na voljo (obkljukano)",
|
"on-hand-checkbox-label": "Prikaži kot Na voljo (obkljukano)",
|
||||||
"required-tools": "Required Tools"
|
"required-tools": "Required Tools",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Administrator",
|
"admin": "Administrator",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Освежи",
|
"refresh": "Освежи",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "How did it turn out?",
|
"how-did-it-turn-out": "How did it turn out?",
|
||||||
"user-made-this": "{user} made this",
|
"user-made-this": "{user} made this",
|
||||||
"last-made-date": "Последњи пут прављено {date}",
|
"last-made-date": "Последњи пут прављено {date}",
|
||||||
"api-extras-description": "Додаци рецепата су кључна карактеристика Mили API-а. Омогућавају вам да креирате прилагођене JSON парове кључ/вредност унутар рецепта за референцу из других апликација. Можете користити ове кључеве за садржај информација за покретање аутоматизације или прилагођених порука које ће бити прослеђене на ваш уређај по жељи.",
|
"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": "Message Key",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||||
@ -532,6 +533,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": "Увези оригиналне кључне речи као ознаке",
|
||||||
"stay-in-edit-mode": "Stay in Edit mode",
|
"stay-in-edit-mode": "Stay in Edit mode",
|
||||||
"import-from-zip": "Увези из Zip архиве",
|
"import-from-zip": "Увези из Zip архиве",
|
||||||
@ -554,7 +557,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": "Напредна претрага",
|
||||||
@ -788,7 +792,8 @@
|
|||||||
"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": "Прибор",
|
||||||
@ -797,7 +802,8 @@
|
|||||||
"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": "Потребан прибор",
|
||||||
|
"tool": "Tool"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Admin",
|
"admin": "Admin",
|
||||||
|
@ -77,7 +77,7 @@
|
|||||||
"tag-events": "Tagga händelser",
|
"tag-events": "Tagga händelser",
|
||||||
"category-events": "Kategorihändelser",
|
"category-events": "Kategorihändelser",
|
||||||
"when-a-new-user-joins-your-group": "När en ny användare går med i din grupp",
|
"when-a-new-user-joins-your-group": "När en ny användare går med i din grupp",
|
||||||
"recipe-events": "Recipe Events"
|
"recipe-events": "Recepthändelser"
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"cancel": "Avbryt",
|
"cancel": "Avbryt",
|
||||||
@ -114,10 +114,10 @@
|
|||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "Nyckelord",
|
"keyword": "Nyckelord",
|
||||||
"link-copied": "Länk kopierad",
|
"link-copied": "Länk kopierad",
|
||||||
"loading": "Loading",
|
"loading": "Läser in",
|
||||||
"loading-events": "Laddar händelser",
|
"loading-events": "Laddar händelser",
|
||||||
"loading-recipe": "Loading recipe...",
|
"loading-recipe": "Läser in recept...",
|
||||||
"loading-ocr-data": "Loading OCR data...",
|
"loading-ocr-data": "Läser in OCR-data...",
|
||||||
"loading-recipes": "Laddar Recept",
|
"loading-recipes": "Laddar Recept",
|
||||||
"message": "Meddelande",
|
"message": "Meddelande",
|
||||||
"monday": "Måndag",
|
"monday": "Måndag",
|
||||||
@ -128,7 +128,7 @@
|
|||||||
"no-recipe-found": "Inga recept hittades",
|
"no-recipe-found": "Inga recept hittades",
|
||||||
"ok": "Ok",
|
"ok": "Ok",
|
||||||
"options": "Alternativ:",
|
"options": "Alternativ:",
|
||||||
"plural-name": "Plural Name",
|
"plural-name": "Plural namn",
|
||||||
"print": "Skriv ut",
|
"print": "Skriv ut",
|
||||||
"print-preferences": "Utskriftsinställningar",
|
"print-preferences": "Utskriftsinställningar",
|
||||||
"random": "Slumpa",
|
"random": "Slumpa",
|
||||||
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Uppdatera",
|
"refresh": "Uppdatera",
|
||||||
"upload-file": "Ladda upp fil",
|
"upload-file": "Ladda upp fil",
|
||||||
"created-on-date": "Skapad {0}",
|
"created-on-date": "Skapad {0}",
|
||||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes."
|
"unsaved-changes": "Du har osparade ändringar. Vill du spara innan du lämnar? Tryck Okej att spara, Avbryt för att ignorera ändringar.",
|
||||||
|
"clipboard-copy-failure": "Det gick inte att kopiera till urklipp."
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "Är du säker på att du vill radera <b>{groupName}<b/>?",
|
"are-you-sure-you-want-to-delete-the-group": "Är du säker på att du vill radera <b>{groupName}<b/>?",
|
||||||
@ -213,7 +214,7 @@
|
|||||||
"group-id-with-value": "Grupp ID: {groupID}",
|
"group-id-with-value": "Grupp ID: {groupID}",
|
||||||
"group-name": "Gruppnamn",
|
"group-name": "Gruppnamn",
|
||||||
"group-not-found": "Grupp ej funnen",
|
"group-not-found": "Grupp ej funnen",
|
||||||
"group-token": "Group Token",
|
"group-token": "Grupptoken",
|
||||||
"group-with-value": "Grupp: {groupID}",
|
"group-with-value": "Grupp: {groupID}",
|
||||||
"groups": "Grupper",
|
"groups": "Grupper",
|
||||||
"manage-groups": "Hantera grupper",
|
"manage-groups": "Hantera grupper",
|
||||||
@ -249,7 +250,7 @@
|
|||||||
"general-preferences": "Generella inställningar",
|
"general-preferences": "Generella inställningar",
|
||||||
"group-recipe-preferences": "Inställningar för receptgrupper",
|
"group-recipe-preferences": "Inställningar för receptgrupper",
|
||||||
"report": "Rapport",
|
"report": "Rapport",
|
||||||
"report-with-id": "Report ID: {id}",
|
"report-with-id": "RapportID: {id}",
|
||||||
"group-management": "Grupphantering",
|
"group-management": "Grupphantering",
|
||||||
"admin-group-management": "Hantering av administratörsgrupp",
|
"admin-group-management": "Hantering av administratörsgrupp",
|
||||||
"admin-group-management-text": "Ändringar i denna grupp kommer att återspeglas omedelbart.",
|
"admin-group-management-text": "Ändringar i denna grupp kommer att återspeglas omedelbart.",
|
||||||
@ -320,21 +321,21 @@
|
|||||||
"recipe-migration": "Migrera recept",
|
"recipe-migration": "Migrera recept",
|
||||||
"chowdown": {
|
"chowdown": {
|
||||||
"description": "Importera data från Chowdown",
|
"description": "Importera data från Chowdown",
|
||||||
"description-long": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
"description-long": "Mealie har inbyggt stöd för chowdowns kodförrådsformat. Ladda ner kodförrådet som en .zip-fil och ladda upp det nedan.",
|
||||||
"title": "Chowdown"
|
"title": "Chowdown"
|
||||||
},
|
},
|
||||||
"nextcloud": {
|
"nextcloud": {
|
||||||
"description": "Importera data från Nextcloud Cookbook instans",
|
"description": "Importera data från Nextcloud Cookbook instans",
|
||||||
"description-long": "Nextcloud recipes can be imported from a zip file that contains the data stored in Nextcloud. See the example folder structure below to ensure your recipes are able to be imported.",
|
"description-long": "Nextcloud-recept kan importeras från en zip-fil som innehåller datan som lagras i Nextcloud. Se exempel på mappstrukturen nedan för att säkerställa att dina recept kan importeras.",
|
||||||
"title": "Nextcloud Cookbook"
|
"title": "Nextcloud Cookbook"
|
||||||
},
|
},
|
||||||
"copymethat": {
|
"copymethat": {
|
||||||
"description-long": "Mealie can import recipes from Copy Me That. Export your recipes in HTML format, then upload the .zip below.",
|
"description-long": "Mealie kan importera recept från Copy Me That. Exportera dina recept i HTML-format, ladda sen upp .zip-filen nedan.",
|
||||||
"title": "Copy Me That Recipe Manager"
|
"title": "Copy Me That recepthanterare"
|
||||||
},
|
},
|
||||||
"paprika": {
|
"paprika": {
|
||||||
"description-long": "Mealie kan importera recept från Paprika-applikationen. Exportera dina recept från paprika, byt namn på exporttillägget till .zip och ladda upp det nedan.",
|
"description-long": "Mealie kan importera recept från Paprika-applikationen. Exportera dina recept från paprika, byt namn på exporttillägget till .zip och ladda upp det nedan.",
|
||||||
"title": "Paprika Recipe Manager"
|
"title": "Paprika recepthanterare"
|
||||||
},
|
},
|
||||||
"mealie-pre-v1": {
|
"mealie-pre-v1": {
|
||||||
"description-long": "Mealie kan importera recept från Mealieapplikationen från en pre v1.0 release. Exportera dina recept från din gamla instans, och ladda upp zip-filen nedan. Observera att endast recept kan importeras från exporten.",
|
"description-long": "Mealie kan importera recept från Mealieapplikationen från en pre v1.0 release. Exportera dina recept från din gamla instans, och ladda upp zip-filen nedan. Observera att endast recept kan importeras från exporten.",
|
||||||
@ -349,13 +350,13 @@
|
|||||||
"choose-migration-type": "Välj migrationstyp",
|
"choose-migration-type": "Välj migrationstyp",
|
||||||
"tag-all-recipes": "Tagga alla recept med {tag-name} tagg",
|
"tag-all-recipes": "Tagga alla recept med {tag-name} tagg",
|
||||||
"nextcloud-text": "Nextcloud-recept kan importeras från en zip-fil som innehåller data som lagras i Nextcloud. Se exempelmappens struktur nedan för att säkerställa att dina recept kan importeras.",
|
"nextcloud-text": "Nextcloud-recept kan importeras från en zip-fil som innehåller data som lagras i Nextcloud. Se exempelmappens struktur nedan för att säkerställa att dina recept kan importeras.",
|
||||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below",
|
"chowdown-text": "Mealie har inbyggt stöd för chowdowns kodförrådsformat. Ladda ner kodförrådet som en .zip-fil och ladda upp det nedan",
|
||||||
"recipe-1": "Recept 1",
|
"recipe-1": "Recept 1",
|
||||||
"recipe-2": "Recept 2",
|
"recipe-2": "Recept 2",
|
||||||
"paprika-text": "Mealie can import recipes from the Paprika application. Export your recipes from paprika, rename the export extension to .zip and upload it below.",
|
"paprika-text": "Mealie kan importera recept från Paprika-applikationen. Exportera dina recept från Paprika, byt namn på filnamnstillägget på exporten till .zip och ladda upp det nedan.",
|
||||||
"mealie-text": "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.",
|
"mealie-text": "Mealie kan importera recept från Mealieapplikationen från en före v1.0 version. Exportera dina recept från din gamla instans, och ladda upp zip-filen nedan. Observera att endast recept kan importeras från exporten.",
|
||||||
"plantoeat": {
|
"plantoeat": {
|
||||||
"title": "Plan to Eat",
|
"title": "Planera att äta",
|
||||||
"description-long": "Mealie kan importera recept från Plan to Eat."
|
"description-long": "Mealie kan importera recept från Plan to Eat."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -483,7 +484,7 @@
|
|||||||
"toggle-section": "Växla sektion",
|
"toggle-section": "Växla sektion",
|
||||||
"see-original-text": "Visa originaltext",
|
"see-original-text": "Visa originaltext",
|
||||||
"original-text-with-value": "Originaltext: {originalText}",
|
"original-text-with-value": "Originaltext: {originalText}",
|
||||||
"ingredient-linker": "Ingredient Linker",
|
"ingredient-linker": "Länka ingredienser",
|
||||||
"linked-to-other-step": "Kopplat till annat steg",
|
"linked-to-other-step": "Kopplat till annat steg",
|
||||||
"auto": "Auto",
|
"auto": "Auto",
|
||||||
"cook-mode": "Matlagningsläge",
|
"cook-mode": "Matlagningsläge",
|
||||||
@ -510,11 +511,11 @@
|
|||||||
"how-did-it-turn-out": "Hur blev rätten?",
|
"how-did-it-turn-out": "Hur blev rätten?",
|
||||||
"user-made-this": "{user} lagade detta",
|
"user-made-this": "{user} lagade detta",
|
||||||
"last-made-date": "Senast lagad {date}",
|
"last-made-date": "Senast lagad {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 part applications. You can use these keys to contain information to trigger automation or custom messages to relay to your desired device.",
|
"api-extras-description": "Recept extras är en viktig funktion i Mealie's API. Med hjälp av dem kan du skapa anpassade JSON-nyckel/värdepar i ett recept, som du kan referera till från tredjepartsapplikationer. Du kan använda dessa nycklar för att tillhandahålla information, till exempel för att trigga automatiseringar eller anpassade meddelanden som ska vidarebefordras till önskad enhet.",
|
||||||
"message-key": "Meddelandenyckel",
|
"message-key": "Meddelandenyckel",
|
||||||
"parse": "Läs in",
|
"parse": "Läs in",
|
||||||
"attach-images-hint": "Bifoga bilder genom att dra och släppa dem i redigeraren",
|
"attach-images-hint": "Bifoga bilder genom att dra och släppa dem i redigeraren",
|
||||||
"drop-image": "Drop image",
|
"drop-image": "Släpp bild",
|
||||||
"enable-ingredient-amounts-to-use-this-feature": "Aktivera ingrediensmängd för att använda denna funktion",
|
"enable-ingredient-amounts-to-use-this-feature": "Aktivera ingrediensmängd för att använda denna funktion",
|
||||||
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Recept med enheter eller definierade livsmedel kan inte tolkas.",
|
"recipes-with-units-or-foods-defined-cannot-be-parsed": "Recept med enheter eller definierade livsmedel kan inte tolkas.",
|
||||||
"parse-ingredients": "Tolka ingredienser",
|
"parse-ingredients": "Tolka ingredienser",
|
||||||
@ -531,15 +532,17 @@
|
|||||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Skapa ett recept genom att ange namnet. Alla recept måste ha unika namn.",
|
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Skapa ett recept genom att ange namnet. Alla recept måste ha unika namn.",
|
||||||
"new-recipe-names-must-be-unique": "Nya receptnamn måste vara unika",
|
"new-recipe-names-must-be-unique": "Nya receptnamn måste vara unika",
|
||||||
"scrape-recipe": "Skrapa Recept",
|
"scrape-recipe": "Skrapa Recept",
|
||||||
"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": "Hämta ett recept med webbadress. Ange URL:en för webbplatsen du vill hämta, och Mealie kommer att försöka hämta receptet från den webbplatsen och lägga till det i din samling.",
|
||||||
"import-original-keywords-as-tags": "Import original keywords as tags",
|
"scrape-recipe-have-a-lot-of-recipes": "Har du många recept som du vill skrapa på en gång?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Testa massimportören",
|
||||||
|
"import-original-keywords-as-tags": "Importera ursprungliga sökord som taggar",
|
||||||
"stay-in-edit-mode": "Stanna kvar i redigeringsläge",
|
"stay-in-edit-mode": "Stanna kvar i redigeringsläge",
|
||||||
"import-from-zip": "Importera från zip",
|
"import-from-zip": "Importera från zip",
|
||||||
"import-from-zip-description": "Import a single recipe that was exported from another Mealie instance.",
|
"import-from-zip-description": "Importera ett enstaka recept som exporterades från en annan Mealie-instans.",
|
||||||
"zip-files-must-have-been-exported-from-mealie": ".zip-filer måste ha exporterats från Mealie",
|
"zip-files-must-have-been-exported-from-mealie": ".zip-filer måste ha exporterats från Mealie",
|
||||||
"create-a-recipe-by-uploading-a-scan": "Skapa ett recept genom att ladda upp en skanning.",
|
"create-a-recipe-by-uploading-a-scan": "Skapa ett recept genom att ladda upp en skanning.",
|
||||||
"upload-a-png-image-from-a-recipe-book": "Ladda upp en png bild från en receptbok",
|
"upload-a-png-image-from-a-recipe-book": "Ladda upp en png bild från en receptbok",
|
||||||
"recipe-bulk-importer": "Recipe Bulk Importer",
|
"recipe-bulk-importer": "Massimport av recept",
|
||||||
"recipe-bulk-importer-description": "Massimporten av recept låter dig importera flera recept på samma gång i bakgrunden genom att köa upp webbplatser i bakgrunden. Det kan var användbart när du gör en första migrering till Mealie eller när du behöver importera en stor mängd recept.",
|
"recipe-bulk-importer-description": "Massimporten av recept låter dig importera flera recept på samma gång i bakgrunden genom att köa upp webbplatser i bakgrunden. Det kan var användbart när du gör en första migrering till Mealie eller när du behöver importera en stor mängd recept.",
|
||||||
"set-categories-and-tags": "Sätt kategorier och taggar",
|
"set-categories-and-tags": "Sätt kategorier och taggar",
|
||||||
"bulk-imports": "Mängdimporter",
|
"bulk-imports": "Mängdimporter",
|
||||||
@ -553,8 +556,9 @@
|
|||||||
"recipe-yield": "Receptutfall",
|
"recipe-yield": "Receptutfall",
|
||||||
"unit": "Måttenhet",
|
"unit": "Måttenhet",
|
||||||
"upload-image": "Ladda upp bild",
|
"upload-image": "Ladda upp bild",
|
||||||
"screen-awake": "Keep Screen Awake",
|
"screen-awake": "Håll skärmen vaken",
|
||||||
"remove-image": "Ta bort bild"
|
"remove-image": "Ta bort bild",
|
||||||
|
"nextStep": "Nästa steg"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Avancerad sökning",
|
"advanced-search": "Avancerad sökning",
|
||||||
@ -573,16 +577,16 @@
|
|||||||
"search-hint": "Tryck '/'",
|
"search-hint": "Tryck '/'",
|
||||||
"advanced": "Avancerat",
|
"advanced": "Avancerat",
|
||||||
"auto-search": "Autosök",
|
"auto-search": "Autosök",
|
||||||
"no-results": "No results found"
|
"no-results": "Inga resultat hittades"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"add-a-new-theme": "Lägg till ett nytt tema",
|
"add-a-new-theme": "Lägg till ett nytt tema",
|
||||||
"admin-settings": "Administratörsinställningar",
|
"admin-settings": "Administratörsinställningar",
|
||||||
"backup": {
|
"backup": {
|
||||||
"backup-created": "Backup created successfully",
|
"backup-created": "Säkerhetskopia skapades",
|
||||||
"backup-created-at-response-export_path": "Backup skapad {path}",
|
"backup-created-at-response-export_path": "Backup skapad {path}",
|
||||||
"backup-deleted": "Backup raderad",
|
"backup-deleted": "Backup raderad",
|
||||||
"restore-success": "Restore successful",
|
"restore-success": "Återställning slutförd",
|
||||||
"backup-tag": "Backup tagg",
|
"backup-tag": "Backup tagg",
|
||||||
"create-heading": "Skapa en säkerhetskopia",
|
"create-heading": "Skapa en säkerhetskopia",
|
||||||
"delete-backup": "Ta bort säkerhetskopian",
|
"delete-backup": "Ta bort säkerhetskopian",
|
||||||
@ -596,8 +600,8 @@
|
|||||||
"back-restore-description": "Återställning av den här backuppen kommer att skriva över all information i databasen och datakatalogen och ersätta allt med innehållet i nackuppen. {cannot-be-undone} Om återställningen går bra kommer du att loggas ut.",
|
"back-restore-description": "Återställning av den här backuppen kommer att skriva över all information i databasen och datakatalogen och ersätta allt med innehållet i nackuppen. {cannot-be-undone} Om återställningen går bra kommer du att loggas ut.",
|
||||||
"cannot-be-undone": "Denna åtgärd kan inte ångras - använd med försiktighet.",
|
"cannot-be-undone": "Denna åtgärd kan inte ångras - använd med försiktighet.",
|
||||||
"postgresql-note": "Om du använder PostGreSQL, vänligen granska {backup-restore-process} innan du återställer.",
|
"postgresql-note": "Om du använder PostGreSQL, vänligen granska {backup-restore-process} innan du återställer.",
|
||||||
"backup-restore-process-in-the-documentation": "backup/restore process in the documentation",
|
"backup-restore-process-in-the-documentation": "säkerhetskopiering/återställning i dokumentationen",
|
||||||
"irreversible-acknowledgment": "I understand that this action is irreversible, destructive and may cause data loss",
|
"irreversible-acknowledgment": "Jag förstår att denna åtgärd är oåterkallelig, destruktiv och kan orsaka dataförlust",
|
||||||
"restore-backup": "Återställ säkerhetskopia"
|
"restore-backup": "Återställ säkerhetskopia"
|
||||||
},
|
},
|
||||||
"backup-and-exports": "Backuper",
|
"backup-and-exports": "Backuper",
|
||||||
@ -683,21 +687,21 @@
|
|||||||
"webhooks-caps": "WEBHOOKS",
|
"webhooks-caps": "WEBHOOKS",
|
||||||
"webhooks": "Webhooks",
|
"webhooks": "Webhooks",
|
||||||
"webhook-name": "Namn på webhook",
|
"webhook-name": "Namn på 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": "De webhooks som definieras nedan kommer att exekveras när en måltid definieras för dagen. Vid den schemalagda tiden skickas webhooks med data från receptet som är schemalagt för dagen. Observera att exekveringen av webhooks inte är exakt. Webhooks exekveras med ett 5 minuters intervall så att webhooks kommer att exekveras inom 5 +/- minuter från den schemalagda tiden."
|
||||||
},
|
},
|
||||||
"bug-report": "Buggrapport",
|
"bug-report": "Buggrapport",
|
||||||
"bug-report-information": "Use this information to report a bug. Providing details of your instance to developers is the best way to get your issues resolved quickly.",
|
"bug-report-information": "Använd denna information för att rapportera ett fel. Att ge utvecklarna information om din installation är det bästa sättet att få dina problem lösta snabbt.",
|
||||||
"tracker": "Spårare",
|
"tracker": "Spårare",
|
||||||
"configuration": "Konfiguration",
|
"configuration": "Konfiguration",
|
||||||
"docker-volume": "Docker volym",
|
"docker-volume": "Docker volym",
|
||||||
"docker-volume-help": "Mealie requires that the frontend container and the backend share the same docker volume or storage. This ensures that the frontend container can properly access the images and assets stored on disk.",
|
"docker-volume-help": "Mealie kräver att frontend behållare och backend dela samma docker volym eller lagring. Detta säkerställer att frontend-behållaren på rätt sätt kan komma åt bilder och tillgångar som lagras på disken.",
|
||||||
"volumes-are-misconfigured": "Volumes are misconfigured.",
|
"volumes-are-misconfigured": "Volymer är felkonfigurerade.",
|
||||||
"volumes-are-configured-correctly": "Volumes are configured correctly.",
|
"volumes-are-configured-correctly": "Volymer är konfigurerade korrekt.",
|
||||||
"status-unknown-try-running-a-validation": "Status Unknown. Try running a validation.",
|
"status-unknown-try-running-a-validation": "Status okänd. Försök köra en validering.",
|
||||||
"validate": "Validera",
|
"validate": "Validera",
|
||||||
"email-configuration-status": "Email Configuration Status",
|
"email-configuration-status": "E-post konfigurationsstatus",
|
||||||
"email-configured": "Email Configured",
|
"email-configured": "E-post konfigurerad",
|
||||||
"email-test-results": "Email Test Results",
|
"email-test-results": "Testresultat för e-post",
|
||||||
"ready": "Redo",
|
"ready": "Redo",
|
||||||
"not-ready": "Inte redo - Kontrollera miljövariabler",
|
"not-ready": "Inte redo - Kontrollera miljövariabler",
|
||||||
"succeeded": "Lyckades",
|
"succeeded": "Lyckades",
|
||||||
@ -707,16 +711,16 @@
|
|||||||
"application-version-error-text": "Din nuvarande version ({0}) matchar inte den senaste utgåvan. Överväg att uppdatera till den senaste versionen ({1}).",
|
"application-version-error-text": "Din nuvarande version ({0}) matchar inte den senaste utgåvan. Överväg att uppdatera till den senaste versionen ({1}).",
|
||||||
"mealie-is-up-to-date": "Mealie är uppdaterad",
|
"mealie-is-up-to-date": "Mealie är uppdaterad",
|
||||||
"secure-site": "Säker webbplats",
|
"secure-site": "Säker webbplats",
|
||||||
"secure-site-error-text": "Serve via localhost or secure with https. Clipboard and additional browser APIs may not work.",
|
"secure-site-error-text": "Servera via localhost eller säker med https. Urklipp och ytterligare webbläsare API: er kanske inte fungerar.",
|
||||||
"secure-site-success-text": "Webbplatsen nås av localhost eller https",
|
"secure-site-success-text": "Webbplatsen nås av localhost eller https",
|
||||||
"server-side-base-url": "Serverns bas-URL",
|
"server-side-base-url": "Serverns bas-URL",
|
||||||
"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` är fortfarande standardvärdet på API-servern. Detta kommer att orsaka problem med meddelanden som genereras på servern för e-postmeddelanden, etc.",
|
||||||
"server-side-base-url-success-text": "Server Side URL does not match the default",
|
"server-side-base-url-success-text": "Serversidans URL matchar inte standard",
|
||||||
"ldap-ready": "LDAP Redo",
|
"ldap-ready": "LDAP Redo",
|
||||||
"ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.",
|
"ldap-ready-error-text": "Alla LDAP-värden är inte konfigurerade. Detta kan ignoreras om du inte använder LDAP-autentisering.",
|
||||||
"ldap-ready-success-text": "Required LDAP variables are all set.",
|
"ldap-ready-success-text": "Alla obligatoriska LDAP-variabler är satta.",
|
||||||
"build": "Bygg",
|
"build": "Bygg",
|
||||||
"recipe-scraper-version": "Recipe Scraper Version"
|
"recipe-scraper-version": "Version av Recept-scraper"
|
||||||
},
|
},
|
||||||
"shopping-list": {
|
"shopping-list": {
|
||||||
"all-lists": "Visa alla listor",
|
"all-lists": "Visa alla listor",
|
||||||
@ -730,19 +734,19 @@
|
|||||||
"food": "Mat",
|
"food": "Mat",
|
||||||
"note": "Anteckning",
|
"note": "Anteckning",
|
||||||
"label": "Etikett",
|
"label": "Etikett",
|
||||||
"linked-item-warning": "This item is linked to one or more recipe. Adjusting the units or foods will yield unexpected results when adding or removing the recipe from this list.",
|
"linked-item-warning": "Denna artikel är länkad till ett eller flera recept. Justering av enheter eller livsmedel ger oväntade resultat när du lägger till eller tar bort receptet från denna lista.",
|
||||||
"toggle-food": "Växla mat",
|
"toggle-food": "Växla mat",
|
||||||
"manage-labels": "Hantera etiketter",
|
"manage-labels": "Hantera etiketter",
|
||||||
"are-you-sure-you-want-to-delete-this-item": "Är du säker på att du vill ta bort detta objekt?",
|
"are-you-sure-you-want-to-delete-this-item": "Är du säker på att du vill ta bort detta objekt?",
|
||||||
"copy-as-text": "Kopiera som text",
|
"copy-as-text": "Kopiera som text",
|
||||||
"copy-as-markdown": "Kopiera som Markdown",
|
"copy-as-markdown": "Kopiera som Markdown",
|
||||||
"delete-checked": "Ta bort markerade",
|
"delete-checked": "Ta bort markerade",
|
||||||
"toggle-label-sort": "Toggle Label Sort",
|
"toggle-label-sort": "Växla etikettsortering",
|
||||||
"reorder-labels": "Ordna om etiketter",
|
"reorder-labels": "Ordna om etiketter",
|
||||||
"uncheck-all-items": "Avmarkera alla objekt",
|
"uncheck-all-items": "Avmarkera alla objekt",
|
||||||
"check-all-items": "Markera alla objekt",
|
"check-all-items": "Markera alla objekt",
|
||||||
"linked-recipes-count": "No Linked Recipes|One Linked Recipe|{count} Linked Recipes",
|
"linked-recipes-count": "Inga länkade recept|Ett länkat recept|{count} länkade recept",
|
||||||
"items-checked-count": "No items checked|One item checked|{count} items checked",
|
"items-checked-count": "Inga artiklar markerade|En artikel markerad|{count} artiklar markerade",
|
||||||
"no-label": "Ingen etikett",
|
"no-label": "Ingen etikett",
|
||||||
"completed-on": "Slutförd på {date}"
|
"completed-on": "Slutförd på {date}"
|
||||||
},
|
},
|
||||||
@ -788,7 +792,8 @@
|
|||||||
"tags": "Taggar",
|
"tags": "Taggar",
|
||||||
"untagged-count": "Otaggad {count}",
|
"untagged-count": "Otaggad {count}",
|
||||||
"create-a-tag": "Skapa tagg",
|
"create-a-tag": "Skapa tagg",
|
||||||
"tag-name": "Taggnamn"
|
"tag-name": "Taggnamn",
|
||||||
|
"tag": "Tagg"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Redskap",
|
"tools": "Redskap",
|
||||||
@ -797,7 +802,8 @@
|
|||||||
"tool-name": "Verktygsnamn",
|
"tool-name": "Verktygsnamn",
|
||||||
"create-new-tool": "Skapa nytt verktyg",
|
"create-new-tool": "Skapa nytt verktyg",
|
||||||
"on-hand-checkbox-label": "Visa som tillgänglig (markerad)",
|
"on-hand-checkbox-label": "Visa som tillgänglig (markerad)",
|
||||||
"required-tools": "Verktyg som krävs"
|
"required-tools": "Verktyg som krävs",
|
||||||
|
"tool": "Verktyg"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Administratör",
|
"admin": "Administratör",
|
||||||
@ -832,7 +838,7 @@
|
|||||||
"password-updated": "Lösenord uppdaterat",
|
"password-updated": "Lösenord uppdaterat",
|
||||||
"password": "Lösenord",
|
"password": "Lösenord",
|
||||||
"password-strength": "Lösenordsstyrka {strength}",
|
"password-strength": "Lösenordsstyrka {strength}",
|
||||||
"please-enter-password": "Please enter your new password.",
|
"please-enter-password": "Ange ditt nya lösenord.",
|
||||||
"register": "Registrering",
|
"register": "Registrering",
|
||||||
"reset-password": "Ändra lösenord",
|
"reset-password": "Ändra lösenord",
|
||||||
"sign-in": "Logga in",
|
"sign-in": "Logga in",
|
||||||
@ -853,7 +859,7 @@
|
|||||||
"username": "Användarnamn",
|
"username": "Användarnamn",
|
||||||
"users-header": "ANVÄNDARE",
|
"users-header": "ANVÄNDARE",
|
||||||
"users": "Användare",
|
"users": "Användare",
|
||||||
"user-not-found": "User not found",
|
"user-not-found": "Användaren kunde inte hittas",
|
||||||
"webhook-time": "Webbhook tid",
|
"webhook-time": "Webbhook tid",
|
||||||
"webhooks-enabled": "Webhooks aktiverat",
|
"webhooks-enabled": "Webhooks aktiverat",
|
||||||
"you-are-not-allowed-to-create-a-user": "Du har inte behörighet att skapa en användare",
|
"you-are-not-allowed-to-create-a-user": "Du har inte behörighet att skapa en användare",
|
||||||
@ -876,7 +882,7 @@
|
|||||||
"user-management": "Användarhantering",
|
"user-management": "Användarhantering",
|
||||||
"reset-locked-users": "Återställ låsta användare",
|
"reset-locked-users": "Återställ låsta användare",
|
||||||
"admin-user-creation": "Skapande av adminanvändare",
|
"admin-user-creation": "Skapande av adminanvändare",
|
||||||
"admin-user-management": "Admin User Management",
|
"admin-user-management": "Användarhantering",
|
||||||
"user-details": "Användarinformation",
|
"user-details": "Användarinformation",
|
||||||
"user-name": "Användarnamn",
|
"user-name": "Användarnamn",
|
||||||
"authentication-method": "Autentiseringsmetod",
|
"authentication-method": "Autentiseringsmetod",
|
||||||
@ -889,9 +895,9 @@
|
|||||||
"enable-advanced-features": "Aktivera avancerade funktioner",
|
"enable-advanced-features": "Aktivera avancerade funktioner",
|
||||||
"it-looks-like-this-is-your-first-time-logging-in": "Det ser ut som om detta är första gången du loggar in.",
|
"it-looks-like-this-is-your-first-time-logging-in": "Det ser ut som om detta är första gången du loggar in.",
|
||||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Vill du inte se detta längre? Se till att ändra din e-post i dina användarinställningar!",
|
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "Vill du inte se detta längre? Se till att ändra din e-post i dina användarinställningar!",
|
||||||
"forgot-password": "Forgot Password",
|
"forgot-password": "Glömt lösenord",
|
||||||
"forgot-password-text": "Please enter your email address and we will send you a link to reset your password.",
|
"forgot-password-text": "Ange din e-postadress så skickar vi dig en länk för att återställa ditt lösenord.",
|
||||||
"changes-reflected-immediately": "Changes to this user will be reflected immediately."
|
"changes-reflected-immediately": "Ändringar av denna användare kommer att ske omedelbart."
|
||||||
},
|
},
|
||||||
"language-dialog": {
|
"language-dialog": {
|
||||||
"translated": "översatt",
|
"translated": "översatt",
|
||||||
@ -907,8 +913,8 @@
|
|||||||
"seed-dialog-text": "Fyll databasen med livsmedel baserade på ditt språk. Detta kommer att skapa 200+ vanliga livsmedel som kan användas för att organisera din databas. Livsmedlen översätts via ett gemenskapsinsats.",
|
"seed-dialog-text": "Fyll databasen med livsmedel baserade på ditt språk. Detta kommer att skapa 200+ vanliga livsmedel som kan användas för att organisera din databas. Livsmedlen översätts via ett gemenskapsinsats.",
|
||||||
"seed-dialog-warning": "Du har redan några objekt i din databas. Denna åtgärd kommer inte att förena dubbletter, du kommer att behöva hantera dem manuellt.",
|
"seed-dialog-warning": "Du har redan några objekt i din databas. Denna åtgärd kommer inte att förena dubbletter, du kommer att behöva hantera dem manuellt.",
|
||||||
"combine-food": "Kombinera mat",
|
"combine-food": "Kombinera mat",
|
||||||
"source-food": "Source Food",
|
"source-food": "Matens källa",
|
||||||
"target-food": "Target Food",
|
"target-food": "Matens mål",
|
||||||
"create-food": "Skapa mat",
|
"create-food": "Skapa mat",
|
||||||
"food-label": "Mat etikett",
|
"food-label": "Mat etikett",
|
||||||
"edit-food": "Redigera mat",
|
"edit-food": "Redigera mat",
|
||||||
@ -918,21 +924,21 @@
|
|||||||
},
|
},
|
||||||
"units": {
|
"units": {
|
||||||
"seed-dialog-text": "Fyll databasen med vanliga enheter baserade på ditt språk.",
|
"seed-dialog-text": "Fyll databasen med vanliga enheter baserade på ditt språk.",
|
||||||
"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": "Genom att kombinera de valda enheterna slås källenheten och målenheten samman till en enda enhet. {source-unit-will-be-deleted} och alla referenser till enhetens källa kommer att uppdateras så att de pekar på enhetens mål.",
|
||||||
"combine-unit": "Kombinera enhet",
|
"combine-unit": "Kombinera enhet",
|
||||||
"source-unit": "Source Unit",
|
"source-unit": "Källenhet",
|
||||||
"target-unit": "Target Unit",
|
"target-unit": "Målenhet",
|
||||||
"merging-unit-into-unit": "Slå samman {0} till {1}",
|
"merging-unit-into-unit": "Slå samman {0} till {1}",
|
||||||
"create-unit": "Skapa enhet",
|
"create-unit": "Skapa enhet",
|
||||||
"abbreviation": "Abbreviation",
|
"abbreviation": "Förkortning",
|
||||||
"plural-abbreviation": "Plural Abbreviation",
|
"plural-abbreviation": "Plural förkortning",
|
||||||
"description": "Beskrivning",
|
"description": "Beskrivning",
|
||||||
"display-as-fraction": "Display as Fraction",
|
"display-as-fraction": "Visa som bråktal",
|
||||||
"use-abbreviation": "Använd förkortning",
|
"use-abbreviation": "Använd förkortning",
|
||||||
"edit-unit": "Redigera enhet",
|
"edit-unit": "Redigera enhet",
|
||||||
"unit-data": "Enhetsdata",
|
"unit-data": "Enhetsdata",
|
||||||
"use-abbv": "Use Abbv.",
|
"use-abbv": "Använd förkortning",
|
||||||
"fraction": "Fraction",
|
"fraction": "Bråktal",
|
||||||
"example-unit-singular": "ex: Matsked",
|
"example-unit-singular": "ex: Matsked",
|
||||||
"example-unit-plural": "ex: Matskedar",
|
"example-unit-plural": "ex: Matskedar",
|
||||||
"example-unit-abbreviation-singular": "ex: msk",
|
"example-unit-abbreviation-singular": "ex: msk",
|
||||||
@ -946,15 +952,15 @@
|
|||||||
},
|
},
|
||||||
"recipes": {
|
"recipes": {
|
||||||
"purge-exports": "Rensa exporter",
|
"purge-exports": "Rensa exporter",
|
||||||
"are-you-sure-you-want-to-delete-all-export-data": "Are you sure you want to delete all export data?",
|
"are-you-sure-you-want-to-delete-all-export-data": "Är du säker på att du vill ta bort all exportdata?",
|
||||||
"confirm-delete-recipes": "Are you sure you want to delete the following recipes? This action cannot be undone.",
|
"confirm-delete-recipes": "Är du säker på att du vill radera följande recept? Denna åtgärd kan inte ångras.",
|
||||||
"the-following-recipes-selected-length-will-be-exported": "The following recipes ({0}) will be exported.",
|
"the-following-recipes-selected-length-will-be-exported": "Följande recept ({0}) kommer att exporteras.",
|
||||||
"settings-chosen-explanation": "Settings chosen here, excluding the locked option, will be applied to all selected recipes.",
|
"settings-chosen-explanation": "Inställningarna valda här, exklusive det låsta alternativet, kommer att tillämpas på alla valda recept.",
|
||||||
"selected-length-recipe-s-settings-will-be-updated": "{count} recipe(s) settings will be updated.",
|
"selected-length-recipe-s-settings-will-be-updated": "{count} receptinställning(ar) kommer att uppdateras.",
|
||||||
"recipe-data": "Recept data",
|
"recipe-data": "Recept data",
|
||||||
"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": "Använd det här avsnittet för att hantera data som är kopplade till dina recept. Du kan utföra flera massåtgärder på dina recept, inklusive export, radering, taggning och tilldelning av kategorier.",
|
||||||
"recipe-columns": "Receptkolumner",
|
"recipe-columns": "Receptkolumner",
|
||||||
"data-exports-description": "This section provides links to available exports that are ready to download. These exports do expire, so be sure to grab them while they're still available.",
|
"data-exports-description": "I det här avsnittet finns länkar till tillgängliga exporter som är redo att laddas ner. Dessa exporter upphör att gälla, så se till att hämta dem medan de fortfarande är tillgängliga.",
|
||||||
"data-exports": "Dataexport",
|
"data-exports": "Dataexport",
|
||||||
"tag": "Tagg",
|
"tag": "Tagg",
|
||||||
"categorize": "Kategorisera",
|
"categorize": "Kategorisera",
|
||||||
@ -963,14 +969,14 @@
|
|||||||
"categorize-recipes": "Kategorisera recept",
|
"categorize-recipes": "Kategorisera recept",
|
||||||
"export-recipes": "Exportera recept",
|
"export-recipes": "Exportera recept",
|
||||||
"delete-recipes": "Radera recept",
|
"delete-recipes": "Radera recept",
|
||||||
"source-unit-will-be-deleted": "Source Unit will be deleted"
|
"source-unit-will-be-deleted": "Källenheten kommer att raderas"
|
||||||
},
|
},
|
||||||
"create-alias": "Skapa alias",
|
"create-alias": "Skapa alias",
|
||||||
"manage-aliases": "Manage Aliases",
|
"manage-aliases": "Hantera alias",
|
||||||
"seed-data": "Exempeldata",
|
"seed-data": "Exempeldata",
|
||||||
"seed": "Seed",
|
"seed": "Frö",
|
||||||
"data-management": "Datahantering",
|
"data-management": "Datahantering",
|
||||||
"data-management-description": "Select which data set you want to make changes to.",
|
"data-management-description": "Välj vilken data du vill göra ändringar i.",
|
||||||
"select-data": "Välj data",
|
"select-data": "Välj data",
|
||||||
"select-language": "Välj språk",
|
"select-language": "Välj språk",
|
||||||
"columns": "Kolumner",
|
"columns": "Kolumner",
|
||||||
@ -978,7 +984,7 @@
|
|||||||
"categories": {
|
"categories": {
|
||||||
"edit-category": "Redigera kategori",
|
"edit-category": "Redigera kategori",
|
||||||
"new-category": "Ny kategori",
|
"new-category": "Ny kategori",
|
||||||
"category-data": "Category Data"
|
"category-data": "Kategoridata"
|
||||||
},
|
},
|
||||||
"tags": {
|
"tags": {
|
||||||
"new-tag": "Ny Tag",
|
"new-tag": "Ny Tag",
|
||||||
@ -988,12 +994,12 @@
|
|||||||
"tools": {
|
"tools": {
|
||||||
"new-tool": "Nytt verktyg",
|
"new-tool": "Nytt verktyg",
|
||||||
"edit-tool": "Lägg till/ta bort verktyg",
|
"edit-tool": "Lägg till/ta bort verktyg",
|
||||||
"tool-data": "Tool Data"
|
"tool-data": "Verktygsdata"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"user-registration": {
|
"user-registration": {
|
||||||
"user-registration": "Användarregistrering",
|
"user-registration": "Användarregistrering",
|
||||||
"registration-success": "Registration Success",
|
"registration-success": "Registrering lyckades",
|
||||||
"join-a-group": "Gå med i en grupp",
|
"join-a-group": "Gå med i en grupp",
|
||||||
"create-a-new-group": "Skapa en ny grupp",
|
"create-a-new-group": "Skapa en ny grupp",
|
||||||
"provide-registration-token-description": "Ange registreringstoken som är kopplad till den grupp som du vill gå med. Du måste få detta från en befintlig gruppmedlem.",
|
"provide-registration-token-description": "Ange registreringstoken som är kopplad till den grupp som du vill gå med. Du måste få detta från en befintlig gruppmedlem.",
|
||||||
@ -1039,66 +1045,66 @@
|
|||||||
"demo_password": "Lösenord: {password}"
|
"demo_password": "Lösenord: {password}"
|
||||||
},
|
},
|
||||||
"ocr-editor": {
|
"ocr-editor": {
|
||||||
"ocr-editor": "Ocr editor",
|
"ocr-editor": "Ocr redigerare",
|
||||||
"toolbar": "Toolbar",
|
"toolbar": "Verktygsfält",
|
||||||
"selection-mode": "Markeringsläge",
|
"selection-mode": "Markeringsläge",
|
||||||
"pan-and-zoom-picture": "Pan and zoom picture",
|
"pan-and-zoom-picture": "Panorera och zooma bild",
|
||||||
"split-text": "Dela text",
|
"split-text": "Dela text",
|
||||||
"preserve-line-breaks": "Preserve original line breaks",
|
"preserve-line-breaks": "Bevara ursprungliga radbrytningar",
|
||||||
"split-by-block": "Split by text block",
|
"split-by-block": "Dela med textblock",
|
||||||
"flatten": "Flatten regardless of original formating",
|
"flatten": "Platta till oavsett ursprunglig formatering",
|
||||||
"help": {
|
"help": {
|
||||||
"help": "Help",
|
"help": "Hjälp",
|
||||||
"mouse-modes": "Mouse modes",
|
"mouse-modes": "Musläge",
|
||||||
"selection-mode": "Markeringsläge (standard)",
|
"selection-mode": "Markeringsläge (standard)",
|
||||||
"selection-mode-desc": "The selection mode is the main mode that can be used to enter data:",
|
"selection-mode-desc": "Urvalsläget är det huvudsakliga läget som kan användas för att mata in data:",
|
||||||
"selection-mode-steps": {
|
"selection-mode-steps": {
|
||||||
"draw": "Draw a rectangle on the text you want to select.",
|
"draw": "Rita en rektangel på den text du vill markera.",
|
||||||
"click": "Click on any field on the right and then click back on the rectangle above the image.",
|
"click": "Klicka på valfritt fält till höger och klicka sedan tillbaka på rektangeln ovanför bilden.",
|
||||||
"result": "The selected text will appear inside the previously selected field."
|
"result": "Den markerade texten visas i det tidigare markerade fältet."
|
||||||
},
|
},
|
||||||
"pan-and-zoom-mode": "Pan and Zoom Mode",
|
"pan-and-zoom-mode": "Panorerings- och zoomläge",
|
||||||
"pan-and-zoom-desc": "Select pan and zoom by clicking the icon. This mode allows to zoom inside the image and move around to make using big images easier.",
|
"pan-and-zoom-desc": "Välj panorera och zooma genom att klicka på ikonen. I det här läget kan du zooma in i bilden och flytta runt den för att göra det enklare att använda stora bilder.",
|
||||||
"split-text-mode": "Split Text modes",
|
"split-text-mode": "Dela upp textlägen",
|
||||||
"split-modes": {
|
"split-modes": {
|
||||||
"line-mode": "Line mode (default)",
|
"line-mode": "Radläge (standard)",
|
||||||
"line-mode-desc": "In line mode, the text will be propagated by keeping the original line breaks. This mode is useful when using bulk add on a list of ingredients where one ingredient is one line.",
|
"line-mode-desc": "I radläget kommer texten att spridas genom att behålla de ursprungliga radbrytningarna. Detta läge är användbart när du använder bulk add på en lista med ingredienser där en ingrediens är en rad.",
|
||||||
"block-mode": "Block mode",
|
"block-mode": "Block läge",
|
||||||
"block-mode-desc": "In block mode, the text will be split in blocks. This mode is useful when bulk adding instructions that are usually written in paragraphs.",
|
"block-mode-desc": "I blockläget kommer texten att delas upp i block. Detta läge är användbart när du lägger till instruktioner som vanligtvis är skrivna i stycken.",
|
||||||
"flat-mode": "Flat mode",
|
"flat-mode": "Platt läge",
|
||||||
"flat-mode-desc": "In flat mode, the text will be added to the selected recipe field with no line breaks."
|
"flat-mode-desc": "I platt läge läggs texten till i det valda receptfältet utan radbrytningar."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"admin": {
|
"admin": {
|
||||||
"maintenance": {
|
"maintenance": {
|
||||||
"storage-details": "Storage Details",
|
"storage-details": "Lagringsdetaljer",
|
||||||
"page-title": "Site Maintenance",
|
"page-title": "Underhåll av webbplatsen",
|
||||||
"summary-title": "Summary",
|
"summary-title": "Sammanfattning",
|
||||||
"button-label-get-summary": "Get Summary",
|
"button-label-get-summary": "Hämta sammanfattning",
|
||||||
"button-label-open-details": "Details",
|
"button-label-open-details": "Detaljer",
|
||||||
"info-description-data-dir-size": "Data Directory Size",
|
"info-description-data-dir-size": "Datakatalogens storlek",
|
||||||
"info-description-log-file-size": "Storlek på loggfil",
|
"info-description-log-file-size": "Storlek på loggfil",
|
||||||
"info-description-cleanable-directories": "Rensbara mappar",
|
"info-description-cleanable-directories": "Rensbara mappar",
|
||||||
"info-description-cleanable-images": "Rensbara bilder",
|
"info-description-cleanable-images": "Rensbara bilder",
|
||||||
"storage": {
|
"storage": {
|
||||||
"title-temporary-directory": "Tillfällig mapp (.temp)",
|
"title-temporary-directory": "Tillfällig mapp (.temp)",
|
||||||
"title-backups-directory": "Backups Directory (backups)",
|
"title-backups-directory": "Katalog för säkerhetskopior (säkerhetskopior)",
|
||||||
"title-groups-directory": "Groups Directory (groups)",
|
"title-groups-directory": "Gruppkatalog (grupper)",
|
||||||
"title-recipes-directory": "Recipes Directory (recipes)",
|
"title-recipes-directory": "Receptkatalog (recept)",
|
||||||
"title-user-directory": "User Directory (user)"
|
"title-user-directory": "Användarkatalog (användare)"
|
||||||
},
|
},
|
||||||
"action-delete-log-files-name": "Radera loggfiler",
|
"action-delete-log-files-name": "Radera loggfiler",
|
||||||
"action-delete-log-files-description": "Tar bort alla loggfiler",
|
"action-delete-log-files-description": "Tar bort alla loggfiler",
|
||||||
"action-clean-directories-name": "Rensa mappar",
|
"action-clean-directories-name": "Rensa mappar",
|
||||||
"action-clean-directories-description": "Removes all the recipe folders that are not valid UUIDs",
|
"action-clean-directories-description": "Tar bort alla receptmappar som inte är giltiga UUID",
|
||||||
"action-clean-temporary-files-name": "Rensa tillfälliga filer",
|
"action-clean-temporary-files-name": "Rensa tillfälliga filer",
|
||||||
"action-clean-temporary-files-description": "Removes all files and folders in the .temp directory",
|
"action-clean-temporary-files-description": "Tar bort alla filer och mappar i .temp-katalogen",
|
||||||
"action-clean-images-name": "Clean Images",
|
"action-clean-images-name": "Rensa bilder",
|
||||||
"action-clean-images-description": "Removes all the images that don't end with .webp",
|
"action-clean-images-description": "Tar bort alla bilder som inte slutar med .webp",
|
||||||
"actions-description": "Maintenance actions are {destructive_in_bold} and should be used with caution. Performing any of these actions is {irreversible_in_bold}.",
|
"actions-description": "Underhållsåtgärder är {destructive_in_bold} och bör användas med försiktighet. Att utföra någon av dessa åtgärder är {irreversible_in_bold}.",
|
||||||
"actions-description-destructive": "destructive",
|
"actions-description-destructive": "destruktiv",
|
||||||
"actions-description-irreversible": "irreversible",
|
"actions-description-irreversible": "oåterkallelig",
|
||||||
"logs-action-refresh": "Uppdatera loggar",
|
"logs-action-refresh": "Uppdatera loggar",
|
||||||
"logs-page-title": "Mealie loggar",
|
"logs-page-title": "Mealie loggar",
|
||||||
"logs-tail-lines-label": "Tail Lines"
|
"logs-tail-lines-label": "Tail Lines"
|
||||||
@ -1107,11 +1113,11 @@
|
|||||||
"actions-title": "Åtgärder"
|
"actions-title": "Åtgärder"
|
||||||
},
|
},
|
||||||
"ingredients-natural-language-processor": "Ingredients Natural Language Processor",
|
"ingredients-natural-language-processor": "Ingredients Natural Language Processor",
|
||||||
"ingredients-natural-language-processor-explanation": "Mealie uses Conditional Random Fields (CRFs) for parsing and processing ingredients. The model used for ingredients is based off a data set of over 100,000 ingredients from a dataset compiled by the New York Times. Note that as the model is trained in English only, you may have varied results when using the model in other languages. This page is a playground for testing the model.",
|
"ingredients-natural-language-processor-explanation": "Mealie använder villkorliga slumpfält (CRF) för tolkning och bearbetning av ingredienser. Modellen som används för ingredienser är baserad på en uppsättning data på över 100.000 ingredienser från en dataset sammanställd av New York Times. Observera att eftersom modellen endast är utbildad på engelska kan du ha olika resultat när du använder modellen på andra språk. Denna sida är en lekplats för att testa modellen.",
|
||||||
"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": "Det är inte perfekt, men det ger bra resultat i allmänhet och är en bra utgångspunkt för att manuellt tolka ingredienser i enskilda områden. Alternativt kan du också använda \"Brute\" processor som använder en mönstermatchningsteknik för att identifiera ingredienser.",
|
||||||
"nlp": "NLP",
|
"nlp": "NLP",
|
||||||
"brute": "Brute",
|
"brute": "Brute",
|
||||||
"show-individual-confidence": "Show individual confidence",
|
"show-individual-confidence": "Visa individuella självförtroende",
|
||||||
"ingredient-text": "Ingrediens text",
|
"ingredient-text": "Ingrediens text",
|
||||||
"average-confident": "{0} Säker",
|
"average-confident": "{0} Säker",
|
||||||
"try-an-example": "Försök med ett exempel",
|
"try-an-example": "Försök med ett exempel",
|
||||||
@ -1125,7 +1131,7 @@
|
|||||||
"welcome-user": "👋 Välkommen, {0}",
|
"welcome-user": "👋 Välkommen, {0}",
|
||||||
"description": "Hantera dina profil, recept och gruppinställningar.",
|
"description": "Hantera dina profil, recept och gruppinställningar.",
|
||||||
"get-invite-link": "Få inbjudningslänk",
|
"get-invite-link": "Få inbjudningslänk",
|
||||||
"get-public-link": "Get Public Link",
|
"get-public-link": "Få offentlig länk",
|
||||||
"account-summary": "Kontosammanfattning",
|
"account-summary": "Kontosammanfattning",
|
||||||
"account-summary-description": "Här är en sammanfattning av din grupps information",
|
"account-summary-description": "Här är en sammanfattning av din grupps information",
|
||||||
"group-statistics": "Gruppstatistik",
|
"group-statistics": "Gruppstatistik",
|
||||||
@ -1133,32 +1139,32 @@
|
|||||||
"storage-capacity": "Lagringskapacitet",
|
"storage-capacity": "Lagringskapacitet",
|
||||||
"storage-capacity-description": "Din lagringskapacitet är en beräkning av de bilder och tillgångar du har laddat upp.",
|
"storage-capacity-description": "Din lagringskapacitet är en beräkning av de bilder och tillgångar du har laddat upp.",
|
||||||
"personal": "Personligt",
|
"personal": "Personligt",
|
||||||
"personal-description": "These are settings that are personal to you. Changes here won't affect other users",
|
"personal-description": "Detta är inställningar som är personliga för dig. Ändringar här påverkar inte andra användare",
|
||||||
"user-settings": "Användarinställningar",
|
"user-settings": "Användarinställningar",
|
||||||
"user-settings-description": "Manage your preferences, change your password, and update your email",
|
"user-settings-description": "Hantera dina inställningar, ändra ditt lösenord och uppdatera din e-post",
|
||||||
"api-tokens-description": "Manage your API Tokens for access from external applications",
|
"api-tokens-description": "Hantera dina API-Tokens för åtkomst från externa applikationer",
|
||||||
"group-description": "These items are shared within your group. Editing one of them will change it for the whole group!",
|
"group-description": "Dessa objekt delas inom din grupp. Att redigera en av dem kommer att ändra den för hela gruppen!",
|
||||||
"group-settings": "Gruppinställningar",
|
"group-settings": "Gruppinställningar",
|
||||||
"group-settings-description": "Manage your common group settings like mealplan and privacy settings.",
|
"group-settings-description": "Hantera dina gemensamma gruppinställningar som måltidsplan och sekretessinställningar.",
|
||||||
"cookbooks-description": "Manage a collection of recipe categories and generate pages for them.",
|
"cookbooks-description": "Hantera en samling receptkategorier och generera sidor för dem.",
|
||||||
"members": "Medlemmar",
|
"members": "Medlemmar",
|
||||||
"members-description": "See who's in your group and manage their permissions.",
|
"members-description": "Se vem som är med i din grupp och hantera deras behörigheter.",
|
||||||
"webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.",
|
"webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.",
|
||||||
"notifiers": "Notifierare",
|
"notifiers": "Notifierare",
|
||||||
"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": "Hantera data",
|
"manage-data": "Hantera data",
|
||||||
"manage-data-description": "Manage your Food and Units (more options coming soon)",
|
"manage-data-description": "Hantera Mat och Enheter (fler alternativ kommer snart)",
|
||||||
"data-migrations": "Data migreringar",
|
"data-migrations": "Data migreringar",
|
||||||
"data-migrations-description": "Migrate your existing data from other applications like Nextcloud Recipes and Chowdown",
|
"data-migrations-description": "Migrera befintliga data från andra program som Nextcloud Recipes och Chowdown",
|
||||||
"email-sent": "E-post skickades",
|
"email-sent": "E-post skickades",
|
||||||
"error-sending-email": "Fel vid sändning av e-post",
|
"error-sending-email": "Fel vid sändning av e-post",
|
||||||
"personal-information": "Personlig information",
|
"personal-information": "Personlig information",
|
||||||
"preferences": "Preferenser",
|
"preferences": "Preferenser",
|
||||||
"show-advanced-description": "Show advanced features (API Keys, Webhooks, and Data Management)",
|
"show-advanced-description": "Visa avancerade funktioner (API-nycklar, webhooks och datahantering)",
|
||||||
"back-to-profile": "Tillbaka till profilen",
|
"back-to-profile": "Tillbaka till profilen",
|
||||||
"looking-for-privacy-settings": "Letar du efter sekretessinställningar?",
|
"looking-for-privacy-settings": "Letar du efter sekretessinställningar?",
|
||||||
"manage-your-api-tokens": "Hantera dina API Tokens",
|
"manage-your-api-tokens": "Hantera dina API Tokens",
|
||||||
"manage-user-profile": "Manage User Profile",
|
"manage-user-profile": "Hantera användarprofil",
|
||||||
"manage-cookbooks": "Hantera kokböcker",
|
"manage-cookbooks": "Hantera kokböcker",
|
||||||
"manage-members": "Hantera medlemmar",
|
"manage-members": "Hantera medlemmar",
|
||||||
"manage-webhooks": "Hantera Webhookar",
|
"manage-webhooks": "Hantera Webhookar",
|
||||||
@ -1171,7 +1177,7 @@
|
|||||||
"public-cookbook": "Offentlig kokbok",
|
"public-cookbook": "Offentlig kokbok",
|
||||||
"public-cookbook-description": "Offentliga kokböcker kan delas med icke-mealie användare och kommer att visas på din gruppsida.",
|
"public-cookbook-description": "Offentliga kokböcker kan delas med icke-mealie användare och kommer att visas på din gruppsida.",
|
||||||
"filter-options": "Filterinställningar",
|
"filter-options": "Filterinställningar",
|
||||||
"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": "När använd allt är valt kommer kokboken bara att innehålla recept som har alla objekt valda. Detta gäller för varje delmängd av väljare och inte ett tvärsnitt av de valda objekt.",
|
||||||
"require-all-categories": "Kräv alla kategorier",
|
"require-all-categories": "Kräv alla kategorier",
|
||||||
"require-all-tags": "Kräv alla taggar",
|
"require-all-tags": "Kräv alla taggar",
|
||||||
"require-all-tools": "Kräv alla verktyg",
|
"require-all-tools": "Kräv alla verktyg",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Yenile",
|
"refresh": "Yenile",
|
||||||
"upload-file": "Dosya Yükle",
|
"upload-file": "Dosya Yükle",
|
||||||
"created-on-date": "{0} tarihinde oluşturuldu",
|
"created-on-date": "{0} tarihinde oluşturuldu",
|
||||||
"unsaved-changes": "Kaydedilmemiş değişiklikleriniz mevcut. Ayrılmadan önce kaydetmek ister misiniz? Kaydetmek için Tamam'ı, değişiklikleri iptal etmek için İptal'i seçin."
|
"unsaved-changes": "Kaydedilmemiş değişiklikleriniz mevcut. Ayrılmadan önce kaydetmek ister misiniz? Kaydetmek için Tamam'ı, değişiklikleri iptal etmek için İptal'i seçin.",
|
||||||
|
"clipboard-copy-failure": "Panoya kopyalanamadı."
|
||||||
},
|
},
|
||||||
"group": {
|
"group": {
|
||||||
"are-you-sure-you-want-to-delete-the-group": "<b>{groupName}<b/>'i silmek istediğine emin misin?",
|
"are-you-sure-you-want-to-delete-the-group": "<b>{groupName}<b/>'i silmek istediğine emin misin?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "Nasıl oldu?",
|
"how-did-it-turn-out": "Nasıl oldu?",
|
||||||
"user-made-this": "{user} bunu yaptı",
|
"user-made-this": "{user} bunu yaptı",
|
||||||
"last-made-date": "Last Made {date}",
|
"last-made-date": "Last Made {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 part applications. You can use these keys to contain information to trigger automation or custom messages to relay to your desired device.",
|
"api-extras-description": "Tarif ekstraları Mealie API'nin önemli bir özelliğidir. Üçüncü taraf uygulamalardan referans almak üzere bir tarif içinde özel JSON anahtar/değer çiftleri oluşturmanıza olanak tanır. Bu tuşları, örneğin otomasyonları tetiklemek veya istediğiniz cihaza iletilecek özel mesajları bilgi sağlamak için kullanabilirsiniz.",
|
||||||
"message-key": "Message Key",
|
"message-key": "Message Key",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||||
@ -532,6 +533,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": "Aynı anda kazımak istediğiniz birçok tarifiniz mi var?",
|
||||||
|
"scrape-recipe-suggest-bulk-importer": "Toplu ithalatçıyı deneyin",
|
||||||
"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": "Zip'ten içeri aktar",
|
"import-from-zip": "Zip'ten içeri aktar",
|
||||||
@ -554,7 +557,8 @@
|
|||||||
"unit": "Birim",
|
"unit": "Birim",
|
||||||
"upload-image": "Resim yükleyin",
|
"upload-image": "Resim yükleyin",
|
||||||
"screen-awake": "Ekranı Açık Tut",
|
"screen-awake": "Ekranı Açık Tut",
|
||||||
"remove-image": "Resmi kaldır"
|
"remove-image": "Resmi kaldır",
|
||||||
|
"nextStep": "Sonraki adım"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Advanced Search",
|
"advanced-search": "Advanced Search",
|
||||||
@ -788,7 +792,8 @@
|
|||||||
"tags": "Etiketler",
|
"tags": "Etiketler",
|
||||||
"untagged-count": "Untagged {count}",
|
"untagged-count": "Untagged {count}",
|
||||||
"create-a-tag": "Create a Tag",
|
"create-a-tag": "Create a Tag",
|
||||||
"tag-name": "Etiket Adı"
|
"tag-name": "Etiket Adı",
|
||||||
|
"tag": "Etiket"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Tools",
|
"tools": "Tools",
|
||||||
@ -797,7 +802,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": "Araç"
|
||||||
},
|
},
|
||||||
"user": {
|
"user": {
|
||||||
"admin": "Admin",
|
"admin": "Admin",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Оновити",
|
"refresh": "Оновити",
|
||||||
"upload-file": "Вивантажити файл",
|
"upload-file": "Вивантажити файл",
|
||||||
"created-on-date": "Створено: {0}",
|
"created-on-date": "Створено: {0}",
|
||||||
"unsaved-changes": "У вас є незбережені зміни. Ви хочете зберегти їх перед виходом? Гаразд, щоб зберегти, Скасувати, щоб скасувати."
|
"unsaved-changes": "У вас є незбережені зміни. Ви хочете зберегти їх перед виходом? Гаразд, щоб зберегти, Скасувати, щоб скасувати.",
|
||||||
|
"clipboard-copy-failure": "Не вдалося скопіювати до буфера обміну."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "Як вийшло?",
|
"how-did-it-turn-out": "Як вийшло?",
|
||||||
"user-made-this": "{user} зробив це",
|
"user-made-this": "{user} зробив це",
|
||||||
"last-made-date": "Востаннє приготовано {date}",
|
"last-made-date": "Востаннє приготовано {date}",
|
||||||
"api-extras-description": "Додатки рецептів - це ключова функція API Mealie. Вони дозволяють створювати користувацьку пару ключів та значень в рецепті для сторонніх додатків. Це можна використовувати для автоматизації або створення користувацьких повідомлень.",
|
"api-extras-description": "Додатки в рецептах - ключова функція API Mealie. Вони дозволяють створювати користувацьку пару JSON ключів та значень в рецепті для сторонніх додатків. Це можна використовувати для автоматизації або для створення користувацьких повідомлень для сторонніх сервісів.",
|
||||||
"message-key": "Ключ повідомлення",
|
"message-key": "Ключ повідомлення",
|
||||||
"parse": "Проаналізувати",
|
"parse": "Проаналізувати",
|
||||||
"attach-images-hint": "Прикріпіть зображення, перетягнувши їх у редактор",
|
"attach-images-hint": "Прикріпіть зображення, перетягнувши їх у редактор",
|
||||||
@ -532,6 +533,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": "Багато рецептів, які ви хочете розпізнати відразу?",
|
||||||
|
"scrape-recipe-suggest-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",
|
||||||
@ -554,7 +557,8 @@
|
|||||||
"unit": "Одиниця виміру",
|
"unit": "Одиниця виміру",
|
||||||
"upload-image": "Вивантажити зображення",
|
"upload-image": "Вивантажити зображення",
|
||||||
"screen-awake": "Тримати екран активним",
|
"screen-awake": "Тримати екран активним",
|
||||||
"remove-image": "Видалити зображення"
|
"remove-image": "Видалити зображення",
|
||||||
|
"nextStep": "Наступний крок"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"advanced-search": "Розширений пошук",
|
"advanced-search": "Розширений пошук",
|
||||||
@ -788,7 +792,8 @@
|
|||||||
"tags": "Мітки",
|
"tags": "Мітки",
|
||||||
"untagged-count": "Без мітки {count}",
|
"untagged-count": "Без мітки {count}",
|
||||||
"create-a-tag": "Створити тег",
|
"create-a-tag": "Створити тег",
|
||||||
"tag-name": "Назва тегу"
|
"tag-name": "Назва тегу",
|
||||||
|
"tag": "Мітка"
|
||||||
},
|
},
|
||||||
"tool": {
|
"tool": {
|
||||||
"tools": "Інструменти",
|
"tools": "Інструменти",
|
||||||
@ -797,7 +802,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": "Адміністратор",
|
||||||
|
@ -198,7 +198,8 @@
|
|||||||
"refresh": "Refresh",
|
"refresh": "Refresh",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "How did it turn out?",
|
"how-did-it-turn-out": "How did it turn out?",
|
||||||
"user-made-this": "{user} made this",
|
"user-made-this": "{user} made this",
|
||||||
"last-made-date": "Last Made {date}",
|
"last-made-date": "Last Made {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 part applications. You can use these keys to contain information to trigger automation 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": "Message Key",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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",
|
||||||
@ -788,7 +792,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",
|
||||||
@ -797,7 +802,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",
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -21,8 +21,8 @@
|
|||||||
"production": "正式版",
|
"production": "正式版",
|
||||||
"support": "支持",
|
"support": "支持",
|
||||||
"version": "版本",
|
"version": "版本",
|
||||||
"unknown-version": "unknown",
|
"unknown-version": "未知",
|
||||||
"sponsor": "Sponsor"
|
"sponsor": "贊助者"
|
||||||
},
|
},
|
||||||
"asset": {
|
"asset": {
|
||||||
"assets": "資源",
|
"assets": "資源",
|
||||||
@ -33,10 +33,10 @@
|
|||||||
"pdf": "PDF",
|
"pdf": "PDF",
|
||||||
"recipe": "食譜",
|
"recipe": "食譜",
|
||||||
"show-assets": "顯示資源",
|
"show-assets": "顯示資源",
|
||||||
"error-submitting-form": "Error Submitting Form"
|
"error-submitting-form": "提交表格時發生錯誤"
|
||||||
},
|
},
|
||||||
"category": {
|
"category": {
|
||||||
"categories": "Categories",
|
"categories": "目錄",
|
||||||
"category-created": "類別已新增",
|
"category-created": "類別已新增",
|
||||||
"category-creation-failed": "新增類別失敗",
|
"category-creation-failed": "新增類別失敗",
|
||||||
"category-deleted": "類別已刪除",
|
"category-deleted": "類別已刪除",
|
||||||
@ -45,17 +45,17 @@
|
|||||||
"category-update-failed": "類別更新失敗",
|
"category-update-failed": "類別更新失敗",
|
||||||
"category-updated": "類別已更新",
|
"category-updated": "類別已更新",
|
||||||
"uncategorized-count": "未分類 {count}",
|
"uncategorized-count": "未分類 {count}",
|
||||||
"create-a-category": "Create a Category",
|
"create-a-category": "創建類別",
|
||||||
"category-name": "Category Name",
|
"category-name": "類別名稱",
|
||||||
"category": "Category"
|
"category": "目錄"
|
||||||
},
|
},
|
||||||
"events": {
|
"events": {
|
||||||
"apprise-url": "Apprise連結",
|
"apprise-url": "Apprise連結",
|
||||||
"database": "資料庫",
|
"database": "資料庫",
|
||||||
"delete-event": "删除事件",
|
"delete-event": "删除事件",
|
||||||
"event-delete-confirmation": "Are you sure you want to delete this event?",
|
"event-delete-confirmation": "您是否確定要刪除本活動?",
|
||||||
"event-deleted": "Event Deleted",
|
"event-deleted": "活動已刪除",
|
||||||
"event-updated": "Event Updated",
|
"event-updated": "活動已更新",
|
||||||
"new-notification-form-description": "Mealie使用Apprise來產生通知。他們提供多種選項給服務來使用通知。請參考他們wiki上關於如何為你的服務新建一個連結的詳細指引。若選擇通知的種類,可能會包含額外的功能。",
|
"new-notification-form-description": "Mealie使用Apprise來產生通知。他們提供多種選項給服務來使用通知。請參考他們wiki上關於如何為你的服務新建一個連結的詳細指引。若選擇通知的種類,可能會包含額外的功能。",
|
||||||
"new-version": "有可用的新版本!",
|
"new-version": "有可用的新版本!",
|
||||||
"notification": "通知",
|
"notification": "通知",
|
||||||
@ -64,7 +64,7 @@
|
|||||||
"something-went-wrong": "出了點問題...",
|
"something-went-wrong": "出了點問題...",
|
||||||
"subscribed-events": "關注的事件",
|
"subscribed-events": "關注的事件",
|
||||||
"test-message-sent": "測試訊息已發送",
|
"test-message-sent": "測試訊息已發送",
|
||||||
"new-notification": "New Notification",
|
"new-notification": "新通知",
|
||||||
"event-notifiers": "Event Notifiers",
|
"event-notifiers": "Event Notifiers",
|
||||||
"apprise-url-skipped-if-blank": "Apprise URL (skipped if blank)",
|
"apprise-url-skipped-if-blank": "Apprise URL (skipped if blank)",
|
||||||
"enable-notifier": "Enable Notifier",
|
"enable-notifier": "Enable Notifier",
|
||||||
@ -72,7 +72,7 @@
|
|||||||
"user-events": "User Events",
|
"user-events": "User Events",
|
||||||
"mealplan-events": "Mealplan Events",
|
"mealplan-events": "Mealplan Events",
|
||||||
"when-a-user-in-your-group-creates-a-new-mealplan": "When a user in your group creates a new mealplan",
|
"when-a-user-in-your-group-creates-a-new-mealplan": "When a user in your group creates a new mealplan",
|
||||||
"shopping-list-events": "Shopping List Events",
|
"shopping-list-events": "購物清單",
|
||||||
"cookbook-events": "Cookbook Events",
|
"cookbook-events": "Cookbook Events",
|
||||||
"tag-events": "Tag Events",
|
"tag-events": "Tag Events",
|
||||||
"category-events": "Category Events",
|
"category-events": "Category Events",
|
||||||
@ -85,7 +85,7 @@
|
|||||||
"close": "關閉",
|
"close": "關閉",
|
||||||
"confirm": "確定",
|
"confirm": "確定",
|
||||||
"confirm-delete-generic": "您確定要刪除這個嗎?",
|
"confirm-delete-generic": "您確定要刪除這個嗎?",
|
||||||
"copied_message": "Copied!",
|
"copied_message": "已複製!",
|
||||||
"create": "創建",
|
"create": "創建",
|
||||||
"created": "已建立",
|
"created": "已建立",
|
||||||
"custom": "自訂",
|
"custom": "自訂",
|
||||||
@ -93,7 +93,7 @@
|
|||||||
"delete": "删除",
|
"delete": "删除",
|
||||||
"disabled": "已停用",
|
"disabled": "已停用",
|
||||||
"download": "下载",
|
"download": "下载",
|
||||||
"duplicate": "Duplicate",
|
"duplicate": "複製",
|
||||||
"edit": "编辑",
|
"edit": "编辑",
|
||||||
"enabled": "已啟用",
|
"enabled": "已啟用",
|
||||||
"exception": "錯誤",
|
"exception": "錯誤",
|
||||||
@ -114,23 +114,23 @@
|
|||||||
"json": "JSON",
|
"json": "JSON",
|
||||||
"keyword": "關鍵字",
|
"keyword": "關鍵字",
|
||||||
"link-copied": "已複製連結",
|
"link-copied": "已複製連結",
|
||||||
"loading": "Loading",
|
"loading": "正在載入",
|
||||||
"loading-events": "Loading Events",
|
"loading-events": "載入行程中",
|
||||||
"loading-recipe": "Loading recipe...",
|
"loading-recipe": "載入食譜中...",
|
||||||
"loading-ocr-data": "Loading OCR data...",
|
"loading-ocr-data": "載入 OCR 資料...",
|
||||||
"loading-recipes": "載入食譜中",
|
"loading-recipes": "載入食譜中",
|
||||||
"message": "Message",
|
"message": "信息",
|
||||||
"monday": "星期一",
|
"monday": "星期一",
|
||||||
"name": "名稱",
|
"name": "名稱",
|
||||||
"new": "新增",
|
"new": "新增",
|
||||||
"never": "Never",
|
"never": "決不",
|
||||||
"no": "否",
|
"no": "否",
|
||||||
"no-recipe-found": "找不到食譜",
|
"no-recipe-found": "找不到食譜",
|
||||||
"ok": "好的",
|
"ok": "好的",
|
||||||
"options": "選項:",
|
"options": "選項:",
|
||||||
"plural-name": "Plural Name",
|
"plural-name": "複數",
|
||||||
"print": "列印",
|
"print": "列印",
|
||||||
"print-preferences": "Print Preferences",
|
"print-preferences": "列印設定",
|
||||||
"random": "隨機",
|
"random": "隨機",
|
||||||
"rating": "評價",
|
"rating": "評價",
|
||||||
"recent": "最近",
|
"recent": "最近",
|
||||||
@ -146,7 +146,7 @@
|
|||||||
"sort": "排序",
|
"sort": "排序",
|
||||||
"sort-alphabetically": "按字母順序",
|
"sort-alphabetically": "按字母順序",
|
||||||
"status": "狀態",
|
"status": "狀態",
|
||||||
"subject": "Subject",
|
"subject": "標題",
|
||||||
"submit": "提交",
|
"submit": "提交",
|
||||||
"success-count": "成功: {count}",
|
"success-count": "成功: {count}",
|
||||||
"sunday": "星期日",
|
"sunday": "星期日",
|
||||||
@ -164,41 +164,42 @@
|
|||||||
"view": "檢視",
|
"view": "檢視",
|
||||||
"wednesday": "星期三",
|
"wednesday": "星期三",
|
||||||
"yes": "是",
|
"yes": "是",
|
||||||
"foods": "Foods",
|
"foods": "糧食",
|
||||||
"units": "Units",
|
"units": "單位",
|
||||||
"back": "Back",
|
"back": "返回",
|
||||||
"next": "Next",
|
"next": "下一步",
|
||||||
"toggle-view": "Toggle View",
|
"toggle-view": "切換檢視方式",
|
||||||
"date": "Date",
|
"date": "日期",
|
||||||
"id": "Id",
|
"id": "ID",
|
||||||
"owner": "Owner",
|
"owner": "擁有者",
|
||||||
"date-added": "Date Added",
|
"date-added": "新增日期",
|
||||||
"none": "None",
|
"none": "無",
|
||||||
"run": "Run",
|
"run": "運行",
|
||||||
"menu": "Menu",
|
"menu": "選單",
|
||||||
"a-name-is-required": "A Name is Required",
|
"a-name-is-required": "名稱必填",
|
||||||
"delete-with-name": "Delete {name}",
|
"delete-with-name": "刪除 {name}",
|
||||||
"confirm-delete-generic-with-name": "Are you sure you want to delete this {name}?",
|
"confirm-delete-generic-with-name": "Are you sure you want to delete this {name}?",
|
||||||
"confirm-delete-own-admin-account": "Please note that you are trying to delete your own admin account! This action cannot be undone and will permanently delete your account?",
|
"confirm-delete-own-admin-account": "Please note that you are trying to delete your own admin account! This action cannot be undone and will permanently delete your account?",
|
||||||
"organizer": "Organizer",
|
"organizer": "Organizer",
|
||||||
"transfer": "Transfer",
|
"transfer": "Transfer",
|
||||||
"copy": "Copy",
|
"copy": "複製",
|
||||||
"color": "Color",
|
"color": "色彩",
|
||||||
"timestamp": "Timestamp",
|
"timestamp": "時間戳",
|
||||||
"last-made": "Last Made",
|
"last-made": "最後製作的",
|
||||||
"learn-more": "Learn More",
|
"learn-more": "學習更多",
|
||||||
"this-feature-is-currently-inactive": "This feature is currently inactive",
|
"this-feature-is-currently-inactive": "該功能目前處於非活動狀態",
|
||||||
"clipboard-not-supported": "Clipboard not supported",
|
"clipboard-not-supported": "Clipboard not supported",
|
||||||
"copied-to-clipboard": "Copied to clipboard",
|
"copied-to-clipboard": "複製到剪貼簿",
|
||||||
"your-browser-does-not-support-clipboard": "Your browser does not support clipboard",
|
"your-browser-does-not-support-clipboard": "Your browser does not support clipboard",
|
||||||
"copied-items-to-clipboard": "No item copied to clipboard|One item copied to clipboard|Copied {count} items to clipboard",
|
"copied-items-to-clipboard": "No item copied to clipboard|One item copied to clipboard|Copied {count} items to clipboard",
|
||||||
"actions": "Actions",
|
"actions": "Actions",
|
||||||
"selected-count": "Selected: {count}",
|
"selected-count": "Selected: {count}",
|
||||||
"export-all": "Export All",
|
"export-all": "Export All",
|
||||||
"refresh": "Refresh",
|
"refresh": "更新",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"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/>?",
|
||||||
@ -221,13 +222,13 @@
|
|||||||
"user-group-created": "用戶群組已建立",
|
"user-group-created": "用戶群組已建立",
|
||||||
"user-group-creation-failed": "用戶群組建立失敗",
|
"user-group-creation-failed": "用戶群組建立失敗",
|
||||||
"settings": {
|
"settings": {
|
||||||
"keep-my-recipes-private": "Keep My Recipes Private",
|
"keep-my-recipes-private": "將我的食譜保密",
|
||||||
"keep-my-recipes-private-description": "Sets your group and all recipes defaults to private. You can always change this later."
|
"keep-my-recipes-private-description": "Sets your group and all recipes defaults to private. You can always change this later."
|
||||||
},
|
},
|
||||||
"manage-members": "Manage Members",
|
"manage-members": "管理成員",
|
||||||
"manage-members-description": "Manage the permissions of the members in your groups. {manage} allows the user to access the data-management page {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.",
|
"manage-members-description": "Manage the permissions of the members in your groups. {manage} allows the user to access the data-management page {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.",
|
||||||
"manage": "Manage",
|
"manage": "Manage",
|
||||||
"invite": "Invite",
|
"invite": "邀請",
|
||||||
"looking-to-update-your-profile": "Looking to Update Your Profile?",
|
"looking-to-update-your-profile": "Looking to Update Your Profile?",
|
||||||
"default-recipe-preferences-description": "These are the default settings when a new recipe is created in your group. These can be changed for individual recipes in the recipe settings menu.",
|
"default-recipe-preferences-description": "These are the default settings when a new recipe is created in your group. These can be changed for individual recipes in the recipe settings menu.",
|
||||||
"default-recipe-preferences": "Default Recipe Preferences",
|
"default-recipe-preferences": "Default Recipe Preferences",
|
||||||
@ -238,7 +239,7 @@
|
|||||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your group or with a pre-generated private link",
|
"allow-users-outside-of-your-group-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your group or with a pre-generated private link",
|
||||||
"show-nutrition-information": "Show nutrition information",
|
"show-nutrition-information": "Show nutrition information",
|
||||||
"show-nutrition-information-description": "When enabled the nutrition information will be shown on the recipe if available. If there is no nutrition information available, the nutrition information will not be shown",
|
"show-nutrition-information-description": "When enabled the nutrition information will be shown on the recipe if available. If there is no nutrition information available, the nutrition information will not be shown",
|
||||||
"show-recipe-assets": "Show recipe assets",
|
"show-recipe-assets": "顯示食譜附件",
|
||||||
"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",
|
||||||
@ -248,7 +249,7 @@
|
|||||||
"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",
|
||||||
"group-recipe-preferences": "Group Recipe Preferences",
|
"group-recipe-preferences": "Group Recipe Preferences",
|
||||||
"report": "Report",
|
"report": "報告",
|
||||||
"report-with-id": "Report ID: {id}",
|
"report-with-id": "Report ID: {id}",
|
||||||
"group-management": "Group Management",
|
"group-management": "Group Management",
|
||||||
"admin-group-management": "Admin Group Management",
|
"admin-group-management": "Admin Group Management",
|
||||||
@ -285,13 +286,13 @@
|
|||||||
"rule-day": "Rule Day",
|
"rule-day": "Rule Day",
|
||||||
"meal-type": "Meal Type",
|
"meal-type": "Meal Type",
|
||||||
"breakfast": "Breakfast",
|
"breakfast": "Breakfast",
|
||||||
"lunch": "Lunch",
|
"lunch": "午餐",
|
||||||
"dinner": "Dinner",
|
"dinner": "晚餐",
|
||||||
"type-any": "Any",
|
"type-any": "Any",
|
||||||
"day-any": "Any",
|
"day-any": "Any",
|
||||||
"editor": "Editor",
|
"editor": "Editor",
|
||||||
"meal-recipe": "Meal Recipe",
|
"meal-recipe": "Meal Recipe",
|
||||||
"meal-title": "Meal Title",
|
"meal-title": "用餐標題",
|
||||||
"meal-note": "Meal Note",
|
"meal-note": "Meal Note",
|
||||||
"note-only": "Note Only",
|
"note-only": "Note Only",
|
||||||
"random-meal": "Random Meal",
|
"random-meal": "Random Meal",
|
||||||
@ -300,7 +301,7 @@
|
|||||||
"this-rule-will-apply": "This rule will apply {dayCriteria} {mealTypeCriteria}.",
|
"this-rule-will-apply": "This rule will apply {dayCriteria} {mealTypeCriteria}.",
|
||||||
"to-all-days": "to all days",
|
"to-all-days": "to all days",
|
||||||
"on-days": "on {0}s",
|
"on-days": "on {0}s",
|
||||||
"for-all-meal-types": "for all meal types",
|
"for-all-meal-types": "適用於所有餐點類型",
|
||||||
"for-type-meal-types": "for {0} meal types",
|
"for-type-meal-types": "for {0} meal types",
|
||||||
"meal-plan-rules": "Meal Plan Rules",
|
"meal-plan-rules": "Meal Plan Rules",
|
||||||
"new-rule": "New Rule",
|
"new-rule": "New Rule",
|
||||||
@ -510,7 +511,7 @@
|
|||||||
"how-did-it-turn-out": "How did it turn out?",
|
"how-did-it-turn-out": "How did it turn out?",
|
||||||
"user-made-this": "{user} made this",
|
"user-made-this": "{user} made this",
|
||||||
"last-made-date": "Last Made {date}",
|
"last-made-date": "Last Made {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 part applications. You can use these keys to contain information to trigger automation 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": "Message Key",
|
||||||
"parse": "Parse",
|
"parse": "Parse",
|
||||||
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
"attach-images-hint": "Attach images by dragging & dropping them into the editor",
|
||||||
@ -532,6 +533,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",
|
||||||
@ -554,7 +557,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": "進階搜尋",
|
||||||
@ -705,7 +709,7 @@
|
|||||||
"general-about": "General About",
|
"general-about": "General About",
|
||||||
"application-version": "Application Version",
|
"application-version": "Application Version",
|
||||||
"application-version-error-text": "Your current version ({0}) does not match the latest release. Considering updating to the latest version ({1}).",
|
"application-version-error-text": "Your current version ({0}) does not match the latest release. Considering updating to the latest version ({1}).",
|
||||||
"mealie-is-up-to-date": "Mealie is up to date",
|
"mealie-is-up-to-date": "Mealie已經更新了",
|
||||||
"secure-site": "Secure Site",
|
"secure-site": "Secure Site",
|
||||||
"secure-site-error-text": "Serve via localhost or secure with https. Clipboard and additional browser APIs may not work.",
|
"secure-site-error-text": "Serve via localhost or secure with https. Clipboard and additional browser APIs may not work.",
|
||||||
"secure-site-success-text": "Site is accessed by localhost or https",
|
"secure-site-success-text": "Site is accessed by localhost or https",
|
||||||
@ -750,7 +754,7 @@
|
|||||||
"all-recipes": "所有食譜",
|
"all-recipes": "所有食譜",
|
||||||
"backups": "Backups",
|
"backups": "Backups",
|
||||||
"categories": "類別",
|
"categories": "類別",
|
||||||
"cookbooks": "Cookbooks",
|
"cookbooks": "食譜",
|
||||||
"dashboard": "控制面板",
|
"dashboard": "控制面板",
|
||||||
"home-page": "首頁",
|
"home-page": "首頁",
|
||||||
"manage-users": "管理使用者",
|
"manage-users": "管理使用者",
|
||||||
@ -765,8 +769,8 @@
|
|||||||
"background-tasks": "Background Tasks",
|
"background-tasks": "Background Tasks",
|
||||||
"parser": "Parser",
|
"parser": "Parser",
|
||||||
"developer": "Developer",
|
"developer": "Developer",
|
||||||
"cookbook": "Cookbook",
|
"cookbook": "食譜",
|
||||||
"create-cookbook": "Create a new cookbook"
|
"create-cookbook": "新建一個食譜合集"
|
||||||
},
|
},
|
||||||
"signup": {
|
"signup": {
|
||||||
"error-signing-up": "註冊失敗",
|
"error-signing-up": "註冊失敗",
|
||||||
@ -788,7 +792,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",
|
"tools": "Tools",
|
||||||
@ -797,7 +802,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": "管理員",
|
||||||
@ -896,7 +902,7 @@
|
|||||||
"language-dialog": {
|
"language-dialog": {
|
||||||
"translated": "translated",
|
"translated": "translated",
|
||||||
"choose-language": "Choose Language",
|
"choose-language": "Choose Language",
|
||||||
"select-description": "Choose the language for the Mealie UI. The setting only applies to you, not other users.",
|
"select-description": "選擇Mealie 使用者介面 的語言。 此設定僅適用於您,不適用於其他使用者。",
|
||||||
"how-to-contribute-description": "Is something not translated yet, mistranslated, or your language missing from the list? {read-the-docs-link} on how to contribute!",
|
"how-to-contribute-description": "Is something not translated yet, mistranslated, or your language missing from the list? {read-the-docs-link} on how to contribute!",
|
||||||
"read-the-docs": "Read the docs"
|
"read-the-docs": "Read the docs"
|
||||||
},
|
},
|
||||||
@ -1048,7 +1054,7 @@
|
|||||||
"split-by-block": "Split by text block",
|
"split-by-block": "Split by text block",
|
||||||
"flatten": "Flatten regardless of original formating",
|
"flatten": "Flatten regardless of original formating",
|
||||||
"help": {
|
"help": {
|
||||||
"help": "Help",
|
"help": "幫助",
|
||||||
"mouse-modes": "Mouse modes",
|
"mouse-modes": "Mouse modes",
|
||||||
"selection-mode": "Selection Mode (default)",
|
"selection-mode": "Selection Mode (default)",
|
||||||
"selection-mode-desc": "The selection mode is the main mode that can be used to enter data:",
|
"selection-mode-desc": "The selection mode is the main mode that can be used to enter data:",
|
||||||
@ -1100,7 +1106,7 @@
|
|||||||
"actions-description-destructive": "destructive",
|
"actions-description-destructive": "destructive",
|
||||||
"actions-description-irreversible": "irreversible",
|
"actions-description-irreversible": "irreversible",
|
||||||
"logs-action-refresh": "Refresh Logs",
|
"logs-action-refresh": "Refresh Logs",
|
||||||
"logs-page-title": "Mealie Logs",
|
"logs-page-title": "Mealie紀錄",
|
||||||
"logs-tail-lines-label": "Tail Lines"
|
"logs-tail-lines-label": "Tail Lines"
|
||||||
},
|
},
|
||||||
"mainentance": {
|
"mainentance": {
|
||||||
@ -1159,14 +1165,14 @@
|
|||||||
"looking-for-privacy-settings": "Looking for Privacy Settings?",
|
"looking-for-privacy-settings": "Looking for Privacy Settings?",
|
||||||
"manage-your-api-tokens": "Manage Your API Tokens",
|
"manage-your-api-tokens": "Manage Your API Tokens",
|
||||||
"manage-user-profile": "Manage User Profile",
|
"manage-user-profile": "Manage User Profile",
|
||||||
"manage-cookbooks": "Manage Cookbooks",
|
"manage-cookbooks": "管理食譜",
|
||||||
"manage-members": "Manage Members",
|
"manage-members": "Manage Members",
|
||||||
"manage-webhooks": "Manage Webhooks",
|
"manage-webhooks": "Manage Webhooks",
|
||||||
"manage-notifiers": "Manage Notifiers",
|
"manage-notifiers": "Manage Notifiers",
|
||||||
"manage-data-migrations": "Manage Data Migrations"
|
"manage-data-migrations": "Manage Data Migrations"
|
||||||
},
|
},
|
||||||
"cookbook": {
|
"cookbook": {
|
||||||
"cookbooks": "Cookbooks",
|
"cookbooks": "食譜",
|
||||||
"description": "Cookbooks are another way to organize recipes by creating cross sections of recipes and tags. Creating a cookbook will add an entry to the side-bar and all the recipes with the tags and categories chosen will be displayed in the cookbook.",
|
"description": "Cookbooks are another way to organize recipes by creating cross sections of recipes and tags. Creating a cookbook will add an entry to the side-bar and all the recipes with the tags and categories chosen will be displayed in the cookbook.",
|
||||||
"public-cookbook": "Public Cookbook",
|
"public-cookbook": "Public Cookbook",
|
||||||
"public-cookbook-description": "Public Cookbooks can be shared with non-mealie users and will be displayed on your groups page.",
|
"public-cookbook-description": "Public Cookbooks can be shared with non-mealie users and will be displayed on your groups page.",
|
||||||
@ -1175,7 +1181,7 @@
|
|||||||
"require-all-categories": "Require All Categories",
|
"require-all-categories": "Require All Categories",
|
||||||
"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-with-name": "Cookbook {0}"
|
"cookbook-with-name": "食譜 {0}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ import { SidebarLinks } from "~/types/application-types";
|
|||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
components: { AppHeader, AppSidebar, TheSnackbar },
|
components: { AppHeader, AppSidebar, TheSnackbar },
|
||||||
middleware: "auth",
|
middleware: ["auth", "admin-only"],
|
||||||
auth: true,
|
auth: true,
|
||||||
setup() {
|
setup() {
|
||||||
const { $globals, i18n, $vuetify } = useContext();
|
const { $globals, i18n, $vuetify } = useContext();
|
||||||
|
@ -4,9 +4,7 @@
|
|||||||
|
|
||||||
<v-banner v-if="isDemo" sticky>
|
<v-banner v-if="isDemo" sticky>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<b> {{ $t("demo.info_message_with_version", { version: version }) }} </b> |
|
<b> {{ $t("demo.info_message_with_version", { version: version }) }} </b>
|
||||||
{{ $t("demo.demo_username", { username: "changeme@example.com" }) }} |
|
|
||||||
{{ $t("demo.demo_password", { password: "demo" }) }}
|
|
||||||
</div>
|
</div>
|
||||||
</v-banner>
|
</v-banner>
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { BaseAPI } from "../base/base-clients";
|
import { BaseAPI } from "../base/base-clients";
|
||||||
import { AdminAboutInfo, DockerVolumeText, CheckAppConfig } from "~/lib/api/types/admin";
|
import { AdminAboutInfo, CheckAppConfig } from "~/lib/api/types/admin";
|
||||||
|
|
||||||
const prefix = "/api";
|
const prefix = "/api";
|
||||||
|
|
||||||
@ -24,10 +24,6 @@ export class AdminAboutAPI extends BaseAPI {
|
|||||||
return await this.requests.get<CheckAppConfig>(routes.check);
|
return await this.requests.get<CheckAppConfig>(routes.check);
|
||||||
}
|
}
|
||||||
|
|
||||||
async checkDocker() {
|
|
||||||
return await this.requests.get<DockerVolumeText>(routes.docker);
|
|
||||||
}
|
|
||||||
|
|
||||||
async getDockerValidateFileContents() {
|
async getDockerValidateFileContents() {
|
||||||
return await this.requests.get<string>(routes.validationFile);
|
return await this.requests.get<string>(routes.validationFile);
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,6 @@ import { MultiPurposeLabelsApi } from "./user/group-multiple-purpose-labels";
|
|||||||
import { GroupEventNotifierApi } from "./user/group-event-notifier";
|
import { GroupEventNotifierApi } from "./user/group-event-notifier";
|
||||||
import { MealPlanRulesApi } from "./user/group-mealplan-rules";
|
import { MealPlanRulesApi } from "./user/group-mealplan-rules";
|
||||||
import { GroupDataSeederApi } from "./user/group-seeder";
|
import { GroupDataSeederApi } from "./user/group-seeder";
|
||||||
import { OcrAPI } from "./user/ocr";
|
|
||||||
import { ApiRequestInstance } from "~/lib/api/types/non-generated";
|
import { ApiRequestInstance } from "~/lib/api/types/non-generated";
|
||||||
|
|
||||||
export class UserApiClient {
|
export class UserApiClient {
|
||||||
@ -52,7 +51,6 @@ export class UserApiClient {
|
|||||||
public groupEventNotifier: GroupEventNotifierApi;
|
public groupEventNotifier: GroupEventNotifierApi;
|
||||||
public upload: UploadFile;
|
public upload: UploadFile;
|
||||||
public seeders: GroupDataSeederApi;
|
public seeders: GroupDataSeederApi;
|
||||||
public ocr: OcrAPI;
|
|
||||||
|
|
||||||
constructor(requests: ApiRequestInstance) {
|
constructor(requests: ApiRequestInstance) {
|
||||||
// Recipes
|
// Recipes
|
||||||
@ -91,9 +89,6 @@ export class UserApiClient {
|
|||||||
this.bulk = new BulkActionsAPI(requests);
|
this.bulk = new BulkActionsAPI(requests);
|
||||||
this.groupEventNotifier = new GroupEventNotifierApi(requests);
|
this.groupEventNotifier = new GroupEventNotifierApi(requests);
|
||||||
|
|
||||||
// ocr
|
|
||||||
this.ocr = new OcrAPI(requests);
|
|
||||||
|
|
||||||
Object.freeze(this);
|
Object.freeze(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -151,9 +151,6 @@ export interface CustomPageOut {
|
|||||||
categories?: RecipeCategoryResponse[];
|
categories?: RecipeCategoryResponse[];
|
||||||
id: number;
|
id: number;
|
||||||
}
|
}
|
||||||
export interface DockerVolumeText {
|
|
||||||
text: string;
|
|
||||||
}
|
|
||||||
export interface EmailReady {
|
export interface EmailReady {
|
||||||
ready: boolean;
|
ready: boolean;
|
||||||
}
|
}
|
||||||
|
@ -1,25 +0,0 @@
|
|||||||
/* tslint:disable */
|
|
||||||
/* eslint-disable */
|
|
||||||
/**
|
|
||||||
/* This file was automatically generated from pydantic models by running pydantic2ts.
|
|
||||||
/* Do not modify it by hand - just update the pydantic models and then re-run the script
|
|
||||||
*/
|
|
||||||
|
|
||||||
export interface OcrAssetReq {
|
|
||||||
recipeSlug: string;
|
|
||||||
assetName: string;
|
|
||||||
}
|
|
||||||
export interface OcrTsvResponse {
|
|
||||||
level?: number;
|
|
||||||
pageNum?: number;
|
|
||||||
blockNum?: number;
|
|
||||||
parNum?: number;
|
|
||||||
lineNum?: number;
|
|
||||||
wordNum?: number;
|
|
||||||
left?: number;
|
|
||||||
top?: number;
|
|
||||||
width?: number;
|
|
||||||
height?: number;
|
|
||||||
conf?: number;
|
|
||||||
text?: string;
|
|
||||||
}
|
|
@ -244,7 +244,6 @@ export interface Recipe {
|
|||||||
extras?: {
|
extras?: {
|
||||||
[k: string]: unknown;
|
[k: string]: unknown;
|
||||||
};
|
};
|
||||||
isOcrRecipe?: boolean;
|
|
||||||
comments?: RecipeCommentOut[];
|
comments?: RecipeCommentOut[];
|
||||||
}
|
}
|
||||||
export interface RecipeTool {
|
export interface RecipeTool {
|
||||||
|
@ -1,16 +0,0 @@
|
|||||||
import { BaseAPI } from "../base/base-clients";
|
|
||||||
|
|
||||||
const prefix = "/api";
|
|
||||||
|
|
||||||
export class OcrAPI extends BaseAPI {
|
|
||||||
// Currently unused in favor for the endpoint using asset names
|
|
||||||
async fileToTsv(file: File) {
|
|
||||||
const formData = new FormData();
|
|
||||||
formData.append("file", file);
|
|
||||||
return await this.requests.post(`${prefix}/ocr/file-to-tsv`, formData);
|
|
||||||
}
|
|
||||||
|
|
||||||
async assetToTsv(recipeSlug: string, assetName: string) {
|
|
||||||
return await this.requests.post(`${prefix}/ocr/asset-to-tsv`, { recipeSlug, assetName });
|
|
||||||
}
|
|
||||||
}
|
|
@ -38,7 +38,6 @@ const routes = {
|
|||||||
recipesCategory: `${prefix}/recipes/category`,
|
recipesCategory: `${prefix}/recipes/category`,
|
||||||
recipesParseIngredient: `${prefix}/parser/ingredient`,
|
recipesParseIngredient: `${prefix}/parser/ingredient`,
|
||||||
recipesParseIngredients: `${prefix}/parser/ingredients`,
|
recipesParseIngredients: `${prefix}/parser/ingredients`,
|
||||||
recipesCreateFromOcr: `${prefix}/recipes/create-ocr`,
|
|
||||||
recipesTimelineEvent: `${prefix}/recipes/timeline/events`,
|
recipesTimelineEvent: `${prefix}/recipes/timeline/events`,
|
||||||
|
|
||||||
recipesRecipeSlug: (recipe_slug: string) => `${prefix}/recipes/${recipe_slug}`,
|
recipesRecipeSlug: (recipe_slug: string) => `${prefix}/recipes/${recipe_slug}`,
|
||||||
@ -159,15 +158,6 @@ export class RecipeAPI extends BaseCRUDAPI<CreateRecipe, Recipe, Recipe> {
|
|||||||
return `${routes.recipesRecipeSlugExportZip(recipeSlug)}?token=${token}`;
|
return `${routes.recipesRecipeSlugExportZip(recipeSlug)}?token=${token}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
async createFromOcr(file: File, makeFileRecipeImage: boolean) {
|
|
||||||
const formData = new FormData();
|
|
||||||
formData.append("file", file);
|
|
||||||
formData.append("extension", file.name.split(".").pop() ?? "");
|
|
||||||
formData.append("makefilerecipeimage", String(makeFileRecipeImage));
|
|
||||||
|
|
||||||
return await this.requests.post(routes.recipesCreateFromOcr, formData);
|
|
||||||
}
|
|
||||||
|
|
||||||
async updateLastMade(recipeSlug: string, timestamp: string) {
|
async updateLastMade(recipeSlug: string, timestamp: string) {
|
||||||
return await this.requests.patch<Recipe, RecipeLastMade>(routes.recipesSlugLastMade(recipeSlug), { timestamp })
|
return await this.requests.patch<Recipe, RecipeLastMade>(routes.recipesSlugLastMade(recipeSlug), { timestamp })
|
||||||
}
|
}
|
||||||
|
10
frontend/middleware/admin-only.ts
Normal file
10
frontend/middleware/admin-only.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
interface AuthRedirectParams {
|
||||||
|
$auth: any
|
||||||
|
redirect: (path: string) => void
|
||||||
|
}
|
||||||
|
export default function ({ $auth, redirect }: AuthRedirectParams) {
|
||||||
|
// If the user is not an admin redirect to the home page
|
||||||
|
if (!$auth.user.admin) {
|
||||||
|
return redirect("/")
|
||||||
|
}
|
||||||
|
}
|
@ -16,7 +16,7 @@ export default {
|
|||||||
hid: "og:image",
|
hid: "og:image",
|
||||||
property: "og:image",
|
property: "og:image",
|
||||||
content:
|
content:
|
||||||
"https://raw.githubusercontent.com/hay-kot/mealie/dev/frontend/public/img/icons/android-chrome-512x512.png",
|
"https://raw.githubusercontent.com/mealie-recipes/mealie/9571816ac4eed5beacfc0abf6c03eff1427fd0eb/frontend/static/icons/android-chrome-512x512.png",
|
||||||
},
|
},
|
||||||
{ charset: "utf-8" },
|
{ charset: "utf-8" },
|
||||||
{ name: "viewport", content: "width=device-width, initial-scale=1" },
|
{ name: "viewport", content: "width=device-width, initial-scale=1" },
|
||||||
@ -195,6 +195,7 @@ export default {
|
|||||||
{ code: "fr-FR", file: "fr-FR.json" },
|
{ code: "fr-FR", file: "fr-FR.json" },
|
||||||
{ code: "zh-TW", file: "zh-TW.json" },
|
{ code: "zh-TW", file: "zh-TW.json" },
|
||||||
{ code: "af-ZA", file: "af-ZA.json" },
|
{ code: "af-ZA", file: "af-ZA.json" },
|
||||||
|
{ code: "is-IS", file: "is-IS.json" },
|
||||||
{ code: "sl-SI", file: "sl-SI.json" },
|
{ code: "sl-SI", file: "sl-SI.json" },
|
||||||
{ code: "ru-RU", file: "ru-RU.json" },
|
{ code: "ru-RU", file: "ru-RU.json" },
|
||||||
{ code: "he-IL", file: "he-IL.json" },
|
{ code: "he-IL", file: "he-IL.json" },
|
||||||
|
@ -147,7 +147,7 @@ export default defineComponent({
|
|||||||
async function createBackup() {
|
async function createBackup() {
|
||||||
const { data } = await adminApi.backups.create();
|
const { data } = await adminApi.backups.create();
|
||||||
|
|
||||||
if (!data?.error) {
|
if (data?.error === false) {
|
||||||
refreshBackups();
|
refreshBackups();
|
||||||
alert.success(i18n.tc("settings.backup.backup-created"));
|
alert.success(i18n.tc("settings.backup.backup-created"));
|
||||||
} else {
|
} else {
|
||||||
|
@ -58,10 +58,10 @@
|
|||||||
:title="$tc('admin.mainentance.actions-title')"
|
:title="$tc('admin.mainentance.actions-title')"
|
||||||
>
|
>
|
||||||
<i18n path="admin.maintenance.actions-description">
|
<i18n path="admin.maintenance.actions-description">
|
||||||
<template #destructive-in-bold>
|
<template #destructive_in_bold>
|
||||||
<b>{{ $t("admin.maintenance.actions-description-destructive") }}</b>
|
<b>{{ $t("admin.maintenance.actions-description-destructive") }}</b>
|
||||||
</template>
|
</template>
|
||||||
<template #irreversible-in-bold>
|
<template #irreversible_in_bold>
|
||||||
<b>{{ $t("admin.maintenance.actions-description-irreversible") }}</b>
|
<b>{{ $t("admin.maintenance.actions-description-irreversible") }}</b>
|
||||||
</template>
|
</template>
|
||||||
</i18n>
|
</i18n>
|
||||||
|
@ -1,51 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div>
|
|
||||||
<RecipeOcrEditorPage v-if="recipe" :recipe="recipe" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
import { defineComponent, useRoute } from "@nuxtjs/composition-api";
|
|
||||||
import RecipeOcrEditorPage from "~/components/Domain/Recipe/RecipeOcrEditorPage/RecipeOcrEditorPage.vue";
|
|
||||||
import { useRecipe } from "~/composables/recipes";
|
|
||||||
|
|
||||||
export default defineComponent({
|
|
||||||
components: { RecipeOcrEditorPage },
|
|
||||||
setup() {
|
|
||||||
const route = useRoute();
|
|
||||||
const slug = route.value.params.slug;
|
|
||||||
|
|
||||||
const { recipe, loading } = useRecipe(slug);
|
|
||||||
|
|
||||||
return {
|
|
||||||
recipe,
|
|
||||||
loading,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="css">
|
|
||||||
.ghost {
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
background: #eee;
|
|
||||||
}
|
|
||||||
|
|
||||||
canvas {
|
|
||||||
background: white;
|
|
||||||
box-shadow: 0px 2px 3px rgba(0, 0, 0, 0.2);
|
|
||||||
width: 100%;
|
|
||||||
image-rendering: optimizeQuality;
|
|
||||||
}
|
|
||||||
|
|
||||||
.box {
|
|
||||||
position: absolute;
|
|
||||||
border: 2px #90ee90 solid;
|
|
||||||
background-color: #90ee90;
|
|
||||||
|
|
||||||
z-index: 3;
|
|
||||||
}
|
|
||||||
</style>
|
|
@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
<AdvancedOnly>
|
<AdvancedOnly>
|
||||||
<v-container class="d-flex justify-center align-center my-4">
|
<v-container class="d-flex justify-center align-center my-4">
|
||||||
<a :to="`/group/migrations`"> {{ $t('recipe.looking-for-migrations') }}</a>
|
<router-link :to="`/group/migrations`"> {{ $t('recipe.looking-for-migrations') }}</router-link>
|
||||||
</v-container>
|
</v-container>
|
||||||
</AdvancedOnly>
|
</AdvancedOnly>
|
||||||
</div>
|
</div>
|
||||||
@ -42,6 +42,11 @@ export default defineComponent({
|
|||||||
text: i18n.tc("recipe.import-with-url"),
|
text: i18n.tc("recipe.import-with-url"),
|
||||||
value: "url",
|
value: "url",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
icon: $globals.icons.link,
|
||||||
|
text: i18n.tc("recipe.bulk-url-import"),
|
||||||
|
value: "bulk",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
icon: $globals.icons.edit,
|
icon: $globals.icons.edit,
|
||||||
text: i18n.tc("recipe.create-recipe"),
|
text: i18n.tc("recipe.create-recipe"),
|
||||||
@ -52,16 +57,6 @@ export default defineComponent({
|
|||||||
text: i18n.tc("recipe.import-with-zip"),
|
text: i18n.tc("recipe.import-with-zip"),
|
||||||
value: "zip",
|
value: "zip",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
icon: $globals.icons.fileImage,
|
|
||||||
text: i18n.tc("recipe.create-recipe-from-an-image"),
|
|
||||||
value: "ocr",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
icon: $globals.icons.link,
|
|
||||||
text: i18n.tc("recipe.bulk-url-import"),
|
|
||||||
value: "bulk",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
icon: $globals.icons.robot,
|
icon: $globals.icons.robot,
|
||||||
text: i18n.tc("recipe.debug-scraper"),
|
text: i18n.tc("recipe.debug-scraper"),
|
||||||
|
@ -1,85 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div>
|
|
||||||
<v-card-title class="headline"> {{ $t('recipe.create-recipe-from-an-image') }} </v-card-title>
|
|
||||||
<v-card-text>
|
|
||||||
{{ $t('recipe.create-a-recipe-by-uploading-a-scan') }}
|
|
||||||
<v-form ref="domCreateByOcr"> </v-form>
|
|
||||||
</v-card-text>
|
|
||||||
<v-card-actions class="justify-center">
|
|
||||||
<v-file-input
|
|
||||||
v-model="imageUpload"
|
|
||||||
accept=".png"
|
|
||||||
label="recipe.png"
|
|
||||||
filled
|
|
||||||
clearable
|
|
||||||
class="rounded-lg mt-2"
|
|
||||||
rounded
|
|
||||||
truncate-length="100"
|
|
||||||
:hint="$t('recipe.upload-a-png-image-from-a-recipe-book')"
|
|
||||||
persistent-hint
|
|
||||||
prepend-icon=""
|
|
||||||
:prepend-inner-icon="$globals.icons.fileImage"
|
|
||||||
/>
|
|
||||||
</v-card-actions>
|
|
||||||
<v-card-actions class="justify-center">
|
|
||||||
<v-checkbox v-model="makeFileRecipeImage" :label="$t('new-recipe.make-recipe-image')" />
|
|
||||||
</v-card-actions>
|
|
||||||
<v-card-actions class="justify-center">
|
|
||||||
<div style="width: 250px">
|
|
||||||
<BaseButton :disabled="imageUpload === null" large rounded block :loading="loading" @click="createByOcr" />
|
|
||||||
</div>
|
|
||||||
</v-card-actions>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<script lang="ts">
|
|
||||||
import { defineComponent, reactive, toRefs, ref, useRouter, computed, useContext, useRoute } from "@nuxtjs/composition-api";
|
|
||||||
import { AxiosResponse } from "axios";
|
|
||||||
import { useUserApi } from "~/composables/api";
|
|
||||||
import { validators } from "~/composables/use-validators";
|
|
||||||
import { VForm } from "~/types/vuetify";
|
|
||||||
|
|
||||||
export default defineComponent({
|
|
||||||
setup() {
|
|
||||||
const state = reactive({
|
|
||||||
error: false,
|
|
||||||
loading: false,
|
|
||||||
makeFileRecipeImage: false,
|
|
||||||
});
|
|
||||||
const { $auth } = useContext();
|
|
||||||
const route = useRoute();
|
|
||||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
|
||||||
|
|
||||||
const api = useUserApi();
|
|
||||||
const router = useRouter();
|
|
||||||
|
|
||||||
const imageUpload = ref<File | null>(null);
|
|
||||||
|
|
||||||
function handleResponse(response: AxiosResponse<string> | null) {
|
|
||||||
if (response?.status !== 201) {
|
|
||||||
state.error = true;
|
|
||||||
state.loading = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
router.push(`/g/${groupSlug.value}/r/${response.data}/ocr-editor`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const domCreateByOcr = ref<VForm | null>(null);
|
|
||||||
|
|
||||||
async function createByOcr() {
|
|
||||||
if (imageUpload.value === null) return; // Should never be true due to circumstances
|
|
||||||
state.loading = true;
|
|
||||||
const { response } = await api.recipes.createFromOcr(imageUpload.value, state.makeFileRecipeImage);
|
|
||||||
// @ts-ignore returns a string and not a full Recipe
|
|
||||||
handleResponse(response);
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
domCreateByOcr,
|
|
||||||
createByOcr,
|
|
||||||
...toRefs(state),
|
|
||||||
validators,
|
|
||||||
imageUpload,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
</script>
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user