Compare commits
133 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0d06494bbf | ||
|
|
9c04950948 | ||
|
|
34c37a2bee | ||
|
|
2cd1e0ad37 | ||
|
|
828afe6674 | ||
|
|
6a705b7352 | ||
|
|
3fa931466e | ||
|
|
4ba8269ff1 | ||
|
|
581310b57d | ||
|
|
ace18ab4aa | ||
|
|
abae973454 | ||
|
|
08bc29ca8a | ||
|
|
9d7ef1837b | ||
|
|
8a15f400e1 | ||
|
|
3d921cb677 | ||
|
|
f0e065efa4 | ||
|
|
d06589b31b | ||
|
|
3405bc4eb6 | ||
|
|
a75eb07a47 | ||
|
|
432914e310 | ||
|
|
65ece35966 | ||
|
|
f11af52d30 | ||
|
|
b4da5c3d5a | ||
|
|
a4e416cabc | ||
|
|
26173704aa | ||
|
|
5876c1ecf7 | ||
|
|
c4a339ed36 | ||
|
|
2967eca819 | ||
|
|
66b19eecfb | ||
|
|
37d93d4e4b | ||
|
|
656d46e9cb | ||
|
|
169d659b72 | ||
|
|
f92a9afbe5 | ||
|
|
d53f81cdfb | ||
|
|
bd4f858ba7 | ||
|
|
ce3a95f38a | ||
|
|
e3ffa03ffd | ||
|
|
79910deb8a | ||
|
|
e0c532ab94 | ||
|
|
73c09ab138 | ||
|
|
7edf0ee3cc | ||
|
|
48381fe897 | ||
|
|
e68300037c | ||
|
|
c643f24a72 | ||
|
|
7820ddc8f7 | ||
|
|
ca3cb2447c | ||
|
|
a55fdb634d | ||
|
|
8b0c607712 | ||
|
|
8c990a5dd2 | ||
|
|
abf5cf0116 | ||
|
|
84069bf9df | ||
|
|
059e5b7ea2 | ||
|
|
3677d04b56 | ||
|
|
05c034fca2 | ||
|
|
17d1cd26dc | ||
|
|
c9bbae6f77 | ||
|
|
a41ad8c6ed | ||
|
|
9c38c89c44 | ||
|
|
998440d064 | ||
|
|
b01d12c377 | ||
|
|
1dee574a08 | ||
|
|
257c4461a3 | ||
|
|
01f4257190 | ||
|
|
d7b7dd6c83 | ||
|
|
23c2eab682 | ||
|
|
def346d16d | ||
|
|
cc324b29ae | ||
|
|
9d58f9b266 | ||
|
|
30b2776f3c | ||
|
|
60d23d0686 | ||
|
|
edf649dea6 | ||
|
|
29b4a3cd22 | ||
|
|
f3a5148628 | ||
|
|
33abd777e0 | ||
|
|
739055caf6 | ||
|
|
8c29bd3439 | ||
|
|
2c4d0b692b | ||
|
|
946b79b77a | ||
|
|
cd154d09b2 | ||
|
|
236c930b54 | ||
|
|
980c847e36 | ||
|
|
91700771e6 | ||
|
|
abb6ad5fd0 | ||
|
|
ac7af02f77 | ||
|
|
525b398687 | ||
|
|
fafc836ccc | ||
|
|
c617b829e5 | ||
|
|
5b1e827d45 | ||
|
|
e33b62be2a | ||
|
|
60c33b499c | ||
|
|
c205dff523 | ||
|
|
ce69899c4b | ||
|
|
a4183e3453 | ||
|
|
ab39408a24 | ||
|
|
8c6c98483c | ||
|
|
ae095ab572 | ||
|
|
65356bc21a | ||
|
|
3aed5de3fc | ||
|
|
a4e9e54dae | ||
|
|
8f698e437e | ||
|
|
ab0d36825a | ||
|
|
4e2f6c57f1 | ||
|
|
de4cb8ba83 | ||
|
|
375f43c596 | ||
|
|
3034945e7e | ||
|
|
8e5effa532 | ||
|
|
3b81d3b18a | ||
|
|
d0f8b5773d | ||
|
|
14910162dc | ||
|
|
035f780d27 | ||
|
|
f10161ee92 | ||
|
|
b1a100a8c5 | ||
|
|
7db39d32d1 | ||
|
|
10921f9a64 | ||
|
|
ba1c44172e | ||
|
|
fd2dc15a15 | ||
|
|
47124488bb | ||
|
|
6e680c972a | ||
|
|
1fd2eb37ae | ||
|
|
923a59791a | ||
|
|
1fcc2c755a | ||
|
|
d5f7a883df | ||
|
|
17f9eef551 | ||
|
|
ca1ab33291 | ||
|
|
6e6ae80c46 | ||
|
|
aa6e109162 | ||
|
|
a6e4b778c1 | ||
|
|
31c7cb7906 | ||
|
|
d954b5cf48 | ||
|
|
e5c2f5570f | ||
|
|
e344f3f1e6 | ||
|
|
6a7f0edbc6 | ||
|
|
d2fd4e0843 |
@@ -38,3 +38,6 @@ RUN apt-get update \
|
||||
libwebp-dev \
|
||||
libsasl2-dev libldap2-dev libssl-dev \
|
||||
gnupg gnupg2 gnupg1
|
||||
|
||||
# create directory used for Docker Secrets
|
||||
RUN mkdir -p /run/secrets
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
"python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf",
|
||||
},
|
||||
"extensions": [
|
||||
"charliermarsh.ruff",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"matangover.mypy",
|
||||
"ms-python.black-formatter",
|
||||
|
||||
9
.github/workflows/release.yml
vendored
@@ -61,10 +61,15 @@ jobs:
|
||||
- name: Checkout 🛎
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Extract Version From Tag Name
|
||||
run: echo "VERSION_NUM=$(echo ${{ github.event.release.tag_name }} | sed 's/^v//')" >> $GITHUB_ENV
|
||||
|
||||
- name: Modify version strings
|
||||
run: |
|
||||
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:${{ github.event.release.tag_name }}/' docs/docs/documentation/getting-started/installation/sqlite.md
|
||||
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:${{ github.event.release.tag_name }}/' docs/docs/documentation/getting-started/installation/postgres.md
|
||||
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:v${{ env.VERSION_NUM }}/' docs/docs/documentation/getting-started/installation/sqlite.md
|
||||
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:v${{ env.VERSION_NUM }}/' docs/docs/documentation/getting-started/installation/postgres.md
|
||||
sed -i 's/^version = "[^"]*"/version = "${{ env.VERSION_NUM }}"/' pyproject.toml
|
||||
sed -i 's/^\s*"version": "[^"]*"/"version": "${{ env.VERSION_NUM }}"/' frontend/package.json
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
|
||||
32
.github/workflows/scheduled-checks.yml
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
name: Scheduled Checks
|
||||
|
||||
on:
|
||||
schedule:
|
||||
# Every monday at 7 AM
|
||||
- cron: 0 7 * * 1
|
||||
|
||||
jobs:
|
||||
update:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- name: Checkout 🛎
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Update pre-commit Hooks
|
||||
uses: vrslev/pre-commit-autoupdate@v1.0.0
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
# This doesn't currently work for us because it creates the PR but the workflows don't run.
|
||||
# TODO: Provide a personal access token as a parameter here, that solves that problem.
|
||||
# https://github.com/peter-evans/create-pull-request
|
||||
with:
|
||||
commit-message: "Update pre-commit hooks"
|
||||
branch: "fix/update-pre-commit-hooks"
|
||||
delete-branch: true
|
||||
base: mealie-next
|
||||
title: "fix(auto): Update pre-commit hooks"
|
||||
body: "Auto-generated by `.github/workflows/scheduled-checks.yml`"
|
||||
@@ -12,6 +12,7 @@ repos:
|
||||
exclude: ^tests/data/
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
# Ruff version.
|
||||
rev: v0.5.0
|
||||
rev: v0.6.1
|
||||
hooks:
|
||||
- id: ruff
|
||||
- id: ruff-format
|
||||
|
||||
@@ -148,7 +148,7 @@ tasks:
|
||||
- poetry run python mealie/app.py
|
||||
|
||||
py:migrate:
|
||||
desc: generates a new database migration file e.g. task py:migrate "add new column"
|
||||
desc: generates a new database migration file e.g. task py:migrate -- "add new column"
|
||||
cmds:
|
||||
- poetry run alembic revision --autogenerate -m "{{ .CLI_ARGS }}"
|
||||
- task: py:format
|
||||
|
||||
@@ -6,9 +6,6 @@ Create Date: 2023-02-10 21:18:32.405130
|
||||
|
||||
"""
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
import mealie.db.migration_types
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
|
||||
@@ -11,9 +11,8 @@ from sqlalchemy import orm, select
|
||||
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
|
||||
from text_unidecode import unidecode
|
||||
|
||||
import mealie.db.migration_types
|
||||
from alembic import op
|
||||
from mealie.db.models._model_utils import GUID
|
||||
from mealie.db.models._model_utils.guid import GUID
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = "5ab195a474eb"
|
||||
|
||||
@@ -8,7 +8,6 @@ Create Date: 2023-02-22 21:45:52.900964
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
import mealie.db.migration_types
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
|
||||
@@ -6,12 +6,7 @@ Create Date: 2023-04-13 06:47:04.617131
|
||||
|
||||
"""
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
import mealie.db.migration_types
|
||||
from alembic import op
|
||||
import alembic.context as context
|
||||
from mealie.core.config import get_app_settings
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = "b3dbb554ba53"
|
||||
|
||||
@@ -66,7 +66,7 @@ def populate_shopping_list_users():
|
||||
user_id = find_user_id_for_group(group_id)
|
||||
if user_id:
|
||||
session.execute(
|
||||
sa.text(f"UPDATE shopping_lists SET user_id=:user_id WHERE id=:id").bindparams(
|
||||
sa.text("UPDATE shopping_lists SET user_id=:user_id WHERE id=:id").bindparams(
|
||||
user_id=user_id, id=list_id
|
||||
)
|
||||
)
|
||||
@@ -74,7 +74,7 @@ def populate_shopping_list_users():
|
||||
logger.warning(
|
||||
f"No user found for shopping list {list_id} with group {group_id}; deleting shopping list"
|
||||
)
|
||||
session.execute(sa.text(f"DELETE FROM shopping_lists WHERE id=:id").bindparams(id=list_id))
|
||||
session.execute(sa.text("DELETE FROM shopping_lists WHERE id=:id").bindparams(id=list_id))
|
||||
|
||||
|
||||
def upgrade():
|
||||
|
||||
@@ -6,9 +6,6 @@ Create Date: 2024-03-10 05:08:32.397027
|
||||
|
||||
"""
|
||||
|
||||
import sqlalchemy as sa
|
||||
|
||||
import mealie.db.migration_types
|
||||
from alembic import op
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
|
||||
@@ -6,7 +6,7 @@ Create Date: 2024-03-18 02:28:15.896959
|
||||
|
||||
"""
|
||||
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
from textwrap import dedent
|
||||
from typing import Any
|
||||
from uuid import uuid4
|
||||
@@ -32,9 +32,9 @@ def new_user_rating(user_id: Any, recipe_id: Any, rating: float | None = None, i
|
||||
if is_postgres():
|
||||
id = str(uuid4())
|
||||
else:
|
||||
id = "%.32x" % uuid4().int
|
||||
id = "%.32x" % uuid4().int # noqa: UP031
|
||||
|
||||
now = datetime.now().isoformat()
|
||||
now = datetime.now(timezone.utc).isoformat()
|
||||
return {
|
||||
"id": id,
|
||||
"user_id": user_id,
|
||||
|
||||
@@ -4,7 +4,7 @@ from pathlib import Path
|
||||
from fastapi import FastAPI
|
||||
from jinja2 import Template
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
from utils import PROJECT_DIR, CodeTemplates, HTTPRequest, RouteObject, RequestType
|
||||
from utils import PROJECT_DIR, CodeTemplates, HTTPRequest, RouteObject
|
||||
|
||||
CWD = Path(__file__).parent
|
||||
|
||||
@@ -17,9 +17,16 @@ class PathObject(BaseModel):
|
||||
http_verbs: list[HTTPRequest]
|
||||
|
||||
|
||||
def get_path_objects(app: FastAPI):
|
||||
paths = []
|
||||
def force_include_in_schema(app: FastAPI):
|
||||
# clear schema cache
|
||||
app.openapi_schema = None
|
||||
for route in app.routes:
|
||||
route.include_in_schema = True
|
||||
|
||||
|
||||
def get_path_objects(app: FastAPI):
|
||||
force_include_in_schema(app)
|
||||
paths = []
|
||||
for key, value in app.openapi().items():
|
||||
if key == "paths":
|
||||
for key, value2 in value.items():
|
||||
|
||||
@@ -35,6 +35,7 @@ LOCALE_DATA: dict[str, LocaleData] = {
|
||||
"es-ES": LocaleData(name="Español (Spanish)"),
|
||||
"fi-FI": LocaleData(name="Suomi (Finnish)"),
|
||||
"fr-FR": LocaleData(name="Français (French)"),
|
||||
"fr-BE": LocaleData(name="Belge (Belgian)"),
|
||||
"gl-ES": LocaleData(name="Galego (Galician)"),
|
||||
"he-IL": LocaleData(name="עברית (Hebrew)", dir="rtl"),
|
||||
"hr-HR": LocaleData(name="Hrvatski (Croatian)"),
|
||||
|
||||
@@ -92,6 +92,9 @@ RUN apt-get update \
|
||||
libldap-2.5 \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# create directory used for Docker Secrets
|
||||
RUN mkdir -p /run/secrets
|
||||
|
||||
# copying poetry and venv into image
|
||||
COPY --from=builder-base $POETRY_HOME $POETRY_HOME
|
||||
COPY --from=builder-base $PYSETUP_PATH $PYSETUP_PATH
|
||||
|
||||
@@ -9,7 +9,7 @@ How exactly you need to modify it is of course highly contextual to the change y
|
||||
|
||||
## Using Alembic to generate upgrade script
|
||||
|
||||
In your dev container you can run something like (change the message) `task py:migrate "Add creation tag to group preferences"` to have Alembic generate an upgrade script for you.
|
||||
In your dev container you can run something like (change the message) `task py:migrate -- "Add creation tag to group preferences"` to have Alembic generate an upgrade script for you.
|
||||
|
||||
The script Alembic generates, will be limited! (Perhaps there's a way to resolve that? Haven't looked into it yet)
|
||||
For example, Alembic generated a script _similar_ to this (it has been modified already to have accurate foreign key names, for instance):
|
||||
|
||||
@@ -18,7 +18,7 @@ Create an API token from Mealie's User Settings page (https://hay-kot.github.io/
|
||||
#### 2. Create Home Assistant Sensors
|
||||
|
||||
Create REST sensors in home assistant to get the details of today's meal.
|
||||
We will create sensors to get the name and ID of the first meal in today's meal plan (note that this may not be what is wanted if there is more than one meal planned for the day). We need the ID as well as the name to be able to retreive the image for the meal.
|
||||
We will create sensors to get the name and ID of the first meal in today's meal plan (note that this may not be what is wanted if there is more than one meal planned for the day). We need the ID as well as the name to be able to retrieve the image for the meal.
|
||||
|
||||
Make sure the url and port (`http://mealie:9000` ) matches your installation's address and _API_ port.
|
||||
|
||||
|
||||
@@ -7,7 +7,9 @@ You can use bookmarklets to generate a bookmark that will take your current loca
|
||||
You can use a [bookmarklet generator site](https://caiorss.github.io/bookmarklet-maker/) and the code below to generate a bookmark for your site. Just change the `http://localhost:8080` to your sites web address and follow the instructions.
|
||||
|
||||
```js
|
||||
var url = document.URL;
|
||||
var url = document.URL.endsWith('/') ?
|
||||
document.URL.slice(0, -1) :
|
||||
document.URL;
|
||||
var mealie = "http://localhost:8080";
|
||||
var group_slug = "home" // Change this to your group slug. You can obtain this from your URL after logging-in to Mealie
|
||||
var use_keywords= "&use_keywords=1" // Optional - use keywords from recipe - update to "" if you don't want that
|
||||
|
||||
@@ -48,7 +48,7 @@ services:
|
||||
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.duckdns</code> into your personal domain and the <code>duckdnstoken</code> into your token and remove the brackets.
|
||||
|
||||
## Step 3: Change the config files
|
||||
|
||||
|
||||
@@ -2,14 +2,14 @@
|
||||
|
||||
## 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 recipes 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
|
||||
Do the following just **once**. Doing this applies to your whole group, so be careful.
|
||||
|
||||
1. Click on your name in the upper left corner to get to your settings
|
||||
2. In the bottom right, select `Manage Data`
|
||||
3. In the Management page, make sure that a little orange button says `Foods`
|
||||
4. If your Foods database is empty, click `Seed` and choose your language. You should end up with a list of foods. (Wait bit for seeding to happen, and try not to seed more than once or you will have duplicates)
|
||||
4. If your Foods database is empty, click `Seed` and choose your language. You should end up with a list of foods. (Wait a bit for seeding to happen, and try not to seed more than once or you will have duplicates)
|
||||
5. Click the little orange `Foods` button and now choose `Units`.
|
||||
6. Click `Seed` and choose your language. You should end up with a list of units (e.g. `tablespoon`)
|
||||
|
||||
@@ -33,9 +33,9 @@ Do the following for each recipe you want to intelligently handle ingredients.
|
||||
|
||||
Scaling up this recipe or adding it to a Shopping List will now smartly take care of ingredient amounts and duplicate combinations.
|
||||
|
||||
## Is it Safe to Upgrade Mealie?
|
||||
## Is it safe to upgrade Mealie?
|
||||
|
||||
Yes. If you are using the v1 branches (including beta), you can upgrade to the latest version of Mealie without performing a site Export/Restore. This process was required in previous versions of Mealie, however we've automated the database migration process to make it easier to upgrade. Not that if you were using the v0.5.x version, you CANNOT upgrade to the latest version automatically. You must follow the migration instructions in the documentation.
|
||||
Yes. If you are using the v1 branches (including beta), you can upgrade to the latest version of Mealie without performing a site Export/Restore. This process was required in previous versions of Mealie, however we've automated the database migration process to make it easier to upgrade. Note that if you were using the v0.5.x version, you CANNOT upgrade to the latest version automatically. You must follow the migration instructions in the documentation.
|
||||
|
||||
- [Migration From v0.5.x](./migrating-to-mealie-v1.md)
|
||||
|
||||
@@ -45,7 +45,7 @@ You can change the theme by settings the environment variables.
|
||||
|
||||
- [Backend Config - Themeing](./installation/backend-config.md#themeing)
|
||||
|
||||
## 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.
|
||||
|
||||
@@ -53,7 +53,7 @@ Login session can be configured by setting the `TOKEN_TIME` variable on the back
|
||||
|
||||
## Can I serve Mealie on a subpath?
|
||||
|
||||
No. Due to limitations from the Javascript Framework, mealie doesn't support serving Mealie on a subpath.
|
||||
No. Due to limitations from the JavaScript Framework, Mealie doesn't support serving Mealie on a subpath.
|
||||
|
||||
## Can I install Mealie without docker?
|
||||
|
||||
@@ -130,8 +130,8 @@ stateDiagram-v2
|
||||
|
||||
For more information, check out the [Permissions and Public Access guide](./usage/permissions-and-public-access.md).
|
||||
|
||||
## 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.
|
||||
## 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.
|
||||
|
||||
Your fail2ban usage should look like the following:
|
||||
```
|
||||
@@ -139,11 +139,11 @@ Use datepattern : %d-%b-%y %H:%M:%S : Day-MON-Year2 24hour:Minute:Second
|
||||
Use failregex line : ^ERROR:\s+Incorrect username or password from <HOST>
|
||||
```
|
||||
|
||||
## 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 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 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 on Meal Plan data to remind you to defrost the chicken, marinate 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?
|
||||
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.
|
||||
## 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 providing 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?
|
||||
|
||||
|
||||
@@ -4,22 +4,22 @@
|
||||
|
||||
### General
|
||||
|
||||
| Variables | Default | Description |
|
||||
| ----------------------------- | :-------------------: | ----------------------------------------------------------------------------------- |
|
||||
| PUID | 911 | UserID permissions between host OS and container |
|
||||
| PGID | 911 | GroupID permissions between host OS and container |
|
||||
| DEFAULT_GROUP | Home | The default group for users |
|
||||
| BASE_URL | http://localhost:8080 | Used for Notifications |
|
||||
| TOKEN_TIME | 48 | The time in hours that a login/auth token is valid |
|
||||
| API_PORT | 9000 | The port exposed by backend API. **Do not change this if you're running in Docker** |
|
||||
| API_DOCS | True | Turns on/off access to the API documentation locally. |
|
||||
| TZ | UTC | Must be set to get correct date/time on the server |
|
||||
| ALLOW_SIGNUP<super>\*</super> | false | Allow user sign-up without token |
|
||||
| LOG_CONFIG_OVERRIDE | | Override the config for logging with a custom path |
|
||||
| LOG_LEVEL | info | Logging level (e.g. critical, error, warning, info, debug, trace) |
|
||||
| DAILY_SCHEDULE_TIME | 23:45 | The time of day to run the daily tasks. |
|
||||
| Variables | Default | Description |
|
||||
| ----------------------------- | :-------------------: | --------------------------------------------------------------------------------------------------------- |
|
||||
| PUID | 911 | UserID permissions between host OS and container |
|
||||
| PGID | 911 | GroupID permissions between host OS and container |
|
||||
| DEFAULT_GROUP | Home | The default group for users |
|
||||
| BASE_URL | http://localhost:8080 | Used for Notifications |
|
||||
| TOKEN_TIME | 48 | The time in hours that a login/auth token is valid |
|
||||
| API_PORT | 9000 | The port exposed by backend API. **Do not change this if you're running in Docker** |
|
||||
| API_DOCS | True | Turns on/off access to the API documentation locally |
|
||||
| TZ | UTC | Must be set to get correct date/time on the server |
|
||||
| ALLOW_SIGNUP<super>\*</super> | false | Allow user sign-up without token |
|
||||
| LOG_CONFIG_OVERRIDE | | Override the config for logging with a custom path |
|
||||
| LOG_LEVEL | info | Logging level (e.g. critical, error, warning, info, debug, trace) |
|
||||
| DAILY_SCHEDULE_TIME | 23:45 | The time of day to run daily server tasks, in HH:MM format. Use the server's local time, *not* UTC |
|
||||
|
||||
<super>\*</super> Starting in v1.4.0 this was changed to default to `false` as apart of a security review of the application.
|
||||
<super>\*</super> Starting in v1.4.0 this was changed to default to `false` as part of a security review of the application.
|
||||
|
||||
### Security
|
||||
|
||||
@@ -106,14 +106,15 @@ For usage, see [Usage - OpenID Connect](../authentication/oidc.md)
|
||||
|
||||
Mealie supports various integrations using OpenAI. To enable OpenAI, [you must provide your OpenAI API key](https://platform.openai.com/api-keys). You can tweak how OpenAI is used using these backend settings. Please note that while OpenAI usage is optimized to reduce API costs, you're unlikely to be able to use OpenAI features with the free tier limits.
|
||||
|
||||
| Variables | Default | Description |
|
||||
| ------------------------- | :-----: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| OPENAI_BASE_URL | None | The base URL for the OpenAI API. If you're not sure, leave this empty to use the standard OpenAI platform |
|
||||
| OPENAI_API_KEY | None | Your OpenAI API Key. Enables OpenAI-related features |
|
||||
| OPENAI_MODEL | gpt-4o | Which OpenAI model to use. If you're not sure, leave this empty |
|
||||
| OPENAI_WORKERS | 2 | Number of OpenAI workers per request. Higher values may increase processing speed, but will incur additional API costs |
|
||||
| OPENAI_SEND_DATABASE_DATA | True | Whether to send Mealie data to OpenAI to improve request accuracy. This will incur additional API costs |
|
||||
| OPENAI_REQUEST_TIMEOUT | 10 | The number of seconds to wait for an OpenAI request to complete before cancelling the request. Leave this empty unless you're running into timeout issues on slower hardware |
|
||||
| Variables | Default | Description |
|
||||
| ---------------------------- | :-----: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| OPENAI_BASE_URL | None | The base URL for the OpenAI API. If you're not sure, leave this empty to use the standard OpenAI platform |
|
||||
| OPENAI_API_KEY | None | Your OpenAI API Key. Enables OpenAI-related features |
|
||||
| OPENAI_MODEL | gpt-4o | Which OpenAI model to use. If you're not sure, leave this empty |
|
||||
| OPENAI_ENABLE_IMAGE_SERVICES | True | Whether to enable OpenAI image services, such as creating recipes via image. Leave this enabled unless your custom model doesn't support it, or you want to reduce costs |
|
||||
| OPENAI_WORKERS | 2 | Number of OpenAI workers per request. Higher values may increase processing speed, but will incur additional API costs |
|
||||
| OPENAI_SEND_DATABASE_DATA | True | Whether to send Mealie data to OpenAI to improve request accuracy. This will incur additional API costs |
|
||||
| OPENAI_REQUEST_TIMEOUT | 60 | The number of seconds to wait for an OpenAI request to complete before cancelling the request. Leave this empty unless you're running into timeout issues on slower hardware |
|
||||
|
||||
### Themeing
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@ The following steps were tested on a Ubuntu 20.04 server, but should work for mo
|
||||
4. Create a docker-compose.yaml file in the mealie directory: `touch 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 3: Customizing The `docker-compose.yaml` files.
|
||||
|
||||
After you've decided setup the files it's important to set a few ENV variables to ensure that you can use all the features of Mealie. I recommend that you verify and check that:
|
||||
|
||||
@@ -67,7 +67,7 @@ After you've decided setup the files it's important to set a few ENV variables t
|
||||
- [x] You've set the [`BASE_URL`](./backend-config.md#general) variable.
|
||||
- [x] You've set the `DEFAULT_EMAIL` and `DEFAULT_GROUP` variable.
|
||||
|
||||
## Step 3: Startup
|
||||
## Step 4: 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`.
|
||||
|
||||
@@ -87,11 +87,11 @@ You should see the containers start up without error. You should now be able to
|
||||
|
||||
**Password:** MyPassword
|
||||
|
||||
## Step 4: Validate Installation
|
||||
## Step 5: Validate Installation
|
||||
|
||||
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 6: 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.
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In
|
||||
```yaml
|
||||
services:
|
||||
mealie:
|
||||
image: ghcr.io/mealie-recipes/mealie:v1.9.0 # (3)
|
||||
image: ghcr.io/mealie-recipes/mealie:v1.11.0 # (3)
|
||||
container_name: mealie
|
||||
restart: always
|
||||
ports:
|
||||
@@ -20,7 +20,7 @@ services:
|
||||
- mealie-data:/app/data/
|
||||
environment:
|
||||
# Set Backend ENV Variables Here
|
||||
ALLOW_SIGNUP: true
|
||||
ALLOW_SIGNUP: false
|
||||
PUID: 1000
|
||||
PGID: 1000
|
||||
TZ: America/Anchorage
|
||||
|
||||
@@ -11,7 +11,7 @@ SQLite is a popular, open source, self-contained, zero-configuration database th
|
||||
```yaml
|
||||
services:
|
||||
mealie:
|
||||
image: ghcr.io/mealie-recipes/mealie:v1.9.0 # (3)
|
||||
image: ghcr.io/mealie-recipes/mealie:v1.11.0 # (3)
|
||||
container_name: mealie
|
||||
restart: always
|
||||
ports:
|
||||
@@ -24,7 +24,7 @@ services:
|
||||
- mealie-data:/app/data/
|
||||
environment:
|
||||
# Set Backend ENV Variables Here
|
||||
ALLOW_SIGNUP: true
|
||||
ALLOW_SIGNUP: false
|
||||
PUID: 1000
|
||||
PGID: 1000
|
||||
TZ: America/Anchorage
|
||||
|
||||
@@ -18,8 +18,6 @@
|
||||
icon: $globals.icons.testTube,
|
||||
text: $tc('general.test'),
|
||||
event: 'test',
|
||||
// TODO: There is no functionality hooked up to this. Enable it when there is
|
||||
disabled: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.save,
|
||||
|
||||
@@ -36,6 +36,9 @@
|
||||
<v-list-item-subtitle>
|
||||
<SafeMarkdown :source="description" />
|
||||
</v-list-item-subtitle>
|
||||
<div class="d-flex flex-wrap justify-start">
|
||||
<RecipeChips :truncate="true" :items="tags" :title="false" :limit="2" :small="true" url-prefix="tags" />
|
||||
</div>
|
||||
<div class="d-flex flex-wrap justify-end align-center">
|
||||
<slot name="actions">
|
||||
<RecipeFavoriteBadge v-if="isOwnGroup && showRecipeContent" :recipe-id="recipeId" show-always />
|
||||
@@ -83,6 +86,7 @@ import RecipeFavoriteBadge from "./RecipeFavoriteBadge.vue";
|
||||
import RecipeContextMenu from "./RecipeContextMenu.vue";
|
||||
import RecipeCardImage from "./RecipeCardImage.vue";
|
||||
import RecipeRating from "./RecipeRating.vue";
|
||||
import RecipeChips from "./RecipeChips.vue";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
|
||||
export default defineComponent({
|
||||
@@ -91,6 +95,7 @@ export default defineComponent({
|
||||
RecipeContextMenu,
|
||||
RecipeRating,
|
||||
RecipeCardImage,
|
||||
RecipeChips,
|
||||
},
|
||||
props: {
|
||||
name: {
|
||||
@@ -114,6 +119,10 @@ export default defineComponent({
|
||||
required: false,
|
||||
default: "abc123",
|
||||
},
|
||||
tags: {
|
||||
type: Array,
|
||||
default: () => [],
|
||||
},
|
||||
recipeId: {
|
||||
type: String,
|
||||
required: true,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div v-if="dialog">
|
||||
<BaseDialog v-if="shoppingListDialog" v-model="dialog" :title="$t('recipe.add-to-list')" :icon="$globals.icons.cartCheck">
|
||||
<BaseDialog v-if="shoppingListDialog && ready" v-model="dialog" :title="$t('recipe.add-to-list')" :icon="$globals.icons.cartCheck">
|
||||
<v-card-text>
|
||||
<v-card
|
||||
v-for="list in shoppingListChoices"
|
||||
@@ -23,7 +23,7 @@
|
||||
{{ $t("general.cancel") }}
|
||||
</v-btn>
|
||||
<div class="d-flex justify-end" style="width: 100%;">
|
||||
<v-checkbox v-model="preferences.viewAllLists" hide-details :label="$tc('general.show-all')" class="my-auto mr-4" />
|
||||
<v-checkbox v-model="preferences.viewAllLists" hide-details :label="$tc('general.show-all')" class="my-auto mr-4" @click="setShowAllToggled()" />
|
||||
</div>
|
||||
</template>
|
||||
</BaseDialog>
|
||||
@@ -127,14 +127,14 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, reactive, ref, useContext } from "@nuxtjs/composition-api";
|
||||
import { toRefs } from "@vueuse/core";
|
||||
import RecipeIngredientListItem from "./RecipeIngredientListItem.vue";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
import { alert } from "~/composables/use-toast";
|
||||
import { useShoppingListPreferences } from "~/composables/use-users/preferences";
|
||||
import { ShoppingListSummary } from "~/lib/api/types/group";
|
||||
import { Recipe, RecipeIngredient } from "~/lib/api/types/recipe";
|
||||
import { computed, defineComponent, reactive, ref, useContext, watchEffect } from "@nuxtjs/composition-api"
|
||||
import { toRefs } from "@vueuse/core"
|
||||
import RecipeIngredientListItem from "./RecipeIngredientListItem.vue"
|
||||
import { useUserApi } from "~/composables/api"
|
||||
import { alert } from "~/composables/use-toast"
|
||||
import { useShoppingListPreferences } from "~/composables/use-users/preferences"
|
||||
import { ShoppingListSummary } from "~/lib/api/types/group"
|
||||
import { Recipe, RecipeIngredient } from "~/lib/api/types/recipe"
|
||||
|
||||
export interface RecipeWithScale extends Recipe {
|
||||
scale: number;
|
||||
@@ -180,6 +180,7 @@ export default defineComponent({
|
||||
const { $auth, i18n } = useContext();
|
||||
const api = useUserApi();
|
||||
const preferences = useShoppingListPreferences();
|
||||
const ready = ref(false);
|
||||
|
||||
// v-model support
|
||||
const dialog = computed({
|
||||
@@ -195,6 +196,7 @@ export default defineComponent({
|
||||
const state = reactive({
|
||||
shoppingListDialog: true,
|
||||
shoppingListIngredientDialog: false,
|
||||
shoppingListShowAllToggled: false,
|
||||
});
|
||||
|
||||
const shoppingListChoices = computed(() => {
|
||||
@@ -204,6 +206,16 @@ export default defineComponent({
|
||||
const recipeIngredientSections = ref<ShoppingListRecipeIngredientSection[]>([]);
|
||||
const selectedShoppingList = ref<ShoppingListSummary | null>(null);
|
||||
|
||||
watchEffect(
|
||||
() => {
|
||||
if (shoppingListChoices.value.length === 1 && !state.shoppingListShowAllToggled) {
|
||||
openShoppingListIngredientDialog(shoppingListChoices.value[0]);
|
||||
} else {
|
||||
ready.value = true;
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
async function consolidateRecipesIntoSections(recipes: RecipeWithScale[]) {
|
||||
const recipeSectionMap = new Map<string, ShoppingListRecipeIngredientSection>();
|
||||
for (const recipe of recipes) {
|
||||
@@ -237,30 +249,40 @@ export default defineComponent({
|
||||
}
|
||||
});
|
||||
|
||||
let currentTitle = "";
|
||||
const onHandIngs: ShoppingListIngredient[] = [];
|
||||
const shoppingListIngredientSections = shoppingListIngredients.reduce((sections, ing) => {
|
||||
// if title append new section to the end of the array
|
||||
if (ing.ingredient.title) {
|
||||
currentTitle = ing.ingredient.title;
|
||||
}
|
||||
|
||||
// If this is the first item in the section, create a new section
|
||||
if (sections.length === 0 || currentTitle !== sections[sections.length - 1].sectionName) {
|
||||
if (sections.length) {
|
||||
// Add the on-hand ingredients to the previous section
|
||||
sections[sections.length - 1].ingredients.push(...onHandIngs);
|
||||
onHandIngs.length = 0;
|
||||
}
|
||||
sections.push({
|
||||
sectionName: ing.ingredient.title,
|
||||
ingredients: [ing],
|
||||
sectionName: currentTitle,
|
||||
ingredients: [],
|
||||
});
|
||||
}
|
||||
|
||||
// Store the on-hand ingredients for later
|
||||
if (ing.ingredient.food?.onHand) {
|
||||
onHandIngs.push(ing);
|
||||
return sections;
|
||||
}
|
||||
|
||||
// append new section if first
|
||||
if (sections.length === 0) {
|
||||
sections.push({
|
||||
sectionName: "",
|
||||
ingredients: [ing],
|
||||
});
|
||||
return sections;
|
||||
}
|
||||
|
||||
// otherwise add ingredient to last section in the array
|
||||
// Add the ingredient to previous section
|
||||
sections[sections.length - 1].ingredients.push(ing);
|
||||
return sections;
|
||||
}, [] as ShoppingListIngredientSection[]);
|
||||
|
||||
// Add remaining on-hand ingredients to the previous section
|
||||
shoppingListIngredientSections[shoppingListIngredientSections.length - 1].ingredients.push(...onHandIngs);
|
||||
|
||||
recipeSectionMap.set(recipe.slug, {
|
||||
recipeId: recipe.id,
|
||||
recipeName: recipe.name,
|
||||
@@ -275,6 +297,7 @@ export default defineComponent({
|
||||
function initState() {
|
||||
state.shoppingListDialog = true;
|
||||
state.shoppingListIngredientDialog = false;
|
||||
state.shoppingListShowAllToggled = false;
|
||||
recipeIngredientSections.value = [];
|
||||
selectedShoppingList.value = null;
|
||||
}
|
||||
@@ -292,6 +315,10 @@ export default defineComponent({
|
||||
state.shoppingListIngredientDialog = true;
|
||||
}
|
||||
|
||||
function setShowAllToggled() {
|
||||
state.shoppingListShowAllToggled = true;
|
||||
}
|
||||
|
||||
function bulkCheckIngredients(value = true) {
|
||||
recipeIngredientSections.value.forEach((recipeSection) => {
|
||||
recipeSection.ingredientSections.forEach((ingSection) => {
|
||||
@@ -353,11 +380,13 @@ export default defineComponent({
|
||||
return {
|
||||
dialog,
|
||||
preferences,
|
||||
ready,
|
||||
shoppingListChoices,
|
||||
...toRefs(state),
|
||||
addRecipesToList,
|
||||
bulkCheckIngredients,
|
||||
openShoppingListIngredientDialog,
|
||||
setShowAllToggled,
|
||||
recipeIngredientSections,
|
||||
selectedShoppingList,
|
||||
}
|
||||
|
||||
@@ -126,8 +126,8 @@
|
||||
<RecipeCardSection
|
||||
v-if="state.ready"
|
||||
class="mt-n5"
|
||||
:icon="$globals.icons.search"
|
||||
:title="$tc('search.results')"
|
||||
:icon="$globals.icons.silverwareForkKnife"
|
||||
:title="$tc('general.recipes')"
|
||||
:recipes="recipes"
|
||||
:query="passedQueryWithSeed"
|
||||
@replaceRecipes="replaceRecipes"
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
<v-icon left>
|
||||
{{ $globals.icons.calendar }}
|
||||
</v-icon>
|
||||
{{ $t('recipe.last-made-date', { date: value ? new Date(value+"Z").toLocaleDateString($i18n.locale) : $t("general.never") } ) }}
|
||||
{{ $t('recipe.last-made-date', { date: value ? new Date(value).toLocaleDateString($i18n.locale) : $t("general.never") } ) }}
|
||||
</v-chip>
|
||||
</div>
|
||||
</div>
|
||||
@@ -199,11 +199,7 @@ export default defineComponent({
|
||||
await userApi.recipes.updateLastMade(props.recipe.slug, newTimelineEvent.value.timestamp);
|
||||
|
||||
// update recipe in parent so the user can see it
|
||||
// we remove the trailing "Z" since this is how the API returns it
|
||||
context.emit(
|
||||
"input", newTimelineEvent.value.timestamp
|
||||
.substring(0, newTimelineEvent.value.timestamp.length - 1)
|
||||
);
|
||||
context.emit("input", newTimelineEvent.value.timestamp);
|
||||
}
|
||||
|
||||
// update the image, if provided
|
||||
|
||||
@@ -114,9 +114,9 @@ export default defineComponent({
|
||||
options: {
|
||||
ignoreLocation: true,
|
||||
shouldSort: true,
|
||||
threshold: 0.6,
|
||||
threshold: 0.2,
|
||||
location: 0,
|
||||
distance: 100,
|
||||
distance: 20,
|
||||
findAllMatches: true,
|
||||
maxPatternLength: 32,
|
||||
minMatchCharLength: 1,
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
<template v-if="!useMobileFormat" #opposite>
|
||||
<v-chip v-if="event.timestamp" label large>
|
||||
<v-icon class="mr-1"> {{ $globals.icons.calendar }} </v-icon>
|
||||
{{ new Date(event.timestamp+"Z").toLocaleDateString($i18n.locale) }}
|
||||
{{ new Date(event.timestamp).toLocaleDateString($i18n.locale) }}
|
||||
</v-chip>
|
||||
</template>
|
||||
<v-card
|
||||
@@ -25,7 +25,7 @@
|
||||
<v-col v-if="useMobileFormat" align-self="center" class="pr-0">
|
||||
<v-chip label>
|
||||
<v-icon> {{ $globals.icons.calendar }} </v-icon>
|
||||
{{ new Date(event.timestamp+"Z").toLocaleDateString($i18n.locale) }}
|
||||
{{ new Date(event.timestamp || "").toLocaleDateString($i18n.locale) }}
|
||||
</v-chip>
|
||||
</v-col>
|
||||
<v-col v-else cols="9" style="margin: auto; text-align: center;">
|
||||
|
||||
@@ -69,13 +69,13 @@
|
||||
</v-row>
|
||||
<v-row v-if="!listItem.checked && recipeList && recipeList.length && displayRecipeRefs" no-gutters class="mb-2">
|
||||
<v-col cols="auto" style="width: 100%;">
|
||||
<RecipeList :recipes="recipeList" :list-item="listItem" :disabled="isOffline" small tile />
|
||||
<RecipeList :recipes="recipeList" :list-item="listItem" :disabled="$nuxt.isOffline" small tile />
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-row v-if="listItem.checked" no-gutters class="mb-2">
|
||||
<v-col cols="auto">
|
||||
<div class="text-caption font-weight-light font-italic">
|
||||
{{ $t("shopping-list.completed-on", {date: new Date(listItem.updateAt+"Z").toLocaleDateString($i18n.locale)}) }}
|
||||
{{ $t("shopping-list.completed-on", {date: new Date(listItem.updateAt || "").toLocaleDateString($i18n.locale)}) }}
|
||||
</div>
|
||||
</v-col>
|
||||
</v-row>
|
||||
@@ -136,10 +136,6 @@ export default defineComponent({
|
||||
type: Map<string, RecipeSummary>,
|
||||
default: undefined,
|
||||
},
|
||||
isOffline: {
|
||||
type: Boolean,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
setup(props, context) {
|
||||
const { i18n } = useContext();
|
||||
|
||||
@@ -1,25 +1,26 @@
|
||||
<template>
|
||||
<v-app dark>
|
||||
<TheSnackbar />
|
||||
<v-app dark>
|
||||
<TheSnackbar />
|
||||
|
||||
<AppSidebar
|
||||
v-model="sidebar"
|
||||
absolute
|
||||
:top-link="topLinks"
|
||||
:secondary-links="cookbookLinks || []"
|
||||
:bottom-links="isAdmin ? bottomLinks : []"
|
||||
>
|
||||
<v-menu offset-y nudge-bottom="5" close-delay="50" nudge-right="15">
|
||||
<template #activator="{ on, attrs }">
|
||||
<v-btn v-if="isOwnGroup" rounded large class="ml-2 mt-3" v-bind="attrs" v-on="on">
|
||||
<v-icon left large color="primary">
|
||||
{{ $globals.icons.createAlt }}
|
||||
</v-icon>
|
||||
{{ $t("general.create") }}
|
||||
</v-btn>
|
||||
</template>
|
||||
<v-list dense class="my-0 py-0">
|
||||
<template v-for="(item, index) in createLinks">
|
||||
<AppSidebar
|
||||
v-model="sidebar"
|
||||
absolute
|
||||
:top-link="topLinks"
|
||||
:secondary-links="cookbookLinks || []"
|
||||
:bottom-links="isAdmin ? bottomLinks : []"
|
||||
>
|
||||
<v-menu offset-y nudge-bottom="5" close-delay="50" nudge-right="15">
|
||||
<template #activator="{ on, attrs }">
|
||||
<v-btn v-if="isOwnGroup" rounded large class="ml-2 mt-3" v-bind="attrs" v-on="on">
|
||||
<v-icon left large color="primary">
|
||||
{{ $globals.icons.createAlt }}
|
||||
</v-icon>
|
||||
{{ $t("general.create") }}
|
||||
</v-btn>
|
||||
</template>
|
||||
<v-list dense class="my-0 py-0">
|
||||
<template v-for="(item, index) in createLinks">
|
||||
<div v-if="!item.hide" :key="item.title">
|
||||
<v-divider v-if="item.insertDivider" :key="index" class="mx-2"></v-divider>
|
||||
<v-list-item v-if="!item.restricted || isOwnGroup" :key="item.title" :to="item.to" exact>
|
||||
<v-list-item-avatar>
|
||||
@@ -36,195 +37,212 @@
|
||||
</v-list-item-subtitle>
|
||||
</v-list-item-content>
|
||||
</v-list-item>
|
||||
</template>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
<template #bottom>
|
||||
<v-list-item @click.stop="languageDialog = true">
|
||||
<v-list-item-icon>
|
||||
<v-icon>{{ $globals.icons.translate }}</v-icon>
|
||||
</v-list-item-icon>
|
||||
<v-list-item-content>
|
||||
<v-list-item-title>{{ $t("sidebar.language") }}</v-list-item-title>
|
||||
<LanguageDialog v-model="languageDialog" />
|
||||
</v-list-item-content>
|
||||
</v-list-item>
|
||||
<v-list-item @click="toggleDark">
|
||||
<v-list-item-icon>
|
||||
<v-icon>
|
||||
{{ $vuetify.theme.dark ? $globals.icons.weatherSunny : $globals.icons.weatherNight }}
|
||||
</v-icon>
|
||||
</v-list-item-icon>
|
||||
<v-list-item-title>
|
||||
{{ $vuetify.theme.dark ? $t("settings.theme.light-mode") : $t("settings.theme.dark-mode") }}
|
||||
</v-list-item-title>
|
||||
</v-list-item>
|
||||
</template>
|
||||
</AppSidebar>
|
||||
</div>
|
||||
</template>
|
||||
</v-list>
|
||||
</v-menu>
|
||||
<template #bottom>
|
||||
<v-list-item @click.stop="languageDialog = true">
|
||||
<v-list-item-icon>
|
||||
<v-icon>{{ $globals.icons.translate }}</v-icon>
|
||||
</v-list-item-icon>
|
||||
<v-list-item-content>
|
||||
<v-list-item-title>{{ $t("sidebar.language") }}</v-list-item-title>
|
||||
<LanguageDialog v-model="languageDialog" />
|
||||
</v-list-item-content>
|
||||
</v-list-item>
|
||||
<v-list-item @click="toggleDark">
|
||||
<v-list-item-icon>
|
||||
<v-icon>
|
||||
{{ $vuetify.theme.dark ? $globals.icons.weatherSunny : $globals.icons.weatherNight }}
|
||||
</v-icon>
|
||||
</v-list-item-icon>
|
||||
<v-list-item-title>
|
||||
{{ $vuetify.theme.dark ? $t("settings.theme.light-mode") : $t("settings.theme.dark-mode") }}
|
||||
</v-list-item-title>
|
||||
</v-list-item>
|
||||
</template>
|
||||
</AppSidebar>
|
||||
|
||||
<AppHeader>
|
||||
<v-btn icon @click.stop="sidebar = !sidebar">
|
||||
<v-icon> {{ $globals.icons.menu }}</v-icon>
|
||||
</v-btn>
|
||||
</AppHeader>
|
||||
<v-main>
|
||||
<v-scroll-x-transition>
|
||||
<Nuxt />
|
||||
</v-scroll-x-transition>
|
||||
</v-main>
|
||||
</v-app>
|
||||
</template>
|
||||
<AppHeader>
|
||||
<v-btn icon @click.stop="sidebar = !sidebar">
|
||||
<v-icon> {{ $globals.icons.menu }}</v-icon>
|
||||
</v-btn>
|
||||
</AppHeader>
|
||||
<v-main>
|
||||
<v-scroll-x-transition>
|
||||
<Nuxt />
|
||||
</v-scroll-x-transition>
|
||||
</v-main>
|
||||
</v-app>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, onMounted, ref, useContext, useRoute } from "@nuxtjs/composition-api";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import AppHeader from "@/components/Layout/LayoutParts/AppHeader.vue";
|
||||
import AppSidebar from "@/components/Layout/LayoutParts/AppSidebar.vue";
|
||||
import { SidebarLinks } from "~/types/application-types";
|
||||
import LanguageDialog from "~/components/global/LanguageDialog.vue";
|
||||
import TheSnackbar from "@/components/Layout/LayoutParts/TheSnackbar.vue";
|
||||
import { useCookbooks, usePublicCookbooks } from "~/composables/use-group-cookbooks";
|
||||
import { useToggleDarkMode } from "~/composables/use-utils";
|
||||
<script lang="ts">
|
||||
import { computed, defineComponent, onMounted, ref, useContext, useRoute } from "@nuxtjs/composition-api";
|
||||
import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
import AppHeader from "@/components/Layout/LayoutParts/AppHeader.vue";
|
||||
import AppSidebar from "@/components/Layout/LayoutParts/AppSidebar.vue";
|
||||
import { SidebarLinks } from "~/types/application-types";
|
||||
import LanguageDialog from "~/components/global/LanguageDialog.vue";
|
||||
import TheSnackbar from "@/components/Layout/LayoutParts/TheSnackbar.vue";
|
||||
import { useAppInfo } from "~/composables/api";
|
||||
import { useCookbooks, usePublicCookbooks } from "~/composables/use-group-cookbooks";
|
||||
import { useToggleDarkMode } from "~/composables/use-utils";
|
||||
|
||||
export default defineComponent({
|
||||
components: { AppHeader, AppSidebar, LanguageDialog, TheSnackbar },
|
||||
setup() {
|
||||
const { $globals, $auth, $vuetify, i18n } = useContext();
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
export default defineComponent({
|
||||
components: { AppHeader, AppSidebar, LanguageDialog, TheSnackbar },
|
||||
setup() {
|
||||
const { $globals, $auth, $vuetify, i18n } = useContext();
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
|
||||
const isAdmin = computed(() => $auth.user?.admin);
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
const { cookbooks } = isOwnGroup.value ? useCookbooks() : usePublicCookbooks(groupSlug.value || "");
|
||||
const isAdmin = computed(() => $auth.user?.admin);
|
||||
const route = useRoute();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || $auth.user?.groupSlug || "");
|
||||
const { cookbooks } = isOwnGroup.value ? useCookbooks() : usePublicCookbooks(groupSlug.value || "");
|
||||
|
||||
const toggleDark = useToggleDarkMode();
|
||||
const appInfo = useAppInfo();
|
||||
const showImageImport = computed(() => appInfo.value?.enableOpenaiImageServices);
|
||||
|
||||
const languageDialog = ref<boolean>(false);
|
||||
const toggleDark = useToggleDarkMode();
|
||||
|
||||
const sidebar = ref<boolean | null>(null);
|
||||
const languageDialog = ref<boolean>(false);
|
||||
|
||||
onMounted(() => {
|
||||
sidebar.value = !$vuetify.breakpoint.md;
|
||||
const sidebar = ref<boolean | null>(null);
|
||||
|
||||
onMounted(() => {
|
||||
sidebar.value = !$vuetify.breakpoint.md;
|
||||
});
|
||||
|
||||
const cookbookLinks = computed(() => {
|
||||
if (!cookbooks.value) return [];
|
||||
return cookbooks.value.map((cookbook) => {
|
||||
return {
|
||||
icon: $globals.icons.pages,
|
||||
title: cookbook.name,
|
||||
to: `/g/${groupSlug.value}/cookbooks/${cookbook.slug as string}`,
|
||||
};
|
||||
});
|
||||
});
|
||||
|
||||
const cookbookLinks = computed(() => {
|
||||
if (!cookbooks.value) return [];
|
||||
return cookbooks.value.map((cookbook) => {
|
||||
return {
|
||||
icon: $globals.icons.pages,
|
||||
title: cookbook.name,
|
||||
to: `/g/${groupSlug.value}/cookbooks/${cookbook.slug as string}`,
|
||||
};
|
||||
});
|
||||
});
|
||||
interface Link {
|
||||
insertDivider: boolean;
|
||||
icon: string;
|
||||
title: string;
|
||||
subtitle: string | null;
|
||||
to: string;
|
||||
restricted: boolean;
|
||||
hide: boolean;
|
||||
}
|
||||
|
||||
interface Link {
|
||||
insertDivider: boolean;
|
||||
icon: string;
|
||||
title: string;
|
||||
subtitle: string | null;
|
||||
to: string;
|
||||
restricted: boolean;
|
||||
}
|
||||
const createLinks = computed<Link[]>(() => [
|
||||
{
|
||||
insertDivider: false,
|
||||
icon: $globals.icons.link,
|
||||
title: i18n.tc("general.import"),
|
||||
subtitle: i18n.tc("new-recipe.import-by-url"),
|
||||
to: `/g/${groupSlug.value}/r/create/url`,
|
||||
restricted: true,
|
||||
hide: false,
|
||||
},
|
||||
{
|
||||
insertDivider: false,
|
||||
icon: $globals.icons.fileImage,
|
||||
title: i18n.tc("recipe.create-from-image"),
|
||||
subtitle: i18n.tc("recipe.create-recipe-from-an-image"),
|
||||
to: `/g/${groupSlug.value}/r/create/image`,
|
||||
restricted: true,
|
||||
hide: !showImageImport.value,
|
||||
},
|
||||
{
|
||||
insertDivider: true,
|
||||
icon: $globals.icons.edit,
|
||||
title: i18n.tc("general.create"),
|
||||
subtitle: i18n.tc("new-recipe.create-manually"),
|
||||
to: `/g/${groupSlug.value}/r/create/new`,
|
||||
restricted: true,
|
||||
hide: false,
|
||||
},
|
||||
]);
|
||||
|
||||
const createLinks = computed<Link[]>(() => [
|
||||
{
|
||||
insertDivider: false,
|
||||
icon: $globals.icons.link,
|
||||
title: i18n.tc("general.import"),
|
||||
subtitle: i18n.tc("new-recipe.import-by-url"),
|
||||
to: `/g/${groupSlug.value}/r/create/url`,
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
insertDivider: true,
|
||||
icon: $globals.icons.edit,
|
||||
title: i18n.tc("general.create"),
|
||||
subtitle: i18n.tc("new-recipe.create-manually"),
|
||||
to: `/g/${groupSlug.value}/r/create/new`,
|
||||
restricted: true,
|
||||
},
|
||||
]);
|
||||
const bottomLinks = computed<SidebarLinks>(() => [
|
||||
{
|
||||
icon: $globals.icons.cog,
|
||||
title: i18n.tc("general.settings"),
|
||||
to: "/admin/site-settings",
|
||||
restricted: true,
|
||||
},
|
||||
]);
|
||||
|
||||
const bottomLinks = computed<SidebarLinks>(() => [
|
||||
{
|
||||
icon: $globals.icons.cog,
|
||||
title: i18n.tc("general.settings"),
|
||||
to: "/admin/site-settings",
|
||||
restricted: true,
|
||||
},
|
||||
]);
|
||||
const topLinks = computed<SidebarLinks>(() => [
|
||||
{
|
||||
icon: $globals.icons.silverwareForkKnife,
|
||||
to: `/g/${groupSlug.value}`,
|
||||
title: i18n.tc("general.recipes"),
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.calendarMultiselect,
|
||||
title: i18n.tc("meal-plan.meal-planner"),
|
||||
to: "/group/mealplan/planner/view",
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.formatListCheck,
|
||||
title: i18n.tc("shopping-list.shopping-lists"),
|
||||
to: "/shopping-lists",
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.timelineText,
|
||||
title: i18n.tc("recipe.timeline"),
|
||||
to: `/g/${groupSlug.value}/recipes/timeline`,
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.book,
|
||||
to: `/g/${groupSlug.value}/cookbooks`,
|
||||
title: i18n.tc("cookbook.cookbooks"),
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.organizers,
|
||||
title: i18n.tc("general.organizers"),
|
||||
restricted: true,
|
||||
children: [
|
||||
{
|
||||
icon: $globals.icons.categories,
|
||||
to: `/g/${groupSlug.value}/recipes/categories`,
|
||||
title: i18n.tc("sidebar.categories"),
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.tags,
|
||||
to: `/g/${groupSlug.value}/recipes/tags`,
|
||||
title: i18n.tc("sidebar.tags"),
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.potSteam,
|
||||
to: `/g/${groupSlug.value}/recipes/tools`,
|
||||
title: i18n.tc("tool.tools"),
|
||||
restricted: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
|
||||
const topLinks = computed<SidebarLinks>(() => [
|
||||
{
|
||||
icon: $globals.icons.search,
|
||||
to: `/g/${groupSlug.value}`,
|
||||
title: i18n.tc("sidebar.search"),
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.calendarMultiselect,
|
||||
title: i18n.tc("meal-plan.meal-planner"),
|
||||
to: "/group/mealplan/planner/view",
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.formatListCheck,
|
||||
title: i18n.tc("shopping-list.shopping-lists"),
|
||||
to: "/shopping-lists",
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.timelineText,
|
||||
title: i18n.tc("recipe.timeline"),
|
||||
to: `/g/${groupSlug.value}/recipes/timeline`,
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.book,
|
||||
to: `/g/${groupSlug.value}/cookbooks`,
|
||||
title: i18n.tc("cookbook.cookbooks"),
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.organizers,
|
||||
title: i18n.tc("general.organizers"),
|
||||
restricted: true,
|
||||
children: [
|
||||
{
|
||||
icon: $globals.icons.categories,
|
||||
to: `/g/${groupSlug.value}/recipes/categories`,
|
||||
title: i18n.tc("sidebar.categories"),
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.tags,
|
||||
to: `/g/${groupSlug.value}/recipes/tags`,
|
||||
title: i18n.tc("sidebar.tags"),
|
||||
restricted: true,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.potSteam,
|
||||
to: `/g/${groupSlug.value}/recipes/tools`,
|
||||
title: i18n.tc("tool.tools"),
|
||||
restricted: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
||||
|
||||
return {
|
||||
groupSlug,
|
||||
cookbookLinks,
|
||||
createLinks,
|
||||
bottomLinks,
|
||||
topLinks,
|
||||
isAdmin,
|
||||
isOwnGroup,
|
||||
languageDialog,
|
||||
toggleDark,
|
||||
sidebar,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
return {
|
||||
groupSlug,
|
||||
cookbookLinks,
|
||||
createLinks,
|
||||
bottomLinks,
|
||||
topLinks,
|
||||
isAdmin,
|
||||
isOwnGroup,
|
||||
languageDialog,
|
||||
toggleDark,
|
||||
sidebar,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -1,6 +1,16 @@
|
||||
<template>
|
||||
<v-container class="pa-0">
|
||||
<v-row no-gutters>
|
||||
<v-col cols="8" align-self="center">
|
||||
<Cropper
|
||||
ref="cropper"
|
||||
class="cropper"
|
||||
:src="img"
|
||||
:default-size="defaultSize"
|
||||
:style="`height: ${cropperHeight}; width: ${cropperWidth};`"
|
||||
/>
|
||||
</v-col>
|
||||
<v-spacer />
|
||||
<v-col cols="2" align-self="center">
|
||||
<v-container class="pa-0 mx-0">
|
||||
<v-row v-for="(row, keyRow) in controls" :key="keyRow">
|
||||
@@ -17,16 +27,6 @@
|
||||
</v-row>
|
||||
</v-container>
|
||||
</v-col>
|
||||
<v-spacer />
|
||||
<v-col cols="8" align-self="center">
|
||||
<Cropper
|
||||
ref="cropper"
|
||||
class="cropper"
|
||||
:src="img"
|
||||
:default-size="defaultSize"
|
||||
:style="`height: ${cropperHeight}; width: ${cropperWidth};`"
|
||||
/>
|
||||
</v-col>
|
||||
</v-row>
|
||||
</v-container>
|
||||
</template>
|
||||
|
||||
@@ -64,7 +64,6 @@ export const useGroupWebhooks = function () {
|
||||
newDt.setMinutes(Number(minutes));
|
||||
|
||||
updateData.scheduledTime = `${pad(newDt.getUTCHours(), 2)}:${pad(newDt.getUTCMinutes(), 2)}`;
|
||||
console.log(updateData.scheduledTime);
|
||||
|
||||
const payload = {
|
||||
...updateData,
|
||||
@@ -85,7 +84,14 @@ export const useGroupWebhooks = function () {
|
||||
if (data) {
|
||||
this.refreshAll();
|
||||
}
|
||||
loading.value = false;
|
||||
},
|
||||
|
||||
async testOne(id: string | number) {
|
||||
loading.value = true;
|
||||
await api.groupWebhooks.testOne(id);
|
||||
loading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
const webhooks = actions.getAll();
|
||||
|
||||
@@ -162,6 +162,12 @@ export const LOCALES = [
|
||||
progress: 100,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Belge (Belgian)",
|
||||
value: "fr-BE",
|
||||
progress: 100,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "French, Canada",
|
||||
value: "fr-CA",
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { computed, ref } from "@nuxtjs/composition-api";
|
||||
import { computed, reactive, watch } from "@nuxtjs/composition-api";
|
||||
import { useLocalStorage } from "@vueuse/core";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
import { ShoppingListItemOut } from "~/lib/api/types/group";
|
||||
import { ShoppingListItemOut, ShoppingListOut } from "~/lib/api/types/group";
|
||||
import { RequestResponse } from "~/lib/api/types/non-generated";
|
||||
|
||||
const localStorageKey = "shopping-list-queue";
|
||||
const queueTimeout = 5 * 60 * 1000; // 5 minutes
|
||||
@@ -23,27 +24,73 @@ interface Storage {
|
||||
export function useShoppingListItemActions(shoppingListId: string) {
|
||||
const api = useUserApi();
|
||||
const storage = useLocalStorage(localStorageKey, {} as Storage, { deep: true });
|
||||
const queue = storage.value[shoppingListId] ||= { create: [], update: [], delete: [], lastUpdate: Date.now()};
|
||||
const queue = reactive(getQueue());
|
||||
const queueEmpty = computed(() => !queue.create.length && !queue.update.length && !queue.delete.length);
|
||||
if (queueEmpty.value) {
|
||||
queue.lastUpdate = Date.now();
|
||||
}
|
||||
|
||||
const isOffline = ref(false);
|
||||
storage.value[shoppingListId] = { ...queue }
|
||||
watch(
|
||||
() => queue,
|
||||
(value) => {
|
||||
storage.value[shoppingListId] = { ...value }
|
||||
},
|
||||
{
|
||||
deep: true,
|
||||
immediate: true,
|
||||
},
|
||||
)
|
||||
|
||||
function removeFromQueue(queue: ShoppingListItemOut[], item: ShoppingListItemOut): boolean {
|
||||
const index = queue.findIndex(i => i.id === item.id);
|
||||
function isValidQueueObject(obj: any): obj is ShoppingListQueue {
|
||||
if (typeof obj !== "object" || obj === null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const hasRequiredProps = "create" in obj && "update" in obj && "delete" in obj && "lastUpdate" in obj;
|
||||
if (!hasRequiredProps) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const arraysValid = Array.isArray(obj.create) && Array.isArray(obj.update) && Array.isArray(obj.delete);
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
||||
const lastUpdateValid = typeof obj.lastUpdate === "number" && !isNaN(new Date(obj.lastUpdate).getTime());
|
||||
|
||||
return arraysValid && lastUpdateValid;
|
||||
}
|
||||
|
||||
function createEmptyQueue(): ShoppingListQueue {
|
||||
const newQueue = { create: [], update: [], delete: [], lastUpdate: Date.now() };
|
||||
return newQueue;
|
||||
}
|
||||
|
||||
function getQueue(): ShoppingListQueue {
|
||||
try {
|
||||
const fetchedQueue = storage.value[shoppingListId];
|
||||
if (!isValidQueueObject(fetchedQueue)) {
|
||||
console.log("Invalid queue object in local storage; resetting queue.");
|
||||
return createEmptyQueue();
|
||||
} else {
|
||||
return fetchedQueue;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log("Error validating queue object in local storage; resetting queue.", error);
|
||||
return createEmptyQueue();
|
||||
}
|
||||
}
|
||||
|
||||
function removeFromQueue(itemQueue: ShoppingListItemOut[], item: ShoppingListItemOut): boolean {
|
||||
const index = itemQueue.findIndex(i => i.id === item.id);
|
||||
if (index === -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
queue.splice(index, 1);
|
||||
itemQueue.splice(index, 1);
|
||||
return true;
|
||||
}
|
||||
|
||||
async function getList() {
|
||||
const response = await api.shopping.lists.getOne(shoppingListId);
|
||||
handleResponse(response);
|
||||
return response.data;
|
||||
}
|
||||
|
||||
@@ -90,44 +137,59 @@ export function useShoppingListItemActions(shoppingListId: string) {
|
||||
if (itemQueueType === "delete" || itemQueueType === "all") {
|
||||
queue.delete = itemIds ? queue.delete.filter(item => !itemIds.includes(item.id)) : [];
|
||||
}
|
||||
if (queueEmpty.value) {
|
||||
queue.lastUpdate = Date.now();
|
||||
}
|
||||
}
|
||||
|
||||
// Set the storage value explicitly so changes are saved in the browser.
|
||||
storage.value[shoppingListId] = { ...queue };
|
||||
function checkUpdateState(list: ShoppingListOut) {
|
||||
const cutoffDate = new Date(queue.lastUpdate + queueTimeout).toISOString();
|
||||
if (list.updateAt && list.updateAt > cutoffDate) {
|
||||
// If the queue is too far behind the shopping list to reliably do updates, we clear the queue
|
||||
console.log("Out of sync with server; clearing queue");
|
||||
clearQueueItems("all");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the response from the backend and sets the isOffline flag if necessary.
|
||||
* Processes the queue items and returns whether the processing was successful.
|
||||
*/
|
||||
function handleResponse(response: any) {
|
||||
// TODO: is there a better way of checking for network errors?
|
||||
isOffline.value = response.error?.message?.includes("Network Error") || false;
|
||||
}
|
||||
|
||||
async function processQueueItems(
|
||||
action: (items: ShoppingListItemOut[]) => Promise<any>,
|
||||
action: (items: ShoppingListItemOut[]) => Promise<RequestResponse<any>>,
|
||||
itemQueueType: ItemQueueType,
|
||||
) {
|
||||
const queueItems = getQueueItems(itemQueueType);
|
||||
if (!queueItems.length) {
|
||||
return;
|
||||
): Promise<boolean> {
|
||||
let queueItems: ShoppingListItemOut[];
|
||||
try {
|
||||
queueItems = getQueueItems(itemQueueType);
|
||||
if (!queueItems.length) {
|
||||
return true;
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(`Error fetching queue items of type ${itemQueueType}:`, error);
|
||||
clearQueueItems(itemQueueType);
|
||||
return false;
|
||||
}
|
||||
|
||||
const itemsToProcess = [...queueItems];
|
||||
await action(itemsToProcess)
|
||||
.then((response) => {
|
||||
handleResponse(response);
|
||||
if (!isOffline.value) {
|
||||
clearQueueItems(itemQueueType, itemsToProcess.map(item => item.id));
|
||||
}
|
||||
});
|
||||
try {
|
||||
const itemsToProcess = [...queueItems];
|
||||
await action(itemsToProcess)
|
||||
.then(() => {
|
||||
if (window.$nuxt.isOnline) {
|
||||
clearQueueItems(itemQueueType, itemsToProcess.map(item => item.id));
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.log(`Error processing queue items of type ${itemQueueType}:`, error);
|
||||
clearQueueItems(itemQueueType);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
async function process() {
|
||||
if(
|
||||
!queue.create.length &&
|
||||
!queue.update.length &&
|
||||
!queue.delete.length
|
||||
) {
|
||||
if(queueEmpty.value) {
|
||||
queue.lastUpdate = Date.now();
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -135,26 +197,23 @@ export function useShoppingListItemActions(shoppingListId: string) {
|
||||
if (!data) {
|
||||
return;
|
||||
}
|
||||
checkUpdateState(data);
|
||||
|
||||
const cutoffDate = new Date(queue.lastUpdate + queueTimeout).toISOString();
|
||||
if (data.updateAt && data.updateAt > cutoffDate) {
|
||||
// If the queue is too far behind the shopping list to reliably do updates, we clear the queue
|
||||
clearQueueItems("all");
|
||||
} else {
|
||||
// We send each bulk request one at a time, since the backend may merge items
|
||||
await processQueueItems((items) => api.shopping.items.deleteMany(items), "delete");
|
||||
await processQueueItems((items) => api.shopping.items.updateMany(items), "update");
|
||||
await processQueueItems((items) => api.shopping.items.createMany(items), "create");
|
||||
}
|
||||
// We send each bulk request one at a time, since the backend may merge items
|
||||
// "failures" here refers to an actual error, rather than failing to reach the backend
|
||||
let failures = 0;
|
||||
if (!(await processQueueItems((items) => api.shopping.items.deleteMany(items), "delete"))) failures++;
|
||||
if (!(await processQueueItems((items) => api.shopping.items.updateMany(items), "update"))) failures++;
|
||||
if (!(await processQueueItems((items) => api.shopping.items.createMany(items), "create"))) failures++;
|
||||
|
||||
// If we're online, the queue is fully processed, so we're up to date
|
||||
if (!isOffline.value) {
|
||||
// If we're online, or the queue is empty, the queue is fully processed, so we're up to date
|
||||
// Otherwise, if all three queue processes failed, we've already reset the queue, so we need to reset the date
|
||||
if (window.$nuxt.isOnline || queueEmpty.value || failures === 3) {
|
||||
queue.lastUpdate = Date.now();
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
isOffline,
|
||||
getList,
|
||||
createItem,
|
||||
updateItem,
|
||||
|
||||
21
frontend/lang/dateTimeFormats/fr-BE.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"short": {
|
||||
"month": "short",
|
||||
"day": "numeric",
|
||||
"weekday": "long"
|
||||
},
|
||||
"medium": {
|
||||
"month": "long",
|
||||
"day": "numeric",
|
||||
"weekday": "long",
|
||||
"year": "numeric"
|
||||
},
|
||||
"long": {
|
||||
"year": "numeric",
|
||||
"month": "long",
|
||||
"day": "numeric",
|
||||
"weekday": "long",
|
||||
"hour": "numeric",
|
||||
"minute": "numeric"
|
||||
}
|
||||
}
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Voer in met .zip",
|
||||
"create-recipe-from-an-image": "Skep 'n resep vanaf 'n foto",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Grootmaat-URL-invoer",
|
||||
"debug-scraper": "Debug skraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Skep 'n resep deur dit 'n naam te gee. Alle resepte moet unieke name hê.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Permissies",
|
||||
"administrator": "Administrateur",
|
||||
"user-can-invite-other-to-group": "Gebruiker kan ander na groep nooi",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "Gebruiker kan groep bestuur",
|
||||
"user-can-organize-group-data": "Gebruiker kan groepdata organiseer",
|
||||
"enable-advanced-features": "Aktiveer gevorderde funksies",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Create a recipe by providing the name. All recipes must have unique names.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Permissions",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "User can invite other to group",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "User can manage group",
|
||||
"user-can-organize-group-data": "User can organize group data",
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Създайте нова рецепта от чернова.",
|
||||
"create-recipes": "Създайте рецепти",
|
||||
"import-with-zip": "Импортирай от .zip",
|
||||
"create-recipe-from-an-image": "Добави рецепта от снимка",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Импортиране на рецепти от линк",
|
||||
"debug-scraper": "Отстраняване на грешки на скрейпъра",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Добави рецепта като предоставиш име. Всички рецепти трябва да имат уникални имена.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Права",
|
||||
"administrator": "Администратор",
|
||||
"user-can-invite-other-to-group": "Потребителя може да добавя други в групата",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "Потребителя може да управлява групата",
|
||||
"user-can-organize-group-data": "Потребителя може да организира данните на групата",
|
||||
"enable-advanced-features": "Включване на разширени функции",
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
"clear": "Neteja",
|
||||
"close": "Tanca",
|
||||
"confirm": "Confirma",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-how-does-everything-look": "Com es veu tot això?",
|
||||
"confirm-delete-generic": "Esteu segur de voler suprimir-lo?",
|
||||
"copied_message": "S'ha copiat!",
|
||||
"create": "Crea",
|
||||
@@ -248,7 +248,7 @@
|
||||
"private-group": "Grup privat",
|
||||
"private-group-description": "Marcar el grup com a privat afectarà a totes les opcions de visualització pública per defecte. Podeu canviar-les individualment en les opcions de visualització de cada recepta.",
|
||||
"enable-public-access": "Permetre l'accés públic",
|
||||
"enable-public-access-description": "Make group recipes public by default, and allow visitors to view recipes without logging-in",
|
||||
"enable-public-access-description": "Fes les receptes en grup públiques per defecte, i permet a visitants veure receptes sense registrar-se",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Permeteu als usuaris d'altres grups, visualitzar les vostres receptes",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Si ho habiliteu, podreu compartir enllaços públics de receptes específiques sense autoritzar l'usuari. Si està deshabilitat, només podreu compartir amb usuaris del vostre grup o generant enllaços privats",
|
||||
"show-nutrition-information": "Mostra la informació nutricional",
|
||||
@@ -292,7 +292,7 @@
|
||||
"mealplan-updated": "S'ha actualitzat el menú",
|
||||
"no-meal-plan-defined-yet": "No hi ha cap menú planificat",
|
||||
"no-meal-planned-for-today": "No hi han cap menú per a hui",
|
||||
"numberOfDays-hint": "Number of days on page load",
|
||||
"numberOfDays-hint": "Nombre de dies en carregar la pàgina",
|
||||
"numberOfDays-label": "Dies per defecte",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Només s'utilitzaran aquestes categories per als menús",
|
||||
"planner": "Planificador",
|
||||
@@ -323,7 +323,7 @@
|
||||
"meal-plan-rules": "Normes del planificador de menús",
|
||||
"new-rule": "Nova norma",
|
||||
"meal-plan-rules-description": "Podeu crear regles per a la selecció automàtica de receptes per als vostres plans d'àpats. El servidor utilitza aquestes regles per determinar el conjunt aleatori de receptes per seleccionar quan es creen plans d'àpats. Tingueu en compte que si les regles tenen les mateixes restriccions de dia/tipus, les categories de les regles es fusionaran. A la pràctica, no és necessari crear regles duplicades, però és possible fer-ho.",
|
||||
"new-rule-description": "When creating a new rule for a meal plan you can restrict the rule to be applicable for a specific day of the week and/or a specific type of meal. To apply a rule to all days or all meal types you can set the rule to \"Any\" which will apply it to all the possible values for the day and/or meal type.",
|
||||
"new-rule-description": "Quan creis una nova norma per una planificació d'àpats, pots restringir la norma per a què s'apliqui un dia específic de la setmana i/o un tipus d'àpat específic. Per aplicar la norma a tots els dies o a tots els tipus d'àpats, pots configurar la norma a \"Qualsevol\" que l'aplicarà a tots els valors possibles pel dia i/o tipus d'àpat.",
|
||||
"recipe-rules": "Normes per la recepta",
|
||||
"applies-to-all-days": "Aplica a tots els dies",
|
||||
"applies-on-days": "S'aplicarà en {0}s",
|
||||
@@ -364,7 +364,7 @@
|
||||
},
|
||||
"recipe-data-migrations": "Migració de receptes",
|
||||
"recipe-data-migrations-explanation": "Les receptes es poden migrar des d'una altra aplicació suportada cap a Mealie. És una manera genial de començar a utilitzar el Mealie.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Coming from another application or an even older version of Mealie? Check out migrations and see if your data can be imported.",
|
||||
"coming-from-another-application-or-an-even-older-version-of-mealie": "Véns d'una altra aplicació o una versió més antiga de Mealia? Fés un cop d'ull a migracions i mira si pots importar les teves dades.",
|
||||
"choose-migration-type": "Elegeix un tipus de migració",
|
||||
"tag-all-recipes": "Etiqueta totes les receptes amb {tag-name}",
|
||||
"nextcloud-text": "Les receptes de Nextcloud poden ser importades d'un fitxer ZIP que contingui les dades emmagatzemades en Nextcloud. Segueix l'exemple d'estructura de directori de sota per assegurar que les receptes podran ser importades.",
|
||||
@@ -379,11 +379,11 @@
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "La Meva Caixa de Receptes",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
"description-long": "Mealie pot importar receptes de My Recipe Box. Exporta les teves receptes en format CSV, després puja el fitxer .csv aquí sota."
|
||||
},
|
||||
"recipekeeper": {
|
||||
"title": "Recipe Keeper",
|
||||
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
|
||||
"description-long": "Mealie pot importar receptes de RecipeKeeper. Exporta les teves receptes en format zip, després puja el fitxer .zip aquí sota."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -449,8 +449,8 @@
|
||||
"ingredients": "Ingredients",
|
||||
"insert-ingredient": "Afegiu ingredient",
|
||||
"insert-section": "Insereix una secció",
|
||||
"insert-above": "Insert Above",
|
||||
"insert-below": "Insert Below",
|
||||
"insert-above": "Insereix a sobre",
|
||||
"insert-below": "Insereix a sota",
|
||||
"instructions": "Instruccions",
|
||||
"key-name-required": "Es requereix un nom de clau",
|
||||
"landscape-view-coming-soon": "Vista apaïsada (aviat)",
|
||||
@@ -500,11 +500,11 @@
|
||||
"add-to-timeline": "Afegir a la cronologia",
|
||||
"recipe-added-to-list": "Recepta afegida a la llista",
|
||||
"recipes-added-to-list": "Receptes afegides a la llista",
|
||||
"successfully-added-to-list": "Successfully added to list",
|
||||
"successfully-added-to-list": "Exitosament afegit a la llista",
|
||||
"recipe-added-to-mealplan": "Recepta afegida al menú",
|
||||
"failed-to-add-recipes-to-list": "S'ha produït un error al intentar afegir la recepta a la llista",
|
||||
"failed-to-add-recipe-to-mealplan": "S'ha produït un error afegint la recepta al menú",
|
||||
"failed-to-add-to-list": "Failed to add to list",
|
||||
"failed-to-add-to-list": "No s'ha pogut afegir a la llista",
|
||||
"yield": "Racions",
|
||||
"quantity": "Quantitat",
|
||||
"choose-unit": "Tria el tipus d'unitat",
|
||||
@@ -537,14 +537,14 @@
|
||||
"edit-timeline-event": "Edita l'esdeveniment de la cronologia",
|
||||
"timeline": "Cronologia",
|
||||
"timeline-is-empty": "Encara no hi ha res a la cronologia. Prova de fer aquesta recepta!",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No events found. Try adjusting your search filters.",
|
||||
"group-global-timeline": "{groupName} Global Timeline",
|
||||
"timeline-no-events-found-try-adjusting-filters": "No s'han trobat esdeveniments. Prova a ajustar els filtres de cerca.",
|
||||
"group-global-timeline": "Cronologia global de {groupName}",
|
||||
"open-timeline": "Obrir la cronologia",
|
||||
"made-this": "Ho he fet",
|
||||
"how-did-it-turn-out": "Com ha sortit?",
|
||||
"user-made-this": "{user} ha fet això",
|
||||
"last-made-date": "Última vegada feta {date}",
|
||||
"api-extras-description": "Recipes extras are a key feature of the Mealie API. They allow you to create custom JSON key/value pairs within a recipe, to reference from 3rd party applications. You can use these keys to provide information, for example to trigger automations or custom messages to relay to your desired device.",
|
||||
"api-extras-description": "Els extres de receptes són una funcionalitat clau de l'API de Mealie. Permeten crear parells clau/valor JSON personalitzats dins una recepta, per referenciar-los des d'aplicacions de tercers. Pots emprar aquestes claus per proveir informació, per exemple per a desencadenar automatitzacions o missatges personlitzats per a propagar al teu dispositiu desitjat.",
|
||||
"message-key": "Clau del missatge",
|
||||
"parse": "Analitzar",
|
||||
"attach-images-hint": "Afegeix imatges arrossegant i deixant anar la imatge a l'editor",
|
||||
@@ -561,15 +561,20 @@
|
||||
"create-recipe-description": "Crea una nova recepta des de zero.",
|
||||
"create-recipes": "Crea Receptes",
|
||||
"import-with-zip": "Importar amb un .zip",
|
||||
"create-recipe-from-an-image": "Crea la recepta a partir d'una imatge",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Importació d'URL en massa",
|
||||
"debug-scraper": "Rastrejador de depuració",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Crea la recepta proporcionant-ne un nom. Totes les receptes han de tenir un nom únic.",
|
||||
"new-recipe-names-must-be-unique": "Els noms de les noves receptes han de ser únics",
|
||||
"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-have-a-lot-of-recipes": "Have a lot of recipes you want to scrape at once?",
|
||||
"scrape-recipe-suggest-bulk-importer": "Try out the bulk importer",
|
||||
"scrape-recipe-have-a-lot-of-recipes": "Tens moltes receptes a processar alhora?",
|
||||
"scrape-recipe-suggest-bulk-importer": "Prova l'importador a granel",
|
||||
"import-original-keywords-as-tags": "Importa les paraules clau originals com a tags",
|
||||
"stay-in-edit-mode": "Segueix en el mode d'edició",
|
||||
"import-from-zip": "Importa des d'un ZIP",
|
||||
@@ -586,8 +591,8 @@
|
||||
"report-deletion-failed": "No s'ha pogut suprimir l'informe",
|
||||
"recipe-debugger": "Depuradora de receptes",
|
||||
"recipe-debugger-description": "Agafa l'URL de la recepta que vols depurar i enganxa-la aquí. L'URL serà reastrejada pel rastrejador de receptes i es mostraran els resultats. Si no veieu cap dada retornada, el lloc que esteu provant de rastrejar no és compatible amb Mealie ni la seva biblioteca de rastreig.",
|
||||
"use-openai": "Use OpenAI",
|
||||
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
|
||||
"use-openai": "Fes servir OpenAI",
|
||||
"recipe-debugger-use-openai-description": "Fes servir OpenAI per processar els resultats en comptes d'emprar la llibreria de processat. Quan creis una recepta via URL, es fa automàticament si la llibreria falla, però ho pots provar manualment aquí.",
|
||||
"debug": "Depuració",
|
||||
"tree-view": "Vista en arbre",
|
||||
"recipe-yield": "Rendiment de la recepta",
|
||||
@@ -598,19 +603,19 @@
|
||||
"nextStep": "Següent pas",
|
||||
"recipe-actions": "Accions de la Recepta",
|
||||
"parser": {
|
||||
"experimental-alert-text": "Mealie uses natural language processing to parse and create units and food items for your recipe ingredients. This feature is experimental and may not always work as expected. If you prefer not to use the parsed results, you can select 'Cancel' and your changes will not be saved.",
|
||||
"ingredient-parser": "Ingredient Parser",
|
||||
"explanation": "To use the ingredient parser, click the 'Parse All' button to start the process. Once the processed ingredients are available, you can review the items and verify that they were parsed correctly. The model's confidence score is displayed on the right of the item title. This score is an average of all the individual scores and may not always be completely accurate.",
|
||||
"alerts-explainer": "Alerts will be displayed if a matching foods or unit is found but does not exists in the database.",
|
||||
"select-parser": "Select Parser",
|
||||
"natural-language-processor": "Natural Language Processor",
|
||||
"brute-parser": "Brute Parser",
|
||||
"experimental-alert-text": "Mealie fa servir processament de llenguatge natural per processar i crear unitats i elements de menjar pels ingredients de la teva recepta. Aquesta funcionalitat és experimental i pot no funcionar com s'espera. Si prefereixes no fer servir els resultats processats, pots seleccionar \"Cancel·la\" i els canvis no es guardaran.",
|
||||
"ingredient-parser": "Processador d'ingredients",
|
||||
"explanation": "Per fer servir el processador d'aliments, clica el botó \"Processa tot\" per començar el procés. Un cop els ingredients processats estiguin disponibles, pots revisar-los per comprovar que s'hagin processat degudament. La confiança del model és mostrada a la dreta del títol de l'element. Aquesta puntuació es la mitja de totes les puntuacions individuals i pot no ser del tot precisa.",
|
||||
"alerts-explainer": "Es mostraran alertes si un menjar o unitat coincident es troben però no existeixen a la base de dades.",
|
||||
"select-parser": "Selecciona processador",
|
||||
"natural-language-processor": "Processador de llenguatge natural",
|
||||
"brute-parser": "Processador brut",
|
||||
"openai-parser": "Analitzador d'OpenAI",
|
||||
"parse-all": "Parse All",
|
||||
"no-unit": "No unit",
|
||||
"missing-unit": "Create missing unit: {unit}",
|
||||
"missing-food": "Create missing food: {food}",
|
||||
"no-food": "No Food"
|
||||
"parse-all": "Processa tot",
|
||||
"no-unit": "Sense unitat",
|
||||
"missing-unit": "Crear unitat que manca: {unit}",
|
||||
"missing-food": "Crear menjar que manca: {food}",
|
||||
"no-food": "Sense menjar"
|
||||
}
|
||||
},
|
||||
"search": {
|
||||
@@ -640,7 +645,7 @@
|
||||
"backup-created-at-response-export_path": "S'ha creat una còpia de seguretat a {path}",
|
||||
"backup-deleted": "Còpia de seguretat suprimida",
|
||||
"restore-success": "La restauració s'ha dut a terme correctament",
|
||||
"restore-fail": "Restore failed. Check your server logs for more details",
|
||||
"restore-fail": "Restauració fallida. Comprova els logs del servidor per més detalls",
|
||||
"backup-tag": "Etiqueta de la còpia de seguretat",
|
||||
"create-heading": "Crea una còpia de seguretat",
|
||||
"delete-backup": "Esborra la còpia de seguretat",
|
||||
@@ -649,7 +654,7 @@
|
||||
"import-summary": "Resum de la importació",
|
||||
"partial-backup": "Còpia de seguretat parcial",
|
||||
"unable-to-delete-backup": "No s'ha pogut suprimir la còpia.",
|
||||
"experimental-description": "Backups are total snapshots of the database and data directory of the site. This includes all data and cannot be set to exclude subsets of data. You can think of this as a snapshot of Mealie at a specific time. These serve as a database agnostic way to export and import data, or back up the site to an external location.",
|
||||
"experimental-description": "Les còpies de seguretat són captures instantànies totals de la base de dades i el directori de dades de la pàgina. Això inclou totes les dades i no es pot configurar per excloure subconjunts de dades. Pots conceptualiztar-ho com una captura de Mealie en un moment concret. Permeten poder exportar i importar dades d'una manera agnòstica de bases de dades, o per fer còpies de seguretat de la pàgina a localitzacions externes.",
|
||||
"backup-restore": "Restaura la còpia de seguretat",
|
||||
"back-restore-description": "Restaurar aquesta còpia de seguretat sobreescriurà totes les dades actuals de la teva base de dades i qualsevol directori i els substituirà amb el contingut d'aquesta còpia de seguretat. {cannot-be-undone} Si la restauració es duu a terme correctament, se us tancarà la sessió.",
|
||||
"cannot-be-undone": "Aquesta acció no es pot desfer. Utilitza-la amb precaució.",
|
||||
@@ -744,18 +749,18 @@
|
||||
"description": "Els webhooks definits a sota s'executaran quan es defineixi un menú pel dia. En un temps estipulat, els webhooks s'enviaran amb les dades de la recepta que estigui programada pel dia. L'execució dels webhooks no és exacta. Els webhooks s'executen en un interval de 5 minuts, és a dir, que s'executaran en un interval de +/- 5 minuts del temps estipulat."
|
||||
},
|
||||
"bug-report": "Informe d'errors",
|
||||
"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": "Fes servir aquesta informació per reportar un bug. Proporcionar detalls de la teva instància als desenvolupadors és la millor manera de resoldre't els problemes ràpidament.",
|
||||
"tracker": "Tracker",
|
||||
"configuration": "Configuració",
|
||||
"docker-volume": "Volum de Docker",
|
||||
"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-configured-correctly": "Volumes are configured correctly.",
|
||||
"status-unknown-try-running-a-validation": "Status Unknown. Try running a validation.",
|
||||
"validate": "Validate",
|
||||
"docker-volume-help": "Mealie requereix que els contenidors del frontend i del backend comparteixin el mateix volum docker o emmagatzematge. Això assegura que el contenidor del frontend pot accedir correctament les imatges i béns guardats en disc.",
|
||||
"volumes-are-misconfigured": "Els volums no estan ben configurats.",
|
||||
"volumes-are-configured-correctly": "Els volums estan ben configurats.",
|
||||
"status-unknown-try-running-a-validation": "Estat desconegut. Prova a executar una validació.",
|
||||
"validate": "Valida",
|
||||
"email-configuration-status": "Estat de la configuració del correu electrònic",
|
||||
"email-configured": "Correu electrònic configurat",
|
||||
"email-test-results": "Email Test Results",
|
||||
"email-test-results": "Resultats de la prova de correu electrònic",
|
||||
"ready": "Llest",
|
||||
"not-ready": "No està llest - Comprova les variables d'entorn",
|
||||
"succeeded": "Va tenir èxit",
|
||||
@@ -767,14 +772,14 @@
|
||||
"secure-site": "Web Segur",
|
||||
"secure-site-error-text": "Allotja mitjançant localhost o assegura amb https. És possible que el porta-retalls i API addicionals del navegador no funcionin.",
|
||||
"secure-site-success-text": "El web és accedit amb localhost o https",
|
||||
"server-side-base-url": "Server Side Base 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-success-text": "Server Side URL does not match the default",
|
||||
"ldap-ready": "LDAP Ready",
|
||||
"ldap-ready-error-text": "Not all LDAP Values are configured. This can be ignored if you are not using LDAP Authentication.",
|
||||
"server-side-base-url": "URL base de part del servidor",
|
||||
"server-side-base-url-error-text": "'BASE_URL' és encara el valor per defecte a l'API de servidor. Això causarà errors amb enllaços de notificació generats al servidor per correus electrònics, etc.",
|
||||
"server-side-base-url-success-text": "L'URL de part del servidor no correspon amb el predeterminat",
|
||||
"ldap-ready": "LDAP a punt",
|
||||
"ldap-ready-error-text": "No tots els valors LDAP estan configurats. Això es pot ignorar si no es fa servir autentificació LDAP.",
|
||||
"ldap-ready-success-text": "Les variables requerides per LDAP estan establertes.",
|
||||
"build": "Versió de compilació",
|
||||
"recipe-scraper-version": "Recipe Scraper Version",
|
||||
"recipe-scraper-version": "Versió de processador de receptes",
|
||||
"oidc-ready": "OIDC Llest",
|
||||
"oidc-ready-error-text": "No tots els valors d'OIDC estan configurats. Es pot ignorar si no s'està utilitzant l'autenticació d'OIDC.",
|
||||
"oidc-ready-success-text": "Les variables requerides per OICD estan establertes.",
|
||||
@@ -806,15 +811,15 @@
|
||||
"reorder-labels": "Canvia d'ordre les etiquetes",
|
||||
"uncheck-all-items": "Desselecciona tots els ítems",
|
||||
"check-all-items": "Selecciona tots els ítems",
|
||||
"linked-recipes-count": "No Linked Recipes|One Linked Recipe|{count} Linked Recipes",
|
||||
"items-checked-count": "No items checked|One item checked|{count} items checked",
|
||||
"linked-recipes-count": "Cap recepta enllaçada|Una recepta enllaçada|{count} receptes enllaçades",
|
||||
"items-checked-count": "Cap element marcat|Un element marcat|{count} elements marcats",
|
||||
"no-label": "Sense etiqueta",
|
||||
"completed-on": "Completat el {date}",
|
||||
"you-are-offline": "You are offline",
|
||||
"you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?"
|
||||
"you-are-offline": "Estàs desconnectat",
|
||||
"you-are-offline-description": "No totes les funcionalitats són disponibles desconnectat. Encara pots afegir, modificar i eliminar elements, però no podràs sincronitzar els teus canvis amb el servidor fins que et tornis a connectar.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Estàs segur que vols marcar tots els elements?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Estàs segur que vols desmarcar tots els elements?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Estàs segur que vols eliminar tots els elements marcats?"
|
||||
},
|
||||
"sidebar": {
|
||||
"all-recipes": "Receptes",
|
||||
@@ -898,7 +903,7 @@
|
||||
"or": "o",
|
||||
"logout": "Tanca la sessió",
|
||||
"manage-users": "Gestionar usuaris",
|
||||
"manage-users-description": "Create and manage users.",
|
||||
"manage-users-description": "Crea i gestiona usuaris.",
|
||||
"new-password": "Nova contrasenya",
|
||||
"new-user": "Nou Usuari",
|
||||
"password-has-been-reset-to-the-default-password": "S'ha restablert la contrasenya al seu valor per defecte",
|
||||
@@ -951,21 +956,21 @@
|
||||
"user-management": "Gestió d'usuaris",
|
||||
"reset-locked-users": "Reinicia els usuaris bloquejats",
|
||||
"admin-user-creation": "Creació d'un usuari administrador",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"admin-user-management": "Gestió d'usuari administrador",
|
||||
"user-details": "Detalls de l'usuari",
|
||||
"user-name": "Nom de l'usuari",
|
||||
"authentication-method": "Authentication Method",
|
||||
"authentication-method": "Mètode d'autentificació",
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Permisos",
|
||||
"administrator": "Administrador",
|
||||
"user-can-invite-other-to-group": "User can invite other to group",
|
||||
"user-can-manage-group": "User can manage group",
|
||||
"user-can-organize-group-data": "User can organize group data",
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
"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!",
|
||||
"user-can-invite-other-to-group": "L'usuari pot convidar a altres al grup",
|
||||
"user-can-manage-group": "L'usuari pot gestionar el grup",
|
||||
"user-can-organize-group-data": "L'usuari pot organitzar dades del grup",
|
||||
"enable-advanced-features": "Activa funcionalitats avançades",
|
||||
"it-looks-like-this-is-your-first-time-logging-in": "Sembla que és el primer cop que et registres.",
|
||||
"dont-want-to-see-this-anymore-be-sure-to-change-your-email": "No vols tornar a veure això? Assegura't de canviar el teu correu electrònic a les configuracions del teu usuari!",
|
||||
"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": "Introdueix siusplau la teva adreça de correu electrònic i t'enviarem un enllaç per restablir la teva contrassenya.",
|
||||
"changes-reflected-immediately": "Els canvis en aquest usuari s'actualitzaran immediatament."
|
||||
},
|
||||
"language-dialog": {
|
||||
@@ -985,21 +990,21 @@
|
||||
"source-food": "Aliment d'Origen",
|
||||
"target-food": "Aliment de Destí",
|
||||
"create-food": "Crear Aliment",
|
||||
"food-label": "Food Label",
|
||||
"food-label": "Etiqueta de menjar",
|
||||
"edit-food": "Editar Aliment",
|
||||
"food-data": "Food Data",
|
||||
"food-data": "Dades de menjar",
|
||||
"example-food-singular": "p. ex.: Ceba",
|
||||
"example-food-plural": "p. ex.: Cebes",
|
||||
"label-overwrite-warning": "This will assign the chosen label to all selected foods and potentially overwrite your existing labels.",
|
||||
"on-hand-checkbox-label": "Setting this flag will make this food unchecked by default when adding a recipe to a shopping list."
|
||||
"label-overwrite-warning": "Això assignarà l'etiqueta escollida als menjars seleccionats i pot sobreescriure potencialment etiquetes ja existents.",
|
||||
"on-hand-checkbox-label": "Aplicar aquest atribut farà que aquest menjar no es marqui per defecte quan afegeixis una recepta a la llista de la compra."
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Afegeix a la base de dades les unitats més comunes en el vostre idioma.",
|
||||
"combine-unit-description": "Combining the selected units will merge the Source Unit and Target Unit into a single unit. The {source-unit-will-be-deleted} and all of the references to the Source Unit will be updated to point to the Target Unit.",
|
||||
"combine-unit-description": "Combinar les unitats seleccionades ajuntarà la Unitat Origen amb la Unitat Objectiu en una sola unitat. La {source-unit-will-be-deleted} i totes les referències a la Unitat Origen s'actualitzaran per referir a la Unitat Objectiu.",
|
||||
"combine-unit": "Combina Unitats",
|
||||
"source-unit": "Unitat Origen",
|
||||
"target-unit": "Unitat Destí",
|
||||
"merging-unit-into-unit": "Merging {0} into {1}",
|
||||
"merging-unit-into-unit": "Fusionant {0} a {1}",
|
||||
"create-unit": "Crea la unitat",
|
||||
"abbreviation": "Abreviatura",
|
||||
"plural-abbreviation": "Abreviatura del Plural",
|
||||
@@ -1007,77 +1012,77 @@
|
||||
"display-as-fraction": "Mostra com una Fracció",
|
||||
"use-abbreviation": "Utilitza Abreviatura",
|
||||
"edit-unit": "Editar Unitat",
|
||||
"unit-data": "Unit Data",
|
||||
"use-abbv": "Use Abbv.",
|
||||
"fraction": "Fraction",
|
||||
"example-unit-singular": "ex: Tablespoon",
|
||||
"example-unit-plural": "ex: Tablespoons",
|
||||
"unit-data": "Dades d'unitat",
|
||||
"use-abbv": "Fes servir abreviació",
|
||||
"fraction": "Fracció",
|
||||
"example-unit-singular": "ex: Cullerada sopera",
|
||||
"example-unit-plural": "ex: Cullerades soperes",
|
||||
"example-unit-abbreviation-singular": "ex: Tbsp",
|
||||
"example-unit-abbreviation-plural": "ex: Tbsps"
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Afegeix a la base de dades etiquetes comunes en el vostre idioma.",
|
||||
"edit-label": "Edit Label",
|
||||
"new-label": "New Label",
|
||||
"labels": "Labels",
|
||||
"edit-label": "Edita etiqueta",
|
||||
"new-label": "Nova etiqueta",
|
||||
"labels": "Etiquetes",
|
||||
"assign-label": "Assigna L'etiqueta"
|
||||
},
|
||||
"recipes": {
|
||||
"purge-exports": "Purge Exports",
|
||||
"are-you-sure-you-want-to-delete-all-export-data": "Are you sure you want to delete all export data?",
|
||||
"confirm-delete-recipes": "Are you sure you want to delete the following recipes? This action cannot be undone.",
|
||||
"the-following-recipes-selected-length-will-be-exported": "The following recipes ({0}) will be exported.",
|
||||
"settings-chosen-explanation": "Settings chosen here, excluding the locked option, will be applied to all selected recipes.",
|
||||
"selected-length-recipe-s-settings-will-be-updated": "{count} recipe(s) settings will be updated.",
|
||||
"recipe-data": "Recipe Data",
|
||||
"recipe-data-description": "Use this section to manage the data associated with your recipes. You can perform several bulk actions on your recipes including exporting, deleting, tagging, and assigning categories.",
|
||||
"recipe-columns": "Recipe Columns",
|
||||
"data-exports-description": "This section provides links to available exports that are ready to download. These exports do expire, so be sure to grab them while they're still available.",
|
||||
"data-exports": "Data Exports",
|
||||
"tag": "Tag",
|
||||
"categorize": "Categorize",
|
||||
"update-settings": "Update Settings",
|
||||
"tag-recipes": "Tag Recipes",
|
||||
"categorize-recipes": "Categorize Recipes",
|
||||
"export-recipes": "Export Recipes",
|
||||
"delete-recipes": "Delete Recipes",
|
||||
"source-unit-will-be-deleted": "Source Unit will be deleted"
|
||||
"purge-exports": "Purga exportacions",
|
||||
"are-you-sure-you-want-to-delete-all-export-data": "Estàs segur que vols esborrar totes les dades d'exportació?",
|
||||
"confirm-delete-recipes": "Estàs segur que vols esborrar les següents receptes? Aquesta acció no es pot desfer.",
|
||||
"the-following-recipes-selected-length-will-be-exported": "Les següents receptes ({0}) seran exportades.",
|
||||
"settings-chosen-explanation": "Configuracions escollides aquí, excloent la opció bloquejada, s'aplicaran a totes les receptes seleccionades.",
|
||||
"selected-length-recipe-s-settings-will-be-updated": "{count} configuració(ns) de recepte(s) seran actualitzades.",
|
||||
"recipe-data": "Dades de recepta",
|
||||
"recipe-data-description": "Empra aquesta secció per gestionar les dades associades a les teves receptes. Pots fer diverses accions en lot a les teves receptes, inclosos exportar, esborrar, etiquetar i assignar categories.",
|
||||
"recipe-columns": "Columnes de recepta",
|
||||
"data-exports-description": "Aquesta secció ofereix enllaços a exportacions disponibles ja preparades per a descarregar. Aquestes exportacions caduquen, així que assegura't agafar-les quan encara estan disponibles.",
|
||||
"data-exports": "Exportacions de dades",
|
||||
"tag": "Etiqueta",
|
||||
"categorize": "Categoritza",
|
||||
"update-settings": "Actualitza configuracions",
|
||||
"tag-recipes": "Etiqueta receptes",
|
||||
"categorize-recipes": "Categoritza receptes",
|
||||
"export-recipes": "Exporta receptes",
|
||||
"delete-recipes": "Esborra receptes",
|
||||
"source-unit-will-be-deleted": "Unitat Origen serà eliminada"
|
||||
},
|
||||
"recipe-actions": {
|
||||
"recipe-actions-data": "Recipe Actions Data",
|
||||
"new-recipe-action": "New Recipe Action",
|
||||
"edit-recipe-action": "Edit Recipe Action",
|
||||
"action-type": "Action Type"
|
||||
"recipe-actions-data": "Dades d'accions de receptes",
|
||||
"new-recipe-action": "Nova acció de receptes",
|
||||
"edit-recipe-action": "Edita acció de receptes",
|
||||
"action-type": "Tipus d'acció"
|
||||
},
|
||||
"create-alias": "Create Alias",
|
||||
"manage-aliases": "Manage Aliases",
|
||||
"create-alias": "Crea un àlies",
|
||||
"manage-aliases": "Gestiona els àlies",
|
||||
"seed-data": "Dades d'exemple",
|
||||
"seed": "Seed",
|
||||
"data-management": "Data Management",
|
||||
"data-management-description": "Select which data set you want to make changes to.",
|
||||
"select-data": "Select Data",
|
||||
"select-language": "Select Language",
|
||||
"columns": "Columns",
|
||||
"combine": "Combine",
|
||||
"seed": "Llavor",
|
||||
"data-management": "Gestió de dades",
|
||||
"data-management-description": "Selecciona a quin conjunt de dades hi vols fer canvis.",
|
||||
"select-data": "Selecciona dades",
|
||||
"select-language": "Selecciona l'idioma",
|
||||
"columns": "Columnes",
|
||||
"combine": "Combina",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"category-data": "Category Data"
|
||||
"edit-category": "Edita categoria",
|
||||
"new-category": "Nova categoria",
|
||||
"category-data": "Dades de categoria"
|
||||
},
|
||||
"tags": {
|
||||
"new-tag": "New Tag",
|
||||
"edit-tag": "Edit Tag",
|
||||
"tag-data": "Tag Data"
|
||||
"new-tag": "Nova etiqueta",
|
||||
"edit-tag": "Edita etiqueta",
|
||||
"tag-data": "Dades d'etiqueta"
|
||||
},
|
||||
"tools": {
|
||||
"new-tool": "New Tool",
|
||||
"edit-tool": "Edit Tool",
|
||||
"tool-data": "Tool Data"
|
||||
"new-tool": "Nova eina",
|
||||
"edit-tool": "Edita eina",
|
||||
"tool-data": "Dades d'eina"
|
||||
}
|
||||
},
|
||||
"user-registration": {
|
||||
"user-registration": "Registre d'usuari",
|
||||
"registration-success": "Registration Success",
|
||||
"registration-success": "Registre exitós",
|
||||
"join-a-group": "Uneix-te a un grup",
|
||||
"create-a-new-group": "Crea un grup nou",
|
||||
"provide-registration-token-description": "Per favor, proporciona el token associat al grup al qual voleu afegir-vos. Podeu obtindre'l d'un altre membre del grup.",
|
||||
@@ -1091,7 +1096,7 @@
|
||||
"group-name-is-taken": "Aquest nom ja existeix per a un altre grup",
|
||||
"username-is-taken": "Aquest nom ja existeix per a un altre usuari",
|
||||
"email-is-taken": "Aquest email ja existeix per a un altre usuari",
|
||||
"this-field-is-required": "This Field is Required"
|
||||
"this-field-is-required": "Aquest camp és obligatori"
|
||||
},
|
||||
"export": {
|
||||
"export": "Exporta",
|
||||
@@ -1124,134 +1129,134 @@
|
||||
},
|
||||
"ocr-editor": {
|
||||
"ocr-editor": "Editor OCR",
|
||||
"toolbar": "Toolbar",
|
||||
"toolbar": "Barra d'eines",
|
||||
"selection-mode": "Mode de selecció",
|
||||
"pan-and-zoom-picture": "Amplia la imatge",
|
||||
"split-text": "Divideix el text",
|
||||
"preserve-line-breaks": "Preserveu els salts de línia originals",
|
||||
"split-by-block": "Dividiu per blocs de text",
|
||||
"flatten": "Flatten regardless of original formating",
|
||||
"flatten": "Aplana sense considerar el format original",
|
||||
"help": {
|
||||
"help": "Help",
|
||||
"mouse-modes": "Mouse modes",
|
||||
"help": "Ajuda",
|
||||
"mouse-modes": "Modes de ratolí",
|
||||
"selection-mode": "Mode de selecció (predeterminat)",
|
||||
"selection-mode-desc": "The selection mode is the main mode that can be used to enter data:",
|
||||
"selection-mode-desc": "El mode de selecció és el principal mode a fer servir per introduïr dades:",
|
||||
"selection-mode-steps": {
|
||||
"draw": "Draw a rectangle on the text you want to select.",
|
||||
"click": "Click on any field on the right and then click back on the rectangle above the image.",
|
||||
"result": "The selected text will appear inside the previously selected field."
|
||||
"draw": "Dibuixa un rectangle al text que vulguis seleccionar.",
|
||||
"click": "Clica a qualsevol camp a la dreta i després clica al rectangle de sobre la imatge.",
|
||||
"result": "El text seleccionat apareixerà dins del camp prèviament seleccionat."
|
||||
},
|
||||
"pan-and-zoom-mode": "Pan and Zoom Mode",
|
||||
"pan-and-zoom-desc": "Select pan and zoom by clicking the icon. This mode allows to zoom inside the image and move around to make using big images easier.",
|
||||
"split-text-mode": "Split Text modes",
|
||||
"pan-and-zoom-mode": "Mode Pan i Zoom",
|
||||
"pan-and-zoom-desc": "Selecciona Pan i Zoom clicant-ne la icona. Aquest mode et permet fer zoom dins la imatge i moure-t'hi per facilitar l'ús d'imatges grosses.",
|
||||
"split-text-mode": "Modes de text partit",
|
||||
"split-modes": {
|
||||
"line-mode": "Line mode (default)",
|
||||
"line-mode-desc": "In line mode, the text will be propagated by keeping the original line breaks. This mode is useful when using bulk add on a list of ingredients where one ingredient is one line.",
|
||||
"block-mode": "Block mode",
|
||||
"block-mode-desc": "In block mode, the text will be split in blocks. This mode is useful when bulk adding instructions that are usually written in paragraphs.",
|
||||
"flat-mode": "Flat mode",
|
||||
"flat-mode-desc": "In flat mode, the text will be added to the selected recipe field with no line breaks."
|
||||
"line-mode": "Mode línia (per defecte)",
|
||||
"line-mode-desc": "En mode línia, el text es propagarà mantenint els salts de línia originals. Aquest mode és útil afegint a lots a llistes d'ingredients on cada ingredient és a una línia.",
|
||||
"block-mode": "Mode bloc",
|
||||
"block-mode-desc": "En mode bloc, el text es partirà en blocs. Aquest mode és útil afegint instruccions en lot normalment escrites en paràgrafs.",
|
||||
"flat-mode": "Mode pla",
|
||||
"flat-mode-desc": "En mode pla, el text s'afegirà al camp seleccionat de la recepta sense salts de línia."
|
||||
}
|
||||
}
|
||||
},
|
||||
"admin": {
|
||||
"maintenance": {
|
||||
"storage-details": "Storage Details",
|
||||
"page-title": "Site Maintenance",
|
||||
"summary-title": "Summary",
|
||||
"button-label-get-summary": "Get Summary",
|
||||
"button-label-open-details": "Details",
|
||||
"info-description-data-dir-size": "Data Directory Size",
|
||||
"info-description-log-file-size": "Log File Size",
|
||||
"info-description-cleanable-directories": "Cleanable Directories",
|
||||
"info-description-cleanable-images": "Cleanable Images",
|
||||
"storage-details": "Detalls d'emmagatzematge",
|
||||
"page-title": "Manteniment de la pàgina",
|
||||
"summary-title": "Resum",
|
||||
"button-label-get-summary": "Obtenir resum",
|
||||
"button-label-open-details": "Detalls",
|
||||
"info-description-data-dir-size": "Tamany del directori de dades",
|
||||
"info-description-log-file-size": "Tamany del fitxer de log",
|
||||
"info-description-cleanable-directories": "Directoris netejables",
|
||||
"info-description-cleanable-images": "Imatges netejables",
|
||||
"storage": {
|
||||
"title-temporary-directory": "Temporary Directory (.temp)",
|
||||
"title-backups-directory": "Backups Directory (backups)",
|
||||
"title-groups-directory": "Groups Directory (groups)",
|
||||
"title-recipes-directory": "Recipes Directory (recipes)",
|
||||
"title-user-directory": "User Directory (user)"
|
||||
"title-temporary-directory": "Directori temporal (.temp)",
|
||||
"title-backups-directory": "Directori de còpies de seguretat (backups)",
|
||||
"title-groups-directory": "Directori de grups (groups)",
|
||||
"title-recipes-directory": "Directori de receptes (recipes)",
|
||||
"title-user-directory": "Direcori d'usuari (user)"
|
||||
},
|
||||
"action-delete-log-files-name": "Delete Log Files",
|
||||
"action-delete-log-files-description": "Deletes all the log files",
|
||||
"action-clean-directories-name": "Clean Directories",
|
||||
"action-clean-directories-description": "Removes all the recipe folders that are not valid UUIDs",
|
||||
"action-clean-temporary-files-name": "Clean Temporary Files",
|
||||
"action-clean-temporary-files-description": "Removes all files and folders in the .temp directory",
|
||||
"action-clean-images-name": "Clean Images",
|
||||
"action-clean-images-description": "Removes all the images that don't end with .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-destructive": "destructive",
|
||||
"action-delete-log-files-name": "Esborra fitxers log",
|
||||
"action-delete-log-files-description": "Esborra tots els fitxers log",
|
||||
"action-clean-directories-name": "Neteja directoris",
|
||||
"action-clean-directories-description": "Esborra totes les carpetes de receptes que no són UUIDs vàlids",
|
||||
"action-clean-temporary-files-name": "Esborra fitxers temporals",
|
||||
"action-clean-temporary-files-description": "Esborra tots els fitxers i carpetes del directori .temp",
|
||||
"action-clean-images-name": "Neteja imatges",
|
||||
"action-clean-images-description": "Esborra totes les imatges que no acaben en .webp",
|
||||
"actions-description": "Les accions de manteniment són {destructive_in_bold} i s'han d'emprar amb cautela. Fer qualsevol d'aquestes accions és {irreversible_in_bold}.",
|
||||
"actions-description-destructive": "destructiu",
|
||||
"actions-description-irreversible": "irreversible",
|
||||
"logs-action-refresh": "Refresh Logs",
|
||||
"logs-page-title": "Mealie Logs",
|
||||
"logs-tail-lines-label": "Tail Lines"
|
||||
"logs-action-refresh": "Actualitza logs",
|
||||
"logs-page-title": "Logs de Mealie",
|
||||
"logs-tail-lines-label": "Línies de la cua"
|
||||
},
|
||||
"mainentance": {
|
||||
"actions-title": "Actions"
|
||||
"actions-title": "Accions"
|
||||
},
|
||||
"ingredients-natural-language-processor": "Ingredients Natural Language Processor",
|
||||
"ingredients-natural-language-processor-explanation": "Mealie uses Conditional Random Fields (CRFs) for parsing and processing ingredients. The model used for ingredients is based off a data set of over 100,000 ingredients from a dataset compiled by the New York Times. Note that as the model is trained in English only, you may have varied results when using the model in other languages. This page is a playground for testing the model.",
|
||||
"ingredients-natural-language-processor-explanation-2": "It's not perfect, but it yields great results in general and is a good starting point for manually parsing ingredients into individual fields. Alternatively, you can also use the \"Brute\" processor that uses a pattern matching technique to identify ingredients.",
|
||||
"ingredients-natural-language-processor": "Processador de llenguatge natural d'ingredients",
|
||||
"ingredients-natural-language-processor-explanation": "Mealie fa servir Camps Condicionals Aleatoris (CRFs) per processar ingredients. El model emprat es basa en un conjunt de dades de més de 100.000 ingredients d'un conjunt de dades compilat pel New York Times. Noti's que aquest model s'ha entrenat només en anglès, pots tenir resultats variats fent-lo servir en altres idiomes. Aquesta pàgina és un espai de joc per provar el model.",
|
||||
"ingredients-natural-language-processor-explanation-2": "No és perfecte, però ofereix bons resultats en general i és un bon punt de partida per processar manualment ingredients a camps individuals. Alternativament, també pots fer servir el processador \"brut\" que fa servir una tècnica de reconeixement de patrons per identificar ingredients.",
|
||||
"nlp": "NLP",
|
||||
"brute": "Brute",
|
||||
"brute": "Brut",
|
||||
"openai": "OpenAI",
|
||||
"show-individual-confidence": "Show individual confidence",
|
||||
"ingredient-text": "Ingredient Text",
|
||||
"average-confident": "{0} Confident",
|
||||
"try-an-example": "Try an example",
|
||||
"parser": "Parser",
|
||||
"background-tasks": "Background Tasks",
|
||||
"background-tasks-description": "Here you can view all the running background tasks and their status",
|
||||
"no-logs-found": "No Logs Found",
|
||||
"tasks": "Tasks",
|
||||
"show-individual-confidence": "Mostra confiança individual",
|
||||
"ingredient-text": "Text d'ingredient",
|
||||
"average-confident": "{0} confiança",
|
||||
"try-an-example": "Prova un exemple",
|
||||
"parser": "Processador",
|
||||
"background-tasks": "Tasques en segon pla",
|
||||
"background-tasks-description": "Aquí pots revisar les tasques en segon pla en execució i els seus estats",
|
||||
"no-logs-found": "No s'han trobat logs",
|
||||
"tasks": "Tasques",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
"already-set-up-bring-to-homepage": "I'm already set up, just bring me to the homepage",
|
||||
"common-settings-for-new-sites": "Here are some common settings for new sites",
|
||||
"setup-complete": "Setup Complete!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Here are a few things to help you get started with Mealie",
|
||||
"restore-from-v1-backup": "Have a backup from a previous instance of Mealie v1? You can restore it here.",
|
||||
"manage-profile-or-get-invite-link": "Manage your own profile, or grab an invite link to share with others."
|
||||
"first-time-setup": "Configuració de primer cop",
|
||||
"welcome-to-mealie-get-started": "Benvingut/da a Mealie! Anem per feina",
|
||||
"already-set-up-bring-to-homepage": "Ja ho tinc configurat, porta'm a la pàgina principal",
|
||||
"common-settings-for-new-sites": "Aquí hi ha algunes configuracions comunes per noves pàgines",
|
||||
"setup-complete": "Configuració completada!",
|
||||
"here-are-a-few-things-to-help-you-get-started": "Aquí hi ha unes quantes coses per ajudar-te a posar Mealie en marxa",
|
||||
"restore-from-v1-backup": "Tens una còpia de seguretat d'una instància prèvia de Mealie v1? Pots restaurar-la aquí.",
|
||||
"manage-profile-or-get-invite-link": "Gestiona el teu propi perfil, o agafa un enllaç d'invitació per compartir amb altres."
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Welcome, {0}!",
|
||||
"description": "Manage your profile, recipes, and group settings.",
|
||||
"get-invite-link": "Get Invite Link",
|
||||
"welcome-user": "👋 Benvingut/Benvinguda, {0}!",
|
||||
"description": "Gestiona el teu perfil, receptes i configuracions de grup.",
|
||||
"get-invite-link": "Obtén enllaç d'invitacio",
|
||||
"get-public-link": "Enllaç públic",
|
||||
"account-summary": "Account Summary",
|
||||
"account-summary-description": "Here's a summary of your group's information.",
|
||||
"group-statistics": "Group Statistics",
|
||||
"group-statistics-description": "Your Group Statistics provide some insight how you're using Mealie.",
|
||||
"storage-capacity": "Storage Capacity",
|
||||
"storage-capacity-description": "Your storage capacity is a calculation of the images and assets you have uploaded.",
|
||||
"account-summary": "Resum del compte",
|
||||
"account-summary-description": "Aquí tens un resum de la informació del teu grup.",
|
||||
"group-statistics": "Estadístiques del grup",
|
||||
"group-statistics-description": "Les estadístiques del grup ofereixen certa visió de com feu servir Mealie.",
|
||||
"storage-capacity": "Capacitat d'emmagatzematge",
|
||||
"storage-capacity-description": "La teva capacitat d'emmagatzematge és un càlcul de les imatges i béns que has pujat.",
|
||||
"personal": "Personal",
|
||||
"personal-description": "These are settings that are personal to you. Changes here won't affect other users.",
|
||||
"user-settings": "User Settings",
|
||||
"user-settings-description": "Manage your preferences, change your password, and update your email.",
|
||||
"api-tokens-description": "Manage your API Tokens for access from external applications.",
|
||||
"group-description": "These items are shared within your group. Editing one of them will change it for the whole group!",
|
||||
"group-settings": "Group Settings",
|
||||
"group-settings-description": "Manage your common group settings like mealplan and privacy settings.",
|
||||
"cookbooks-description": "Manage a collection of recipe categories and generate pages for them.",
|
||||
"members": "Members",
|
||||
"members-description": "See who's in your group and manage their permissions.",
|
||||
"personal-description": "Aquestes configuracions són personals a tu. Canvis aquí no afectaran a altres usuaris.",
|
||||
"user-settings": "Configuracions d'usuari",
|
||||
"user-settings-description": "Gestiona les teves preferències, canvia la contrassenya, i actualitza la teva direcció de correu electrònic.",
|
||||
"api-tokens-description": "Gestiona les claus d'API per accés des d'aplicacions externes.",
|
||||
"group-description": "Aquests elements són compartits dins del teu grup. Editar-ne un ho canviarà per tot el grup!",
|
||||
"group-settings": "Configuracions de grup",
|
||||
"group-settings-description": "Gestiona configuracions comunes de grup com planificació d'apats i configuracions de privadesa.",
|
||||
"cookbooks-description": "Gestiona una col·lecció de categories de receptes i genera'n pàgines.",
|
||||
"members": "Membres",
|
||||
"members-description": "Veu qui hi ha al teu grup i gestiona'n els permisos.",
|
||||
"webhooks-description": "Setup webhooks that trigger on days that you have have mealplan scheduled.",
|
||||
"notifiers": "Notifiers",
|
||||
"notifiers": "Notificadors",
|
||||
"notifiers-description": "Setup email and push notifications that trigger on specific events.",
|
||||
"manage-data": "Manage Data",
|
||||
"manage-data-description": "Manage your Mealie data; Foods, Units, Categories, Tags and more.",
|
||||
"data-migrations": "Data Migrations",
|
||||
"data-migrations-description": "Migrate your existing data from other applications like Nextcloud Recipes and Chowdown.",
|
||||
"email-sent": "Email Sent",
|
||||
"error-sending-email": "Error Sending Email",
|
||||
"personal-information": "Personal Information",
|
||||
"preferences": "Preferences",
|
||||
"show-advanced-description": "Show advanced features (API Keys, Webhooks, and Data Management)",
|
||||
"back-to-profile": "Back to Profile",
|
||||
"looking-for-privacy-settings": "Looking for Privacy Settings?",
|
||||
"manage-data": "Gestiona dades",
|
||||
"manage-data-description": "Gestiona es teves dades de Mealie: Menjars, unitats, categories, etiquetes i més.",
|
||||
"data-migrations": "Migracions de dades",
|
||||
"data-migrations-description": "Migra les teves dades ja existents des d'altres aplicacions com Nextcloud Recipes i Chowdown.",
|
||||
"email-sent": "Correu electrònic enviat",
|
||||
"error-sending-email": "Error enviant correu electrònic",
|
||||
"personal-information": "Informació personal",
|
||||
"preferences": "Preferències",
|
||||
"show-advanced-description": "Mostra funcionalitat avançada (claus d'API, webhooks, i gestió de dades)",
|
||||
"back-to-profile": "Torna al perfil",
|
||||
"looking-for-privacy-settings": "Busques les configuracions de privadesa?",
|
||||
"manage-your-api-tokens": "Gestionar les claus API",
|
||||
"manage-user-profile": "Gestionar perfil d'usuari",
|
||||
"manage-cookbooks": "Gestionar receptaris",
|
||||
@@ -1272,7 +1277,7 @@
|
||||
"require-all-tools": "Requereix tots els utensilis",
|
||||
"cookbook-name": "Nom del receptari",
|
||||
"cookbook-with-name": "Receptari {0}",
|
||||
"create-a-cookbook": "Create a Cookbook",
|
||||
"cookbook": "Cookbook"
|
||||
"create-a-cookbook": "Crea un receptari",
|
||||
"cookbook": "Receptari"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -145,11 +145,11 @@
|
||||
"save": "Uložit",
|
||||
"settings": "Nastavení",
|
||||
"share": "Sdílet",
|
||||
"show-all": "Show All",
|
||||
"show-all": "Zobrazit vše",
|
||||
"shuffle": "Náhodně",
|
||||
"sort": "Seřadit",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-ascending": "Řadit vzestupně",
|
||||
"sort-descending": "Řadit sestupně",
|
||||
"sort-alphabetically": "Abecedně",
|
||||
"status": "Stav",
|
||||
"subject": "Předmět",
|
||||
@@ -161,7 +161,7 @@
|
||||
"test": "Test",
|
||||
"themes": "Motivy",
|
||||
"thursday": "Čtvrtek",
|
||||
"title": "Title",
|
||||
"title": "Název",
|
||||
"token": "Token",
|
||||
"tuesday": "Úterý",
|
||||
"type": "Typ",
|
||||
@@ -208,7 +208,7 @@
|
||||
"upload-file": "Nahrát soubor",
|
||||
"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.",
|
||||
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||
"clipboard-copy-failure": "Zkopírování do schránky se nezdařilo.",
|
||||
"confirm-delete-generic-items": "Are you sure you want to delete the following items?",
|
||||
"organizers": "Organizers",
|
||||
"caution": "Caution"
|
||||
@@ -247,7 +247,7 @@
|
||||
"group-preferences": "Nastavení skupiny",
|
||||
"private-group": "Soukromá skupina",
|
||||
"private-group-description": "Setting your group to private will default all public view options to default. This overrides an individual recipes public view settings.",
|
||||
"enable-public-access": "Enable Public Access",
|
||||
"enable-public-access": "Povolit veřejný přístup",
|
||||
"enable-public-access-description": "Make group recipes public by default, and allow visitors to view recipes without logging-in",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Povolit uživatelům mimo vaši skupinu vidět vaše recepty",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your group or with a pre-generated private link",
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Importovat pomocí .zip",
|
||||
"create-recipe-from-an-image": "Vytvořit recept z obrázku",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Create a recipe by providing the name. All recipes must have unique names.",
|
||||
@@ -794,10 +799,10 @@
|
||||
"food": "Jídlo",
|
||||
"note": "Poznámka",
|
||||
"label": "Popisek",
|
||||
"save-label": "Save Label",
|
||||
"save-label": "Uložit štítek",
|
||||
"linked-item-warning": "Tato položka je propojena s jedním nebo více recepty. Úprava jednotky nebo jídla bude mít neočekávané důsledky při přidání nebo odebrání receptu z tohoto seznamu.",
|
||||
"toggle-food": "Přepnout typ položky",
|
||||
"manage-labels": "Manage Labels",
|
||||
"manage-labels": "Spravovat štítky",
|
||||
"are-you-sure-you-want-to-delete-this-item": "Are you sure you want to delete this item?",
|
||||
"copy-as-text": "Copy as Text",
|
||||
"copy-as-markdown": "Copy as Markdown",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Permissions",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "User can invite other to group",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "User can manage group",
|
||||
"user-can-organize-group-data": "User can organize group data",
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
@@ -1018,9 +1023,9 @@
|
||||
"labels": {
|
||||
"seed-dialog-text": "Naplnit databázi s běžnými popisky používanými ve vašem jazyce.",
|
||||
"edit-label": "Upravit štítek",
|
||||
"new-label": "New Label",
|
||||
"new-label": "Nový štítek",
|
||||
"labels": "Štítky",
|
||||
"assign-label": "Assign Label"
|
||||
"assign-label": "Přiřadit štítek"
|
||||
},
|
||||
"recipes": {
|
||||
"purge-exports": "Purge Exports",
|
||||
|
||||
@@ -211,7 +211,7 @@
|
||||
"clipboard-copy-failure": "Kopiering til udklipsholderen mislykkedes.",
|
||||
"confirm-delete-generic-items": "Er du sikker på at du ønsker at slette de valgte emner?",
|
||||
"organizers": "Organisatorer",
|
||||
"caution": "Caution"
|
||||
"caution": "Bemærk"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Er du sikker på, du vil slette <b>{groupName}<b/>?",
|
||||
@@ -292,8 +292,8 @@
|
||||
"mealplan-updated": "Madplanen blev ændret",
|
||||
"no-meal-plan-defined-yet": "Ingen madplan er defineret",
|
||||
"no-meal-planned-for-today": "Ingen ret er planlagt til i dag",
|
||||
"numberOfDays-hint": "Number of days on page load",
|
||||
"numberOfDays-label": "Default Days",
|
||||
"numberOfDays-hint": "Antal dage ved sideindlæsning",
|
||||
"numberOfDays-label": "Standarddage",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Kun opskrifter med disse kategorier vil blive brugt i madplaner",
|
||||
"planner": "Planlæg madplan",
|
||||
"quick-week": "Hurtig uge",
|
||||
@@ -383,7 +383,7 @@
|
||||
},
|
||||
"recipekeeper": {
|
||||
"title": "Recipe Keeper",
|
||||
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
|
||||
"description-long": "Mealie kan importere opskrifter fra Recipe Keeper. Eksportér dine opskrifter i zip-format, og upload derefter .zip-filen nedenfor."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -449,8 +449,8 @@
|
||||
"ingredients": "Ingredienser",
|
||||
"insert-ingredient": "Indsæt Ingrediens",
|
||||
"insert-section": "Indsæt sektion",
|
||||
"insert-above": "Insert Above",
|
||||
"insert-below": "Insert Below",
|
||||
"insert-above": "Indsæt ovenover",
|
||||
"insert-below": "Indsæt nedenunder",
|
||||
"instructions": "Instruktioner",
|
||||
"key-name-required": "Nøglenavn påkrævet",
|
||||
"landscape-view-coming-soon": "Liggende visning (Kommer snart)",
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Opret ny opskrift fra bunden.",
|
||||
"create-recipes": "Opret opskrift",
|
||||
"import-with-zip": "Importér fra ZIP-fil",
|
||||
"create-recipe-from-an-image": "Opret opskrift ud fra et billede",
|
||||
"create-recipe-from-an-image": "Opret opskrift fra et billede",
|
||||
"create-recipe-from-an-image-description": "Opret en opskrift ved at overføre et billede af den. Mealie vil forsøge at udtrække teksten fra billedet med AI og oprette en opskrift fra det.",
|
||||
"crop-and-rotate-the-image": "Beskær og roter billedet, så kun teksten er synlig, og det vises i den rigtige retning.",
|
||||
"create-from-image": "Opret fra billede",
|
||||
"should-translate-description": "Oversæt opskriften til mit sprog",
|
||||
"please-wait-image-procesing": "Vent venligst, billedet behandles. Dette kan tage lidt tid.",
|
||||
"bulk-url-import": "Import fra flere URL-adresser",
|
||||
"debug-scraper": "Fejlsøg Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Opret en opskrift ved at angive navnet. Alle opskrifter skal have unikke navne.",
|
||||
@@ -586,8 +591,8 @@
|
||||
"report-deletion-failed": "Sletning af rapport mislykkedes",
|
||||
"recipe-debugger": "Fejlsøgning af opskrifter",
|
||||
"recipe-debugger-description": "Indsæt URL'en på hjemmesiden, der indeholder den opskrift, du vil fejlsøge. URL-adressen vil blive læst og resultaterne vil blive vist. Hvis ingen data bliver vist, er indhentning af opskrifter fra hjemmesiden endnu ikke understøttet af Mealie.",
|
||||
"use-openai": "Use OpenAI",
|
||||
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
|
||||
"use-openai": "Brug OpenAI",
|
||||
"recipe-debugger-use-openai-description": "Brug OpenAI til at fortolke resultaterne i stedet for at stole på scraper biblioteket. Når du opretter en opskrift via URL, gøres dette automatisk, hvis skraberbiblioteket fejler, men du kan teste det manuelt her.",
|
||||
"debug": "Fejlsøgning",
|
||||
"tree-view": "Træ visning",
|
||||
"recipe-yield": "Udbytte af opskrift",
|
||||
@@ -640,7 +645,7 @@
|
||||
"backup-created-at-response-export_path": "Backup oprettet ved {path}",
|
||||
"backup-deleted": "Backup slettet",
|
||||
"restore-success": "Gendannelse lykkedes",
|
||||
"restore-fail": "Restore failed. Check your server logs for more details",
|
||||
"restore-fail": "Gendannelse mislykkedes. Tjek dine serverlogs for flere detaljer",
|
||||
"backup-tag": "Backupnavn",
|
||||
"create-heading": "Opret en backup",
|
||||
"delete-backup": "Slet backup",
|
||||
@@ -810,11 +815,11 @@
|
||||
"items-checked-count": "Ingen elementer markeret|Et element markeret|{count} elementer er markeret",
|
||||
"no-label": "Ingen etiket",
|
||||
"completed-on": "Afsluttet den {date}",
|
||||
"you-are-offline": "You are offline",
|
||||
"you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?"
|
||||
"you-are-offline": "Du er offline",
|
||||
"you-are-offline-description": "Ikke alle funktioner er tilgængelige mens offline. Du kan stadig tilføje, modificere, og fjerne elementer, men du vil ikke kunne synkronisere dine ændringer til serveren, før du er online igen.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Er du sikker på, at du vil markere alle elementer?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Er du sikker på, at du vil fjerne markeringen af alle elementer?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Er du sikker på, at du vil sletter de valgte elementer?"
|
||||
},
|
||||
"sidebar": {
|
||||
"all-recipes": "Alle opskr.",
|
||||
@@ -955,7 +960,7 @@
|
||||
"user-details": "Brugerdetaljer",
|
||||
"user-name": "Brugernavn",
|
||||
"authentication-method": "Godkendelsesmetode",
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"authentication-method-hint": "Dette angiver, hvordan en bruger vil logge ind på Mealie. Hvis du ikke er sikker, vælg 'Mealie'",
|
||||
"permissions": "Rettigheder",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "Bruger kan invitere andre til gruppen",
|
||||
@@ -990,8 +995,8 @@
|
||||
"food-data": "Oplysninger om fødevare",
|
||||
"example-food-singular": "fx.: grøntsag",
|
||||
"example-food-plural": "fx.: grøntsager",
|
||||
"label-overwrite-warning": "This will assign the chosen label to all selected foods and potentially overwrite your existing labels.",
|
||||
"on-hand-checkbox-label": "Setting this flag will make this food unchecked by default when adding a recipe to a shopping list."
|
||||
"label-overwrite-warning": "Dette vil tildele den valgte etiket til alle udvalgte fødevarer og potentielt overskrive dine eksisterende etiketter.",
|
||||
"on-hand-checkbox-label": "Ændring af dette flag ændrer markeringen, så denne fødevare ikke er markeret som standard, når du tilføjer en opskrift til en indkøbsliste."
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Opret standard enheder i dit sprog.",
|
||||
@@ -1020,7 +1025,7 @@
|
||||
"edit-label": "Redigér etiket",
|
||||
"new-label": "Ny etiket",
|
||||
"labels": "Etiketter",
|
||||
"assign-label": "Assign Label"
|
||||
"assign-label": "Tildel etiket"
|
||||
},
|
||||
"recipes": {
|
||||
"purge-exports": "Tøm Eksport",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Erstelle ein neues Rezept von Grund auf.",
|
||||
"create-recipes": "Rezepte erstellen",
|
||||
"import-with-zip": "Von .zip importieren",
|
||||
"create-recipe-from-an-image": "Rezept von Foto erstellen",
|
||||
"create-recipe-from-an-image": "Rezept von einem Bild erstellen",
|
||||
"create-recipe-from-an-image-description": "Erstelle ein Rezept, indem du ein Bild hochlädst. Mealie wird versuchen, den Text aus dem Bild mit Hilfe von KI zu extrahieren und ein Rezept daraus zu erstellen.",
|
||||
"crop-and-rotate-the-image": "Beschneide und drehe das Bild so, dass nur der Text zu sehen ist und die Ausrichtung stimmt.",
|
||||
"create-from-image": "Vom Bild erstellen",
|
||||
"should-translate-description": "Übersetze das Rezept in meine Sprache",
|
||||
"please-wait-image-procesing": "Warte bitte, das Bild wird gerade bearbeitet. Dies kann einige Zeit dauern.",
|
||||
"bulk-url-import": "URL Massenimport",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Erstelle ein Rezept, indem du den Namen angibst. Alle Rezepte müssen eindeutige Namen haben.",
|
||||
|
||||
@@ -268,7 +268,7 @@
|
||||
"group-management": "Group Management",
|
||||
"admin-group-management": "Admin Group Management",
|
||||
"admin-group-management-text": "Changes to this group will be reflected immediately.",
|
||||
"group-id-value": "Group Id: {0}"
|
||||
"group-id-value": "Group ID: {0}"
|
||||
},
|
||||
"meal-plan": {
|
||||
"create-a-new-meal-plan": "Create a New Meal Plan",
|
||||
@@ -283,18 +283,18 @@
|
||||
"meal-planner": "Meal Planner",
|
||||
"meal-plans": "Meal Plans",
|
||||
"mealplan-categories": "MEALPLAN CATEGORIES",
|
||||
"mealplan-created": "Mealplan created",
|
||||
"mealplan-creation-failed": "Mealplan creation failed",
|
||||
"mealplan-created": "Meal plan created",
|
||||
"mealplan-creation-failed": "Meal plan creation failed",
|
||||
"mealplan-deleted": "Mealplan deleted",
|
||||
"mealplan-deletion-failed": "Mealplan deletion failed",
|
||||
"mealplan-settings": "Mealplan Settings",
|
||||
"mealplan-update-failed": "Mealplan update failed",
|
||||
"mealplan-updated": "Mealplan Updated",
|
||||
"mealplan-deletion-failed": "Meal plan deletion failed",
|
||||
"mealplan-settings": "Meal plan settings",
|
||||
"mealplan-update-failed": "Meal plan update failed",
|
||||
"mealplan-updated": "Meal plan updated",
|
||||
"no-meal-plan-defined-yet": "No meal plan defined yet",
|
||||
"no-meal-planned-for-today": "No meal planned for today",
|
||||
"numberOfDays-hint": "Number of days on page load",
|
||||
"numberOfDays-label": "Default Days",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Only recipes with these categories will be used in Meal Plans",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Only the recipes with these categories will be used in Meal Plans",
|
||||
"planner": "Planner",
|
||||
"quick-week": "Quick Week",
|
||||
"side": "Side",
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Create a recipe by providing the name. All recipes must have unique names.",
|
||||
@@ -935,13 +940,13 @@
|
||||
"you-are-not-allowed-to-delete-this-user": "You are not allowed to delete this user",
|
||||
"enable-advanced-content": "Enable Advanced Content",
|
||||
"enable-advanced-content-description": "Enables advanced features like Recipe Scaling, API keys, Webhooks, and Data Management. Don't worry, you can always change this later",
|
||||
"favorite-recipes": "Favorite Recipes",
|
||||
"favorite-recipes": "Favourite Recipes",
|
||||
"email-or-username": "Email or Username",
|
||||
"remember-me": "Remember Me",
|
||||
"please-enter-your-email-and-password": "Please enter your email and password",
|
||||
"invalid-credentials": "Invalid Credentials",
|
||||
"account-locked-please-try-again-later": "Account Locked. Please try again later",
|
||||
"user-favorites": "User Favorites",
|
||||
"user-favorites": "User Favourites",
|
||||
"password-strength-values": {
|
||||
"weak": "Weak",
|
||||
"good": "Good",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie'",
|
||||
"permissions": "Permissions",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "User can invite other to group",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "User can manage group",
|
||||
"user-can-organize-group-data": "User can organize group data",
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Create a recipe by providing the name. All recipes must have unique names.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie'",
|
||||
"permissions": "Permissions",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "User can invite other to group",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "User can manage group",
|
||||
"user-can-organize-group-data": "User can organize group data",
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Crear nueva receta desde cero.",
|
||||
"create-recipes": "Crear Recetas",
|
||||
"import-with-zip": "Importar desde .zip",
|
||||
"create-recipe-from-an-image": "Crear receta a partir de una imagen",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Importación masiva desde URL",
|
||||
"debug-scraper": "Depurar analizador",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Crear una receta proporcionando el nombre. Todas las recetas deben tener nombres únicos.",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Luo resepti alusta.",
|
||||
"create-recipes": "Luo reseptejä",
|
||||
"import-with-zip": "Tuo .zip:llä",
|
||||
"create-recipe-from-an-image": "Luo resepti kuvasta",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Massa tuonti URL-osoitteesta",
|
||||
"debug-scraper": "Etsi ongelmia Scraperista",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Luo resepti antamalla nimi. Kaikilla resepteillä on oltava yksilölliset nimet.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "Tämä määrittelee, miten käyttäjä todentaa Mealien. Jos et ole varma, valitse 'Mealie'",
|
||||
"permissions": "Käyttöoikeudet",
|
||||
"administrator": "Ylläpitäjä",
|
||||
"user-can-invite-other-to-group": "Käyttäjä voi kutsua muita ryhmään",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "Käyttäjä voi hallita ryhmää",
|
||||
"user-can-organize-group-data": "Käyttäjä voi järjestellä ryhmän tietoja",
|
||||
"enable-advanced-features": "Salli edistyneemmät ominaisuudet",
|
||||
|
||||
1283
frontend/lang/messages/fr-BE.json
Normal file
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Créer une nouvelle recette à partir de zéro.",
|
||||
"create-recipes": "Créer des recettes",
|
||||
"import-with-zip": "Importer un .zip",
|
||||
"create-recipe-from-an-image": "Créer une recette à partir d'une image",
|
||||
"create-recipe-from-an-image": "Créer une recette à partir d’une image",
|
||||
"create-recipe-from-an-image-description": "Créez une recette en téléchargeant une image de celle-ci. Mealie utilisera l’IA pour tenter d’extraire le texte et de créer une recette.",
|
||||
"crop-and-rotate-the-image": "Rogner et pivoter l’image pour que seul le texte soit visible, et qu’il soit dans la bonne orientation.",
|
||||
"create-from-image": "Créer à partir d’une image",
|
||||
"should-translate-description": "Traduire la recette dans ma langue",
|
||||
"please-wait-image-procesing": "Veuillez patienter, l’image est en cours de traitement. Cela peut prendre du temps.",
|
||||
"bulk-url-import": "Importation en masse d'URL",
|
||||
"debug-scraper": "Déboguer le récupérateur",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Créer une recette en fournissant le nom. Toutes les recettes doivent avoir des noms uniques.",
|
||||
@@ -810,8 +815,8 @@
|
||||
"items-checked-count": "Aucun élément coché|Un élément coché|{count} éléments cochés",
|
||||
"no-label": "Aucune étiquette",
|
||||
"completed-on": "Terminé le {date}",
|
||||
"you-are-offline": "You are offline",
|
||||
"you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.",
|
||||
"you-are-offline": "Vous êtes hors-ligne",
|
||||
"you-are-offline-description": "Certaines fonctionnalités ne sont pas disponibles lorsque vous êtes hors-ligne. Vous pouvez toujours ajouter, modifier et supprimer des éléments, mais il ne sera pas possible de synchroniser les changements avec le serveur tant que vous ne serez pas en ligne.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Voulez-vous vraiment sélectionner tous les éléments ?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Voulez-vous vraiment désélectionner tous les éléments ?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Voulez-vous vraiment supprimer tous les éléments sélectionnés ?"
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "Ceci infique comment un utilisateur va s'authentifier sur Mealie. Si vous n'êtes pas sûr, choisissez 'Mealie'",
|
||||
"permissions": "Autorisations",
|
||||
"administrator": "Administrateur",
|
||||
"user-can-invite-other-to-group": "L'utilisateur peut inviter quelqu'un au groupe",
|
||||
"user-can-invite-other-to-group": "L’utilisateur peut inviter d’autres personnes dans le groupe",
|
||||
"user-can-manage-group": "L'utilisateur peut gérer le groupe",
|
||||
"user-can-organize-group-data": "L'utilisateur peut organiser des données de groupe",
|
||||
"enable-advanced-features": "Activer les fonctions avancées",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Créer une nouvelle recette de zéro.",
|
||||
"create-recipes": "Créer des recettes",
|
||||
"import-with-zip": "Importer un .zip",
|
||||
"create-recipe-from-an-image": "Créer une recette à partir d'une image",
|
||||
"create-recipe-from-an-image": "Créer une recette à partir d’une image",
|
||||
"create-recipe-from-an-image-description": "Créez une recette en téléchargeant une image de celle-ci. Mealie utilisera l’IA pour tenter d’extraire le texte et de créer une recette.",
|
||||
"crop-and-rotate-the-image": "Rogner et pivoter l’image pour que seul le texte soit visible, et qu’il soit dans la bonne orientation.",
|
||||
"create-from-image": "Créer à partir d’une image",
|
||||
"should-translate-description": "Traduire la recette dans ma langue",
|
||||
"please-wait-image-procesing": "Veuillez patienter, l’image est en cours de traitement. Cela peut prendre du temps.",
|
||||
"bulk-url-import": "Importation en masse d'URL",
|
||||
"debug-scraper": "Déboguer le récupérateur",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Créer une recette en fournissant le nom. Toutes les recettes doivent avoir des noms uniques.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "Ceci infique comment un utilisateur va s'authentifier sur Mealie. Si vous n'êtes pas sûr, choisissez 'Mealie'",
|
||||
"permissions": "Autorisations",
|
||||
"administrator": "Administrateur",
|
||||
"user-can-invite-other-to-group": "L'utilisateur peut inviter quelqu'un au groupe",
|
||||
"user-can-invite-other-to-group": "L’utilisateur peut inviter d’autres personnes dans le groupe",
|
||||
"user-can-manage-group": "L'utilisateur peut gérer le groupe",
|
||||
"user-can-organize-group-data": "L'utilisateur peut organiser des données de groupe",
|
||||
"enable-advanced-features": "Activer les fonctions avancées",
|
||||
|
||||
@@ -211,7 +211,7 @@
|
||||
"clipboard-copy-failure": "Produciuse un erro ao copiar contido no portapapeis.",
|
||||
"confirm-delete-generic-items": "Estás seguro de que queres eliminar os seguintes elementos?",
|
||||
"organizers": "Organizadores",
|
||||
"caution": "Caution"
|
||||
"caution": "Coidado"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Estás seguro de que queres eliminar <b>{groupName}<b/>?",
|
||||
@@ -342,13 +342,13 @@
|
||||
"title": "Chowdown"
|
||||
},
|
||||
"nextcloud": {
|
||||
"description": "Migrate data from a Nextcloud Cookbook instance",
|
||||
"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": "Migrar datos dunha instancia de Nextcloud Cookbook",
|
||||
"description-long": "As receitas poden ser importadas dun ficheiro zip que contén os datos almacenados en Nextcloud. Revise a estrutura de cartafoles de abaixo como exemplo para asegurar que as túas receitas pódense importar.",
|
||||
"title": "Nextcloud Cookbook"
|
||||
},
|
||||
"copymethat": {
|
||||
"description-long": "Mealie can import recipes from Copy Me That. Export your recipes in HTML format, then upload the .zip below.",
|
||||
"title": "Copy Me That Recipe Manager"
|
||||
"description-long": "Mealie pode importar receitas de Copy Me That. Exporta as túas receitas en formato HTML e sube aquí embaixo o zip.",
|
||||
"title": "Xestor de Receitas Copy Me That"
|
||||
},
|
||||
"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.",
|
||||
@@ -412,8 +412,8 @@
|
||||
"404-page-not-found": "404 Page not found",
|
||||
"all-recipes": "All Recipes",
|
||||
"new-page-created": "New page created",
|
||||
"page": "Page",
|
||||
"page-creation-failed": "Page creation failed",
|
||||
"page": "Páxina",
|
||||
"page-creation-failed": "Produciuse un erro ao creala páxina",
|
||||
"page-deleted": "Páxina eliminada",
|
||||
"page-deletion-failed": "Produciuse un erro ao eliminar a páxina",
|
||||
"page-update-failed": "Produciuse un erro na actualización da páxina",
|
||||
@@ -438,10 +438,10 @@
|
||||
"delete-recipe": "Eliminar Receita",
|
||||
"description": "Descrición",
|
||||
"disable-amount": "Desactivar as Cantidades de Ingredientes",
|
||||
"disable-comments": "Disable Comments",
|
||||
"disable-comments": "Desactivar comentarios",
|
||||
"duplicate": "Duplicar a receita",
|
||||
"duplicate-name": "Nome da nova receita",
|
||||
"edit-scale": "Edit Scale",
|
||||
"edit-scale": "Editar escala",
|
||||
"fat-content": "Graxa",
|
||||
"fiber-content": "Fibra",
|
||||
"grams": "gramos",
|
||||
@@ -449,8 +449,8 @@
|
||||
"ingredients": "Ingredientes",
|
||||
"insert-ingredient": "Inserir Ingrediente",
|
||||
"insert-section": "Inserir Sección",
|
||||
"insert-above": "Insert Above",
|
||||
"insert-below": "Insert Below",
|
||||
"insert-above": "Inserir enriba",
|
||||
"insert-below": "Inserir enbaixo",
|
||||
"instructions": "Instrucións",
|
||||
"key-name-required": "Nome da Chave Obrigatorio",
|
||||
"landscape-view-coming-soon": "Vista Horizontal",
|
||||
@@ -493,7 +493,7 @@
|
||||
"join-the-conversation": "Únete á Conversa",
|
||||
"add-recipe-to-mealplan": "Add Recipe to Mealplan",
|
||||
"entry-type": "Entry Type",
|
||||
"date-format-hint": "MM/DD/YYYY format",
|
||||
"date-format-hint": "Formato MM/DD/YYYY",
|
||||
"date-format-hint-yyyy-mm-dd": "YYYY-MM-DD format",
|
||||
"add-to-list": "Add to List",
|
||||
"add-to-plan": "Add to Plan",
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Create a recipe by providing the name. All recipes must have unique names.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Permissions",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "User can invite other to group",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "User can manage group",
|
||||
"user-can-organize-group-data": "User can organize group data",
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "ייבא באמצעות zip",
|
||||
"create-recipe-from-an-image": "יצירת מתכון באמצעות תמונה",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "ייבוא מספר לינקים",
|
||||
"debug-scraper": "דיבאג סקרייפר",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "יצירת מתכון באמצעות שם. כל שמות המתכונים צריכים להיות שונים.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "זה מציין איך משתמש יתחבר ל״מילי״. אם אתה לא בטוח, בחר מילי",
|
||||
"permissions": "הרשאות",
|
||||
"administrator": "מנהל ראשי",
|
||||
"user-can-invite-other-to-group": "משתמש יכול להזמין אחרים לקבוצה",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "משתמש יכול לנהל קבוצה",
|
||||
"user-can-organize-group-data": "משתמש יכול לשנות מידע של קבוצה",
|
||||
"enable-advanced-features": "אפשר אפשרויות מתקדמות",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Učitaj pomoću .zip-a",
|
||||
"create-recipe-from-an-image": "Kreiraj recept iz slike",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Uvoz više URL-ova",
|
||||
"debug-scraper": "Debugiranje skraper-a",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Kreirajte recept pružajući naziv. Svi recepti moraju imati jedinstvena imena.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "Ovo određuje način autentifikacije korisnika u Mealie sustavu. Ako niste sigurni, odaberite 'Mealie",
|
||||
"permissions": "Dozvole",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "Korisnik može pozvati druge u grupu",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "Korisnik može upravljati grupom",
|
||||
"user-can-organize-group-data": "Korisnik može organizirati podatke grupe",
|
||||
"enable-advanced-features": "Omogućite napredne značajke",
|
||||
|
||||
@@ -297,8 +297,8 @@
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "A menütervekben csak a következő kategóriához tartozó receptek kerülnek felhasználásra",
|
||||
"planner": "Tervező",
|
||||
"quick-week": "Gyors hét",
|
||||
"side": "Köret",
|
||||
"sides": "Köretek",
|
||||
"side": "Kisétkezés",
|
||||
"sides": "Kisétkezések",
|
||||
"start-date": "Kezdő dátum",
|
||||
"rule-day": "Szabály Napja",
|
||||
"meal-type": "Étel típusa",
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Adj hozzá egy új receptet a nulláról kezdve.",
|
||||
"create-recipes": "Receptek létrehozása",
|
||||
"import-with-zip": "Importálás .zip formátummal",
|
||||
"create-recipe-from-an-image": "Recept létrehozása fotóról",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Tömeges URL importálás",
|
||||
"debug-scraper": "Hibakeresés az adatkinyerőben",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Hozzon létre egy receptet a név megadásával. Minden receptnek egyedi névvel kell rendelkeznie.",
|
||||
@@ -596,7 +601,7 @@
|
||||
"screen-awake": "Képernyő ébren tartása",
|
||||
"remove-image": "Kép etávolítása",
|
||||
"nextStep": "Következő lépés",
|
||||
"recipe-actions": "Recipe Actions",
|
||||
"recipe-actions": "Receptekkel kapcsolatos tevékenységek",
|
||||
"parser": {
|
||||
"experimental-alert-text": "A Mealie természetes nyelvi feldolgozást használ a recept összetevőinek elemzésére, az egységek és az élelmiszerelemek létrehozására. Ez a funkció kísérleti jellegű, és előfordulhat, hogy nem mindig működik az elvárt módon. Ha nem szeretné használni az elemzett eredményeket, válassza a 'Mégse' lehetőséget, és a módosítások nem kerülnek mentésre.",
|
||||
"ingredient-parser": "Hozzávaló elemző",
|
||||
@@ -810,11 +815,11 @@
|
||||
"items-checked-count": "Nincs ellenőrzött tétel|Egy ellenőrzött tétel|{count} ellenőrzött tétel",
|
||||
"no-label": "Nincs címke",
|
||||
"completed-on": "Teljesítve {date}",
|
||||
"you-are-offline": "You are offline",
|
||||
"you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?"
|
||||
"you-are-offline": "Offline vagy",
|
||||
"you-are-offline-description": "Offline állapotban nem minden funkció érhető el. Továbbra is hozzáadhat, módosíthat és eltávolíthat elemeket, de a módosításokat nem tudja szinkronizálni a szerverrel, amíg vissza nem tér az online állapotba.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Biztos, hogy minden elemet be akar jelölni?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Biztos, hogy minden elem kijelölését visszavonja?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Biztosan törölni akarja az összes bejelölt elemet?"
|
||||
},
|
||||
"sidebar": {
|
||||
"all-recipes": "Minden recept",
|
||||
@@ -991,7 +996,7 @@
|
||||
"example-food-singular": "pl. Hagyma",
|
||||
"example-food-plural": "pl. Hagymák",
|
||||
"label-overwrite-warning": "Ez a kiválasztott címkét az összes kiválasztott élelmiszerhez hozzárendeli, és esetleg felülírja a meglévő címkéket.",
|
||||
"on-hand-checkbox-label": "Setting this flag will make this food unchecked by default when adding a recipe to a shopping list."
|
||||
"on-hand-checkbox-label": "Ha ezt a jelzőt beállítja, akkor ez az élelmiszer alapértelmezés szerint nem lesz bejelölve, amikor egy receptet hozzáad egy bevásárlólistához."
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Töltse be az Ön nyelve szerinti közös mennyiségi egységet tartalmazó adatbázist.",
|
||||
@@ -1044,9 +1049,9 @@
|
||||
"source-unit-will-be-deleted": "A forrás mennyiségi egység törlésre kerül"
|
||||
},
|
||||
"recipe-actions": {
|
||||
"recipe-actions-data": "Recipe Actions Data",
|
||||
"new-recipe-action": "New Recipe Action",
|
||||
"edit-recipe-action": "Edit Recipe Action",
|
||||
"recipe-actions-data": "Receptekkel kapcsolatos tevékenységek adatai",
|
||||
"new-recipe-action": "Új recept tevékenység",
|
||||
"edit-recipe-action": "Recept tevékenység szerkesztése",
|
||||
"action-type": "Művelet típusa"
|
||||
},
|
||||
"create-alias": "Alias készítése",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Create a recipe by providing the name. All recipes must have unique names.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie'",
|
||||
"permissions": "Permissions",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "User can invite other to group",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "User can manage group",
|
||||
"user-can-organize-group-data": "User can organize group data",
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
|
||||
@@ -562,6 +562,11 @@
|
||||
"create-recipes": "Crea Ricette",
|
||||
"import-with-zip": "Importa da .zip",
|
||||
"create-recipe-from-an-image": "Crea ricetta da un'immagine",
|
||||
"create-recipe-from-an-image-description": "Crea una ricetta caricando un'immagine di essa. Mealie tenterà di estrarre il testo dall'immagine usando l'IA e creare una ricetta da esso.",
|
||||
"crop-and-rotate-the-image": "Ritaglia e ruota l'immagine in modo che solo il testo sia visibile e che sia orientato correttamente.",
|
||||
"create-from-image": "Crea da Immagine",
|
||||
"should-translate-description": "Traduci la ricetta nella mia lingua",
|
||||
"please-wait-image-procesing": "Attendere, l'immagine è in fase di elaborazione. Potrebbe volerci un po' di tempo.",
|
||||
"bulk-url-import": "Importazione multipla URL",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Crea una ricetta fornendo il nome. Tutte le ricette devono avere nomi univoci.",
|
||||
@@ -587,7 +592,7 @@
|
||||
"recipe-debugger": "Debugger Ricetta",
|
||||
"recipe-debugger-description": "Prendi l'URL della ricetta che vuoi fare il debug e incollalo qui. L'URL verrà recuperato dallo scraper di ricette e i risultati verranno visualizzati. Se non si vede alcun dato restituito, il sito che si sta cercando di analizzare non è supportato da Mealie o la sua libreria di scraping.",
|
||||
"use-openai": "Usa OpenAI",
|
||||
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
|
||||
"recipe-debugger-use-openai-description": "Usa OpenAI per analizzare i risultati invece di affidarsi alla libreria scraper. Quando si crea una ricetta tramite URL, questo viene fatto automaticamente se la libreria scraper fallisce, ma è possibile testarlo manualmente qui.",
|
||||
"debug": "Debug",
|
||||
"tree-view": "Visualizzazione ad Albero",
|
||||
"recipe-yield": "Resa Ricetta",
|
||||
@@ -596,7 +601,7 @@
|
||||
"screen-awake": "Mantieni lo schermo acceso",
|
||||
"remove-image": "Rimuovi immagine",
|
||||
"nextStep": "Passo successivo",
|
||||
"recipe-actions": "Recipe Actions",
|
||||
"recipe-actions": "Azioni Ricetta",
|
||||
"parser": {
|
||||
"experimental-alert-text": "Mealie utilizza l'elaborazione del linguaggio naturale per analizzare e creare unità e prodotti alimentari per i vostri ingredienti di ricetta. Questa funzione è sperimentale e potrebbe non funzionare sempre come previsto. Se preferisci non usare i risultati analizzati, puoi selezionare 'Annulla' e le tue modifiche non saranno salvate.",
|
||||
"ingredient-parser": "Analizzatore ingredienti",
|
||||
@@ -605,7 +610,7 @@
|
||||
"select-parser": "Seleziona Analizzatore",
|
||||
"natural-language-processor": "Analizzatore di Linguaggio Naturale",
|
||||
"brute-parser": "Analizzatore brutale",
|
||||
"openai-parser": "OpenAI Parser",
|
||||
"openai-parser": "Parser OpenAI",
|
||||
"parse-all": "Analizza tutto",
|
||||
"no-unit": "Nessuna unità",
|
||||
"missing-unit": "Crea unità mancante: {unit}",
|
||||
@@ -640,7 +645,7 @@
|
||||
"backup-created-at-response-export_path": "Backup Creato in {path}",
|
||||
"backup-deleted": "Backup eliminato",
|
||||
"restore-success": "Ripristino riuscito",
|
||||
"restore-fail": "Restore failed. Check your server logs for more details",
|
||||
"restore-fail": "Ripristino non riuscito. Controlla i log del tuo server per maggiori dettagli",
|
||||
"backup-tag": "Tag Backup",
|
||||
"create-heading": "Crea un Backup",
|
||||
"delete-backup": "Elimina Backup",
|
||||
@@ -778,9 +783,9 @@
|
||||
"oidc-ready": "Pronto per OIDC",
|
||||
"oidc-ready-error-text": "I valori OIDC non sono configurati. Questo può essere ignorato se non si utilizza Autenticazione OIDC.",
|
||||
"oidc-ready-success-text": "Le variabili OIDC richieste sono tutte impostate.",
|
||||
"openai-ready": "OpenAI Ready",
|
||||
"openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.",
|
||||
"openai-ready-success-text": "Required OpenAI variables are all set."
|
||||
"openai-ready": "OpenAI Pronto",
|
||||
"openai-ready-error-text": "Non tutti i valori OpenAI sono configurati. Puoi ignorarlo se non utilizzi le funzioni di OpenAI.",
|
||||
"openai-ready-success-text": "Le variabili OpenAI richieste sono tutte impostate."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Tutte le Liste",
|
||||
@@ -794,7 +799,7 @@
|
||||
"food": "Alimenti",
|
||||
"note": "Nota",
|
||||
"label": "Etichetta",
|
||||
"save-label": "Save Label",
|
||||
"save-label": "Salva Etichetta",
|
||||
"linked-item-warning": "Questo elemento è collegato a una o più ricette. La modifica delle unità o degli alimenti potrebbe dare risultati inattesi quando si aggiunge o si rimuove la ricetta da questo elenco.",
|
||||
"toggle-food": "Attiva/Disattiva Alimento",
|
||||
"manage-labels": "Gestisci Etichette",
|
||||
@@ -810,11 +815,11 @@
|
||||
"items-checked-count": "Nessun elemento selezionato|Un elemento selezionato|{count} elementi selezionati",
|
||||
"no-label": "Nessuna etichetta",
|
||||
"completed-on": "Completato il {date}",
|
||||
"you-are-offline": "You are offline",
|
||||
"you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?"
|
||||
"you-are-offline": "Non sei in linea",
|
||||
"you-are-offline-description": "Non tutte le funzioni sono disponibili quando non sei in linea. Puoi ancora aggiungere, modificare e rimuovere elementi, ma non sarai in grado di sincronizzare le modifiche con il server fino a quando non sarai di nuovo in linea.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Sei sicuro di voler tutti gli elementi?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Sei sicuro di voler deselezionare tutti gli elementi?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Sei sicuro di voler rimuovere tutti gli articoli selezionati?"
|
||||
},
|
||||
"sidebar": {
|
||||
"all-recipes": "Ricette",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "Indica come un utente si autenticherà con Mealie. Se non sei sicuro, scegli 'Mealie",
|
||||
"permissions": "Permessi",
|
||||
"administrator": "Amministratore",
|
||||
"user-can-invite-other-to-group": "L'utente può invitare altri al gruppo",
|
||||
"user-can-invite-other-to-group": "L'utente può invitare altre persone nel gruppo",
|
||||
"user-can-manage-group": "L'utente può gestire il gruppo",
|
||||
"user-can-organize-group-data": "L'utente può organizzare i dati del gruppo",
|
||||
"enable-advanced-features": "Abilita funzionalità avanzate",
|
||||
@@ -990,8 +995,8 @@
|
||||
"food-data": "Dati Alimento",
|
||||
"example-food-singular": "esempio: Cipolla",
|
||||
"example-food-plural": "esempio: Cipolle",
|
||||
"label-overwrite-warning": "This will assign the chosen label to all selected foods and potentially overwrite your existing labels.",
|
||||
"on-hand-checkbox-label": "Setting this flag will make this food unchecked by default when adding a recipe to a shopping list."
|
||||
"label-overwrite-warning": "Questo assegnerà l'etichetta scelta a tutti gli alimenti selezionati e potenzialmente sovrascriverà le etichette esistenti.",
|
||||
"on-hand-checkbox-label": "Abilitando questa impostazione, l'alimento verrà deselezionato di default quando si aggiungerà una ricetta a una lista della spesa."
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Riempie il database con unità comuni basate sulla lingua.",
|
||||
@@ -1020,7 +1025,7 @@
|
||||
"edit-label": "Modifica Etichetta",
|
||||
"new-label": "Nuova Etichetta",
|
||||
"labels": "Etichette",
|
||||
"assign-label": "Assign Label"
|
||||
"assign-label": "Assegna Etichetta"
|
||||
},
|
||||
"recipes": {
|
||||
"purge-exports": "Elimina Esportazioni",
|
||||
@@ -1044,10 +1049,10 @@
|
||||
"source-unit-will-be-deleted": "L'unità di origine verrà eliminata"
|
||||
},
|
||||
"recipe-actions": {
|
||||
"recipe-actions-data": "Recipe Actions Data",
|
||||
"new-recipe-action": "New Recipe Action",
|
||||
"edit-recipe-action": "Edit Recipe Action",
|
||||
"action-type": "Action Type"
|
||||
"recipe-actions-data": "Dati Azioni Ricetta",
|
||||
"new-recipe-action": "Nuova Azione Ricetta",
|
||||
"edit-recipe-action": "Modifica Azione Ricetta",
|
||||
"action-type": "Tipo Di Azione"
|
||||
},
|
||||
"create-alias": "Crea Alias",
|
||||
"manage-aliases": "Gestisci Alias",
|
||||
|
||||
@@ -210,8 +210,8 @@
|
||||
"unsaved-changes": "保存されていない変更があります。移動する前に保存しますか?保存するには はい を、変更を破棄するにはキャンセルしてください。",
|
||||
"clipboard-copy-failure": "クリップボードにコピーできませんでした",
|
||||
"confirm-delete-generic-items": "次のアイテムを本当に削除しますか?",
|
||||
"organizers": "Organizers",
|
||||
"caution": "Caution"
|
||||
"organizers": "収納",
|
||||
"caution": "注意"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "<b>{groupName}<b/> を削除しますか?",
|
||||
@@ -292,8 +292,8 @@
|
||||
"mealplan-updated": "献立を更新しました",
|
||||
"no-meal-plan-defined-yet": "食事プランはまだ定義されていません",
|
||||
"no-meal-planned-for-today": "今日の食事プランはありません",
|
||||
"numberOfDays-hint": "Number of days on page load",
|
||||
"numberOfDays-label": "Default Days",
|
||||
"numberOfDays-hint": "ページ読み込みの日数",
|
||||
"numberOfDays-label": "デフォルトの日数",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "食事プランでは、これらのカテゴリを持つレシピのみが使用されます",
|
||||
"planner": "プランナー",
|
||||
"quick-week": "クイックウィーク",
|
||||
@@ -383,7 +383,7 @@
|
||||
},
|
||||
"recipekeeper": {
|
||||
"title": "Recipe Keeper",
|
||||
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
|
||||
"description-long": "MealieはRecipe Keeperからレシピをインポートできます。レシピをzip形式でエクスポートし、以下に.zipファイルをアップロードしてください。"
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -449,8 +449,8 @@
|
||||
"ingredients": "材料",
|
||||
"insert-ingredient": "材料を投入",
|
||||
"insert-section": "手順を挿入",
|
||||
"insert-above": "Insert Above",
|
||||
"insert-below": "Insert Below",
|
||||
"insert-above": "上に挿入",
|
||||
"insert-below": "下に挿入",
|
||||
"instructions": "説明",
|
||||
"key-name-required": "キー名が必要です",
|
||||
"landscape-view-coming-soon": "Landscape View (Coming Soon)",
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "新しいレシピを一から作成します。",
|
||||
"create-recipes": "レシピを作成する",
|
||||
"import-with-zip": ".zip でインポート",
|
||||
"create-recipe-from-an-image": "画像からレシピを作成",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "URL 一括インポート",
|
||||
"debug-scraper": "デバッグスクレーパー",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "名前を指定してレシピを作成します。すべてのレシピには固有の名前が必要です。",
|
||||
@@ -586,8 +591,8 @@
|
||||
"report-deletion-failed": "レポートの削除に失敗しました",
|
||||
"recipe-debugger": "レシピのデバッガー",
|
||||
"recipe-debugger-description": "デバッグしたいレシピのURLを取得し、ここに貼り付けます。 URLはレシピスクレーパーによって削除され、結果が表示されます。 データが返されていない場合、スクレイプしようとしているサイトはMealieまたはそのスクレイパーライブラリではサポートされていません。",
|
||||
"use-openai": "Use OpenAI",
|
||||
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
|
||||
"use-openai": "OpenAIを使用する",
|
||||
"recipe-debugger-use-openai-description": "スクレーパーライブラリに依存するのではなく、結果を解析するためにOpenAIを使用してください。 URL経由でレシピを作成する場合は、スクレーパーライブラリが失敗した場合に自動的に行われますが、ここで手動でテストすることができます。",
|
||||
"debug": "デバッグ",
|
||||
"tree-view": "ツリービュー",
|
||||
"recipe-yield": "レシピ収率",
|
||||
@@ -598,19 +603,19 @@
|
||||
"nextStep": "次のステップ",
|
||||
"recipe-actions": "レシピ操作",
|
||||
"parser": {
|
||||
"experimental-alert-text": "Mealie uses natural language processing to parse and create units and food items for your recipe ingredients. This feature is experimental and may not always work as expected. If you prefer not to use the parsed results, you can select 'Cancel' and your changes will not be saved.",
|
||||
"experimental-alert-text": "Mealieは、自然言語処理を使用して、レシピ成分のための単位や食品を解析し、作成します。 この機能は実験的であり、常に期待どおりに動作するとは限りません。 解析結果を使用したくない場合は、「キャンセル」を選択することができ、変更内容は保存されません。",
|
||||
"ingredient-parser": "Ingredient Parser",
|
||||
"explanation": "To use the ingredient parser, click the 'Parse All' button to start the process. Once the processed ingredients are available, you can review the items and verify that they were parsed correctly. The model's confidence score is displayed on the right of the item title. This score is an average of all the individual scores and may not always be completely accurate.",
|
||||
"alerts-explainer": "Alerts will be displayed if a matching foods or unit is found but does not exists in the database.",
|
||||
"select-parser": "Select Parser",
|
||||
"natural-language-processor": "Natural Language Processor",
|
||||
"brute-parser": "Brute Parser",
|
||||
"openai-parser": "OpenAI Parser",
|
||||
"parse-all": "Parse All",
|
||||
"no-unit": "No unit",
|
||||
"missing-unit": "Create missing unit: {unit}",
|
||||
"missing-food": "Create missing food: {food}",
|
||||
"no-food": "No Food"
|
||||
"explanation": "Ingredient Parserを使用するには、「すべて解析」ボタンをクリックしてプロセスを開始します。 処理された原材料が利用可能になったら、項目を確認し、それらが正しく解析されたことを確認できます。 アイテムタイトルの右側にモデルの信頼度が表示されます。 このスコアは、すべての個々のスコアの平均であり、常に完全に正確であるとは限りません。",
|
||||
"alerts-explainer": "一致する食品または単位が見つかってもデータベースに存在しない場合は、アラートが表示されます。",
|
||||
"select-parser": "パーサを選択",
|
||||
"natural-language-processor": "自然言語処理",
|
||||
"brute-parser": "Bruteパーサ",
|
||||
"openai-parser": "OpenAIパーサ",
|
||||
"parse-all": "すべて解析",
|
||||
"no-unit": "単位がありません",
|
||||
"missing-unit": "欠けている単位を作成: {unit}",
|
||||
"missing-food": "欠けている食材を作成: {food}",
|
||||
"no-food": "食材はありません"
|
||||
}
|
||||
},
|
||||
"search": {
|
||||
@@ -640,7 +645,7 @@
|
||||
"backup-created-at-response-export_path": "{path} にバックアップを作成しました",
|
||||
"backup-deleted": "バックアップを削除しました",
|
||||
"restore-success": "復元に成功しました",
|
||||
"restore-fail": "Restore failed. Check your server logs for more details",
|
||||
"restore-fail": "復元に失敗しました。詳細はサーバーのログを確認してください",
|
||||
"backup-tag": "バックアップ タグ",
|
||||
"create-heading": "Create a Backup",
|
||||
"delete-backup": "バックアップを削除",
|
||||
@@ -771,7 +776,7 @@
|
||||
"server-side-base-url-error-text": "`BASE_URL` はAPIサーバーのデフォルト値です。サーバー上でメールなどの通知リンクが生成されると問題が発生します。",
|
||||
"server-side-base-url-success-text": "サーバー側のURLがデフォルトと一致しません",
|
||||
"ldap-ready": "LDAP対応",
|
||||
"ldap-ready-error-text": "すべてのLDAP値が設定されているわけではありません。LDAP認証を使用していない場合はこれは無視できます。",
|
||||
"ldap-ready-error-text": "すべてのLDAP値が設定されていません。LDAP認証を使用していない場合は無視できます。",
|
||||
"ldap-ready-success-text": "必要なLDAP変数はすべて設定されています。",
|
||||
"build": "Build",
|
||||
"recipe-scraper-version": "Recipe Scraper バージョン",
|
||||
@@ -779,8 +784,8 @@
|
||||
"oidc-ready-error-text": "すべてのOIDC値が設定されていません。OIDC認証を使用していない場合は無視できます。",
|
||||
"oidc-ready-success-text": "必要なOIDC変数はすべて設定されています。",
|
||||
"openai-ready": "OpenAI Ready",
|
||||
"openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.",
|
||||
"openai-ready-success-text": "Required OpenAI variables are all set."
|
||||
"openai-ready-error-text": "すべてのOpenAIの値が設定されていません。OpenAIを使用していない場合は無視できます。",
|
||||
"openai-ready-success-text": "必須のOpenAI変数はすべて設定されています。"
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "すべてのリスト",
|
||||
@@ -794,7 +799,7 @@
|
||||
"food": "食料",
|
||||
"note": "メモ",
|
||||
"label": "ラベル",
|
||||
"save-label": "Save Label",
|
||||
"save-label": "ラベルを保存",
|
||||
"linked-item-warning": "このアイテムは 1 つ以上のレシピにリンクされています。このリストにレシピを追加または削除するときに、単位や食品を調整すると予期しない結果が生じることがあります。",
|
||||
"toggle-food": "食料の切り替え",
|
||||
"manage-labels": "ラベルの管理",
|
||||
@@ -810,11 +815,11 @@
|
||||
"items-checked-count": "チェックされたアイテムはありません|チェックされたアイテムは1つです| チェックされたアイテムは {count} です",
|
||||
"no-label": "ラベルなし",
|
||||
"completed-on": "完了日: {date}",
|
||||
"you-are-offline": "You are offline",
|
||||
"you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?"
|
||||
"you-are-offline": "オフライン",
|
||||
"you-are-offline-description": "オフライン中は機能が一部制限されます。 アイテムの追加、変更、削除は可能ですがオンラインに戻るまでサーバーに変更を同期することはできません",
|
||||
"are-you-sure-you-want-to-check-all-items": "すべての項目をチェックしてもよろしいですか?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "すべてのアイテムのチェックを外してもよろしいですか?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "チェックされた項目をすべて削除してもよろしいですか?"
|
||||
},
|
||||
"sidebar": {
|
||||
"all-recipes": "すべてのレシピ",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "権限",
|
||||
"administrator": "管理者",
|
||||
"user-can-invite-other-to-group": "ユーザーは他のグループに招待できます",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "ユーザーはグループを管理できます",
|
||||
"user-can-organize-group-data": "ユーザーはグループデータを整理できます",
|
||||
"enable-advanced-features": "高度な機能を有効にする",
|
||||
@@ -990,8 +995,8 @@
|
||||
"food-data": "食品データ",
|
||||
"example-food-singular": "例: 玉ねぎ",
|
||||
"example-food-plural": "例: 玉ねぎ",
|
||||
"label-overwrite-warning": "This will assign the chosen label to all selected foods and potentially overwrite your existing labels.",
|
||||
"on-hand-checkbox-label": "Setting this flag will make this food unchecked by default when adding a recipe to a shopping list."
|
||||
"label-overwrite-warning": "選択したすべての食品に選択したラベルが割り当てられ、既存のラベルが上書きされます。",
|
||||
"on-hand-checkbox-label": "このフラグを設定すると、ショッピング リストにレシピを追加するときに、デフォルトでこの食品のチェックが外されます。"
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "ローカル言語に基づいた共通の単位をデータベースにシードします。",
|
||||
@@ -1020,7 +1025,7 @@
|
||||
"edit-label": "ラベルの編集",
|
||||
"new-label": "新規ラベル",
|
||||
"labels": "ラベル",
|
||||
"assign-label": "Assign Label"
|
||||
"assign-label": "ラベルの割り当て"
|
||||
},
|
||||
"recipes": {
|
||||
"purge-exports": "エクスポートの削除",
|
||||
@@ -1044,10 +1049,10 @@
|
||||
"source-unit-will-be-deleted": "元の単位が削除されます"
|
||||
},
|
||||
"recipe-actions": {
|
||||
"recipe-actions-data": "Recipe Actions Data",
|
||||
"new-recipe-action": "New Recipe Action",
|
||||
"edit-recipe-action": "Edit Recipe Action",
|
||||
"action-type": "Action Type"
|
||||
"recipe-actions-data": "レシピ操作データ",
|
||||
"new-recipe-action": "新しいレシピ操作",
|
||||
"edit-recipe-action": "レシピ操作の編集",
|
||||
"action-type": "操作タイプ"
|
||||
},
|
||||
"create-alias": "エイリアスを作成",
|
||||
"manage-aliases": "エイリアスの管理",
|
||||
@@ -1222,16 +1227,16 @@
|
||||
"get-invite-link": "招待リンクを取得",
|
||||
"get-public-link": "公開リンクを取得",
|
||||
"account-summary": "アカウントの概要",
|
||||
"account-summary-description": "Here's a summary of your group's information.",
|
||||
"account-summary-description": "グループ情報の概要は次のとおりです.",
|
||||
"group-statistics": "グループ統計",
|
||||
"group-statistics-description": "グループ統計によりMealieの使用状況がわかります。",
|
||||
"storage-capacity": "ストレージ容量",
|
||||
"storage-capacity-description": "ストレージ容量は、アップロードした画像とアセットの合計です。",
|
||||
"personal": "個人",
|
||||
"personal-description": "These are settings that are personal to you. Changes here won't affect other users.",
|
||||
"personal-description": "これらは個人的な設定です。ここでの変更は他のユーザーには影響しません.",
|
||||
"user-settings": "ユーザー設定",
|
||||
"user-settings-description": "Manage your preferences, change your password, and update your email.",
|
||||
"api-tokens-description": "Manage your API Tokens for access from external applications.",
|
||||
"user-settings-description": "設定を管理し、パスワードを変更し、電子メールを更新します。",
|
||||
"api-tokens-description": "外部アプリケーションからアクセスするためのAPIトークンを管理します.",
|
||||
"group-description": "これらのアイテムはグループ内で共有されます。そのうちの 1 つを編集すると、グループ全体の内容が変更されます。",
|
||||
"group-settings": "グループ設定",
|
||||
"group-settings-description": "食事プランやプライバシー設定などの共通のグループ設定を管理します。",
|
||||
@@ -1242,9 +1247,9 @@
|
||||
"notifiers": "通知",
|
||||
"notifiers-description": "Setup email and push notifications that trigger on specific events.",
|
||||
"manage-data": "データ管理",
|
||||
"manage-data-description": "Manage your Mealie data; Foods, Units, Categories, Tags and more.",
|
||||
"manage-data-description": "Mealieデータの管理:食材、単位、カテゴリ、タグなど。",
|
||||
"data-migrations": "データ移行",
|
||||
"data-migrations-description": "Migrate your existing data from other applications like Nextcloud Recipes and Chowdown.",
|
||||
"data-migrations-description": "NextcloudレシピやChowdownなどの他のアプリケーションから既存のデータを移行します。",
|
||||
"email-sent": "メールが送信されました",
|
||||
"error-sending-email": "メール送信エラー",
|
||||
"personal-information": "個人情報",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Create a recipe by providing the name. All recipes must have unique names.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Permissions",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "User can invite other to group",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "User can manage group",
|
||||
"user-can-organize-group-data": "User can organize group data",
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Įkelti naudojant .zip failus",
|
||||
"create-recipe-from-an-image": "Sukurti receptą iš nuotraukos",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Masinis URL importavimas",
|
||||
"debug-scraper": "Ieškoti nuskaitymo klaidų",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Sukurti receptą įrašant pavadinimą. Visi receptai privalo turėti unikalius pavadinimus.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Leidimai",
|
||||
"administrator": "Administratorius",
|
||||
"user-can-invite-other-to-group": "Naudotojas gali kviesti kitus į grupę",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "Naudotojas gali valdyti grupę",
|
||||
"user-can-organize-group-data": "Naudotojas gali tvarkyti grupės duomenis",
|
||||
"enable-advanced-features": "Įjungti pažangias funkcijas",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Create a recipe by providing the name. All recipes must have unique names.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Permissions",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "User can invite other to group",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "User can manage group",
|
||||
"user-can-organize-group-data": "User can organize group data",
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Maak een nieuw recept.",
|
||||
"create-recipes": "Recepten aanmaken",
|
||||
"import-with-zip": "Importeer met .zip",
|
||||
"create-recipe-from-an-image": "Maak recept van een afbeelding",
|
||||
"create-recipe-from-an-image": "Maak recept van de tekst op een afbeelding",
|
||||
"create-recipe-from-an-image-description": "Maak een recept door een afbeelding ervan te uploaden. Mealie probeert de tekst met behulp van AI uit de afbeelding te halen en er een recept uit te maken.",
|
||||
"crop-and-rotate-the-image": "Snijd de afbeelding bij zodat alleen tekst zichtbaar is. En draai t plaatje zodat het leesbaar is.",
|
||||
"create-from-image": "Maken vanuit afbeelding",
|
||||
"should-translate-description": "Vertaal het recept in mijn taal",
|
||||
"please-wait-image-procesing": "Even wachten. Mealie verwerkt de afbeelding. Dit kan even duren.",
|
||||
"bulk-url-import": "URL-import in bulk",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Maak een recept door het een naam te geven. Alle recepten moeten unieke namen hebben.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "Dit bepaalt hoe een gebruiker zich aanmeldt bij Mealie. Als je het niet zeker weet, kies dan voor 'Mealie'",
|
||||
"permissions": "Gebruikersrechten",
|
||||
"administrator": "Beheerder",
|
||||
"user-can-invite-other-to-group": "Gebruiker kan iemand uitnodigen voor de groep",
|
||||
"user-can-invite-other-to-group": "Gebruiker kan anderen uitnodigen voor zijn groep",
|
||||
"user-can-manage-group": "Gebruiker kan de groep beheren",
|
||||
"user-can-organize-group-data": "Gebruiker kan groepsgegevens indelen",
|
||||
"enable-advanced-features": "Geavanceerde functies inschakelen",
|
||||
|
||||
@@ -211,7 +211,7 @@
|
||||
"clipboard-copy-failure": "Kunne ikke kopiere til utklippstavlen.",
|
||||
"confirm-delete-generic-items": "Er du sikker på at du vil følgende elementer?",
|
||||
"organizers": "Organisatorer",
|
||||
"caution": "Caution"
|
||||
"caution": "Forsiktig"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Er du sikker på at du vil slette <b>{groupName}<b/>?",
|
||||
@@ -292,8 +292,8 @@
|
||||
"mealplan-updated": "Måltidsplan oppdatert",
|
||||
"no-meal-plan-defined-yet": "Ingen måltidsplan er definert ennå",
|
||||
"no-meal-planned-for-today": "Ingen måltid planlagt i dag",
|
||||
"numberOfDays-hint": "Number of days on page load",
|
||||
"numberOfDays-label": "Default Days",
|
||||
"numberOfDays-hint": "Antall dager på sideinnlasting",
|
||||
"numberOfDays-label": "Standard antall dager",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Kun oppskrifter med disse kategoriene vil bli brukt i måltidsplaner",
|
||||
"planner": "Planlegger",
|
||||
"quick-week": "Hurtigplan",
|
||||
@@ -383,7 +383,7 @@
|
||||
},
|
||||
"recipekeeper": {
|
||||
"title": "Recipe Keeper",
|
||||
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
|
||||
"description-long": "Meali kan importere oppskrifter fra Recipe Keeper. Eksporter oppskrifter i zip-format, og last deretter opp .zip-filen nedenfor."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -449,8 +449,8 @@
|
||||
"ingredients": "Ingredienser",
|
||||
"insert-ingredient": "Sett inn ingrediens",
|
||||
"insert-section": "Sett inn avsnitt",
|
||||
"insert-above": "Insert Above",
|
||||
"insert-below": "Insert Below",
|
||||
"insert-above": "Sett inn over",
|
||||
"insert-below": "Sett inn under",
|
||||
"instructions": "Instruksjoner",
|
||||
"key-name-required": "Navn på nøkkel er påkrevd",
|
||||
"landscape-view-coming-soon": "Landskapsvisning",
|
||||
@@ -562,6 +562,11 @@
|
||||
"create-recipes": "Opprett oppskrifter",
|
||||
"import-with-zip": "Importer fra .zip-fil",
|
||||
"create-recipe-from-an-image": "Opprett oppskrift fra et bilde",
|
||||
"create-recipe-from-an-image-description": "Opprett en oppskrift ved å laste opp et bilde av den. Mealie vil forsøke å hente ut teksten fra bildet ved bruk av AI, og lage en ny oppskrift.",
|
||||
"crop-and-rotate-the-image": "Beskjær og roter bildet slik at bare teksten er synlig, og at det er i riktig retning.",
|
||||
"create-from-image": "Opprett fra bilde",
|
||||
"should-translate-description": "Oversett oppskriften til mitt språk",
|
||||
"please-wait-image-procesing": "Vent litt, bildet blir prosessert. Dette kan ta litt tid.",
|
||||
"bulk-url-import": "Importer flere nettadresser",
|
||||
"debug-scraper": "Feilsøk skraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Opprett en oppskrift ved å angi navnet. Alle oppskrifter må ha unike navn.",
|
||||
@@ -586,8 +591,8 @@
|
||||
"report-deletion-failed": "Sletting av rapport mislyktes",
|
||||
"recipe-debugger": "Oppskriftsfeilsøker",
|
||||
"recipe-debugger-description": "Hent nettadressen til oppskriften du vil feilsøke og lim den inn her. Nettsiden vil bli skrapt og resultatene vil bli vist. Hvis du ikke ser noen data returnert, er ikke nettstedet du prøver å skrape støttet av Mealie eller skraper-biblioteket.",
|
||||
"use-openai": "Use OpenAI",
|
||||
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
|
||||
"use-openai": "Bruk OpenAI",
|
||||
"recipe-debugger-use-openai-description": "Bruke OpenAI til å analysere resultatene i stedet for å basere seg på scraper-biblioteket. Når du oppretter en oppskrift via URL, blir dette gjort automatisk hvis scraper-biblioteket mislykkes, men du kan teste det manuelt her.",
|
||||
"debug": "Feilsøk",
|
||||
"tree-view": "Trevisning",
|
||||
"recipe-yield": "Utbytte av oppskrift",
|
||||
@@ -598,19 +603,19 @@
|
||||
"nextStep": "Neste trinn",
|
||||
"recipe-actions": "Oppskriftshandlinger",
|
||||
"parser": {
|
||||
"experimental-alert-text": "Mealie uses natural language processing to parse and create units and food items for your recipe ingredients. This feature is experimental and may not always work as expected. If you prefer not to use the parsed results, you can select 'Cancel' and your changes will not be saved.",
|
||||
"experimental-alert-text": "Mealie bruker naturlig språkbehandling til å analysere og lage enheter og matvarer til oppskriftsingrediensene dine. Denne funksjonen er eksperimentell og fungerer kanskje ikke som forventet. Hvis du foretrekker ikke å bruke de foreslåtte resultatene, kan du velge 'Avbryt', og endringene dine vil ikke bli lagret.",
|
||||
"ingredient-parser": "Ingrediens-parser",
|
||||
"explanation": "To use the ingredient parser, click the 'Parse All' button to start the process. Once the processed ingredients are available, you can review the items and verify that they were parsed correctly. The model's confidence score is displayed on the right of the item title. This score is an average of all the individual scores and may not always be completely accurate.",
|
||||
"alerts-explainer": "Alerts will be displayed if a matching foods or unit is found but does not exists in the database.",
|
||||
"select-parser": "Select Parser",
|
||||
"natural-language-processor": "Natural Language Processor",
|
||||
"brute-parser": "Brute Parser",
|
||||
"openai-parser": "OpenAI Parser",
|
||||
"parse-all": "Parse All",
|
||||
"no-unit": "No unit",
|
||||
"missing-unit": "Create missing unit: {unit}",
|
||||
"missing-food": "Create missing food: {food}",
|
||||
"no-food": "No Food"
|
||||
"explanation": "For å bruke ingrediens-forslag, klikk på 'Analyser alle' for å starte prosessen. Når de prosesserte ingrediensene er tilgjengelige, kan du se gjennom elementene og kontrollere at de er sjekket korrekt. Modellens tillitsverdi vises på høyre side av elementet. Denne scoren er et gjennomsnitt av alle de individuelle poengene og alltid er ikke helt nøyaktige.",
|
||||
"alerts-explainer": "Varsler vil bli vist dersom en matchende matvare eller enhet blir funnet, men ikke finnes i databasen.",
|
||||
"select-parser": "Velg analyserer",
|
||||
"natural-language-processor": "Prosessor for naturlig språk",
|
||||
"brute-parser": "Enkel analyse",
|
||||
"openai-parser": "OpenAI-analyse",
|
||||
"parse-all": "Analyser alle",
|
||||
"no-unit": "Ingen enhet",
|
||||
"missing-unit": "Opprett manglende enhet: {unit}",
|
||||
"missing-food": "Opprett manglende mat: {food}",
|
||||
"no-food": "Ingen matvarer"
|
||||
}
|
||||
},
|
||||
"search": {
|
||||
@@ -640,7 +645,7 @@
|
||||
"backup-created-at-response-export_path": "Sikkerhetskopi opprettet i {path}",
|
||||
"backup-deleted": "Sikkerhetskopi slettet",
|
||||
"restore-success": "Gjenopprettingen var vellykket",
|
||||
"restore-fail": "Restore failed. Check your server logs for more details",
|
||||
"restore-fail": "Gjenoppretting mislyktes. Sjekk serverloggene for flere detaljer",
|
||||
"backup-tag": "Emneord for sikkerhetskopi",
|
||||
"create-heading": "Opprett en sikkerhetskopi",
|
||||
"delete-backup": "Slett sikkerhetskopi",
|
||||
@@ -778,9 +783,9 @@
|
||||
"oidc-ready": "OIDC klar",
|
||||
"oidc-ready-error-text": "Ikke alle OIDC-verdier er konfigurert. Dette kan ignoreres hvis du ikke bruker OIDC-autentisering.",
|
||||
"oidc-ready-success-text": "Alle obligratoriske OIDC-variabler er satt.",
|
||||
"openai-ready": "OpenAI Ready",
|
||||
"openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.",
|
||||
"openai-ready-success-text": "Required OpenAI variables are all set."
|
||||
"openai-ready": "OpenAI klar",
|
||||
"openai-ready-error-text": "Ikke alle OpenAI-verdier er konfigurert. Dette kan ignoreres hvis du ikke bruker OpenAI-funksjoner.",
|
||||
"openai-ready-success-text": "Alle påkrevde OpenAI-variabler er satt."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Alle lister",
|
||||
@@ -794,7 +799,7 @@
|
||||
"food": "Matvare",
|
||||
"note": "Notat",
|
||||
"label": "Etikett",
|
||||
"save-label": "Save Label",
|
||||
"save-label": "Lagre etikett",
|
||||
"linked-item-warning": "Dette elementet er koblet til én eller flere oppskrifter. Å endre enheter eller matvarer vil føre til uventede resultater når oppskriften legges til eller fjernes fra denne listen.",
|
||||
"toggle-food": "Vis/skjul matvare",
|
||||
"manage-labels": "Administrer etiketter",
|
||||
@@ -810,11 +815,11 @@
|
||||
"items-checked-count": "Ingen elementer krysset av|Ett element krysset av|{count} elementer krysset av",
|
||||
"no-label": "Ingen etikett",
|
||||
"completed-on": "Fullført den {date}",
|
||||
"you-are-offline": "You are offline",
|
||||
"you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?"
|
||||
"you-are-offline": "Du er offline",
|
||||
"you-are-offline-description": "Ikke alle funksjoner er tilgjengelige i frakoblet modus. Du kan fremdeles legge til, endre og fjerne elementer. men du vil ikke kunne synkronisere endringene dine med serveren før du er logget på igjen.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Er du sikker på at du vil velge alle elementer?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Er du sikker på at du vil fjerne valg av alle elementer?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Er du sikker på at du vil slette alle valgte elementer?"
|
||||
},
|
||||
"sidebar": {
|
||||
"all-recipes": "Alle oppskrifter",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Rettigheter",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "Brukeren kan invitere andre til gruppe",
|
||||
"user-can-invite-other-to-group": "Bruker kan invitere andre til gruppe",
|
||||
"user-can-manage-group": "Brukeren kan administrere gruppe",
|
||||
"user-can-organize-group-data": "Brukeren kan organisere gruppedata",
|
||||
"enable-advanced-features": "Aktiver avanserte funksjoner",
|
||||
@@ -990,8 +995,8 @@
|
||||
"food-data": "Matvaredata",
|
||||
"example-food-singular": "f.eks: tomat",
|
||||
"example-food-plural": "f.eks: tomater",
|
||||
"label-overwrite-warning": "This will assign the chosen label to all selected foods and potentially overwrite your existing labels.",
|
||||
"on-hand-checkbox-label": "Setting this flag will make this food unchecked by default when adding a recipe to a shopping list."
|
||||
"label-overwrite-warning": "Dette vil tildele den valgte etiketten til alle valgte matvarer og potensielt overskrive dine eksisterende etiketter.",
|
||||
"on-hand-checkbox-label": "Ved å angi dette flagget blir ikke maten valgt som standard når du legger til en oppskrift på en handleliste."
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Tilfør typiske enheter i databasen basert på ditt lokale språk.",
|
||||
@@ -1020,7 +1025,7 @@
|
||||
"edit-label": "Rediger etikett",
|
||||
"new-label": "Ny etikett",
|
||||
"labels": "Etiketter",
|
||||
"assign-label": "Assign Label"
|
||||
"assign-label": "Tilordne etikett"
|
||||
},
|
||||
"recipes": {
|
||||
"purge-exports": "Fjern eksporter",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Importuj z pliku .zip",
|
||||
"create-recipe-from-an-image": "Utwórz przepis z obrazka",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Import Zbiorczy z URL",
|
||||
"debug-scraper": "Debuguj Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Utwórz przepis, podając nazwę. Wszystkie przepisy muszą mieć unikalne nazwy.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "Określa jak użytkownik będzie uwierzytelniać się z Mealie. Jeśli nie jesteś pewien, wybierz 'Mealie",
|
||||
"permissions": "Uprawnienia",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "Użytkownik może zaprosić innych do grupy",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "Użytkownik może zarządzać grupą",
|
||||
"user-can-organize-group-data": "Użytkownik może organizować dane grupy",
|
||||
"enable-advanced-features": "Włącz zaawansowane funkcje",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Criar uma receita do zero.",
|
||||
"create-recipes": "Criar Receitas",
|
||||
"import-with-zip": "Importar a partir de .zip",
|
||||
"create-recipe-from-an-image": "Criar Receita a partir de uma imagem",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Importação de URL em massa",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Crie uma receita fornecendo o nome. Todas as receitas devem ter nomes exclusivos.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "Isto especifica como um usuário se autentica com o Mealie. Se não tem certeza, escolha \"Mealie\"",
|
||||
"permissions": "Permissões",
|
||||
"administrator": "Administrador",
|
||||
"user-can-invite-other-to-group": "O usuário pode convidar outro para o grupo",
|
||||
"user-can-invite-other-to-group": "O usuário pode convidar outros para o grupo",
|
||||
"user-can-manage-group": "Usuário pode gerenciar o grupo",
|
||||
"user-can-organize-group-data": "Usuário pode organizar dados do grupo",
|
||||
"enable-advanced-features": "Ativar recursos avançados",
|
||||
|
||||
@@ -211,7 +211,7 @@
|
||||
"clipboard-copy-failure": "Erro ao copiar para a área de transferência.",
|
||||
"confirm-delete-generic-items": "Tem a certeza de que deseja eliminar os seguintes itens?",
|
||||
"organizers": "Organizadores",
|
||||
"caution": "Caution"
|
||||
"caution": "Cuidado"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Tem a certeza que quer eliminar <b>{groupName}<b/>?",
|
||||
@@ -449,8 +449,8 @@
|
||||
"ingredients": "Ingredientes",
|
||||
"insert-ingredient": "Inserir Ingrediente",
|
||||
"insert-section": "Inserir Secção",
|
||||
"insert-above": "Insert Above",
|
||||
"insert-below": "Insert Below",
|
||||
"insert-above": "Inserir Acima",
|
||||
"insert-below": "Inserir Abaixo",
|
||||
"instructions": "Instruções",
|
||||
"key-name-required": "Nome da Chave é Obrigatório",
|
||||
"landscape-view-coming-soon": "Modo paisagem",
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Criar uma receita em branco.",
|
||||
"create-recipes": "Criar Receitas",
|
||||
"import-with-zip": "Importar com .zip",
|
||||
"create-recipe-from-an-image": "Criar receita a partir de uma imagem",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Importação de URL em bloco",
|
||||
"debug-scraper": "Depurar Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Crie uma receita fornecendo o nome. Todas as receitas devem ter nomes únicos.",
|
||||
@@ -810,11 +815,11 @@
|
||||
"items-checked-count": "Sem itens selecionados|Um item selecionado|{count} itens selecionados",
|
||||
"no-label": "Sem Rótulo",
|
||||
"completed-on": "Concluída em {date}",
|
||||
"you-are-offline": "You are offline",
|
||||
"you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?"
|
||||
"you-are-offline": "Está offline",
|
||||
"you-are-offline-description": "Nem todas as funcionalidades estão disponíveis enquanto estiver offline. Continua a poder adicionar, modificar e remover itens, mas não poderá sincronizar as suas alterações com o servidor até estar novamente online.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Tem a certeza de que pretende selecionar todos os itens?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Tem a certeza de que pretende desmarcar todos os itens?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Tem a certeza de que pretende eliminar todos os itens selecionados?"
|
||||
},
|
||||
"sidebar": {
|
||||
"all-recipes": "Todas as Receitas",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Permissões",
|
||||
"administrator": "Administrador",
|
||||
"user-can-invite-other-to-group": "O utilizador pode convidar outro para o grupo",
|
||||
"user-can-invite-other-to-group": "O utilizador pode convidar outros para o grupo",
|
||||
"user-can-manage-group": "O utilizador pode gerir o grupo",
|
||||
"user-can-organize-group-data": "O utilizador pode organizar dados do grupo",
|
||||
"enable-advanced-features": "Habilitar recursos avançados",
|
||||
@@ -990,8 +995,8 @@
|
||||
"food-data": "Dados do Alimento",
|
||||
"example-food-singular": "ex: Cebola",
|
||||
"example-food-plural": "ex: Cebolas",
|
||||
"label-overwrite-warning": "This will assign the chosen label to all selected foods and potentially overwrite your existing labels.",
|
||||
"on-hand-checkbox-label": "Setting this flag will make this food unchecked by default when adding a recipe to a shopping list."
|
||||
"label-overwrite-warning": "Isto irá atribuir o rótulo escolhido a todos os alimentos selecionados e, eventualmente, substituir os rótulos existentes.",
|
||||
"on-hand-checkbox-label": "A ativação deste sinalizador fará com que este alimento seja desmarcado por defeito ao adicionar uma receita a uma lista de compras."
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Popule a base de dados com unidades comuns no seu idioma.",
|
||||
@@ -1020,7 +1025,7 @@
|
||||
"edit-label": "Editar Rótulo",
|
||||
"new-label": "Novo rótulo",
|
||||
"labels": "Rótulos",
|
||||
"assign-label": "Assign Label"
|
||||
"assign-label": "Atribuir Rótulo"
|
||||
},
|
||||
"recipes": {
|
||||
"purge-exports": "Limpar exportações",
|
||||
|
||||
@@ -211,7 +211,7 @@
|
||||
"clipboard-copy-failure": "Copierea în clipboard a eșuat.",
|
||||
"confirm-delete-generic-items": "Sunteți sigur că doriți să ștergeți următoarele?",
|
||||
"organizers": "Organizatori",
|
||||
"caution": "Caution"
|
||||
"caution": "Atenție"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Sunteți sigur că doriți să ștergeți <b>{groupName}<b/>?",
|
||||
@@ -292,8 +292,8 @@
|
||||
"mealplan-updated": "Plan de mese actualizat",
|
||||
"no-meal-plan-defined-yet": "Nici un plan de mese definit încă",
|
||||
"no-meal-planned-for-today": "Nicio masă planificată pentru astăzi",
|
||||
"numberOfDays-hint": "Number of days on page load",
|
||||
"numberOfDays-label": "Default Days",
|
||||
"numberOfDays-hint": "Număr de zile pe pagină încărcată",
|
||||
"numberOfDays-label": "Zile implicite",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Numai rețetele cu aceste categorii vor fi utilizate în Planurile de mese",
|
||||
"planner": "Planificator",
|
||||
"quick-week": "Săptămână rapidă",
|
||||
@@ -379,10 +379,10 @@
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "Cutia mea de rețete",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
"description-long": "Mealie poate importa rețete din Cutia mea de rețete. Exportă rețetele în format CSV, apoi încarcă fișierul .csv de mai jos."
|
||||
},
|
||||
"recipekeeper": {
|
||||
"title": "Recipe Keeper",
|
||||
"title": "Oraganizator de rețete",
|
||||
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
|
||||
}
|
||||
},
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Creează o rețetă nouă de la zero.",
|
||||
"create-recipes": "Crează rețetă",
|
||||
"import-with-zip": "Importă cu .zip",
|
||||
"create-recipe-from-an-image": "Creează o rețetă dintr-o imagine",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Import URL în bulk",
|
||||
"debug-scraper": "Depanare funcție Importare",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Creează o rețetă furnizând numele. Toate rețetele trebuie să aibă nume unice.",
|
||||
@@ -699,7 +704,7 @@
|
||||
"error-updating-theme": "Error updating theme",
|
||||
"info": "Info",
|
||||
"light": "Light",
|
||||
"primary": "Primary",
|
||||
"primary": "Primară",
|
||||
"secondary": "Secondary",
|
||||
"success": "Succes",
|
||||
"switch-to-dark-mode": "Switch to dark mode",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Permissions",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "User can invite other to group",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "User can manage group",
|
||||
"user-can-organize-group-data": "User can organize group data",
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Создать новый рецепт с нуля.",
|
||||
"create-recipes": "Создать Рецепт",
|
||||
"import-with-zip": "Импорт из .zip",
|
||||
"create-recipe-from-an-image": "Создать рецепт из изображения",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Массовый импорт по URL",
|
||||
"debug-scraper": "Отладка сканирования",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Создайте рецепт, указав имя. Все рецепты должны иметь уникальные имена.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Права доступа",
|
||||
"administrator": "Администратор",
|
||||
"user-can-invite-other-to-group": "Пользователь может пригласить других в группу",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "Пользователь может управлять группой",
|
||||
"user-can-organize-group-data": "Пользователь может менять групповые данные",
|
||||
"enable-advanced-features": "Включить доп. функции",
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
"something-went-wrong": "Vyskytla sa chyba",
|
||||
"subscribed-events": "Prihlásené akcie",
|
||||
"test-message-sent": "Testovacia správa bola odoslaná",
|
||||
"message-sent": "Message Sent",
|
||||
"message-sent": "Správa odoslaná",
|
||||
"new-notification": "Nové upozornenie",
|
||||
"event-notifiers": "Upozornenia udalostí",
|
||||
"apprise-url-skipped-if-blank": "Informačná URL (preskočená, ak je prázdna)",
|
||||
@@ -161,7 +161,7 @@
|
||||
"test": "Otestovať",
|
||||
"themes": "Motívy",
|
||||
"thursday": "Štvrtok",
|
||||
"title": "Title",
|
||||
"title": "Názov",
|
||||
"token": "Token",
|
||||
"tuesday": "Utorok",
|
||||
"type": "Typ",
|
||||
@@ -210,8 +210,8 @@
|
||||
"unsaved-changes": "Posledne vykonané zmeny nie sú uložené. Želáte si ich uložiť alebo zrušiť?",
|
||||
"clipboard-copy-failure": "Skopírovanie do schránky zlyhalo.",
|
||||
"confirm-delete-generic-items": "Ste si istý, že chcete odstrániť nasledujúce položky?",
|
||||
"organizers": "Organizers",
|
||||
"caution": "Caution"
|
||||
"organizers": "Organizátori",
|
||||
"caution": "Výstraha"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Naozaj chcete odstrániť <b>{groupName}<b/>?",
|
||||
@@ -292,8 +292,8 @@
|
||||
"mealplan-updated": "Jedálniček aktualizovaný",
|
||||
"no-meal-plan-defined-yet": "Nebol vytvorený žiadny jedálniček",
|
||||
"no-meal-planned-for-today": "Pre dnešok žiadne jedlo v jedálničku",
|
||||
"numberOfDays-hint": "Number of days on page load",
|
||||
"numberOfDays-label": "Default Days",
|
||||
"numberOfDays-hint": "Počet dní na stránke",
|
||||
"numberOfDays-label": "Predvolený počet dní",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "V jedálničkoch budú použité iba recepty z nasledovných kategórií",
|
||||
"planner": "Plánovač",
|
||||
"quick-week": "Rýchly návrh týždňa",
|
||||
@@ -368,7 +368,7 @@
|
||||
"choose-migration-type": "Vyberte spôsob migrácie",
|
||||
"tag-all-recipes": "Označte všetky recepty štítkom {tag-name}",
|
||||
"nextcloud-text": "Recepty z Nextcloud-u je možné importovať priamo zo zip-súboru, ktorý obsahuje dáta uložené na Nextcloud-e. Pozrite sa nižšie na príklad adresárovej štruktúry, aby ste sa uistili, že je možné vaše recepty importovať.",
|
||||
"chowdown-text": "Mealie natively supports the chowdown repository format. Download the code repository as a .zip file and upload it below.",
|
||||
"chowdown-text": "Mealie natívne podporuje formát úložiska chowdown. Stiahnite si repozitár ako súbor .zip a nahrajte ho nižšie.",
|
||||
"recipe-1": "Recept 1",
|
||||
"recipe-2": "Recept 2",
|
||||
"paprika-text": "Mealie dokáže importovať recepty z aplikácie Paprika. Exportujte vaše recepty z Papriky, premenujte príponu exportovaného súboru na .zip a nahrajte ho nižšie.",
|
||||
@@ -378,12 +378,12 @@
|
||||
"description-long": "Mealie dokáže importovať recepty z Plan To Eat."
|
||||
},
|
||||
"myrecipebox": {
|
||||
"title": "My Recipe Box",
|
||||
"description-long": "Mealie can import recipes from My Recipe Box. Export your recipes in CSV format, then upload the .csv file below."
|
||||
"title": "Môj receptár",
|
||||
"description-long": "Mealie dokáže importovať recepty z My Recipe Box. Exportujte recepty vo formáte CSV a nižšie nahrajte csv súbor."
|
||||
},
|
||||
"recipekeeper": {
|
||||
"title": "Recipe Keeper",
|
||||
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
|
||||
"title": "Strážca receptov",
|
||||
"description-long": "Mealie dokáže importovať recepty z Recipe Keeper. Exportujte recepty vo formáte Zip a nižšie nahrajte zip súbor."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -449,8 +449,8 @@
|
||||
"ingredients": "Suroviny",
|
||||
"insert-ingredient": "Vložiť prísadu",
|
||||
"insert-section": "Vložiť sekciu",
|
||||
"insert-above": "Insert Above",
|
||||
"insert-below": "Insert Below",
|
||||
"insert-above": "Vložte vyššie",
|
||||
"insert-below": "Vložte nižšie",
|
||||
"instructions": "Postup",
|
||||
"key-name-required": "Názov kľúča je povinným údajom",
|
||||
"landscape-view-coming-soon": "Orientácia na šírku (čoskoro)",
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Vytvoriť nový recept od začiatku.",
|
||||
"create-recipes": "Vytvoriť recept",
|
||||
"import-with-zip": "Importovať .zip súbor",
|
||||
"create-recipe-from-an-image": "Vytvoriť recept z obrázku",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Hromadný URL import",
|
||||
"debug-scraper": "Debugovať scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Vytvoriť recept zadaním názvu. Všetky recepty musia mať jedinečné názvy.",
|
||||
@@ -586,8 +591,8 @@
|
||||
"report-deletion-failed": "Vymazanie reportov zlyhalo",
|
||||
"recipe-debugger": "Debugger receptov",
|
||||
"recipe-debugger-description": "Vezmite URL odkaz receptu, ktorý chcete opraviť a vložte ju sem. Recept bude stiahnutý z URL odkazu pomocou scrapera receptov a zobrazí sa výsledok sťahovania. V prípade, ak nevidíte žiadne zobrazené dáta, stránka z URL odkazu nie je podporovaná Mealie alebo jej scrapovacou knižnicou.",
|
||||
"use-openai": "Use OpenAI",
|
||||
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
|
||||
"use-openai": "Použite OpenAI",
|
||||
"recipe-debugger-use-openai-description": "Použite OpenAI na analýzu výsledkov namiesto spoliehania sa na knižnicu scraper. Pri vytváraní receptu cez URL sa to vykoná automaticky, ak knižnica scraper zlyhá, ale tu to môžete otestovať manuálne.",
|
||||
"debug": "Debugovať",
|
||||
"tree-view": "Stromový pohľad",
|
||||
"recipe-yield": "Počet porcií",
|
||||
@@ -596,21 +601,21 @@
|
||||
"screen-awake": "Ponechať obrazovku stále zapnutú",
|
||||
"remove-image": "Odstrániť obrázok",
|
||||
"nextStep": "Ďalší krok",
|
||||
"recipe-actions": "Recipe Actions",
|
||||
"recipe-actions": "Akcie s receptom",
|
||||
"parser": {
|
||||
"experimental-alert-text": "Mealie uses natural language processing to parse and create units and food items for your recipe ingredients. This feature is experimental and may not always work as expected. If you prefer not to use the parsed results, you can select 'Cancel' and your changes will not be saved.",
|
||||
"ingredient-parser": "Ingredient Parser",
|
||||
"explanation": "To use the ingredient parser, click the 'Parse All' button to start the process. Once the processed ingredients are available, you can review the items and verify that they were parsed correctly. The model's confidence score is displayed on the right of the item title. This score is an average of all the individual scores and may not always be completely accurate.",
|
||||
"alerts-explainer": "Alerts will be displayed if a matching foods or unit is found but does not exists in the database.",
|
||||
"select-parser": "Select Parser",
|
||||
"natural-language-processor": "Natural Language Processor",
|
||||
"brute-parser": "Brute Parser",
|
||||
"openai-parser": "OpenAI Parser",
|
||||
"parse-all": "Parse All",
|
||||
"no-unit": "No unit",
|
||||
"missing-unit": "Create missing unit: {unit}",
|
||||
"missing-food": "Create missing food: {food}",
|
||||
"no-food": "No Food"
|
||||
"experimental-alert-text": "Mealie používa spracovanie prirodzeného jazyka na analýzu a vytváranie jednotiek a potravín pre ingrediencie vášho receptu. Táto funkcia je experimentálna a nemusí vždy fungovať podľa očakávania. Ak nechcete použiť analyzované výsledky, môžete vybrať možnosť „Zrušiť“ a vaše zmeny sa neuložia.",
|
||||
"ingredient-parser": "Parser ingrediencií",
|
||||
"explanation": "Ak chcete použiť parser ingrediencií, kliknutím na tlačidlo „Spracovať všetko“ spustite proces parsovania. Keď budú spracované ingrediencie k dispozícii, môžete položky skontrolovať a overiť, či boli správne analyzované. Skóre spoľahlivosti modelu sa zobrazuje napravo od názvu položky. Toto skóre je priemerom všetkých individuálnych skóre a nemusí byť vždy úplne presné.",
|
||||
"alerts-explainer": "Upozornenia sa zobrazia, ak sa nájde zodpovedajúce jedlo alebo jednotka, ktoré v databáze ešte neexistuje.",
|
||||
"select-parser": "Vyber si parser",
|
||||
"natural-language-processor": "Spracovanie prirodzeného jazyka",
|
||||
"brute-parser": "Parsovanie hrubou silou",
|
||||
"openai-parser": "OpenAI parser",
|
||||
"parse-all": "Spracovať všetko",
|
||||
"no-unit": "Bez jednotky",
|
||||
"missing-unit": "Vytvoriť chýbajúcu jednotku: {unit}",
|
||||
"missing-food": "Vytvoriť chýbajúcu surovinu: {food}",
|
||||
"no-food": "Žiadne suroviny"
|
||||
}
|
||||
},
|
||||
"search": {
|
||||
@@ -640,7 +645,7 @@
|
||||
"backup-created-at-response-export_path": "Záloha vytvorená v {path}",
|
||||
"backup-deleted": "Záloha bola odstránená",
|
||||
"restore-success": "Obnovenie bolo úspešné",
|
||||
"restore-fail": "Restore failed. Check your server logs for more details",
|
||||
"restore-fail": "Obnovenie zlyhalo. Ďalšie podrobnosti nájdete v denníkoch servera",
|
||||
"backup-tag": "Označenie zálohy",
|
||||
"create-heading": "Vytvoriť zálohu",
|
||||
"delete-backup": "Odstrániť zálohu",
|
||||
@@ -778,9 +783,9 @@
|
||||
"oidc-ready": "OIDC pripravené",
|
||||
"oidc-ready-error-text": "Niektoré z OIDC hodnôt nie sú nakonfigurované. Toto varovanie je možné ignorovať, ak nepoužívate OIDC autentifikáciu.",
|
||||
"oidc-ready-success-text": "Všetky potrebné OIDC premenné sú nastavené.",
|
||||
"openai-ready": "OpenAI Ready",
|
||||
"openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.",
|
||||
"openai-ready-success-text": "Required OpenAI variables are all set."
|
||||
"openai-ready": "OpenAI pripravené",
|
||||
"openai-ready-error-text": "Nie všetky hodnoty pre OpenAI sú nakonfigurované. Toto môžete ignorovať, ak nepoužívate funkcie OpenAI.",
|
||||
"openai-ready-success-text": "Všetky požadované premenné pre OpenAI sú nastavené."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Všetky zoznamy",
|
||||
@@ -794,7 +799,7 @@
|
||||
"food": "Jedlo",
|
||||
"note": "Poznámka",
|
||||
"label": "Štítok",
|
||||
"save-label": "Save Label",
|
||||
"save-label": "Uložiť štítok",
|
||||
"linked-item-warning": "Táto položka je prepojená s jedným alebo viacerými receptami. Zmena jednotiek alebo jedál bude viesť k neželaným zmenám pri pridávaní alebo odoberaní receptov z tohto zoznamu.",
|
||||
"toggle-food": "Prepnúť jedlo",
|
||||
"manage-labels": "Spravovať štítky",
|
||||
@@ -810,11 +815,11 @@
|
||||
"items-checked-count": "Nie sú označené žiadne položky|Jedna označená položka|{count} označených položiek",
|
||||
"no-label": "Žiadny štítok",
|
||||
"completed-on": "Ukončené {date}",
|
||||
"you-are-offline": "You are offline",
|
||||
"you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?"
|
||||
"you-are-offline": "Nemáte prístup k internetu",
|
||||
"you-are-offline-description": "V režime offline nie sú dostupné všetky funkcie. Stále môžete pridávať, upravovať a odstraňovať položky, ale nebudete môcť synchronizovať svoje zmeny so serverom, kým nebudete opäť online.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Naozaj chcete označiť všetky položky?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Naozaj chcete zrušiť označenie všetkých položiek?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Naozaj chcete odstrániť všetky označené položky?"
|
||||
},
|
||||
"sidebar": {
|
||||
"all-recipes": "Všetky recepty",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "Toto určuje ako bude overený užívateľ. Ak si nie ste istý, zvoľte 'Mealie'",
|
||||
"permissions": "Povolenia",
|
||||
"administrator": "Administrátor",
|
||||
"user-can-invite-other-to-group": "Užívateľ môže do skupiny pozvať ďalších",
|
||||
"user-can-invite-other-to-group": "Používateľ môže pozvať ostatných do skupiny",
|
||||
"user-can-manage-group": "Užívateľ môže spravovať skupinu",
|
||||
"user-can-organize-group-data": "Užívateľ môže spravovať údaje skupiny",
|
||||
"enable-advanced-features": "Povoliť pokročilé funkcie",
|
||||
@@ -985,13 +990,13 @@
|
||||
"source-food": "Zdrojové jedlo",
|
||||
"target-food": "Cieľové jedlo",
|
||||
"create-food": "Vytvoriť jedlo",
|
||||
"food-label": "Značka jedla",
|
||||
"food-label": "Štítok jedla",
|
||||
"edit-food": "Upraviť jedlo",
|
||||
"food-data": "Údaje o jedle",
|
||||
"example-food-singular": "napr.: cibuľa",
|
||||
"example-food-plural": "napr.: cibule",
|
||||
"label-overwrite-warning": "This will assign the chosen label to all selected foods and potentially overwrite your existing labels.",
|
||||
"on-hand-checkbox-label": "Setting this flag will make this food unchecked by default when adding a recipe to a shopping list."
|
||||
"label-overwrite-warning": "Toto priradí zvolený štítok všetkým vybraným potravinám a potenciálne prepíše vaše existujúce štítky.",
|
||||
"on-hand-checkbox-label": "Nastavením tohto príznaku bude táto surovina, pri pridávaní receptu do nákupného zoznamu, predvolene nezačiarknutá."
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Naplniť databázu z bežnými štítkami podla vášho lokálneho jazyka.",
|
||||
@@ -1017,10 +1022,10 @@
|
||||
},
|
||||
"labels": {
|
||||
"seed-dialog-text": "Naplniť databázu z bežnými štítkami podla vášho lokálneho jazyka.",
|
||||
"edit-label": "Upraviť značku",
|
||||
"new-label": "Nová značka",
|
||||
"labels": "Značky",
|
||||
"assign-label": "Assign Label"
|
||||
"edit-label": "Upraviť štítok",
|
||||
"new-label": "Nový štítok",
|
||||
"labels": "Štítky",
|
||||
"assign-label": "Priradiť štítok"
|
||||
},
|
||||
"recipes": {
|
||||
"purge-exports": "Vyčistiť exporty",
|
||||
@@ -1044,10 +1049,10 @@
|
||||
"source-unit-will-be-deleted": "Zdroj bude vymazaný"
|
||||
},
|
||||
"recipe-actions": {
|
||||
"recipe-actions-data": "Recipe Actions Data",
|
||||
"new-recipe-action": "New Recipe Action",
|
||||
"edit-recipe-action": "Edit Recipe Action",
|
||||
"action-type": "Action Type"
|
||||
"recipe-actions-data": "Dáta akcií receptu",
|
||||
"new-recipe-action": "Nová akcia receptu",
|
||||
"edit-recipe-action": "Upraviť akciu receptu",
|
||||
"action-type": "Typ akcie"
|
||||
},
|
||||
"create-alias": "Vytvoriť alias",
|
||||
"manage-aliases": "Spravovať aliasy",
|
||||
@@ -1217,21 +1222,21 @@
|
||||
}
|
||||
},
|
||||
"profile": {
|
||||
"welcome-user": "👋 Welcome, {0}!",
|
||||
"welcome-user": "👋 Vitajte, {0}!",
|
||||
"description": "Spravujte svoj profil, recepty a nastavenia skupín.",
|
||||
"get-invite-link": "Odkaz s pozvánkou",
|
||||
"get-public-link": "Vytvoriť verejný odkaz",
|
||||
"account-summary": "Zhrnutie účtu",
|
||||
"account-summary-description": "Here's a summary of your group's information.",
|
||||
"account-summary-description": "Tu je súhrn informácií o vašej skupine.",
|
||||
"group-statistics": "Štatistiky skupiny",
|
||||
"group-statistics-description": "Štatistiky vašej skupiny poskytujú ďalší pohľad na to, ako využívate Mealie.",
|
||||
"storage-capacity": "Kapacita úložiska",
|
||||
"storage-capacity-description": "Kapacita vášho úložiska sa počíta ako celkový objem obrázkov a príloh, ktoré máte nahraté.",
|
||||
"personal": "Osobné",
|
||||
"personal-description": "These are settings that are personal to you. Changes here won't affect other users.",
|
||||
"personal-description": "Toto sú vaše osobné nastavenia. Zmeny týchto nastavení neovplyvnia ostatných používateľov.",
|
||||
"user-settings": "Užívateľské nastavenia",
|
||||
"user-settings-description": "Manage your preferences, change your password, and update your email.",
|
||||
"api-tokens-description": "Manage your API Tokens for access from external applications.",
|
||||
"user-settings-description": "Spravujte svoje preferencie, zmeňte svoje heslo a aktualizujte svoj e-mail.",
|
||||
"api-tokens-description": "Spravujte svoje API tokeny pre prístup z externých aplikácií.",
|
||||
"group-description": "Tieto položky sú zdieľané v rámci vašej skupiny. Zmena ktorejkoľvek z nich sa prejaví v celej skupine!",
|
||||
"group-settings": "Nastavenia skupiny",
|
||||
"group-settings-description": "Spravujte bežné nastavenia vašej skupiny ako napr. jedálniček, či nastavenia súkromia.",
|
||||
@@ -1242,9 +1247,9 @@
|
||||
"notifiers": "Notifikátory",
|
||||
"notifiers-description": "Nastaviť e-mail a push notifikácie, ktoré sa spúšťajú pri špecifických udalostiach.",
|
||||
"manage-data": "Spravovať dáta",
|
||||
"manage-data-description": "Manage your Mealie data; Foods, Units, Categories, Tags and more.",
|
||||
"manage-data-description": "Spravujte svoje údaje, jedlá, jednotky, kategórie, štítky a ďalšie.",
|
||||
"data-migrations": "Migrácie dát",
|
||||
"data-migrations-description": "Migrate your existing data from other applications like Nextcloud Recipes and Chowdown.",
|
||||
"data-migrations-description": "Migrujte svoje existujúce údaje z iných aplikácií, ako sú Nextcloud Recipes a Chowdown.",
|
||||
"email-sent": "E-mail Odoslaný",
|
||||
"error-sending-email": "Chyba pri odosielaní e-mailu",
|
||||
"personal-information": "Osobné údaje",
|
||||
|
||||
@@ -211,7 +211,7 @@
|
||||
"clipboard-copy-failure": "Kopiranje na odložišče ni bilo uspešno.",
|
||||
"confirm-delete-generic-items": "Ali ste prepričani, da želite izbrisati izbrane elemente?",
|
||||
"organizers": "Organizatorji",
|
||||
"caution": "Caution"
|
||||
"caution": "Pozor"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Ste prepričani, da želite izbrisati <b>{groupName}<b/>?",
|
||||
@@ -292,8 +292,8 @@
|
||||
"mealplan-updated": "Jedilnik je posodobljen",
|
||||
"no-meal-plan-defined-yet": "Za danes ni definiranjega načrta obroka",
|
||||
"no-meal-planned-for-today": "Za danes ni planiranega načrta obroka",
|
||||
"numberOfDays-hint": "Number of days on page load",
|
||||
"numberOfDays-label": "Default Days",
|
||||
"numberOfDays-hint": "Število dni na začetni strani",
|
||||
"numberOfDays-label": "Privzeto dni",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Samo recepti v teh kategorija bodo uporabljeni v načrtu obroka",
|
||||
"planner": "Načrtovalec",
|
||||
"quick-week": "Hiter pogled tedna",
|
||||
@@ -383,7 +383,7 @@
|
||||
},
|
||||
"recipekeeper": {
|
||||
"title": "Recipe Keeper",
|
||||
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
|
||||
"description-long": "Mealie lahko uvozi recepte iz Recipe Keeper. Izvozi svoje recepte v .zip formatu, nato spodaj naloži .zip datoteko."
|
||||
}
|
||||
},
|
||||
"new-recipe": {
|
||||
@@ -449,8 +449,8 @@
|
||||
"ingredients": "Sestavine",
|
||||
"insert-ingredient": "Dodaj sestavino",
|
||||
"insert-section": "Vstavi odsek",
|
||||
"insert-above": "Insert Above",
|
||||
"insert-below": "Insert Below",
|
||||
"insert-above": "Vstavi zgoraj",
|
||||
"insert-below": "Vstavi spodaj",
|
||||
"instructions": "Navodila",
|
||||
"key-name-required": "Obvezen vnos imena ključa",
|
||||
"landscape-view-coming-soon": "Ležeči pogled",
|
||||
@@ -562,6 +562,11 @@
|
||||
"create-recipes": "Ustvari recepte",
|
||||
"import-with-zip": "Uvozi z .zip",
|
||||
"create-recipe-from-an-image": "Ustvari recept iz slike",
|
||||
"create-recipe-from-an-image-description": "Ustvarite recept tako, da naložite njegovo sliko. Mealie bo s pomočjo umetne inteligence poskušal izluščiti besedilo iz slike in iz njega ustvariti recept.",
|
||||
"crop-and-rotate-the-image": "Obrežite in zasukajte sliko, tako da bo vidno samo besedilo in da bo v pravilnem položaju.",
|
||||
"create-from-image": "Ustvari iz slike",
|
||||
"should-translate-description": "Prevedi recept v moj jezik",
|
||||
"please-wait-image-procesing": "Počakajte, slika je v obdelavi. To lahko traja nekaj časa.",
|
||||
"bulk-url-import": "Masovno uvozi preko URLja",
|
||||
"debug-scraper": "Odpravljanje težav s strgalnikom",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Ustvari recept z izbranim imenom. Vsi recepti morajo imeti unikatna imena.",
|
||||
@@ -586,8 +591,8 @@
|
||||
"report-deletion-failed": "Brisanje poročila ni bilo uspešno",
|
||||
"recipe-debugger": "Odpravljanje težav v strganju recepta",
|
||||
"recipe-debugger-description": "Prilepi povezavo do recepta, ki ga želiš postrgati. Strgalnik receptov bo postrgal spletno stran in prikazal rezultate. Če ne vidiš nobenih podatkov, potem spletna stran, ki jo želiš strgati ni podprta v Mealie oz. v strgalniku, ki ga uporablja.",
|
||||
"use-openai": "Use OpenAI",
|
||||
"recipe-debugger-use-openai-description": "Use OpenAI to parse the results instead of relying on the scraper library. When creating a recipe via URL, this is done automatically if the scraper library fails, but you may test it manually here.",
|
||||
"use-openai": "Uporabi OpenAI",
|
||||
"recipe-debugger-use-openai-description": "Za razčlenitev rezultatov uporabite OpenAI, namesto da se zanašate na knjižnico strgala. Ko ustvarjate recept prek URL-ja, se to izvede samodejno, če knjižnica strgala odpove, vendar ga lahko tukaj preizkusite ročno.",
|
||||
"debug": "Debug",
|
||||
"tree-view": "Drevesni prikaz",
|
||||
"recipe-yield": "Število porcij",
|
||||
@@ -604,8 +609,8 @@
|
||||
"alerts-explainer": "Opozorila bodo prikazana v primeru, da obstaja ujemajoče živilo ali enota, ampak še ne obstaja v podatkovni bazi.",
|
||||
"select-parser": "Izberi razčlenjevalnik",
|
||||
"natural-language-processor": "Procesor naravnega jezika",
|
||||
"brute-parser": "Brute Parser",
|
||||
"openai-parser": "OpenAI Parser",
|
||||
"brute-parser": "Surov razčlenjevalnik",
|
||||
"openai-parser": "Razčlenjevalnik OpenAI",
|
||||
"parse-all": "Razčleni vse",
|
||||
"no-unit": "Ni enote",
|
||||
"missing-unit": "Ustvari manjkajočo enoto: {unit}",
|
||||
@@ -640,7 +645,7 @@
|
||||
"backup-created-at-response-export_path": "Varnostna kopija ustvarjena v {path}",
|
||||
"backup-deleted": "Varnostna kopija je izbrisana",
|
||||
"restore-success": "Obnovitev uspešna",
|
||||
"restore-fail": "Restore failed. Check your server logs for more details",
|
||||
"restore-fail": "Obnovitev ni uspela. Za več podrobnosti preverite dnevnike strežnika",
|
||||
"backup-tag": "Oznaka varnostne kopije",
|
||||
"create-heading": "Izdelaj varnostno kopijo",
|
||||
"delete-backup": "Izbriši varnostno kopijo",
|
||||
@@ -748,9 +753,9 @@
|
||||
"tracker": "Tracker",
|
||||
"configuration": "Nastavitve",
|
||||
"docker-volume": "Docker Volume",
|
||||
"docker-volume-help": "Mealie requires that the frontend container and the backend share the same docker volume or storage. This ensures that the frontend container can properly access the images and assets stored on disk.",
|
||||
"volumes-are-misconfigured": "Volumes are misconfigured.",
|
||||
"volumes-are-configured-correctly": "Volumes are configured correctly.",
|
||||
"docker-volume-help": "Mealie zahteva, da vsebnik sprednjega dela in zadnji del delita isto mapo ali shrambo priklopne postaje. To zagotavlja, da lahko sprednji vsebnik pravilno dostopa do slik in sredstev, shranjenih na disku.",
|
||||
"volumes-are-misconfigured": "Mape so napačno nastavljene.",
|
||||
"volumes-are-configured-correctly": "Mape so nastavljene pravilno.",
|
||||
"status-unknown-try-running-a-validation": "Status ni znan. Poženi validacijo.",
|
||||
"validate": "Validiraj",
|
||||
"email-configuration-status": "Email status",
|
||||
@@ -778,9 +783,9 @@
|
||||
"oidc-ready": "OIDC Ready",
|
||||
"oidc-ready-error-text": "Nekatere OIDC vrednosti niso nastavljene. To lahko ignoriraš, če ne uporabljaš OIDC avtentikacije.",
|
||||
"oidc-ready-success-text": "Vse zahtevane OIDC spremenljivke so nastavljene.",
|
||||
"openai-ready": "OpenAI Ready",
|
||||
"openai-ready-error-text": "Not all OpenAI Values are configured. This can be ignored if you are not using OpenAI features.",
|
||||
"openai-ready-success-text": "Required OpenAI variables are all set."
|
||||
"openai-ready": "OpenAI pripravljen",
|
||||
"openai-ready-error-text": "Niso nastavljene vse OpenAI vrednosti. To lahko prezrete, če ne uporabljate OpenAi funkcij.",
|
||||
"openai-ready-success-text": "Vse zahtevane spremenljivke OpenAI so nastavljene."
|
||||
},
|
||||
"shopping-list": {
|
||||
"all-lists": "Vsi seznami",
|
||||
@@ -794,7 +799,7 @@
|
||||
"food": "Živilo",
|
||||
"note": "Opomba",
|
||||
"label": "Oznaka",
|
||||
"save-label": "Save Label",
|
||||
"save-label": "Shranite oznako",
|
||||
"linked-item-warning": "Ta sestavina je povezana na en ali več receptov. Če spremenite enote količin, se lahko kaj podre, ko dodajate ali odstranjujete iz seznama.",
|
||||
"toggle-food": "Preklopi med hrano",
|
||||
"manage-labels": "Upravljanje oznak",
|
||||
@@ -810,11 +815,11 @@
|
||||
"items-checked-count": "Nobena postavka ni izbrana|Ena postavka izbrana|{count} postavk izbranih",
|
||||
"no-label": "Brez oznake",
|
||||
"completed-on": "Zaključena {date}",
|
||||
"you-are-offline": "You are offline",
|
||||
"you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?"
|
||||
"you-are-offline": "Niste povezani",
|
||||
"you-are-offline-description": "V načinu brez povezave niso na voljo vse funkcije. Še vedno lahko dodajate, spreminjate in odstranjujete elemente, vendar ne boste mogli sinhronizirati svojih sprememb s strežnikom, dokler ne boste spet povezani.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Ali res želite izbrati vse elemente?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Ali res ne želite izbrati vseh elementov?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Ali ste prepričani, da želite izbrisati vse izbrane elemente?"
|
||||
},
|
||||
"sidebar": {
|
||||
"all-recipes": "Vsi recepti",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Dovoljenja",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "Uporabnik lahko druge povabi v skupino",
|
||||
"user-can-invite-other-to-group": "Uporabnih lahko povabi druge v skupino",
|
||||
"user-can-manage-group": "Uporabnik lahko upravlja s skupino",
|
||||
"user-can-organize-group-data": "Uporabnik lahko organizira podatke skupine",
|
||||
"enable-advanced-features": "Vključi napredne funkcije",
|
||||
@@ -990,8 +995,8 @@
|
||||
"food-data": "Podatki o živilih",
|
||||
"example-food-singular": "npr: Čebula",
|
||||
"example-food-plural": "npr: Čebule",
|
||||
"label-overwrite-warning": "This will assign the chosen label to all selected foods and potentially overwrite your existing labels.",
|
||||
"on-hand-checkbox-label": "Setting this flag will make this food unchecked by default when adding a recipe to a shopping list."
|
||||
"label-overwrite-warning": "S tem boste izbrano oznako dodelili vsem izbranim živilom in morda prepisali vaše obstoječe oznake.",
|
||||
"on-hand-checkbox-label": "Če nastavite to zastavico, bo to živilo privzeto odstranjeno, ko dodate recept na nakupovalni seznam."
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Napolni podatkovno bazo z običajnimi enotami, glede na vaš lokalni jezik.",
|
||||
@@ -1020,7 +1025,7 @@
|
||||
"edit-label": "Uredi oznako",
|
||||
"new-label": "Nova oznaka",
|
||||
"labels": "Oznake",
|
||||
"assign-label": "Assign Label"
|
||||
"assign-label": "Dodeli oznako"
|
||||
},
|
||||
"recipes": {
|
||||
"purge-exports": "Počisti izvoze",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Увези помоћу .zip архиве",
|
||||
"create-recipe-from-an-image": "Направи рецепт са слике",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Масовни увоз помоћу URL",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Направи рецепт додајући име. Сви рецепти морају имати јединствена имена.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "Ово одређује како ће се корисник аутентификовати са Mили. Ако нисте сигурни, изаберите 'Mealie'",
|
||||
"permissions": "Permissions",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "User can invite other to group",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "User can manage group",
|
||||
"user-can-organize-group-data": "User can organize group data",
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
|
||||
@@ -211,7 +211,7 @@
|
||||
"clipboard-copy-failure": "Det gick inte att kopiera till urklipp.",
|
||||
"confirm-delete-generic-items": "Är du säker på att du vill radera följande objekt?",
|
||||
"organizers": "Organisatörer",
|
||||
"caution": "Caution"
|
||||
"caution": "Varning"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Är du säker på att du vill radera <b>{groupName}<b/>?",
|
||||
@@ -449,8 +449,8 @@
|
||||
"ingredients": "Ingredienser",
|
||||
"insert-ingredient": "Infoga ingrediens",
|
||||
"insert-section": "Infoga avdelning",
|
||||
"insert-above": "Insert Above",
|
||||
"insert-below": "Insert Below",
|
||||
"insert-above": "Infoga Ovan",
|
||||
"insert-below": "Infoga Nedan",
|
||||
"instructions": "Instruktioner",
|
||||
"key-name-required": "Nyckelnamn krävs",
|
||||
"landscape-view-coming-soon": "Landskapsvy (kommer snart)",
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Skapa nytt recept från grunden.",
|
||||
"create-recipes": "Skapa recept",
|
||||
"import-with-zip": "Importera från .zip",
|
||||
"create-recipe-from-an-image": "Skapa recept från en bild",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Massimport från URL",
|
||||
"debug-scraper": "Felsökningsskrapa",
|
||||
"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.",
|
||||
@@ -810,11 +815,11 @@
|
||||
"items-checked-count": "Inga artiklar markerade|En artikel markerad|{count} artiklar markerade",
|
||||
"no-label": "Ingen etikett",
|
||||
"completed-on": "Slutförd på {date}",
|
||||
"you-are-offline": "You are offline",
|
||||
"you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?"
|
||||
"you-are-offline": "Du är offline",
|
||||
"you-are-offline-description": "Alla funktioner är inte tillgängliga när du är offline. Du kan fortfarande lägga till, ändra och ta bort objekt, men du kommer ej kunna synka dina ändringar till servern förrän du är online igen.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Är du säker på att du vill markera alla objekt?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Är du säker på att du vill avmarkera alla objekt?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Är du säker på att du vill ta bort alla markerade objekt?"
|
||||
},
|
||||
"sidebar": {
|
||||
"all-recipes": "Recept",
|
||||
@@ -990,8 +995,8 @@
|
||||
"food-data": "Mat data",
|
||||
"example-food-singular": "ex: Lök",
|
||||
"example-food-plural": "ex: Lökar",
|
||||
"label-overwrite-warning": "This will assign the chosen label to all selected foods and potentially overwrite your existing labels.",
|
||||
"on-hand-checkbox-label": "Setting this flag will make this food unchecked by default when adding a recipe to a shopping list."
|
||||
"label-overwrite-warning": "Detta kommer att tilldela den valda etiketten till alla utvalda måltider och potentiellt skriva över dina befintliga etiketter.",
|
||||
"on-hand-checkbox-label": "Om du ställer in den här flaggan kommer de här livsmedlen att avmarkeras som standard när du lägger till ett recept i en inköpslista."
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Fyll databasen med vanliga enheter baserade på ditt språk.",
|
||||
@@ -1020,7 +1025,7 @@
|
||||
"edit-label": "Redigera etikett",
|
||||
"new-label": "Ny etikett",
|
||||
"labels": "Etiketter",
|
||||
"assign-label": "Assign Label"
|
||||
"assign-label": "Tilldela etikett"
|
||||
},
|
||||
"recipes": {
|
||||
"purge-exports": "Rensa exporter",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Створити новий рецепт з нуля.",
|
||||
"create-recipes": "Створити рецепти",
|
||||
"import-with-zip": "Імпорт з .zip",
|
||||
"create-recipe-from-an-image": "Створити рецепт із зображення",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Масовий URL імпорт",
|
||||
"debug-scraper": "Дебажити розпізнавач",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Створіть рецепт, надавши назву. Усі рецепти повинні мати унікальні назви.",
|
||||
@@ -804,17 +809,17 @@
|
||||
"delete-checked": "Видалити відмічене",
|
||||
"toggle-label-sort": "Сортування міток",
|
||||
"reorder-labels": "Перевпорядкувати мітки",
|
||||
"uncheck-all-items": "Зняти вибір з усіх елементів",
|
||||
"check-all-items": "Вибрати всі елементи",
|
||||
"uncheck-all-items": "Зняти відмітку з усіх елементів",
|
||||
"check-all-items": "Відмітити всі елементи",
|
||||
"linked-recipes-count": "Нема пов'язаних рецептів|Один пов'язаний рецепт|{count} пов'язаних рецептів",
|
||||
"items-checked-count": "Нема відмічених елементів|Один відмічений елемент|{count} елементів відмічено",
|
||||
"no-label": "Без Мітки",
|
||||
"completed-on": "Завершено {date}",
|
||||
"you-are-offline": "You are offline",
|
||||
"you-are-offline-description": "Not all features are available while offline. You can still add, modify, and remove items, but you will not be able to sync your changes to the server until you are back online.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Are you sure you want to check all items?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Are you sure you want to uncheck all items?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Are you sure you want to delete all checked items?"
|
||||
"you-are-offline": "Ви не в мережі",
|
||||
"you-are-offline-description": "Не всі функції доступні без мережі. Ви все ще можете додавати, змінювати та видаляти елементи, але не зможете синхронізувати зміни на сервер, поки під'єднаєтесь до мережі.",
|
||||
"are-you-sure-you-want-to-check-all-items": "Ви впевнені, що хочете відмітити всі елементи?",
|
||||
"are-you-sure-you-want-to-uncheck-all-items": "Ви впевнені, що хочете зняти відмітку з усіх елементів?",
|
||||
"are-you-sure-you-want-to-delete-checked-items": "Ви впевнені, що хочете видалити всі відмічені елементи?"
|
||||
},
|
||||
"sidebar": {
|
||||
"all-recipes": "Всі рецепти",
|
||||
@@ -867,7 +872,7 @@
|
||||
"create-a-tool": "Створити новий інструмент",
|
||||
"tool-name": "Назва інструмента",
|
||||
"create-new-tool": "Створити новий інструмент",
|
||||
"on-hand-checkbox-label": "Показувати як в наявності (позначено)",
|
||||
"on-hand-checkbox-label": "Показувати як в наявності (відмічене)",
|
||||
"required-tools": "Необхідні інструменти",
|
||||
"tool": "Інструмент"
|
||||
},
|
||||
@@ -991,7 +996,7 @@
|
||||
"example-food-singular": "приклад: Цибулина",
|
||||
"example-food-plural": "приклад: Цибуля",
|
||||
"label-overwrite-warning": "Це призначить обрану мітку для всіх вибраних продуктів і потенційно перезапише існуючі мітки.",
|
||||
"on-hand-checkbox-label": "Setting this flag will make this food unchecked by default when adding a recipe to a shopping list."
|
||||
"on-hand-checkbox-label": "Встановлення цього параметра дозволить зробити цю їжу невідміченою за замовчуванням при додаванні рецепта до списку покупок."
|
||||
},
|
||||
"units": {
|
||||
"seed-dialog-text": "Заповнити базу даних розповсюдженими одиницями виміру що відповідають мові.",
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
{
|
||||
"about": {
|
||||
"about": "About",
|
||||
"about-mealie": "About Mealie",
|
||||
"about": "Giới thiệu",
|
||||
"about-mealie": "Giới thiệu Mealie",
|
||||
"api-docs": "API Docs",
|
||||
"api-port": "API Port",
|
||||
"application-mode": "Application Mode",
|
||||
"database-type": "Database Type",
|
||||
"database-type": "Loại cơ sở dữ liệu",
|
||||
"database-url": "Database URL",
|
||||
"default-group": "Default Group",
|
||||
"demo": "Demo",
|
||||
"demo": "Bản thử nghiệm",
|
||||
"demo-status": "Demo Status",
|
||||
"development": "Development",
|
||||
"docs": "Docs",
|
||||
@@ -59,13 +59,13 @@
|
||||
"new-notification-form-description": "Mealie uses the Apprise library to generate notifications. They offer many options for services to use for notifications. Refer to their wiki for a comprehensive guide on how to create the URL for your service. If available, selecting the type of your notification may include extra features.",
|
||||
"new-version": "New version available!",
|
||||
"notification": "Notification",
|
||||
"refresh": "Refresh",
|
||||
"refresh": "Làm mới",
|
||||
"scheduled": "Scheduled",
|
||||
"something-went-wrong": "Something Went Wrong!",
|
||||
"subscribed-events": "Subscribed Events",
|
||||
"test-message-sent": "Test Message Sent",
|
||||
"message-sent": "Message Sent",
|
||||
"new-notification": "New Notification",
|
||||
"test-message-sent": "Đã gửi thử tin nhắn",
|
||||
"message-sent": "Đã gửi tin nhắn",
|
||||
"new-notification": "Thông báo mới",
|
||||
"event-notifiers": "Event Notifiers",
|
||||
"apprise-url-skipped-if-blank": "Apprise URL (skipped if blank)",
|
||||
"enable-notifier": "Enable Notifier",
|
||||
@@ -81,39 +81,39 @@
|
||||
"recipe-events": "Recipe Events"
|
||||
},
|
||||
"general": {
|
||||
"add": "Add",
|
||||
"cancel": "Cancel",
|
||||
"clear": "Clear",
|
||||
"close": "Close",
|
||||
"confirm": "Confirm",
|
||||
"add": "Thêm",
|
||||
"cancel": "Hủy",
|
||||
"clear": "Xóa",
|
||||
"close": "Đóng",
|
||||
"confirm": "Xác nhận",
|
||||
"confirm-how-does-everything-look": "How does everything look?",
|
||||
"confirm-delete-generic": "Are you sure you want to delete this?",
|
||||
"copied_message": "Copied!",
|
||||
"create": "Create",
|
||||
"created": "Created",
|
||||
"custom": "Custom",
|
||||
"dashboard": "Dashboard",
|
||||
"delete": "Delete",
|
||||
"disabled": "Disabled",
|
||||
"download": "Download",
|
||||
"duplicate": "Duplicate",
|
||||
"edit": "Edit",
|
||||
"enabled": "Enabled",
|
||||
"exception": "Exception",
|
||||
"failed-count": "Failed: {count}",
|
||||
"failure-uploading-file": "Failure uploading file",
|
||||
"favorites": "Favorites",
|
||||
"field-required": "Field Required",
|
||||
"file-folder-not-found": "File/folder not found",
|
||||
"file-uploaded": "File uploaded",
|
||||
"filter": "Filter",
|
||||
"friday": "Friday",
|
||||
"general": "General",
|
||||
"confirm-delete-generic": "Bạn có chắc muốn xoá?",
|
||||
"copied_message": "Đã sao chép!",
|
||||
"create": "Tạo mới",
|
||||
"created": "Đã tạo",
|
||||
"custom": "Tuỳ chỉnh",
|
||||
"dashboard": "Bảng điều khiển",
|
||||
"delete": "Xóa",
|
||||
"disabled": "Đã vô hiệu",
|
||||
"download": "Tải xuống",
|
||||
"duplicate": "Tạo bản sao",
|
||||
"edit": "Chỉnh sửa",
|
||||
"enabled": "Đã kích hoạt",
|
||||
"exception": "Lỗi",
|
||||
"failed-count": "Thất bại: {count}",
|
||||
"failure-uploading-file": "Không thể tải file lên",
|
||||
"favorites": "Yêu thích",
|
||||
"field-required": "Bắt buộc",
|
||||
"file-folder-not-found": "File hoặc thư mục không tồn tại",
|
||||
"file-uploaded": "Đã tải file lên",
|
||||
"filter": "Bộ lọc",
|
||||
"friday": "Thứ 6",
|
||||
"general": "Chung",
|
||||
"get": "Get",
|
||||
"home": "Home",
|
||||
"image": "Image",
|
||||
"image-upload-failed": "Image upload failed",
|
||||
"import": "Import",
|
||||
"home": "Trang chủ",
|
||||
"image": "Hình ảnh",
|
||||
"image-upload-failed": "Tải ảnh không thành công",
|
||||
"import": "Nhập dữ liệu",
|
||||
"json": "JSON",
|
||||
"keyword": "Keyword",
|
||||
"link-copied": "Link Copied",
|
||||
@@ -150,53 +150,53 @@
|
||||
"sort": "Sort",
|
||||
"sort-ascending": "Sort Ascending",
|
||||
"sort-descending": "Sort Descending",
|
||||
"sort-alphabetically": "Alphabetical",
|
||||
"status": "Status",
|
||||
"subject": "Subject",
|
||||
"submit": "Submit",
|
||||
"success-count": "Success: {count}",
|
||||
"sunday": "Sunday",
|
||||
"system": "System",
|
||||
"templates": "Templates:",
|
||||
"test": "Test",
|
||||
"themes": "Themes",
|
||||
"thursday": "Thursday",
|
||||
"title": "Title",
|
||||
"sort-alphabetically": "Thứ tự bảng chữ cái",
|
||||
"status": "Trạng thái",
|
||||
"subject": "Chủ đề",
|
||||
"submit": "Gửi",
|
||||
"success-count": "Thành công: {count}",
|
||||
"sunday": "Chủ Nhật",
|
||||
"system": "Hệ thống",
|
||||
"templates": "Mẫu:",
|
||||
"test": "Chạy thử",
|
||||
"themes": "Giao diện",
|
||||
"thursday": "Thứ 5",
|
||||
"title": "Tiêu đề",
|
||||
"token": "Token",
|
||||
"tuesday": "Tuesday",
|
||||
"type": "Type",
|
||||
"update": "Update",
|
||||
"updated": "Updated",
|
||||
"upload": "Upload",
|
||||
"tuesday": "Thứ 3",
|
||||
"type": "Loại",
|
||||
"update": "Cập nhật",
|
||||
"updated": "Đã cập nhật",
|
||||
"upload": "Tải lên",
|
||||
"url": "URL",
|
||||
"view": "View",
|
||||
"wednesday": "Wednesday",
|
||||
"yes": "Yes",
|
||||
"foods": "Foods",
|
||||
"units": "Units",
|
||||
"back": "Back",
|
||||
"next": "Next",
|
||||
"start": "Start",
|
||||
"toggle-view": "Toggle View",
|
||||
"date": "Date",
|
||||
"view": "Xem",
|
||||
"wednesday": "Thứ 4",
|
||||
"yes": "Đồng ý",
|
||||
"foods": "Thức ăn",
|
||||
"units": "Đơn vị",
|
||||
"back": "Trở lại",
|
||||
"next": "Tiếp tục",
|
||||
"start": "Bắt đầu",
|
||||
"toggle-view": "Chuyển đổi chế độ xem",
|
||||
"date": "Ngày",
|
||||
"id": "Id",
|
||||
"owner": "Owner",
|
||||
"date-added": "Date Added",
|
||||
"none": "None",
|
||||
"run": "Run",
|
||||
"owner": "Người sở hữu",
|
||||
"date-added": "Ngày thêm",
|
||||
"none": "Trống",
|
||||
"run": "Chạy",
|
||||
"menu": "Menu",
|
||||
"a-name-is-required": "A Name is Required",
|
||||
"delete-with-name": "Delete {name}",
|
||||
"confirm-delete-generic-with-name": "Are you sure you want to delete this {name}?",
|
||||
"confirm-delete-own-admin-account": "Please note that you are trying to delete your own admin account! This action cannot be undone and will permanently delete your account?",
|
||||
"organizer": "Organizer",
|
||||
"transfer": "Transfer",
|
||||
"copy": "Copy",
|
||||
"color": "Color",
|
||||
"timestamp": "Timestamp",
|
||||
"a-name-is-required": "Yêu cầu nhập tên",
|
||||
"delete-with-name": "Xoá {name}",
|
||||
"confirm-delete-generic-with-name": "Bạn có chắc chắn muốn xóa {name} không?",
|
||||
"confirm-delete-own-admin-account": "Lưu ý, bạn đang xóa tài khoản admin của bản thân! Hành động này không thể được khôi phục?",
|
||||
"organizer": "Quản lý",
|
||||
"transfer": "Chuyển",
|
||||
"copy": "Sao chép",
|
||||
"color": "Màu",
|
||||
"timestamp": "Thời gian",
|
||||
"last-made": "Last Made",
|
||||
"learn-more": "Learn More",
|
||||
"this-feature-is-currently-inactive": "This feature is currently inactive",
|
||||
"learn-more": "Tìm hiểu thêm",
|
||||
"this-feature-is-currently-inactive": "Tính năng này chưa được bật",
|
||||
"clipboard-not-supported": "Clipboard not supported",
|
||||
"copied-to-clipboard": "Copied to clipboard",
|
||||
"your-browser-does-not-support-clipboard": "Your browser does not support clipboard",
|
||||
@@ -297,10 +297,10 @@
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Only recipes with these categories will be used in Meal Plans",
|
||||
"planner": "Planner",
|
||||
"quick-week": "Quick Week",
|
||||
"side": "Side",
|
||||
"sides": "Sides",
|
||||
"start-date": "Start Date",
|
||||
"rule-day": "Rule Day",
|
||||
"side": "Món ăn kèm",
|
||||
"sides": "Món ăn kèm",
|
||||
"start-date": "Ngày bắt đầu",
|
||||
"rule-day": "Ngày",
|
||||
"meal-type": "Meal Type",
|
||||
"breakfast": "Breakfast",
|
||||
"lunch": "Lunch",
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Create a recipe by providing the name. All recipes must have unique names.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Permissions",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "User can invite other to group",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "User can manage group",
|
||||
"user-can-organize-group-data": "User can organize group data",
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
|
||||
@@ -211,7 +211,7 @@
|
||||
"clipboard-copy-failure": "未能复制到剪切板。",
|
||||
"confirm-delete-generic-items": "你确定删除以下条目吗?",
|
||||
"organizers": "管理器",
|
||||
"caution": "Caution"
|
||||
"caution": "注意!"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "您确定要删除<b>{groupName}<b/>吗?",
|
||||
@@ -382,7 +382,7 @@
|
||||
"description-long": "Mealie可以从“My Recipe Box\"导入食谱。把你的食谱导出为CSV模式,然后在下面上传.csv文件。"
|
||||
},
|
||||
"recipekeeper": {
|
||||
"title": "Recipe Keeper",
|
||||
"title": "食谱保存者",
|
||||
"description-long": "Mealie can import recipes from Recipe Keeper. Export your recipes in zip format, then upload the .zip file below."
|
||||
}
|
||||
},
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "从头创建一个新食谱。",
|
||||
"create-recipes": "创建食谱",
|
||||
"import-with-zip": "使用 .zip 导入",
|
||||
"create-recipe-from-an-image": "用图片创建食谱",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "批量URL导入",
|
||||
"debug-scraper": "调试刮削器",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "通过名称创建食谱,食谱不可重名。",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "权限",
|
||||
"administrator": "管理员",
|
||||
"user-can-invite-other-to-group": "用户可以邀请其他人加入群组",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "用户可以管理群组",
|
||||
"user-can-organize-group-data": "用户可以整理群组数据",
|
||||
"enable-advanced-features": "启用高级功能",
|
||||
|
||||
@@ -561,7 +561,12 @@
|
||||
"create-recipe-description": "Create a new recipe from scratch.",
|
||||
"create-recipes": "Create Recipes",
|
||||
"import-with-zip": "Import with .zip",
|
||||
"create-recipe-from-an-image": "Create recipe from an image",
|
||||
"create-recipe-from-an-image": "Create Recipe from an Image",
|
||||
"create-recipe-from-an-image-description": "Create a recipe by uploading an image of it. Mealie will attempt to extract the text from the image using AI and create a recipe from it.",
|
||||
"crop-and-rotate-the-image": "Crop and rotate the image so that only the text is visible, and it's in the correct orientation.",
|
||||
"create-from-image": "Create from Image",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"bulk-url-import": "Bulk URL Import",
|
||||
"debug-scraper": "Debug Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Create a recipe by providing the name. All recipes must have unique names.",
|
||||
@@ -958,7 +963,7 @@
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie",
|
||||
"permissions": "Permissions",
|
||||
"administrator": "Administrator",
|
||||
"user-can-invite-other-to-group": "User can invite other to group",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "User can manage group",
|
||||
"user-can-organize-group-data": "User can organize group data",
|
||||
"enable-advanced-features": "Enable advanced features",
|
||||
|
||||
@@ -42,6 +42,7 @@ export interface AppInfo {
|
||||
oidcRedirect: boolean;
|
||||
oidcProviderName: string;
|
||||
enableOpenai: boolean;
|
||||
enableOpenaiImageServices: boolean;
|
||||
}
|
||||
export interface AppStartupInfo {
|
||||
isFirstLogin: boolean;
|
||||
|
||||
@@ -6,9 +6,15 @@ const prefix = "/api";
|
||||
const routes = {
|
||||
webhooks: `${prefix}/groups/webhooks`,
|
||||
webhooksId: (id: string | number) => `${prefix}/groups/webhooks/${id}`,
|
||||
webhooksIdTest: (id: string | number) => `${prefix}/groups/webhooks/${id}/test`,
|
||||
};
|
||||
|
||||
export class WebhooksAPI extends BaseCRUDAPI<CreateWebhook, ReadWebhook> {
|
||||
baseRoute = routes.webhooks;
|
||||
itemRoute = routes.webhooksId;
|
||||
itemTestRoute = routes.webhooksIdTest;
|
||||
|
||||
async testOne(itemId: string | number) {
|
||||
return await this.requests.post<null>(`${this.itemTestRoute(itemId)}`, {});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ const routes = {
|
||||
recipesCreateUrl: `${prefix}/recipes/create-url`,
|
||||
recipesCreateUrlBulk: `${prefix}/recipes/create-url/bulk`,
|
||||
recipesCreateFromZip: `${prefix}/recipes/create-from-zip`,
|
||||
recipesCreateFromImage: `${prefix}/recipes/create-from-image`,
|
||||
recipesCategory: `${prefix}/recipes/category`,
|
||||
recipesParseIngredient: `${prefix}/parser/ingredient`,
|
||||
recipesParseIngredients: `${prefix}/parser/ingredients`,
|
||||
@@ -140,6 +141,19 @@ export class RecipeAPI extends BaseCRUDAPI<CreateRecipe, Recipe, Recipe> {
|
||||
return await this.requests.post<string>(routes.recipesCreateUrlBulk, payload);
|
||||
}
|
||||
|
||||
async createOneFromImage(fileObject: Blob | File, fileName: string, translateLanguage: string | null = null) {
|
||||
const formData = new FormData();
|
||||
formData.append("images", fileObject);
|
||||
formData.append("extension", fileName.split(".").pop() ?? "");
|
||||
|
||||
let apiRoute = routes.recipesCreateFromImage
|
||||
if (translateLanguage) {
|
||||
apiRoute = `${apiRoute}?translateLanguage=${translateLanguage}`
|
||||
}
|
||||
|
||||
return await this.requests.post<string>(apiRoute, formData);
|
||||
}
|
||||
|
||||
async parseIngredients(parser: Parser, ingredients: Array<string>) {
|
||||
parser = parser || "nlp";
|
||||
return await this.requests.post<ParsedIngredient[]>(routes.recipesParseIngredients, { parser, ingredients });
|
||||
|
||||
@@ -149,6 +149,7 @@ import {
|
||||
mdiRotateRight,
|
||||
mdiBookOpenPageVariant,
|
||||
mdiFileCabinet,
|
||||
mdiSilverwareForkKnife
|
||||
} from "@mdi/js";
|
||||
|
||||
export const icons = {
|
||||
@@ -249,6 +250,7 @@ export const icons = {
|
||||
search: mdiMagnify,
|
||||
shareVariant: mdiShareVariant,
|
||||
shuffleVariant: mdiShuffleVariant,
|
||||
silverwareForkKnife: mdiSilverwareForkKnife,
|
||||
sort: mdiSort,
|
||||
sortAscending: mdiSortAscending,
|
||||
sortDescending: mdiSortDescending,
|
||||
|
||||
@@ -203,6 +203,7 @@ export default {
|
||||
{ code: "cs-CZ", file: "cs-CZ.json" },
|
||||
{ code: "gl-ES", file: "gl-ES.json" },
|
||||
{ code: "fr-FR", file: "fr-FR.json" },
|
||||
{ code: "fr-BE", file: "fr-BE.json" },
|
||||
{ code: "zh-TW", file: "zh-TW.json" },
|
||||
{ code: "af-ZA", file: "af-ZA.json" },
|
||||
{ code: "is-IS", file: "is-IS.json" },
|
||||
@@ -252,6 +253,7 @@ export default {
|
||||
"sr-SP": require("./lang/dateTimeFormats/sr-SP.json"),
|
||||
"cs-CZ": require("./lang/dateTimeFormats/cs-CZ.json"),
|
||||
"fr-FR": require("./lang/dateTimeFormats/fr-FR.json"),
|
||||
"fr-BE": require("./lang/dateTimeFormats/fr-BE.json"),
|
||||
"zh-TW": require("./lang/dateTimeFormats/zh-TW.json"),
|
||||
"af-ZA": require("./lang/dateTimeFormats/af-ZA.json"),
|
||||
"ru-RU": require("./lang/dateTimeFormats/ru-RU.json"),
|
||||
@@ -351,13 +353,22 @@ export default {
|
||||
},
|
||||
manifest: {
|
||||
start_url: "/",
|
||||
scope: "/",
|
||||
lang: "en",
|
||||
dir: "auto",
|
||||
name: "Mealie",
|
||||
short_name: "Mealie",
|
||||
id: "mealie",
|
||||
description: "Mealie is a recipe management and meal planning app",
|
||||
theme_color: process.env.THEME_LIGHT_PRIMARY || "#E58325",
|
||||
background_color: "#FFFFFF",
|
||||
display: "standalone",
|
||||
display_override: [
|
||||
"standalone",
|
||||
"minimal-ui",
|
||||
"browser",
|
||||
"window-controls-overlay"
|
||||
],
|
||||
share_target: {
|
||||
action: "/r/create/url",
|
||||
method: "GET",
|
||||
@@ -395,6 +406,56 @@ export default {
|
||||
purpose: "maskable",
|
||||
},
|
||||
],
|
||||
screenshots: [
|
||||
{
|
||||
"src": "/screenshots/home-narrow.png",
|
||||
"sizes": "1600x2420",
|
||||
"form_factor": "narrow",
|
||||
"label": "Home Page"
|
||||
},
|
||||
{
|
||||
"src": "/screenshots/recipe-narrow.png",
|
||||
"sizes": "1600x2420",
|
||||
"form_factor": "narrow",
|
||||
"label": "Recipe Page"
|
||||
},
|
||||
{
|
||||
"src": "/screenshots/editor-narrow.png",
|
||||
"sizes": "1600x2420",
|
||||
"form_factor": "narrow",
|
||||
"label": "Editor Page"
|
||||
},
|
||||
{
|
||||
"src": "/screenshots/parser-narrow.png",
|
||||
"sizes": "1600x2420",
|
||||
"form_factor": "narrow",
|
||||
"label": "Parser Page"
|
||||
},
|
||||
{
|
||||
"src": "/screenshots/home-wide.png",
|
||||
"sizes": "2560x1460",
|
||||
"form_factor": "wide",
|
||||
"label": "Home Page"
|
||||
},
|
||||
{
|
||||
"src": "/screenshots/recipe-wide.png",
|
||||
"sizes": "2560x1460",
|
||||
"form_factor": "wide",
|
||||
"label": "Recipe Page"
|
||||
},
|
||||
{
|
||||
"src": "/screenshots/editor-wide.png",
|
||||
"sizes": "2560x1460",
|
||||
"form_factor": "wide",
|
||||
"label": "Editor Page"
|
||||
},
|
||||
{
|
||||
"src": "/screenshots/parser-wide.png",
|
||||
"sizes": "2560x1460",
|
||||
"form_factor": "wide",
|
||||
"label": "Parser Page"
|
||||
}
|
||||
],
|
||||
"shortcuts": [
|
||||
{
|
||||
"name": "Shopping Lists",
|
||||
@@ -403,8 +464,12 @@ export default {
|
||||
"url": "/shopping-lists",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/svgs/mdiFormatListChecks.svg",
|
||||
"sizes": "256x256",
|
||||
"src": "/icons/mdiFormatListChecks-192x192.png",
|
||||
"sizes": "192x192",
|
||||
},
|
||||
{
|
||||
"src": "/icons/mdiFormatListChecks-96x96.png",
|
||||
"sizes": "96x96",
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -415,12 +480,28 @@ export default {
|
||||
"url": "/group/mealplan/planner/view",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/svgs/mdiCalendarMultiselect.svg",
|
||||
"sizes": "256x256",
|
||||
"src": "/icons/mdiCalendarMultiselect-192x192.png",
|
||||
"sizes": "192x192",
|
||||
},
|
||||
{
|
||||
"src": "/icons/mdiCalendarMultiselect-96x96.png",
|
||||
"sizes": "96x96",
|
||||
}
|
||||
]
|
||||
},
|
||||
],
|
||||
prefer_related_applications: false,
|
||||
handle_links: "preferred",
|
||||
orientation: "any",
|
||||
categories: [
|
||||
"food"
|
||||
],
|
||||
launch_handler: {
|
||||
"client_mode": ["focus-existing", "auto"]
|
||||
},
|
||||
edge_side_panel: {
|
||||
"preferred_width": 400
|
||||
}
|
||||
},
|
||||
icon: false, // disables the icon module
|
||||
},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "mealie",
|
||||
"version": "1.0.0",
|
||||
"version": "1.11.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "nuxt",
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, useRouter, useContext, computed, useRoute } from "@nuxtjs/composition-api";
|
||||
import { useAppInfo } from "~/composables/api";
|
||||
import { MenuItem } from "~/components/global/BaseOverflowButton.vue";
|
||||
import AdvancedOnly from "~/components/global/AdvancedOnly.vue";
|
||||
|
||||
@@ -37,7 +38,10 @@ export default defineComponent({
|
||||
setup() {
|
||||
const { $auth, $globals, i18n } = useContext();
|
||||
|
||||
const subpages: MenuItem[] = [
|
||||
const appInfo = useAppInfo();
|
||||
const enableOpenAIImages = computed(() => appInfo.value?.enableOpenaiImageServices);
|
||||
|
||||
const subpages = computed<MenuItem[]>(() => [
|
||||
{
|
||||
icon: $globals.icons.link,
|
||||
text: i18n.tc("recipe.import-with-url"),
|
||||
@@ -48,6 +52,12 @@ export default defineComponent({
|
||||
text: i18n.tc("recipe.bulk-url-import"),
|
||||
value: "bulk",
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.fileImage,
|
||||
text: i18n.tc("recipe.create-from-image"),
|
||||
value: "image",
|
||||
hide: !enableOpenAIImages.value,
|
||||
},
|
||||
{
|
||||
icon: $globals.icons.edit,
|
||||
text: i18n.tc("recipe.create-recipe"),
|
||||
@@ -63,7 +73,7 @@ export default defineComponent({
|
||||
text: i18n.tc("recipe.debug-scraper"),
|
||||
value: "debug",
|
||||
},
|
||||
];
|
||||
]);
|
||||
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
|
||||
161
frontend/pages/g/_groupSlug/r/create/image.vue
Normal file
@@ -0,0 +1,161 @@
|
||||
<template>
|
||||
<div>
|
||||
<v-form ref="domUrlForm" @submit.prevent="createRecipe">
|
||||
<div>
|
||||
<v-card-title class="headline"> {{ $t('recipe.create-recipe-from-an-image') }} </v-card-title>
|
||||
<v-card-text>
|
||||
<p>{{ $t('recipe.create-recipe-from-an-image-description') }}</p>
|
||||
<v-container class="pa-0">
|
||||
<v-row>
|
||||
<v-col cols="auto" align-self="center">
|
||||
<AppButtonUpload
|
||||
v-if="!uploadedImage"
|
||||
class="ml-auto"
|
||||
url="none"
|
||||
file-name="image"
|
||||
accept="image/*"
|
||||
:text="$i18n.tc('recipe.upload-image')"
|
||||
:text-btn="false"
|
||||
:post="false"
|
||||
@uploaded="uploadImage"
|
||||
/>
|
||||
<v-btn
|
||||
v-if="!!uploadedImage"
|
||||
color="error"
|
||||
@click="clearImage"
|
||||
>
|
||||
<v-icon left>{{ $globals.icons.close }}</v-icon>
|
||||
{{ $i18n.tc('recipe.remove-image') }}
|
||||
</v-btn>
|
||||
</v-col>
|
||||
<v-spacer />
|
||||
</v-row>
|
||||
|
||||
<div v-if="uploadedImage && uploadedImagePreviewUrl" class="mt-3">
|
||||
<v-row>
|
||||
<v-col cols="12" class="pb-0">
|
||||
<v-card-text class="pa-0">
|
||||
<p class="mb-0">
|
||||
{{ $t('recipe.crop-and-rotate-the-image') }}
|
||||
</p>
|
||||
</v-card-text>
|
||||
</v-col>
|
||||
</v-row>
|
||||
<v-row style="max-width: 600px;">
|
||||
<v-spacer />
|
||||
<v-col cols="12">
|
||||
<ImageCropper
|
||||
:img="uploadedImagePreviewUrl"
|
||||
cropper-height="50vh"
|
||||
cropper-width="100%"
|
||||
@save="updateUploadedImage"
|
||||
/>
|
||||
</v-col>
|
||||
<v-spacer />
|
||||
</v-row>
|
||||
</div>
|
||||
</v-container>
|
||||
</v-card-text>
|
||||
<v-card-actions v-if="uploadedImage">
|
||||
<div>
|
||||
<p style="width: 250px">
|
||||
<BaseButton rounded block type="submit" :loading="loading" />
|
||||
</p>
|
||||
<p>
|
||||
<v-checkbox
|
||||
v-model="shouldTranslate"
|
||||
hide-details
|
||||
:label="$t('recipe.should-translate-description')"
|
||||
:disabled="loading"
|
||||
/>
|
||||
</p>
|
||||
<p v-if="loading" class="mb-0">
|
||||
{{ $t('recipe.please-wait-image-procesing') }}
|
||||
</p>
|
||||
</div>
|
||||
</v-card-actions>
|
||||
</div>
|
||||
</v-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import {
|
||||
computed,
|
||||
defineComponent,
|
||||
reactive,
|
||||
ref,
|
||||
toRefs,
|
||||
useContext,
|
||||
useRoute,
|
||||
useRouter,
|
||||
} from "@nuxtjs/composition-api";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
import { alert } from "~/composables/use-toast";
|
||||
import { VForm } from "~/types/vuetify";
|
||||
|
||||
export default defineComponent({
|
||||
setup() {
|
||||
const state = reactive({
|
||||
loading: false,
|
||||
});
|
||||
|
||||
const { i18n } = useContext();
|
||||
const api = useUserApi();
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
const groupSlug = computed(() => route.value.params.groupSlug || "");
|
||||
|
||||
const domUrlForm = ref<VForm | null>(null);
|
||||
const uploadedImage = ref<Blob | File>();
|
||||
const uploadedImageName = ref<string>("");
|
||||
const uploadedImagePreviewUrl = ref<string>();
|
||||
const shouldTranslate = ref(true);
|
||||
|
||||
function uploadImage(fileObject: File) {
|
||||
uploadedImage.value = fileObject;
|
||||
uploadedImageName.value = fileObject.name;
|
||||
uploadedImagePreviewUrl.value = URL.createObjectURL(fileObject);
|
||||
}
|
||||
|
||||
function updateUploadedImage(fileObject: Blob) {
|
||||
uploadedImage.value = fileObject;
|
||||
uploadedImagePreviewUrl.value = URL.createObjectURL(fileObject);
|
||||
}
|
||||
|
||||
function clearImage() {
|
||||
uploadedImage.value = undefined;
|
||||
uploadedImageName.value = "";
|
||||
uploadedImagePreviewUrl.value = undefined;
|
||||
}
|
||||
|
||||
async function createRecipe() {
|
||||
if (!uploadedImage.value) {
|
||||
return;
|
||||
}
|
||||
|
||||
state.loading = true;
|
||||
const translateLanguage = shouldTranslate.value ? i18n.locale : undefined;
|
||||
const { data, error } = await api.recipes.createOneFromImage(uploadedImage.value, uploadedImageName.value, translateLanguage);
|
||||
if (error || !data) {
|
||||
alert.error(i18n.tc("events.something-went-wrong"));
|
||||
state.loading = false;
|
||||
} else {
|
||||
router.push(`/g/${groupSlug.value}/r/${data}`);
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
...toRefs(state),
|
||||
domUrlForm,
|
||||
uploadedImage,
|
||||
uploadedImagePreviewUrl,
|
||||
shouldTranslate,
|
||||
uploadImage,
|
||||
updateUploadedImage,
|
||||
clearImage,
|
||||
createRecipe,
|
||||
};
|
||||
},
|
||||
});
|
||||
</script>
|
||||
@@ -42,6 +42,7 @@
|
||||
:slug="mealplan.recipe ? mealplan.recipe.slug : mealplan.title"
|
||||
:description="mealplan.recipe ? mealplan.recipe.description : mealplan.text"
|
||||
:name="mealplan.recipe ? mealplan.recipe.name : mealplan.title"
|
||||
:tags="mealplan.recipe ? mealplan.recipe.tags : []"
|
||||
/>
|
||||
</div>
|
||||
</v-col>
|
||||
|
||||
@@ -10,8 +10,6 @@
|
||||
</v-card-text>
|
||||
</BasePageTitle>
|
||||
|
||||
<BannerExperimental />
|
||||
|
||||
<BaseButton create @click="actions.createOne()" />
|
||||
<v-expansion-panels class="mt-2">
|
||||
<v-expansion-panel v-for="(webhook, index) in webhooks" :key="index" class="my-2 left-border rounded">
|
||||
@@ -36,6 +34,7 @@
|
||||
:webhook="webhook"
|
||||
@save="actions.updateOne($event)"
|
||||
@delete="actions.deleteOne($event)"
|
||||
@test="actions.testOne($event).then(() => alert.success($tc('events.test-message-sent')))"
|
||||
/>
|
||||
</v-expansion-panel-content>
|
||||
</v-expansion-panel>
|
||||
@@ -47,6 +46,7 @@
|
||||
import { defineComponent } from "@nuxtjs/composition-api";
|
||||
import { useGroupWebhooks, timeUTC } from "~/composables/use-group-webhooks";
|
||||
import GroupWebhookEditor from "~/components/Domain/Group/GroupWebhookEditor.vue";
|
||||
import { alert } from "~/composables/use-toast";
|
||||
|
||||
export default defineComponent({
|
||||
components: { GroupWebhookEditor },
|
||||
@@ -55,6 +55,7 @@ export default defineComponent({
|
||||
const { actions, webhooks } = useGroupWebhooks();
|
||||
|
||||
return {
|
||||
alert,
|
||||
webhooks,
|
||||
actions,
|
||||
timeUTC
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
<template #title> {{ shoppingList.name }} </template>
|
||||
</BasePageTitle>
|
||||
<BannerWarning
|
||||
v-if="isOffline"
|
||||
v-if="$nuxt.isOffline"
|
||||
:title="$tc('shopping-list.you-are-offline')"
|
||||
:description="$tc('shopping-list.you-are-offline-description')"
|
||||
/>
|
||||
@@ -46,7 +46,6 @@
|
||||
:units="allUnits || []"
|
||||
:foods="allFoods || []"
|
||||
:recipes="recipeMap"
|
||||
:is-offline="isOffline"
|
||||
@checked="saveListItem"
|
||||
@save="saveListItem"
|
||||
@delete="deleteListItem(item)"
|
||||
@@ -75,7 +74,6 @@
|
||||
:units="allUnits || []"
|
||||
:foods="allFoods || []"
|
||||
:recipes="recipeMap"
|
||||
:is-offline="isOffline"
|
||||
@checked="saveListItem"
|
||||
@save="saveListItem"
|
||||
@delete="deleteListItem(item)"
|
||||
@@ -132,7 +130,6 @@
|
||||
:labels="allLabels || []"
|
||||
:units="allUnits || []"
|
||||
:foods="allFoods || []"
|
||||
:is-offline="isOffline"
|
||||
@delete="createEditorOpen = false"
|
||||
@cancel="createEditorOpen = false"
|
||||
@save="createListItem"
|
||||
@@ -141,7 +138,7 @@
|
||||
<div v-else class="mt-4 d-flex justify-end">
|
||||
<BaseButton
|
||||
v-if="preferences.viewByLabel" edit class="mr-2"
|
||||
:disabled="isOffline"
|
||||
:disabled="$nuxt.isOffline"
|
||||
@click="toggleReorderLabelsDialog">
|
||||
<template #icon> {{ $globals.icons.tags }} </template>
|
||||
{{ $t('shopping-list.reorder-labels') }}
|
||||
@@ -221,7 +218,6 @@
|
||||
:labels="allLabels || []"
|
||||
:units="allUnits || []"
|
||||
:foods="allFoods || []"
|
||||
:is-offline="isOffline"
|
||||
@checked="saveListItem"
|
||||
@save="saveListItem"
|
||||
@delete="deleteListItem(item)"
|
||||
@@ -244,10 +240,10 @@
|
||||
{{ $tc('shopping-list.linked-recipes-count', shoppingList.recipeReferences ? shoppingList.recipeReferences.length : 0) }}
|
||||
</div>
|
||||
<v-divider class="my-4"></v-divider>
|
||||
<RecipeList :recipes="Array.from(recipeMap.values())" show-description :disabled="isOffline">
|
||||
<RecipeList :recipes="Array.from(recipeMap.values())" show-description :disabled="$nuxt.isOffline">
|
||||
<template v-for="(recipe, index) in recipeMap.values()" #[`actions-${recipe.id}`]>
|
||||
<v-list-item-action :key="'item-actions-decrease' + recipe.id">
|
||||
<v-btn icon :disabled="isOffline" @click.prevent="removeRecipeReferenceToList(recipe.id)">
|
||||
<v-btn icon :disabled="$nuxt.isOffline" @click.prevent="removeRecipeReferenceToList(recipe.id)">
|
||||
<v-icon color="grey lighten-1">{{ $globals.icons.minus }}</v-icon>
|
||||
</v-btn>
|
||||
</v-list-item-action>
|
||||
@@ -255,7 +251,7 @@
|
||||
{{ shoppingList.recipeReferences[index].recipeQuantity }}
|
||||
</div>
|
||||
<v-list-item-action :key="'item-actions-increase' + recipe.id">
|
||||
<v-btn icon :disabled="isOffline" @click.prevent="addRecipeReferenceToList(recipe.id)">
|
||||
<v-btn icon :disabled="$nuxt.isOffline" @click.prevent="addRecipeReferenceToList(recipe.id)">
|
||||
<v-icon color="grey lighten-1">{{ $globals.icons.createAlt }}</v-icon>
|
||||
</v-btn>
|
||||
</v-list-item-action>
|
||||
@@ -268,7 +264,7 @@
|
||||
<div class="d-flex justify-end">
|
||||
<BaseButton
|
||||
edit
|
||||
:disabled="isOffline"
|
||||
:disabled="$nuxt.isOffline"
|
||||
@click="toggleSettingsDialog"
|
||||
>
|
||||
<template #icon> {{ $globals.icons.cog }} </template>
|
||||
@@ -278,7 +274,7 @@
|
||||
</v-lazy>
|
||||
|
||||
<v-lazy>
|
||||
<div v-if="!isOffline" class="d-flex justify-end mt-10">
|
||||
<div v-if="$nuxt.isOnline" class="d-flex justify-end mt-10">
|
||||
<ButtonLink
|
||||
:to="`/group/data/labels`"
|
||||
:text="$tc('shopping-list.manage-labels')"
|
||||
@@ -868,7 +864,6 @@ export default defineComponent({
|
||||
|
||||
// set a temporary updatedAt timestamp prior to refresh so it appears at the top of the checked items
|
||||
item.updateAt = new Date().toISOString();
|
||||
item.updateAt = item.updateAt.substring(0, item.updateAt.length-1);
|
||||
}
|
||||
|
||||
// make updates reflect immediately
|
||||
@@ -1073,7 +1068,6 @@ export default defineComponent({
|
||||
getLabelColor,
|
||||
groupSlug,
|
||||
itemsByLabel,
|
||||
isOffline: shoppingListItemActions.isOffline,
|
||||
listItems,
|
||||
loadingCounter,
|
||||
preferences,
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
<v-list-item-title>
|
||||
{{ token.name }}
|
||||
</v-list-item-title>
|
||||
<v-list-item-subtitle> {{ $t('general.created-on-date', [$d(new Date(token.createdAt+"Z"))]) }} </v-list-item-subtitle>
|
||||
<v-list-item-subtitle> {{ $t('general.created-on-date', [$d(new Date(token.createdAt))]) }} </v-list-item-subtitle>
|
||||
</v-list-item-content>
|
||||
<v-list-item-action>
|
||||
<BaseButton delete small @click="deleteToken(token.id)"></BaseButton>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 9.1 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 9.4 KiB |
BIN
frontend/static/icons/mdiCalendarMultiselect-192x192.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
frontend/static/icons/mdiCalendarMultiselect-96x96.png
Normal file
|
After Width: | Height: | Size: 771 B |
BIN
frontend/static/icons/mdiFormatListChecks-192x192.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |