mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-02-24 08:43:11 -05:00
Compare commits
69 Commits
auto-local
...
test-v-sho
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1f2168b6d6 | ||
|
|
064acd1289 | ||
|
|
6274a3dd39 | ||
|
|
a1e8e1aa20 | ||
|
|
b4aff0d8e9 | ||
|
|
e07df8fc43 | ||
|
|
9413e403b4 | ||
|
|
6eab88d44c | ||
|
|
754878eb63 | ||
|
|
c65456c646 | ||
|
|
dd55d23a37 | ||
|
|
aafed68964 | ||
|
|
108ac40b22 | ||
|
|
d2e9c04af1 | ||
|
|
3a1f58037d | ||
|
|
2731fb4a01 | ||
|
|
769db7202d | ||
|
|
644e871ec1 | ||
|
|
8987faa4f6 | ||
|
|
c237b33126 | ||
|
|
7098b67784 | ||
|
|
2d21d00651 | ||
|
|
198d5e4e06 | ||
|
|
98fc333df3 | ||
|
|
c0fb27f979 | ||
|
|
9ec1599427 | ||
|
|
9cfc54b1f5 | ||
|
|
40d2ac9a6b | ||
|
|
44db525049 | ||
|
|
d737cb3e14 | ||
|
|
1034d87a99 | ||
|
|
1243e6804c | ||
|
|
8b9e80358b | ||
|
|
2bae6e9d02 | ||
|
|
6b98a7cd74 | ||
|
|
e0238eb3a2 | ||
|
|
5adb7662c4 | ||
|
|
4e6a7a09ff | ||
|
|
719c7c9f6b | ||
|
|
7331007f30 | ||
|
|
ea329a6b71 | ||
|
|
e1a04ba673 | ||
|
|
63a4d4c801 | ||
|
|
5cf3e2565a | ||
|
|
9e1fe618ba | ||
|
|
691300e481 | ||
|
|
939588f54c | ||
|
|
2d8f491666 | ||
|
|
50754ad012 | ||
|
|
04eca1b992 | ||
|
|
aad7dc1abd | ||
|
|
2f19d31d1b | ||
|
|
095b92c29a | ||
|
|
49c704a4b1 | ||
|
|
c15a4f786b | ||
|
|
6e33878e4f | ||
|
|
5ca004802d | ||
|
|
68115cbf2f | ||
|
|
2b4bc8a662 | ||
|
|
fc801c9da4 | ||
|
|
f99b305dc3 | ||
|
|
b0b3d7e5e5 | ||
|
|
eedd2204a6 | ||
|
|
1ccc67774a | ||
|
|
6d98041ec8 | ||
|
|
c24cfb8096 | ||
|
|
ca41bc8d5c | ||
|
|
da3271f33f | ||
|
|
50a986f331 |
6
.github/workflows/locale-sync.yml
vendored
6
.github/workflows/locale-sync.yml
vendored
@@ -105,11 +105,7 @@ jobs:
|
||||
|
||||
## Changes
|
||||
- Updated frontend locale files
|
||||
- Generated from latest translation sources
|
||||
|
||||
## Test plan
|
||||
- [ ] Verify locale files are properly formatted
|
||||
- [ ] Test that translations load correctly in the frontend" \
|
||||
- Generated from latest translation sources" \
|
||||
env:
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
|
||||
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
||||
name: Build Package
|
||||
uses: ./.github/workflows/build-package.yml
|
||||
with:
|
||||
tag: release
|
||||
tag: ${{ github.event.release.tag_name }}
|
||||
|
||||
publish:
|
||||
permissions:
|
||||
|
||||
@@ -12,7 +12,7 @@ repos:
|
||||
exclude: ^tests/data/
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
# Ruff version.
|
||||
rev: v0.12.1
|
||||
rev: v0.12.3
|
||||
hooks:
|
||||
- id: ruff
|
||||
- id: ruff-format
|
||||
|
||||
@@ -76,7 +76,7 @@ export const LOCALES = [{% for locale in locales %}
|
||||
progress: {{ locale.progress }},
|
||||
dir: "{{ locale.dir }}",
|
||||
},{% endfor %}
|
||||
]
|
||||
];
|
||||
|
||||
"""
|
||||
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
|
||||
|
||||

|
||||
|
||||
# {{ recipe.name }}
|
||||
{{ recipe.description }}
|
||||
|
||||
## Ingredients
|
||||
{% for ingredient in recipe.recipeIngredient %}
|
||||
- [ ] {{ ingredient }} {% endfor %}
|
||||
|
||||
## Instructions
|
||||
{% for step in recipe.recipeInstructions %}
|
||||
- [ ] {{ step.text }} {% endfor %}
|
||||
|
||||
{% for note in recipe.notes %}
|
||||
**{{ note.title }}:** {{ note.text }}
|
||||
{% endfor %}
|
||||
|
||||
---
|
||||
|
||||
Tags: {{ recipe.tags }}
|
||||
Categories: {{ recipe.categories }}
|
||||
Original URL: {{ recipe.orgURL }}
|
||||
@@ -20,7 +20,7 @@ RUN yarn generate
|
||||
###############################################
|
||||
# Base Image - Python
|
||||
###############################################
|
||||
FROM python:3.12-slim as python-base
|
||||
FROM python:3.12-slim AS python-base
|
||||
|
||||
ENV MEALIE_HOME="/app"
|
||||
|
||||
@@ -119,7 +119,7 @@ RUN . $VENV_PATH/bin/activate \
|
||||
###############################################
|
||||
# Production Image
|
||||
###############################################
|
||||
FROM python-base as production
|
||||
FROM python-base AS production
|
||||
LABEL org.opencontainers.image.source="https://github.com/mealie-recipes/mealie"
|
||||
ENV PRODUCTION=true
|
||||
ENV TESTING=false
|
||||
|
||||
@@ -31,7 +31,7 @@ To deploy mealie on your local network, it is highly recommended to use Docker t
|
||||
We've gone through a few versions of Mealie v1 deployment targets. We have settled on a single container deployment, and we've begun publishing the nightly container on github containers. If you're looking to move from the old nightly (split containers _or_ the omni image) to the new nightly, there are a few things you need to do:
|
||||
|
||||
1. Take a backup just in case!
|
||||
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v2.8.0`
|
||||
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.0.1`
|
||||
3. Take the external port from the frontend container and set that as the port mapped to port `9000` on the new container. The frontend is now served on port 9000 from the new container, so it will need to be mapped for you to have access.
|
||||
4. Restart the container
|
||||
|
||||
|
||||
@@ -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:v2.8.0 # (3)
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.0.1 # (3)
|
||||
container_name: mealie
|
||||
restart: always
|
||||
ports:
|
||||
|
||||
@@ -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:v2.8.0 # (3)
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.0.1 # (3)
|
||||
container_name: mealie
|
||||
restart: always
|
||||
ports:
|
||||
|
||||
@@ -1,390 +0,0 @@
|
||||
/* cyrillic-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 100;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-100-cyrillic-ext1.woff2") format("woff2");
|
||||
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||
}
|
||||
/* cyrillic */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 100;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-100-cyrillic2.woff2") format("woff2");
|
||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||
}
|
||||
/* greek-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 100;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-100-greek-ext3.woff2") format("woff2");
|
||||
unicode-range: U+1F00-1FFF;
|
||||
}
|
||||
/* greek */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 100;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-100-greek4.woff2") format("woff2");
|
||||
unicode-range: U+0370-03FF;
|
||||
}
|
||||
/* vietnamese */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 100;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-100-vietnamese5.woff2") format("woff2");
|
||||
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
|
||||
}
|
||||
/* latin-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 100;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-100-latin-ext6.woff2") format("woff2");
|
||||
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 100;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-100-latin7.woff2") format("woff2");
|
||||
unicode-range:
|
||||
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
|
||||
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
/* cyrillic-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-300-cyrillic-ext8.woff2") format("woff2");
|
||||
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||
}
|
||||
/* cyrillic */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-300-cyrillic9.woff2") format("woff2");
|
||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||
}
|
||||
/* greek-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-300-greek-ext10.woff2") format("woff2");
|
||||
unicode-range: U+1F00-1FFF;
|
||||
}
|
||||
/* greek */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-300-greek11.woff2") format("woff2");
|
||||
unicode-range: U+0370-03FF;
|
||||
}
|
||||
/* vietnamese */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-300-vietnamese12.woff2") format("woff2");
|
||||
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
|
||||
}
|
||||
/* latin-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-300-latin-ext13.woff2") format("woff2");
|
||||
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 300;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-300-latin14.woff2") format("woff2");
|
||||
unicode-range:
|
||||
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
|
||||
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
/* cyrillic-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-400-cyrillic-ext15.woff2") format("woff2");
|
||||
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||
}
|
||||
/* cyrillic */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-400-cyrillic16.woff2") format("woff2");
|
||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||
}
|
||||
/* greek-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-400-greek-ext17.woff2") format("woff2");
|
||||
unicode-range: U+1F00-1FFF;
|
||||
}
|
||||
/* greek */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-400-greek18.woff2") format("woff2");
|
||||
unicode-range: U+0370-03FF;
|
||||
}
|
||||
/* vietnamese */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-400-vietnamese19.woff2") format("woff2");
|
||||
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
|
||||
}
|
||||
/* latin-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-400-latin-ext20.woff2") format("woff2");
|
||||
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-400-latin21.woff2") format("woff2");
|
||||
unicode-range:
|
||||
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
|
||||
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
/* cyrillic-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-500-cyrillic-ext22.woff2") format("woff2");
|
||||
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||
}
|
||||
/* cyrillic */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-500-cyrillic23.woff2") format("woff2");
|
||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||
}
|
||||
/* greek-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-500-greek-ext24.woff2") format("woff2");
|
||||
unicode-range: U+1F00-1FFF;
|
||||
}
|
||||
/* greek */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-500-greek25.woff2") format("woff2");
|
||||
unicode-range: U+0370-03FF;
|
||||
}
|
||||
/* vietnamese */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-500-vietnamese26.woff2") format("woff2");
|
||||
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
|
||||
}
|
||||
/* latin-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-500-latin-ext27.woff2") format("woff2");
|
||||
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 500;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-500-latin28.woff2") format("woff2");
|
||||
unicode-range:
|
||||
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
|
||||
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
/* cyrillic-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-700-cyrillic-ext29.woff2") format("woff2");
|
||||
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||
}
|
||||
/* cyrillic */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-700-cyrillic30.woff2") format("woff2");
|
||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||
}
|
||||
/* greek-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-700-greek-ext31.woff2") format("woff2");
|
||||
unicode-range: U+1F00-1FFF;
|
||||
}
|
||||
/* greek */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-700-greek32.woff2") format("woff2");
|
||||
unicode-range: U+0370-03FF;
|
||||
}
|
||||
/* vietnamese */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-700-vietnamese33.woff2") format("woff2");
|
||||
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
|
||||
}
|
||||
/* latin-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-700-latin-ext34.woff2") format("woff2");
|
||||
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-700-latin35.woff2") format("woff2");
|
||||
unicode-range:
|
||||
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
|
||||
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
/* cyrillic-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-900-cyrillic-ext36.woff2") format("woff2");
|
||||
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
|
||||
}
|
||||
/* cyrillic */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-900-cyrillic37.woff2") format("woff2");
|
||||
unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||
}
|
||||
/* greek-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-900-greek-ext38.woff2") format("woff2");
|
||||
unicode-range: U+1F00-1FFF;
|
||||
}
|
||||
/* greek */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-900-greek39.woff2") format("woff2");
|
||||
unicode-range: U+0370-03FF;
|
||||
}
|
||||
/* vietnamese */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-900-vietnamese40.woff2") format("woff2");
|
||||
unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB;
|
||||
}
|
||||
/* latin-ext */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-900-latin-ext41.woff2") format("woff2");
|
||||
unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
/* latin */
|
||||
@font-face {
|
||||
font-family: "Roboto";
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
font-display: swap;
|
||||
src: url("~assets/fonts/Roboto-900-latin42.woff2") format("woff2");
|
||||
unicode-range:
|
||||
U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191,
|
||||
U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,23 +1,23 @@
|
||||
<template>
|
||||
<div v-if="value.length > 0 || edit">
|
||||
<div v-if="model.length > 0 || edit">
|
||||
<v-card class="mt-4">
|
||||
<v-card-title class="py-2">
|
||||
{{ $t("asset.assets") }}
|
||||
</v-card-title>
|
||||
<v-divider class="mx-2" />
|
||||
<v-list
|
||||
v-if="value.length > 0"
|
||||
v-if="model.length > 0"
|
||||
:flat="!edit"
|
||||
>
|
||||
<v-list-item
|
||||
v-for="(item, i) in value"
|
||||
v-for="(item, i) in model"
|
||||
:key="i"
|
||||
>
|
||||
<template #prepend>
|
||||
<div class="ma-auto">
|
||||
<v-tooltip bottom>
|
||||
<template #activator="{ props }">
|
||||
<v-icon v-bind="props">
|
||||
<template #activator="{ props: tooltipProps }">
|
||||
<v-icon v-bind="tooltipProps">
|
||||
{{ getIconDefinition(item.icon).icon }}
|
||||
</v-icon>
|
||||
</template>
|
||||
@@ -44,7 +44,7 @@
|
||||
color="error"
|
||||
icon
|
||||
top
|
||||
@click="value.splice(i, 1)"
|
||||
@click="model.splice(i, 1)"
|
||||
>
|
||||
<v-icon>{{ $globals.icons.delete }}</v-icon>
|
||||
</v-btn>
|
||||
@@ -113,124 +113,109 @@
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
<script setup lang="ts">
|
||||
import { useStaticRoutes, useUserApi } from "~/composables/api";
|
||||
import { alert } from "~/composables/use-toast";
|
||||
import type { RecipeAsset } from "~/lib/api/types/recipe";
|
||||
|
||||
export default defineNuxtComponent({
|
||||
props: {
|
||||
slug: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
recipeId: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
modelValue: {
|
||||
type: Array as () => RecipeAsset[],
|
||||
required: true,
|
||||
},
|
||||
edit: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
const props = defineProps({
|
||||
slug: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
emits: ["update:modelValue"],
|
||||
setup(props, context) {
|
||||
const api = useUserApi();
|
||||
|
||||
const state = reactive({
|
||||
newAssetDialog: false,
|
||||
fileObject: {} as File,
|
||||
newAsset: {
|
||||
name: "",
|
||||
icon: "mdi-file",
|
||||
},
|
||||
});
|
||||
|
||||
const i18n = useI18n();
|
||||
const { $globals } = useNuxtApp();
|
||||
|
||||
const iconOptions = [
|
||||
{
|
||||
name: "mdi-file",
|
||||
title: i18n.t("asset.file"),
|
||||
icon: $globals.icons.file,
|
||||
},
|
||||
{
|
||||
name: "mdi-file-pdf-box",
|
||||
title: i18n.t("asset.pdf"),
|
||||
icon: $globals.icons.filePDF,
|
||||
},
|
||||
{
|
||||
name: "mdi-file-image",
|
||||
title: i18n.t("asset.image"),
|
||||
icon: $globals.icons.fileImage,
|
||||
},
|
||||
{
|
||||
name: "mdi-code-json",
|
||||
title: i18n.t("asset.code"),
|
||||
icon: $globals.icons.codeJson,
|
||||
},
|
||||
{
|
||||
name: "mdi-silverware-fork-knife",
|
||||
title: i18n.t("asset.recipe"),
|
||||
icon: $globals.icons.primary,
|
||||
},
|
||||
];
|
||||
|
||||
const serverBase = useRequestURL().origin;
|
||||
|
||||
function getIconDefinition(icon: string) {
|
||||
return iconOptions.find(item => item.name === icon) || iconOptions[0];
|
||||
}
|
||||
|
||||
const { recipeAssetPath } = useStaticRoutes();
|
||||
function assetURL(assetName: string) {
|
||||
return recipeAssetPath(props.recipeId, assetName);
|
||||
}
|
||||
|
||||
function assetEmbed(name: string) {
|
||||
return `<img src="${serverBase}${assetURL(name)}" height="100%" width="100%"> </img>`;
|
||||
}
|
||||
|
||||
function setFileObject(fileObject: File) {
|
||||
state.fileObject = fileObject;
|
||||
}
|
||||
|
||||
function validFields() {
|
||||
return state.newAsset.name.length > 0 && state.fileObject.name.length > 0;
|
||||
}
|
||||
|
||||
async function addAsset() {
|
||||
if (!validFields()) {
|
||||
alert.error(i18n.t("asset.error-submitting-form") as string);
|
||||
return;
|
||||
}
|
||||
|
||||
const { data } = await api.recipes.createAsset(props.slug, {
|
||||
name: state.newAsset.name,
|
||||
icon: state.newAsset.icon,
|
||||
file: state.fileObject,
|
||||
extension: state.fileObject.name.split(".").pop() || "",
|
||||
});
|
||||
|
||||
context.emit("update:modelValue", [...props.modelValue, data]);
|
||||
state.newAsset = { name: "", icon: "mdi-file" };
|
||||
state.fileObject = {} as File;
|
||||
}
|
||||
|
||||
return {
|
||||
state,
|
||||
addAsset,
|
||||
assetURL,
|
||||
assetEmbed,
|
||||
getIconDefinition,
|
||||
iconOptions,
|
||||
setFileObject,
|
||||
};
|
||||
recipeId: {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
edit: {
|
||||
type: Boolean,
|
||||
default: true,
|
||||
},
|
||||
});
|
||||
|
||||
const model = defineModel<RecipeAsset[]>({ required: true });
|
||||
|
||||
const api = useUserApi();
|
||||
|
||||
const state = reactive({
|
||||
newAssetDialog: false,
|
||||
fileObject: {} as File,
|
||||
newAsset: {
|
||||
name: "",
|
||||
icon: "mdi-file",
|
||||
},
|
||||
});
|
||||
|
||||
const i18n = useI18n();
|
||||
const { $globals } = useNuxtApp();
|
||||
|
||||
const iconOptions = [
|
||||
{
|
||||
name: "mdi-file",
|
||||
title: i18n.t("asset.file"),
|
||||
icon: $globals.icons.file,
|
||||
},
|
||||
{
|
||||
name: "mdi-file-pdf-box",
|
||||
title: i18n.t("asset.pdf"),
|
||||
icon: $globals.icons.filePDF,
|
||||
},
|
||||
{
|
||||
name: "mdi-file-image",
|
||||
title: i18n.t("asset.image"),
|
||||
icon: $globals.icons.fileImage,
|
||||
},
|
||||
{
|
||||
name: "mdi-code-json",
|
||||
title: i18n.t("asset.code"),
|
||||
icon: $globals.icons.codeJson,
|
||||
},
|
||||
{
|
||||
name: "mdi-silverware-fork-knife",
|
||||
title: i18n.t("asset.recipe"),
|
||||
icon: $globals.icons.primary,
|
||||
},
|
||||
];
|
||||
|
||||
const serverBase = useRequestURL().origin;
|
||||
|
||||
function getIconDefinition(icon: string) {
|
||||
return iconOptions.find(item => item.name === icon) || iconOptions[0];
|
||||
}
|
||||
|
||||
const { recipeAssetPath } = useStaticRoutes();
|
||||
function assetURL(assetName: string) {
|
||||
return recipeAssetPath(props.recipeId, assetName);
|
||||
}
|
||||
|
||||
function assetEmbed(name: string) {
|
||||
return `<img src="${serverBase}${assetURL(name)}" height="100%" width="100%"> </img>`;
|
||||
}
|
||||
|
||||
function setFileObject(fileObject: File) {
|
||||
state.fileObject = fileObject;
|
||||
}
|
||||
|
||||
function validFields() {
|
||||
return state.newAsset.name.length > 0 && state.fileObject.name.length > 0;
|
||||
}
|
||||
|
||||
async function addAsset() {
|
||||
if (!validFields()) {
|
||||
alert.error(i18n.t("asset.error-submitting-form") as string);
|
||||
return;
|
||||
}
|
||||
|
||||
const { data } = await api.recipes.createAsset(props.slug, {
|
||||
name: state.newAsset.name,
|
||||
icon: state.newAsset.icon,
|
||||
file: state.fileObject,
|
||||
extension: state.fileObject.name.split(".").pop() || "",
|
||||
});
|
||||
if (data) {
|
||||
model.value = [...model.value, data];
|
||||
}
|
||||
state.newAsset = { name: "", icon: "mdi-file" };
|
||||
state.fileObject = {} as File;
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -269,13 +269,17 @@ export default defineNuxtComponent({
|
||||
recipeName: props.name,
|
||||
loading: false,
|
||||
menuItems: [] as ContextMenuItem[],
|
||||
newMealdate: new Date(Date.now() - new Date().getTimezoneOffset() * 60000),
|
||||
newMealdate: new Date(),
|
||||
newMealType: "dinner" as PlanEntryType,
|
||||
pickerMenu: false,
|
||||
});
|
||||
|
||||
const newMealdateString = computed(() => {
|
||||
return state.newMealdate.toISOString().substring(0, 10);
|
||||
// Format the date to YYYY-MM-DD in the same timezone as newMealdate
|
||||
const year = state.newMealdate.getFullYear();
|
||||
const month = String(state.newMealdate.getMonth() + 1).padStart(2, "0");
|
||||
const day = String(state.newMealdate.getDate()).padStart(2, "0");
|
||||
return `${year}-${month}-${day}`;
|
||||
});
|
||||
|
||||
const i18n = useI18n();
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
:suffix="labels[key].suffix"
|
||||
type="number"
|
||||
autocomplete="off"
|
||||
variant="underlined"
|
||||
@update:model-value="updateValue(key, $event)"
|
||||
/>
|
||||
</div>
|
||||
@@ -31,15 +32,13 @@
|
||||
:key="index"
|
||||
style="min-height: 25px"
|
||||
>
|
||||
<div>
|
||||
<v-list-item-title class="pl-4 caption flex row">
|
||||
<div>{{ item.label }}</div>
|
||||
<div class="ml-auto mr-1">
|
||||
{{ item.value }}
|
||||
</div>
|
||||
<div>{{ item.suffix }}</div>
|
||||
</v-list-item-title>
|
||||
</div>
|
||||
<v-list-item-title class="pl-2 d-flex">
|
||||
<div>{{ item.label }}</div>
|
||||
<div class="ml-auto mr-1">
|
||||
{{ item.value }}
|
||||
</div>
|
||||
<div>{{ item.suffix }}</div>
|
||||
</v-list-item-title>
|
||||
</v-list-item>
|
||||
</v-list>
|
||||
</v-card>
|
||||
|
||||
@@ -42,6 +42,8 @@ export default defineNuxtComponent({
|
||||
|
||||
.v-main {
|
||||
display: block;
|
||||
padding: 0 !important;
|
||||
margin: 0 !important;
|
||||
}
|
||||
|
||||
.v-main__wrap {
|
||||
|
||||
@@ -23,18 +23,17 @@
|
||||
</v-icon>
|
||||
{{ recipe.name }}
|
||||
</v-card-title>
|
||||
<div v-if="recipeYield"
|
||||
class="d-flex justify-space-between align-center px-4 pb-2"
|
||||
<div
|
||||
v-if="recipeYield"
|
||||
class="d-flex justify-space-between align-center pb-6"
|
||||
>
|
||||
<v-chip :size="$vuetify.display.smAndDown ? 'small' : undefined"
|
||||
label
|
||||
>
|
||||
<div>
|
||||
<v-icon start>
|
||||
{{ $globals.icons.potSteam }}
|
||||
</v-icon>
|
||||
<!-- eslint-disable-next-line vue/no-v-html -->
|
||||
<span v-html="recipeYield" />
|
||||
</v-chip>
|
||||
</div>
|
||||
</div>
|
||||
<v-row class="d-flex justify-start">
|
||||
<RecipeTimeCard :prep-time="recipe.prepTime"
|
||||
|
||||
@@ -138,14 +138,48 @@ export default defineNuxtComponent({
|
||||
const groupSlug = computed(() => route.params.groupSlug as string || $auth.user.value?.groupSlug || "");
|
||||
|
||||
const cookbookPreferences = useCookbookPreferences();
|
||||
const { store: cookbooks, actions: cookbooksActions } = isOwnGroup.value ? useCookbookStore() : usePublicCookbookStore(groupSlug.value || "");
|
||||
onMounted(() => {
|
||||
if (!cookbooks.value.length) {
|
||||
cookbooksActions.refresh();
|
||||
|
||||
const ownCookbookStore = useCookbookStore(i18n);
|
||||
const ownHouseholdStore = useHouseholdStore(i18n);
|
||||
|
||||
const publicCookbookStoreCache = ref<Record<string, ReturnType<typeof usePublicCookbookStore>>>({});
|
||||
const publicHouseholdStoreCache = ref<Record<string, ReturnType<typeof usePublicHouseholdStore>>>({});
|
||||
|
||||
function getPublicCookbookStore(slug: string) {
|
||||
if (!publicCookbookStoreCache.value[slug]) {
|
||||
publicCookbookStoreCache.value[slug] = usePublicCookbookStore(slug, i18n);
|
||||
}
|
||||
return publicCookbookStoreCache.value[slug];
|
||||
}
|
||||
|
||||
function getPublicHouseholdStore(slug: string) {
|
||||
if (!publicHouseholdStoreCache.value[slug]) {
|
||||
publicHouseholdStoreCache.value[slug] = usePublicHouseholdStore(slug, i18n);
|
||||
}
|
||||
return publicHouseholdStoreCache.value[slug];
|
||||
}
|
||||
|
||||
const cookbooks = computed(() => {
|
||||
if (isOwnGroup.value) {
|
||||
return ownCookbookStore.store.value;
|
||||
}
|
||||
else if (groupSlug.value) {
|
||||
const publicStore = getPublicCookbookStore(groupSlug.value);
|
||||
return unref(publicStore.store);
|
||||
}
|
||||
return [];
|
||||
});
|
||||
|
||||
const { store: households } = isOwnGroup.value ? useHouseholdStore() : usePublicHouseholdStore(groupSlug.value || "");
|
||||
const households = computed(() => {
|
||||
if (isOwnGroup.value) {
|
||||
return ownHouseholdStore.store.value;
|
||||
}
|
||||
else if (groupSlug.value) {
|
||||
const publicStore = getPublicHouseholdStore(groupSlug.value);
|
||||
return unref(publicStore.store);
|
||||
}
|
||||
return [];
|
||||
});
|
||||
|
||||
const householdsById = computed(() => {
|
||||
return households.value.reduce((acc, household) => {
|
||||
@@ -178,6 +212,10 @@ export default defineNuxtComponent({
|
||||
|
||||
const currentUserHouseholdId = computed(() => $auth.user.value?.householdId);
|
||||
const cookbookLinks = computed<SideBarLink[]>(() => {
|
||||
if (!cookbooks.value?.length) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const sortedCookbooks = [...cookbooks.value].sort((a, b) => (a.position || 0) - (b.position || 0));
|
||||
|
||||
const ownLinks: SideBarLink[] = [];
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
<v-tooltip
|
||||
ref="copyToolTip"
|
||||
v-model="show"
|
||||
:color="copied? 'success-lighten-1' : 'red-lighten-1'"
|
||||
top
|
||||
:open-on-hover="false"
|
||||
:open-on-click="true"
|
||||
@@ -24,15 +23,12 @@
|
||||
{{ icon ? "" : $t("general.copy") }}
|
||||
</v-btn>
|
||||
</template>
|
||||
<span>
|
||||
<v-icon
|
||||
start
|
||||
dark
|
||||
>
|
||||
<span v-if="!isSupported || copiedSuccess !== null">
|
||||
<v-icon start>
|
||||
{{ $globals.icons.clipboardCheck }}
|
||||
</v-icon>
|
||||
<slot v-if="!isSupported"> {{ $t("general.your-browser-does-not-support-clipboard") }} </slot>
|
||||
<slot v-else> {{ copied ? $t("general.copied_message") : $t("general.clipboard-copy-failure") }} </slot>
|
||||
<slot v-else> {{ copiedSuccess ? $t("general.copied_message") : $t("general.clipboard-copy-failure") }} </slot>
|
||||
</span>
|
||||
</v-tooltip>
|
||||
</template>
|
||||
@@ -63,19 +59,18 @@ export default defineNuxtComponent({
|
||||
const { copy, copied, isSupported } = useClipboard();
|
||||
const show = ref(false);
|
||||
const copyToolTip = ref<VTooltip | null>(null);
|
||||
|
||||
function toggleBlur() {
|
||||
copyToolTip.value?.deactivate();
|
||||
}
|
||||
const copiedSuccess = ref<boolean | null>(null);
|
||||
|
||||
async function textToClipboard() {
|
||||
if (isSupported.value) {
|
||||
await copy(props.copyText);
|
||||
if (copied.value) {
|
||||
console.log(`Copied\n${props.copyText}`);
|
||||
copiedSuccess.value = true;
|
||||
console.info(`Copied\n${props.copyText}`);
|
||||
}
|
||||
else {
|
||||
console.warn("Copy failed: ", copied.value);
|
||||
copiedSuccess.value = false;
|
||||
console.error("Copy failed: ", copied.value);
|
||||
}
|
||||
}
|
||||
else {
|
||||
@@ -84,8 +79,8 @@ export default defineNuxtComponent({
|
||||
|
||||
show.value = true;
|
||||
setTimeout(() => {
|
||||
toggleBlur();
|
||||
}, 500);
|
||||
show.value = false;
|
||||
}, 3000);
|
||||
}
|
||||
|
||||
return {
|
||||
@@ -94,6 +89,7 @@ export default defineNuxtComponent({
|
||||
textToClipboard,
|
||||
copied,
|
||||
isSupported,
|
||||
copiedSuccess,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
color="info"
|
||||
variant="elevated"
|
||||
:items="bulkActions"
|
||||
v-bind="bulkActionListener"
|
||||
v-on="bulkActionListener"
|
||||
/>
|
||||
<slot name="button-row" />
|
||||
</v-card-actions>
|
||||
@@ -55,7 +55,7 @@
|
||||
</div>
|
||||
<v-data-table
|
||||
v-model="selected"
|
||||
item-key="id"
|
||||
return-object
|
||||
:headers="activeHeaders"
|
||||
:show-select="bulkActions.length > 0"
|
||||
:sort-by="sortBy"
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import type { AxiosInstance, AxiosResponse, AxiosRequestConfig } from "axios";
|
||||
import type { Composer } from "vue-i18n";
|
||||
import type { ApiRequestInstance, RequestResponse } from "~/lib/api/types/non-generated";
|
||||
import { AdminAPI, PublicApi, UserApi } from "~/lib/api";
|
||||
import { PublicExploreApi } from "~/lib/api/client-public";
|
||||
@@ -52,31 +53,34 @@ function getRequests(axiosInstance: AxiosInstance): ApiRequestInstance {
|
||||
};
|
||||
}
|
||||
|
||||
export const useRequests = function (): ApiRequestInstance {
|
||||
const i18n = useI18n();
|
||||
export const useRequests = function (i18n?: Composer): ApiRequestInstance {
|
||||
const { $axios } = useNuxtApp();
|
||||
if (!i18n) {
|
||||
// Only works in a setup block
|
||||
i18n = useI18n();
|
||||
}
|
||||
|
||||
$axios.defaults.headers.common["Accept-Language"] = i18n.locale.value;
|
||||
|
||||
return getRequests($axios);
|
||||
};
|
||||
|
||||
export const useAdminApi = function (): AdminAPI {
|
||||
const requests = useRequests();
|
||||
export const useAdminApi = function (i18n?: Composer): AdminAPI {
|
||||
const requests = useRequests(i18n);
|
||||
return new AdminAPI(requests);
|
||||
};
|
||||
|
||||
export const useUserApi = function (): UserApi {
|
||||
const requests = useRequests();
|
||||
export const useUserApi = function (i18n?: Composer): UserApi {
|
||||
const requests = useRequests(i18n);
|
||||
return new UserApi(requests);
|
||||
};
|
||||
|
||||
export const usePublicApi = function (): PublicApi {
|
||||
const requests = useRequests();
|
||||
export const usePublicApi = function (i18n?: Composer): PublicApi {
|
||||
const requests = useRequests(i18n);
|
||||
return new PublicApi(requests);
|
||||
};
|
||||
|
||||
export const usePublicExploreApi = function (groupSlug: string): PublicExploreApi {
|
||||
const requests = useRequests();
|
||||
export const usePublicExploreApi = function (groupSlug: string, i18n?: Composer): PublicExploreApi {
|
||||
const requests = useRequests(i18n);
|
||||
return new PublicExploreApi(requests, groupSlug);
|
||||
};
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import type { Composer } from "vue-i18n";
|
||||
import { useData, useReadOnlyStore, useStore } from "../partials/use-store-factory";
|
||||
import type { RecipeCategory } from "~/lib/api/types/recipe";
|
||||
import { usePublicExploreApi, useUserApi } from "~/composables/api";
|
||||
@@ -14,12 +15,12 @@ export const useCategoryData = function () {
|
||||
});
|
||||
};
|
||||
|
||||
export const useCategoryStore = function () {
|
||||
const api = useUserApi();
|
||||
export const useCategoryStore = function (i18n?: Composer) {
|
||||
const api = useUserApi(i18n);
|
||||
return useStore<RecipeCategory>(store, loading, api.categories);
|
||||
};
|
||||
|
||||
export const usePublicCategoryStore = function (groupSlug: string) {
|
||||
const api = usePublicExploreApi(groupSlug).explore;
|
||||
export const usePublicCategoryStore = function (groupSlug: string, i18n?: Composer) {
|
||||
const api = usePublicExploreApi(groupSlug, i18n).explore;
|
||||
return useReadOnlyStore<RecipeCategory>(store, publicLoading, api.categories);
|
||||
};
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import type { Composer } from "vue-i18n";
|
||||
import { useReadOnlyStore, useStore } from "../partials/use-store-factory";
|
||||
import type { RecipeCookBook } from "~/lib/api/types/cookbook";
|
||||
import { usePublicExploreApi, useUserApi } from "~/composables/api";
|
||||
@@ -6,12 +7,12 @@ const store: Ref<RecipeCookBook[]> = ref([]);
|
||||
const loading = ref(false);
|
||||
const publicLoading = ref(false);
|
||||
|
||||
export const useCookbookStore = function () {
|
||||
const api = useUserApi();
|
||||
export const useCookbookStore = function (i18n?: Composer) {
|
||||
const api = useUserApi(i18n);
|
||||
return useStore<RecipeCookBook>(store, loading, api.cookbooks);
|
||||
};
|
||||
|
||||
export const usePublicCookbookStore = function (groupSlug: string) {
|
||||
const api = usePublicExploreApi(groupSlug).explore;
|
||||
export const usePublicCookbookStore = function (groupSlug: string, i18n?: Composer) {
|
||||
const api = usePublicExploreApi(groupSlug, i18n).explore;
|
||||
return useReadOnlyStore<RecipeCookBook>(store, publicLoading, api.cookbooks);
|
||||
};
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import type { Composer } from "vue-i18n";
|
||||
import { useData, useReadOnlyStore, useStore } from "../partials/use-store-factory";
|
||||
import type { IngredientFood } from "~/lib/api/types/recipe";
|
||||
import { usePublicExploreApi, useUserApi } from "~/composables/api";
|
||||
@@ -15,12 +16,12 @@ export const useFoodData = function () {
|
||||
});
|
||||
};
|
||||
|
||||
export const useFoodStore = function () {
|
||||
const api = useUserApi();
|
||||
export const useFoodStore = function (i18n?: Composer) {
|
||||
const api = useUserApi(i18n);
|
||||
return useStore<IngredientFood>(store, loading, api.foods);
|
||||
};
|
||||
|
||||
export const usePublicFoodStore = function (groupSlug: string) {
|
||||
const api = usePublicExploreApi(groupSlug).explore;
|
||||
export const usePublicFoodStore = function (groupSlug: string, i18n?: Composer) {
|
||||
const api = usePublicExploreApi(groupSlug, i18n).explore;
|
||||
return useReadOnlyStore<IngredientFood>(store, publicLoading, api.foods);
|
||||
};
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import type { Composer } from "vue-i18n";
|
||||
import { useReadOnlyStore } from "../partials/use-store-factory";
|
||||
import type { HouseholdSummary } from "~/lib/api/types/household";
|
||||
import { usePublicExploreApi, useUserApi } from "~/composables/api";
|
||||
@@ -6,12 +7,12 @@ const store: Ref<HouseholdSummary[]> = ref([]);
|
||||
const loading = ref(false);
|
||||
const publicLoading = ref(false);
|
||||
|
||||
export const useHouseholdStore = function () {
|
||||
const api = useUserApi();
|
||||
export const useHouseholdStore = function (i18n?: Composer) {
|
||||
const api = useUserApi(i18n);
|
||||
return useReadOnlyStore<HouseholdSummary>(store, loading, api.households);
|
||||
};
|
||||
|
||||
export const usePublicHouseholdStore = function (groupSlug: string) {
|
||||
const api = usePublicExploreApi(groupSlug).explore;
|
||||
export const usePublicHouseholdStore = function (groupSlug: string, i18n?: Composer) {
|
||||
const api = usePublicExploreApi(groupSlug, i18n).explore;
|
||||
return useReadOnlyStore<HouseholdSummary>(store, publicLoading, api.households);
|
||||
};
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import type { Composer } from "vue-i18n";
|
||||
import { useData, useStore } from "../partials/use-store-factory";
|
||||
import type { MultiPurposeLabelOut } from "~/lib/api/types/labels";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
@@ -14,7 +15,7 @@ export const useLabelData = function () {
|
||||
});
|
||||
};
|
||||
|
||||
export const useLabelStore = function () {
|
||||
const api = useUserApi();
|
||||
export const useLabelStore = function (i18n?: Composer) {
|
||||
const api = useUserApi(i18n);
|
||||
return useStore<MultiPurposeLabelOut>(store, loading, api.multiPurposeLabels);
|
||||
};
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import type { Composer } from "vue-i18n";
|
||||
import { useData, useReadOnlyStore, useStore } from "../partials/use-store-factory";
|
||||
import type { RecipeTag } from "~/lib/api/types/recipe";
|
||||
import { usePublicExploreApi, useUserApi } from "~/composables/api";
|
||||
@@ -14,12 +15,12 @@ export const useTagData = function () {
|
||||
});
|
||||
};
|
||||
|
||||
export const useTagStore = function () {
|
||||
const api = useUserApi();
|
||||
export const useTagStore = function (i18n?: Composer) {
|
||||
const api = useUserApi(i18n);
|
||||
return useStore<RecipeTag>(store, loading, api.tags);
|
||||
};
|
||||
|
||||
export const usePublicTagStore = function (groupSlug: string) {
|
||||
const api = usePublicExploreApi(groupSlug).explore;
|
||||
export const usePublicTagStore = function (groupSlug: string, i18n?: Composer) {
|
||||
const api = usePublicExploreApi(groupSlug, i18n).explore;
|
||||
return useReadOnlyStore<RecipeTag>(store, publicLoading, api.tags);
|
||||
};
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import type { Composer } from "vue-i18n";
|
||||
import { useData, useReadOnlyStore, useStore } from "../partials/use-store-factory";
|
||||
import type { RecipeTool } from "~/lib/api/types/recipe";
|
||||
import { usePublicExploreApi, useUserApi } from "~/composables/api";
|
||||
@@ -20,12 +21,12 @@ export const useToolData = function () {
|
||||
});
|
||||
};
|
||||
|
||||
export const useToolStore = function () {
|
||||
const api = useUserApi();
|
||||
export const useToolStore = function (i18n?: Composer) {
|
||||
const api = useUserApi(i18n);
|
||||
return useStore<RecipeTool>(store, loading, api.tools);
|
||||
};
|
||||
|
||||
export const usePublicToolStore = function (groupSlug: string) {
|
||||
const api = usePublicExploreApi(groupSlug).explore;
|
||||
export const usePublicToolStore = function (groupSlug: string, i18n?: Composer) {
|
||||
const api = usePublicExploreApi(groupSlug, i18n).explore;
|
||||
return useReadOnlyStore<RecipeTool>(store, publicLoading, api.tools);
|
||||
};
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import type { Composer } from "vue-i18n";
|
||||
import { useData, useStore } from "../partials/use-store-factory";
|
||||
import type { IngredientUnit } from "~/lib/api/types/recipe";
|
||||
import { useUserApi } from "~/composables/api";
|
||||
@@ -15,7 +16,7 @@ export const useUnitData = function () {
|
||||
});
|
||||
};
|
||||
|
||||
export const useUnitStore = function () {
|
||||
const api = useUserApi();
|
||||
export const useUnitStore = function (i18n?: Composer) {
|
||||
const api = useUserApi(i18n);
|
||||
return useStore<IngredientUnit>(store, loading, api.units);
|
||||
};
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import type { Composer } from "vue-i18n";
|
||||
import { useReadOnlyStore } from "../partials/use-store-factory";
|
||||
import { useRequests } from "../api/api-client";
|
||||
import type { UserSummary } from "~/lib/api/types/user";
|
||||
@@ -11,8 +12,8 @@ class GroupUserAPIReadOnly extends BaseCRUDAPIReadOnly<UserSummary> {
|
||||
itemRoute = (idOrUsername: string | number) => `/groups/members/${idOrUsername}`;
|
||||
}
|
||||
|
||||
export const useUserStore = function () {
|
||||
const requests = useRequests();
|
||||
export const useUserStore = function (i18n?: Composer) {
|
||||
const requests = useRequests(i18n);
|
||||
const api = new GroupUserAPIReadOnly(requests);
|
||||
|
||||
return useReadOnlyStore<UserSummary>(store, loading, api, { orderBy: "full_name" });
|
||||
|
||||
@@ -45,28 +45,11 @@ export const useGroupSelf = function () {
|
||||
export const useGroups = function () {
|
||||
const api = useUserApi();
|
||||
const loading = ref(false);
|
||||
const groups = ref<GroupSummary[] | null>(null);
|
||||
|
||||
function getAllGroups() {
|
||||
async function getAllGroups() {
|
||||
loading.value = true;
|
||||
const asyncKey = String(Date.now());
|
||||
const { data: groups } = useAsyncData(asyncKey, async () => {
|
||||
const { data } = await api.groups.getAll(1, -1, { orderBy: "name", orderDirection: "asc" }); ;
|
||||
|
||||
if (data) {
|
||||
return data.items;
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
loading.value = false;
|
||||
return groups;
|
||||
}
|
||||
|
||||
async function refreshAllGroups() {
|
||||
loading.value = true;
|
||||
const { data } = await api.groups.getAll(1, -1, { orderBy: "name", orderDirection: "asc" }); ;
|
||||
const { data } = await api.groups.getAll(1, -1, { orderBy: "name", orderDirection: "asc" });
|
||||
|
||||
if (data) {
|
||||
groups.value = data.items;
|
||||
@@ -78,11 +61,15 @@ export const useGroups = function () {
|
||||
loading.value = false;
|
||||
}
|
||||
|
||||
async function refreshAllGroups() {
|
||||
await getAllGroups();
|
||||
}
|
||||
|
||||
async function deleteGroup(id: string | number) {
|
||||
loading.value = true;
|
||||
const { data } = await api.groups.deleteOne(id);
|
||||
loading.value = false;
|
||||
refreshAllGroups();
|
||||
await refreshAllGroups();
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -93,9 +80,13 @@ export const useGroups = function () {
|
||||
if (data && groups.value) {
|
||||
groups.value.push(data);
|
||||
}
|
||||
loading.value = false;
|
||||
}
|
||||
|
||||
const groups = getAllGroups();
|
||||
// Initialize data on first call
|
||||
if (!groups.value) {
|
||||
getAllGroups();
|
||||
}
|
||||
|
||||
return { groups, getAllGroups, refreshAllGroups, deleteGroup, createGroup };
|
||||
};
|
||||
|
||||
@@ -48,28 +48,11 @@ export const useHouseholdSelf = function () {
|
||||
export const useAdminHouseholds = function () {
|
||||
const api = useAdminApi();
|
||||
const loading = ref(false);
|
||||
const households = ref<HouseholdInDB[] | null>(null);
|
||||
|
||||
function getAllHouseholds() {
|
||||
async function getAllHouseholds() {
|
||||
loading.value = true;
|
||||
const asyncKey = String(Date.now());
|
||||
const { data: households } = useAsyncData(asyncKey, async () => {
|
||||
const { data } = await api.households.getAll(1, -1, { orderBy: "name, group.name", orderDirection: "asc" });
|
||||
|
||||
if (data) {
|
||||
return data.items;
|
||||
}
|
||||
else {
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
loading.value = false;
|
||||
return households;
|
||||
}
|
||||
|
||||
async function refreshAllHouseholds() {
|
||||
loading.value = true;
|
||||
const { data } = await api.households.getAll(1, -1, { orderBy: "name, group.name", orderDirection: "asc" }); ;
|
||||
const { data } = await api.households.getAll(1, -1, { orderBy: "name, group.name", orderDirection: "asc" });
|
||||
|
||||
if (data) {
|
||||
households.value = data.items;
|
||||
@@ -81,11 +64,15 @@ export const useAdminHouseholds = function () {
|
||||
loading.value = false;
|
||||
}
|
||||
|
||||
async function refreshAllHouseholds() {
|
||||
await getAllHouseholds();
|
||||
}
|
||||
|
||||
async function deleteHousehold(id: string | number) {
|
||||
loading.value = true;
|
||||
const { data } = await api.households.deleteOne(id);
|
||||
loading.value = false;
|
||||
refreshAllHouseholds();
|
||||
await refreshAllHouseholds();
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -96,9 +83,9 @@ export const useAdminHouseholds = function () {
|
||||
if (data && households.value) {
|
||||
households.value.push(data);
|
||||
}
|
||||
loading.value = false;
|
||||
}
|
||||
|
||||
const households = getAllHouseholds();
|
||||
function useHouseholdsInGroup(groupIdRef: Ref<string>) {
|
||||
return computed(
|
||||
() => {
|
||||
@@ -109,6 +96,10 @@ export const useAdminHouseholds = function () {
|
||||
);
|
||||
}
|
||||
|
||||
if (!households.value) {
|
||||
getAllHouseholds();
|
||||
}
|
||||
|
||||
return {
|
||||
households,
|
||||
useHouseholdsInGroup,
|
||||
|
||||
@@ -9,7 +9,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "简体中文 (Chinese simplified)",
|
||||
value: "zh-CN",
|
||||
progress: 32,
|
||||
progress: 33,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -33,7 +33,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Svenska (Swedish)",
|
||||
value: "sv-SE",
|
||||
progress: 37,
|
||||
progress: 39,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -45,7 +45,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Slovenščina (Slovenian)",
|
||||
value: "sl-SI",
|
||||
progress: 37,
|
||||
progress: 39,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -93,7 +93,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Nederlands (Dutch)",
|
||||
value: "nl-NL",
|
||||
progress: 37,
|
||||
progress: 42,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -135,7 +135,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Magyar (Hungarian)",
|
||||
value: "hu-HU",
|
||||
progress: 38,
|
||||
progress: 39,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -159,7 +159,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Français (French)",
|
||||
value: "fr-FR",
|
||||
progress: 37,
|
||||
progress: 38,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -213,7 +213,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Deutsch (German)",
|
||||
value: "de-DE",
|
||||
progress: 37,
|
||||
progress: 55,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -252,4 +252,4 @@ export const LOCALES = [
|
||||
progress: 26,
|
||||
dir: "ltr",
|
||||
},
|
||||
]
|
||||
];
|
||||
|
||||
@@ -1,47 +1,47 @@
|
||||
/* eslint-disable @typescript-eslint/no-require-imports */
|
||||
const datetimeFormats = {
|
||||
// CODE_GEN_ID: DATE_LOCALES
|
||||
"hu-HU": require("./lang/dateTimeFormats/hu-HU.json"),
|
||||
"no-NO": require("./lang/dateTimeFormats/no-NO.json"),
|
||||
"nl-NL": require("./lang/dateTimeFormats/nl-NL.json"),
|
||||
"pl-PL": require("./lang/dateTimeFormats/pl-PL.json"),
|
||||
"da-DK": require("./lang/dateTimeFormats/da-DK.json"),
|
||||
"fr-CA": require("./lang/dateTimeFormats/fr-CA.json"),
|
||||
"fr-BE": require("./lang/dateTimeFormats/fr-BE.json"),
|
||||
"it-IT": require("./lang/dateTimeFormats/it-IT.json"),
|
||||
"sl-SI": require("./lang/dateTimeFormats/sl-SI.json"),
|
||||
"sr-SP": require("./lang/dateTimeFormats/sr-SP.json"),
|
||||
"is-IS": require("./lang/dateTimeFormats/is-IS.json"),
|
||||
"ja-JP": require("./lang/dateTimeFormats/ja-JP.json"),
|
||||
"fr-FR": require("./lang/dateTimeFormats/fr-FR.json"),
|
||||
"ca-ES": require("./lang/dateTimeFormats/ca-ES.json"),
|
||||
"tr-TR": require("./lang/dateTimeFormats/tr-TR.json"),
|
||||
"fi-FI": require("./lang/dateTimeFormats/fi-FI.json"),
|
||||
"hr-HR": require("./lang/dateTimeFormats/hr-HR.json"),
|
||||
"pt-BR": require("./lang/dateTimeFormats/pt-BR.json"),
|
||||
"sk-SK": require("./lang/dateTimeFormats/sk-SK.json"),
|
||||
"zh-CN": require("./lang/dateTimeFormats/zh-CN.json"),
|
||||
"pt-PT": require("./lang/dateTimeFormats/pt-PT.json"),
|
||||
"ja-JP": require("./lang/dateTimeFormats/ja-JP.json"),
|
||||
"en-GB": require("./lang/dateTimeFormats/en-GB.json"),
|
||||
"ca-ES": require("./lang/dateTimeFormats/ca-ES.json"),
|
||||
"it-IT": require("./lang/dateTimeFormats/it-IT.json"),
|
||||
"pl-PL": require("./lang/dateTimeFormats/pl-PL.json"),
|
||||
"pt-PT": require("./lang/dateTimeFormats/pt-PT.json"),
|
||||
"ro-RO": require("./lang/dateTimeFormats/ro-RO.json"),
|
||||
"cs-CZ": require("./lang/dateTimeFormats/cs-CZ.json"),
|
||||
"en-US": require("./lang/dateTimeFormats/en-US.json"),
|
||||
"lv-LV": require("./lang/dateTimeFormats/lv-LV.json"),
|
||||
"ko-KR": require("./lang/dateTimeFormats/ko-KR.json"),
|
||||
"bg-BG": require("./lang/dateTimeFormats/bg-BG.json"),
|
||||
"gl-ES": require("./lang/dateTimeFormats/gl-ES.json"),
|
||||
"sr-SP": require("./lang/dateTimeFormats/sr-SP.json"),
|
||||
"hr-HR": require("./lang/dateTimeFormats/hr-HR.json"),
|
||||
"de-DE": require("./lang/dateTimeFormats/de-DE.json"),
|
||||
"lt-LT": require("./lang/dateTimeFormats/lt-LT.json"),
|
||||
"ru-RU": require("./lang/dateTimeFormats/ru-RU.json"),
|
||||
"he-IL": require("./lang/dateTimeFormats/he-IL.json"),
|
||||
"el-GR": require("./lang/dateTimeFormats/el-GR.json"),
|
||||
"zh-TW": require("./lang/dateTimeFormats/zh-TW.json"),
|
||||
"af-ZA": require("./lang/dateTimeFormats/af-ZA.json"),
|
||||
"fr-CA": require("./lang/dateTimeFormats/fr-CA.json"),
|
||||
"he-IL": require("./lang/dateTimeFormats/he-IL.json"),
|
||||
"pt-BR": require("./lang/dateTimeFormats/pt-BR.json"),
|
||||
"cs-CZ": require("./lang/dateTimeFormats/cs-CZ.json"),
|
||||
"fr-FR": require("./lang/dateTimeFormats/fr-FR.json"),
|
||||
"ru-RU": require("./lang/dateTimeFormats/ru-RU.json"),
|
||||
"is-IS": require("./lang/dateTimeFormats/is-IS.json"),
|
||||
"sk-SK": require("./lang/dateTimeFormats/sk-SK.json"),
|
||||
"el-GR": require("./lang/dateTimeFormats/el-GR.json"),
|
||||
"fr-BE": require("./lang/dateTimeFormats/fr-BE.json"),
|
||||
"da-DK": require("./lang/dateTimeFormats/da-DK.json"),
|
||||
"hu-HU": require("./lang/dateTimeFormats/hu-HU.json"),
|
||||
"es-ES": require("./lang/dateTimeFormats/es-ES.json"),
|
||||
"gl-ES": require("./lang/dateTimeFormats/gl-ES.json"),
|
||||
"no-NO": require("./lang/dateTimeFormats/no-NO.json"),
|
||||
"lt-LT": require("./lang/dateTimeFormats/lt-LT.json"),
|
||||
"en-US": require("./lang/dateTimeFormats/en-US.json"),
|
||||
"sv-SE": require("./lang/dateTimeFormats/sv-SE.json"),
|
||||
"ar-SA": require("./lang/dateTimeFormats/ar-SA.json"),
|
||||
"vi-VN": require("./lang/dateTimeFormats/vi-VN.json"),
|
||||
"ko-KR": require("./lang/dateTimeFormats/ko-KR.json"),
|
||||
"bg-BG": require("./lang/dateTimeFormats/bg-BG.json"),
|
||||
"sl-SI": require("./lang/dateTimeFormats/sl-SI.json"),
|
||||
"uk-UA": require("./lang/dateTimeFormats/uk-UA.json"),
|
||||
"lv-LV": require("./lang/dateTimeFormats/lv-LV.json"),
|
||||
"ar-SA": require("./lang/dateTimeFormats/ar-SA.json"),
|
||||
"nl-NL": require("./lang/dateTimeFormats/nl-NL.json"),
|
||||
"vi-VN": require("./lang/dateTimeFormats/vi-VN.json"),
|
||||
"fi-FI": require("./lang/dateTimeFormats/fi-FI.json"),
|
||||
// END: DATE_LOCALES
|
||||
};
|
||||
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"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",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"please-wait-images-processing": "Please wait, the images are 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ê.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "No Food"
|
||||
},
|
||||
"reset-servings-count": "Reset Servings Count",
|
||||
"not-linked-ingredients": "Additional Ingredients"
|
||||
"not-linked-ingredients": "Additional Ingredients",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recipe Finder",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"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-images": "Create from Images",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
|
||||
"bulk-url-import": "الاستيراد باستخدام أكثر من URL ",
|
||||
"debug-scraper": "تصحيح أخطاء المحلل\n",
|
||||
"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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "لا يوجد طعام"
|
||||
},
|
||||
"reset-servings-count": "إعادة تعيين عدد الحصص",
|
||||
"not-linked-ingredients": "مكونات إضافية"
|
||||
"not-linked-ingredients": "مكونات إضافية",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "البحث عن الوصفات",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"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",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
|
||||
"bulk-url-import": "Импортиране на рецепти от линк",
|
||||
"debug-scraper": "Отстраняване на грешки на скрейпъра",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Добави рецепта като предоставиш име. Всички рецепти трябва да имат уникални имена.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "No Food"
|
||||
},
|
||||
"reset-servings-count": "Reset Servings Count",
|
||||
"not-linked-ingredients": "Additional Ingredients"
|
||||
"not-linked-ingredients": "Additional Ingredients",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recipe Finder",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"create-recipe-from-an-image": "Crear una recepta a partir d'una imatge",
|
||||
"create-recipe-from-an-image-description": "Crear una recepta pujant una imatge d'ella. Mealie intentarà extreure el text de la imatge mitjançant IA i crear-ne la recepta.",
|
||||
"crop-and-rotate-the-image": "Retalla i rota la imatge, per tal que només el text sigui visible, i estigui orientat correctament.",
|
||||
"create-from-image": "Crear des d'una imatge",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "Tradueix la recepta a la meva llengua",
|
||||
"please-wait-image-procesing": "Si us plau, esperi, la imatge s'està processant. Això pot tardar un temps.",
|
||||
"please-wait-images-processing": "Please wait, the images are 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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "Sense menjar"
|
||||
},
|
||||
"reset-servings-count": "Reiniciar racions servides",
|
||||
"not-linked-ingredients": "Ingredients addicionals"
|
||||
"not-linked-ingredients": "Ingredients addicionals",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Cercador de receptes",
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
"api-docs": "Dokumentace API",
|
||||
"api-port": "API port",
|
||||
"application-mode": "Režim aplikace",
|
||||
"database-type": "Typ databáze",
|
||||
"database-type": "Database Type",
|
||||
"database-url": "URL databáze",
|
||||
"default-group": "Výchozí skupina",
|
||||
"default-household": "Výchozí domácnost",
|
||||
@@ -599,9 +599,10 @@
|
||||
"create-recipe-from-an-image": "Vytvořit recept z obrázku",
|
||||
"create-recipe-from-an-image-description": "Vytvořte recept nahráním obrázku. Mealie se pokusí z obrázku extrahovat text pomocí AI a vytvořit z něj recept.",
|
||||
"crop-and-rotate-the-image": "Oříznout a otočit obrázek tak, aby byl viditelný pouze text a aby byl ve správné orientaci.",
|
||||
"create-from-image": "Vytvořit z obrázku",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "Přeložit recept do mého jazyka",
|
||||
"please-wait-image-procesing": "Počkejte prosím, obrázek se zpracovává. Může to chvíli trvat.",
|
||||
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
|
||||
"bulk-url-import": "Hromadný import adres URL",
|
||||
"debug-scraper": "Ladící Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Vytvořte recept zadáním názvu. Všechny recepty musí mít jedinečná jména.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "Žádné jídlo"
|
||||
},
|
||||
"reset-servings-count": "Resetovat počet porcí",
|
||||
"not-linked-ingredients": "Další ingredience"
|
||||
"not-linked-ingredients": "Další ingredience",
|
||||
"upload-another-image": "Nahrát další obrázek",
|
||||
"upload-images": "Nahrát obrázky",
|
||||
"upload-more-images": "Nahrát více obrázků"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Vyhledávač receptů",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"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",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "Oversæt opskriften til mit sprog",
|
||||
"please-wait-image-procesing": "Vent venligst, billedet behandles. Dette kan tage lidt tid.",
|
||||
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
|
||||
"bulk-url-import": "Import fra flere URL-adresser",
|
||||
"debug-scraper": "Fejlsøg indlæser",
|
||||
"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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "Ingen fødevarer"
|
||||
},
|
||||
"reset-servings-count": "Nulstil antal serveringer",
|
||||
"not-linked-ingredients": "Yderligere ingredienser"
|
||||
"not-linked-ingredients": "Yderligere ingredienser",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Opskriftssøger",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"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",
|
||||
"create-from-images": "Aus Bildern 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.",
|
||||
"please-wait-images-processing": "Bitte warten, die Bilder werden verarbeitet. 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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "Kein Lebensmittel"
|
||||
},
|
||||
"reset-servings-count": "Portionen zurücksetzen",
|
||||
"not-linked-ingredients": "Zusätzliche Zutaten"
|
||||
"not-linked-ingredients": "Zusätzliche Zutaten",
|
||||
"upload-another-image": "Weiteres Bild hochladen",
|
||||
"upload-images": "Bilder hochladen",
|
||||
"upload-more-images": "Weitere Bilder hochladen"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Rezept-Suche",
|
||||
@@ -1001,7 +1005,7 @@
|
||||
"webhooks-enabled": "Webhooks aktiviert",
|
||||
"you-are-not-allowed-to-create-a-user": "Du bist nicht berechtigt, einen Benutzer anzulegen",
|
||||
"you-are-not-allowed-to-delete-this-user": "Du bist nicht berechtigt, diesen Benutzer zu entfernen",
|
||||
"enable-advanced-content": "Erweiterten Inhalt aktivieren",
|
||||
"enable-advanced-content": "Erweiterte Inhalte aktivieren",
|
||||
"enable-advanced-content-description": "Aktiviert zusätzliche Funktionen wie Rezept-Skalierung, API-Schlüssel, Webhooks und Datenverwaltung. Keine Sorge, das kann später noch geändert werden.",
|
||||
"favorite-recipes": "Favoriten",
|
||||
"email-or-username": "E-Mail oder Benutzername",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"create-recipe-from-an-image": "Δημιουργία συνταγής από μια εικόνα",
|
||||
"create-recipe-from-an-image-description": "Δημιουργήστε μια συνταγή ανεβάζοντας μια εικόνα της. Το Mealie θα προσπαθήσει να εξάγει το κείμενο από την εικόνα χρησιμοποιώντας τεχνητή νοημοσύνη και να δημιουργήσει μια συνταγή από αυτό.",
|
||||
"crop-and-rotate-the-image": "Περικοπή και περιστροφή της εικόνας, έτσι ώστε να είναι μόνο το κείμενο ορατό και να είναι στο σωστό προσανατολισμό.",
|
||||
"create-from-image": "Δημιουργία από εικόνα",
|
||||
"create-from-images": "Δημιουργία από εικόνες",
|
||||
"should-translate-description": "Μετάφραση της συνταγής στη γλώσσα μου",
|
||||
"please-wait-image-procesing": "Παρακαλώ περιμένετε, η εικόνα είναι υπό επεξεργασία. Αυτό μπορεί να πάρει κάποιο χρόνο.",
|
||||
"please-wait-images-processing": "Παρακαλώ περιμένετε, οι εικόνες επεξεργάζονται. Αυτό μπορεί να πάρει κάποιο χρόνο.",
|
||||
"bulk-url-import": "Μαζική Εισαγωγή URL",
|
||||
"debug-scraper": "Εντοπισμός σφαλμάτων scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Δημιουργήστε μια συνταγή δίνοντας το όνομα. Ολες οι συνταγές πρέπει να έχουν μοναδικά ονόματα.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "Χωρίς Τρόφιμο"
|
||||
},
|
||||
"reset-servings-count": "Επαναφορά μέτρησης μερίδων",
|
||||
"not-linked-ingredients": "Πρόσθετα συστατικά"
|
||||
"not-linked-ingredients": "Πρόσθετα συστατικά",
|
||||
"upload-another-image": "Ανέβασμα άλλης εικόνας",
|
||||
"upload-images": "Ανέβασμα εικόνων",
|
||||
"upload-more-images": "Ανέβασμα περισσότερων εικόνων"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Εύρεση συνταγών",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"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",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"please-wait-images-processing": "Please wait, the images are 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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "No Food"
|
||||
},
|
||||
"reset-servings-count": "Reset Servings Count",
|
||||
"not-linked-ingredients": "Additional Ingredients"
|
||||
"not-linked-ingredients": "Additional Ingredients",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recipe Finder",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"create-recipe-from-an-image": "Crear receta a partir de una imagen",
|
||||
"create-recipe-from-an-image-description": "Crea una receta cargando una imagen de ella. Mealie intentará extraer el texto de la imagen usando IA y crear una receta de ella.",
|
||||
"crop-and-rotate-the-image": "Recortar y rotar la imagen de manera que sólo el texto sea visible, y esté en la orientación correcta.",
|
||||
"create-from-image": "Crear desde imagen",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "Traducir la receta a mi idioma",
|
||||
"please-wait-image-procesing": "Por favor, espere, la imagen se está procesando. Esto puede tardar un tiempo.",
|
||||
"please-wait-images-processing": "Please wait, the images are 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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "Sin Comida"
|
||||
},
|
||||
"reset-servings-count": "Restablecer contador de porciones",
|
||||
"not-linked-ingredients": "Ingredientes adicionales"
|
||||
"not-linked-ingredients": "Ingredientes adicionales",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Buscador de recetas",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"create-recipe-from-an-image": "Retsepti loomine pildist",
|
||||
"create-recipe-from-an-image-description": "Retsepti loomiseks lae üles selle pilt. Mealie üritab ekstraheerida pildil oleva teksti ning luua retsepti sellest kasutades AI-d.",
|
||||
"crop-and-rotate-the-image": "Kärpige ja pöörake pilti nii, et ainult tekst oleks nähtaval ja see oleks suunatud ülespoole.",
|
||||
"create-from-image": "Pildist loomine",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "Tõlgi retsept minu keelde",
|
||||
"please-wait-image-procesing": "Palun oota, pilti töödeldakse veel. See võib võtta veidi aega.",
|
||||
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
|
||||
"bulk-url-import": "Hulgiimport URL-ist",
|
||||
"debug-scraper": "Otsige Scraperis probleeme",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Loo retsept selle nime kasutades. Igal retseptil peab olema unikaalne nimi",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "Toit puudub"
|
||||
},
|
||||
"reset-servings-count": "Lähtesta portsionite arv",
|
||||
"not-linked-ingredients": "Lisa-koostisosad"
|
||||
"not-linked-ingredients": "Lisa-koostisosad",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Retsepti otsing",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"create-recipe-from-an-image": "Luo resepti kuvasta",
|
||||
"create-recipe-from-an-image-description": "Luo resepti tuomalla siitä kuva. Mealie pyrkii poimimaan tekstin kuvasta tekoälyllä ja luomaan siitä reseptin.",
|
||||
"crop-and-rotate-the-image": "Rajaa ja kierrä kuvaa niin, että vain teksti näkyy, ja että se on oikein päin.",
|
||||
"create-from-image": "Luo kuvasta",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "Käännä resepti kielelleni",
|
||||
"please-wait-image-procesing": "Odota, että kuva käsitellään. Tämä voi kestää hetken.",
|
||||
"please-wait-images-processing": "Please wait, the images are 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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "Ei ruokaa"
|
||||
},
|
||||
"reset-servings-count": "Palauta Annoksien Määrä",
|
||||
"not-linked-ingredients": "Muut ainesosat"
|
||||
"not-linked-ingredients": "Muut ainesosat",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Reseptin etsijä",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"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",
|
||||
"create-from-images": "Create from Images",
|
||||
"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.",
|
||||
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
|
||||
"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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "Aucun aliment"
|
||||
},
|
||||
"reset-servings-count": "Réinitialiser le nombre de portions",
|
||||
"not-linked-ingredients": "Ingrédients supplémentaires"
|
||||
"not-linked-ingredients": "Ingrédients supplémentaires",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recherche de recette",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"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éversant 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",
|
||||
"create-from-images": "Create from Images",
|
||||
"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 un certain temps.",
|
||||
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
|
||||
"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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "Aucun aliment"
|
||||
},
|
||||
"reset-servings-count": "Réinitialiser le nombre de portions",
|
||||
"not-linked-ingredients": "Ingrédients supplémentaires"
|
||||
"not-linked-ingredients": "Ingrédients supplémentaires",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recherche de recette",
|
||||
|
||||
@@ -88,8 +88,8 @@
|
||||
"close": "Fermer",
|
||||
"confirm": "Confirmer",
|
||||
"confirm-how-does-everything-look": "À quoi ressemble le tout ?",
|
||||
"confirm-delete-generic": "Voulez-vous vraiment supprimer ceci ?",
|
||||
"copied_message": "Copié !",
|
||||
"confirm-delete-generic": "Voulez-vous vraiment supprimer ceci ?",
|
||||
"copied_message": "Copié !",
|
||||
"create": "Créer",
|
||||
"created": "Créé",
|
||||
"custom": "Personnalisé",
|
||||
@@ -111,7 +111,7 @@
|
||||
"friday": "Vendredi",
|
||||
"general": "Général",
|
||||
"get": "Envoyer",
|
||||
"home": "Page d’accueil",
|
||||
"home": "Accueil",
|
||||
"image": "Image",
|
||||
"image-upload-failed": "Le téléchargement de l’image a échoué",
|
||||
"import": "Importer",
|
||||
@@ -599,9 +599,10 @@
|
||||
"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",
|
||||
"create-from-images": "Créer à partir d’images",
|
||||
"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.",
|
||||
"please-wait-images-processing": "Veuillez patienter, les images sont en cours de traitement. Cela peut prendre un certain 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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "Aucun aliment"
|
||||
},
|
||||
"reset-servings-count": "Réinitialiser le nombre de portions",
|
||||
"not-linked-ingredients": "Ingrédients supplémentaires"
|
||||
"not-linked-ingredients": "Ingrédients supplémentaires",
|
||||
"upload-another-image": "Télécharger une autre image",
|
||||
"upload-images": "Télécharger des images",
|
||||
"upload-more-images": "Télécharger d'autres images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recherche de recette",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"create-recipe-from-an-image": "Crear receita a partir dunha imaxen",
|
||||
"create-recipe-from-an-image-description": "Cree unha receita cargando unha imaxen da mesma. O Mealie tentará extrair o texto da imaxen utilizando IA e creará unha receita a partir da mesma.",
|
||||
"crop-and-rotate-the-image": "Recorte e vire a imaxen de modo a que só o texto sexa visível e na orientación correta.",
|
||||
"create-from-image": "Crear a partir da imaxen",
|
||||
"create-from-images": "Crear a partir de imaxens",
|
||||
"should-translate-description": "Traducir a receita para a miña língua",
|
||||
"please-wait-image-procesing": "Por favor agarde, a imaxen está sendo procesada. Isto pode levar algun tempo.",
|
||||
"please-wait-images-processing": "Por favor agarde, as imaxens están a ser procesadas. Isto pode levar algún tempo.",
|
||||
"bulk-url-import": "Importación de URL en Masa",
|
||||
"debug-scraper": "Depurar Scraper",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Cree unha receita introducindo o nome. Todas as receitas deven ter nomes únicos.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "Sen Comida"
|
||||
},
|
||||
"reset-servings-count": "Reiniciar Contador de Porcións",
|
||||
"not-linked-ingredients": "Ingredientes Adicionais"
|
||||
"not-linked-ingredients": "Ingredientes Adicionais",
|
||||
"upload-another-image": "Cargar outra imaxen",
|
||||
"upload-images": "Cargar imaxens",
|
||||
"upload-more-images": "Cargar mais imaxens"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Localizador de Receitas",
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
"category-filter": "סינון קטגוריות",
|
||||
"category-update-failed": "עדכון קטגוריה נכשל",
|
||||
"category-updated": "קטגוריה עודכנה",
|
||||
"uncategorized-count": "{count} לא קוטלגו",
|
||||
"uncategorized-count": "{count} ללא קטגוריה",
|
||||
"create-a-category": "יצירת קטגוריה",
|
||||
"category-name": "שם קטגוריה",
|
||||
"category": "קטגוריה"
|
||||
@@ -60,17 +60,17 @@
|
||||
"new-notification-form-description": "Mקשךןק עושה שימוש בספריה בשם Apprise לשליחת התראות. Apprise מציעה אפשרויות רבות עבור התראות לבעלי שירותים. פנה לאתר הWiki של Apprise להסבר מלא על יצירת לינקים לשירות שלך.",
|
||||
"new-version": "גרסה חדשה זמינה!",
|
||||
"notification": "התראה",
|
||||
"refresh": "רענן",
|
||||
"refresh": "רענון",
|
||||
"scheduled": "מתוזמן",
|
||||
"something-went-wrong": "משהו השתבש!",
|
||||
"subscribed-events": "אירועים שנרשמת אליהם",
|
||||
"test-message-sent": "הודעת בדיקה נשלחה",
|
||||
"message-sent": "ההודעה נשלחה",
|
||||
"new-notification": "התראה חדשה",
|
||||
"event-notifiers": "אירועי נוטיפיקציות",
|
||||
"event-notifiers": "מנגנוני התרעה על אירועים",
|
||||
"apprise-url-skipped-if-blank": "כתובת Apprise (דלג אם ריק)",
|
||||
"enable-notifier": "אישור נוטיפיקציות",
|
||||
"what-events": "לאילו אירועים להרשם בערוץ התראות זה?",
|
||||
"enable-notifier": "הפעלת מתריע",
|
||||
"what-events": "לאילו אירועים לרשום את מתריע זה?",
|
||||
"user-events": "אירועי משתמש",
|
||||
"mealplan-events": "אירועי תכנון ארוחות",
|
||||
"when-a-user-in-your-group-creates-a-new-mealplan": "כאשר משתמש בקבוצה שלך יוצר תכנון ארוחות חדש",
|
||||
@@ -599,9 +599,10 @@
|
||||
"create-recipe-from-an-image": "יצירת מתכון מתמונה",
|
||||
"create-recipe-from-an-image-description": "יצירת מתכון ע\"י העלאת תמונה שלו. Mealie תנסה לחלץ את הטקסט מהתמונה באמצעות AI ותייצר ממנו מתכון.",
|
||||
"crop-and-rotate-the-image": "נא לחתוך ולסובב את התמונה כך שרואים רק את הטקסט, והוא בכיוון הנכון.",
|
||||
"create-from-image": "יצירה מתמונה",
|
||||
"create-from-images": "יצירה מתמונה",
|
||||
"should-translate-description": "תרגום המתכון לשפה שלי",
|
||||
"please-wait-image-procesing": "נה להמתין, התמונה עוברת עיבוץ. זה יכול לקחת זמן.",
|
||||
"please-wait-images-processing": "נא להמתין, מנתח את התמונות. זה יכול לקחת זמן מה.",
|
||||
"bulk-url-import": "ייבוא מספר לינקים",
|
||||
"debug-scraper": "סורק לניפוי שגיאות",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "יצירת מתכון באמצעות שם. כל שמות המתכונים צריכים להיות שונים.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "אין אוכל"
|
||||
},
|
||||
"reset-servings-count": "איפוס מספר המנות",
|
||||
"not-linked-ingredients": "מרכיבים נוספים"
|
||||
"not-linked-ingredients": "מרכיבים נוספים",
|
||||
"upload-another-image": "העלאת תמונה נוספת",
|
||||
"upload-images": "העלאת תמונות",
|
||||
"upload-more-images": "העלאת תמונות נוספות"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "מצא מתכון",
|
||||
@@ -1338,7 +1342,7 @@
|
||||
"manage-cookbooks": "ניהול ספרי בישול",
|
||||
"manage-members": "ניהול משתמשים",
|
||||
"manage-webhooks": "ניהול Webhooks",
|
||||
"manage-notifiers": "ניהול ערוצי התראות",
|
||||
"manage-notifiers": "ניהול מתריעים",
|
||||
"manage-data-migrations": "ניהול מיגרציות מידע"
|
||||
},
|
||||
"cookbook": {
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
"docs": "Dokumenti",
|
||||
"download-log": "Preuzmi zapisnik",
|
||||
"download-recipe-json": "Posljednji prikupljeni JSON",
|
||||
"github": "GitHub",
|
||||
"github": "Github",
|
||||
"log-lines": "Bilježi zapisnik",
|
||||
"not-demo": "Nije Demo",
|
||||
"portfolio": "Portfelj",
|
||||
@@ -253,9 +253,9 @@
|
||||
"default-recipe-preferences": "Zadane Postavke Recepata",
|
||||
"group-preferences": "Postavke Grupe",
|
||||
"private-group": "Privatna Grupa",
|
||||
"private-group-description": "Setting your group to private will disable all public view options. This overrides any individual public view settings",
|
||||
"enable-public-access": "Enable Public Access",
|
||||
"enable-public-access-description": "Make group recipes public by default, and allow visitors to view recipes without logging-in",
|
||||
"private-group-description": "Postavljanje tvoje grupe na privatni režim će onemogućiti sve opcije javnog prikaza. To će poništiti bilo koju pojedinačnu postavku za javni prikaz",
|
||||
"enable-public-access": "Dozvoli javni pristup",
|
||||
"enable-public-access-description": "Napravite grupne recepte javnim kao zadanu vrijednost i omogući posjetiteljima pregled recepata bez prijave",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Dopustite korisnicima izvan vaše grupe da vide vaše recepte",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Kada je omogućeno, možete koristiti javnu povezncu dijeljene veze za dijeljenje određenih recepata bez autorizacije korisnika. Kada je onemogućeno, recepte možete dijeliti samo s korisnicima koji su u vašoj grupi ili s prethodno generiranom privatnom vezom",
|
||||
"show-nutrition-information": "Prikaži prehrambene vrijednosti",
|
||||
@@ -267,36 +267,36 @@
|
||||
"disable-users-from-commenting-on-recipes": "Onemogući korisnicima da komentiraju recepte",
|
||||
"disable-users-from-commenting-on-recipes-description": "Skriva sekciju komentara na stranici recepta i onemogućuje komentiranje",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food": "Onemogući organiziranje sastojaka recepata prema jedinicama i namirnicama",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Hides the Food, Unit, and Amount fields for ingredients and treats ingredients as plain text fields",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Sakriva polja za Hranu, Jedinicu i Količinu za sastojke te tretira sastojke kao obična tekstualna polja",
|
||||
"general-preferences": "Opće postavke",
|
||||
"group-recipe-preferences": "Postavke Recepata Grupe",
|
||||
"report": "Izvješće",
|
||||
"report-with-id": "Report ID: {id}",
|
||||
"report-with-id": "ID Izvješća: {id}",
|
||||
"group-management": "Upravljanje Grupom",
|
||||
"admin-group-management": "Upravljanje Grupom od strane Administratora",
|
||||
"admin-group-management-text": "Promjene u ovoj grupi će se odmah odraziti.",
|
||||
"group-id-value": "Id grupe: {0}",
|
||||
"total-households": "Total Households",
|
||||
"you-must-select-a-group-before-selecting-a-household": "You must select a group before selecting a household"
|
||||
"total-households": "Ukupno kućanstava",
|
||||
"you-must-select-a-group-before-selecting-a-household": "Prije odabira kućanstva morate odabrati grupu"
|
||||
},
|
||||
"household": {
|
||||
"household": "Household",
|
||||
"households": "Households",
|
||||
"user-household": "User Household",
|
||||
"create-household": "Create Household",
|
||||
"household-name": "Household Name",
|
||||
"household-group": "Household Group",
|
||||
"household-management": "Household Management",
|
||||
"manage-households": "Manage Households",
|
||||
"admin-household-management": "Admin Household Management",
|
||||
"admin-household-management-text": "Changes to this household will be reflected immediately.",
|
||||
"household-id-value": "Household Id: {0}",
|
||||
"private-household": "Private Household",
|
||||
"private-household-description": "Setting your household to private will disable all public view options. This overrides any individual public view settings",
|
||||
"lock-recipe-edits-from-other-households": "Lock recipe edits from other households",
|
||||
"lock-recipe-edits-from-other-households-description": "When enabled only users in your household can edit recipes created by your household",
|
||||
"household-recipe-preferences": "Household Recipe Preferences",
|
||||
"default-recipe-preferences-description": "These are the default settings when a new recipe is created in your household. These can be changed for individual recipes in the recipe settings menu.",
|
||||
"household": "Domaćinstvo",
|
||||
"households": "Domaćinstva",
|
||||
"user-household": "Korisničko domaćinstvo",
|
||||
"create-household": "Napravi domaćinstvo",
|
||||
"household-name": "Ime domaćinstva",
|
||||
"household-group": "Grupa domaćinstva",
|
||||
"household-management": "Upravitelji domaćinstva",
|
||||
"manage-households": "Upravljanje domaćinstvom",
|
||||
"admin-household-management": "Administratorsko upravljanje domaćinstvom",
|
||||
"admin-household-management-text": "Promjene u ovom domaćinstvo će se odraziti odmah.",
|
||||
"household-id-value": "ID domaćinstva: {0}",
|
||||
"private-household": "Privatno domaćinstvo",
|
||||
"private-household-description": "Postavljanje tvojeg domaćinstva na privatni režim će onemogućiti sve opcije javnog prikaza. To će poništiti bilo koju pojedinačnu postavku za javni prikaz",
|
||||
"lock-recipe-edits-from-other-households": "Onemogućite izmjene recepata iz drugih domaćinstva",
|
||||
"lock-recipe-edits-from-other-households-description": "Kada je omogućeno, samo korisnici u tvojem domaćinstvu mogu uređivati recepte izrađene u tvojem domaćinstvu",
|
||||
"household-recipe-preferences": "Postavke recepata u domaćinstvu",
|
||||
"default-recipe-preferences-description": "Ovo su zadane postavke, kada se u tvojem domaćinstvu izradi novi recept. Ove postavke se mogu promijeniti za pojedinačne recepte u izborniku postavki recepata.",
|
||||
"allow-users-outside-of-your-household-to-see-your-recipes": "Allow users outside of your household to see your recipes",
|
||||
"allow-users-outside-of-your-household-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 household or with a pre-generated private link",
|
||||
"household-preferences": "Household Preferences"
|
||||
@@ -599,9 +599,10 @@
|
||||
"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",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"please-wait-images-processing": "Please wait, the images are 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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "No Food"
|
||||
},
|
||||
"reset-servings-count": "Reset Servings Count",
|
||||
"not-linked-ingredients": "Additional Ingredients"
|
||||
"not-linked-ingredients": "Additional Ingredients",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recipe Finder",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"create-recipe-from-an-image": "Recept készítése képről",
|
||||
"create-recipe-from-an-image-description": "Hozzon létre egy receptet egy kép feltöltésével. A Mealie megpróbálja a kép szövegét mesterséges intelligencia segítségével kinyerni, és létrehozni belőle a receptet.",
|
||||
"crop-and-rotate-the-image": "Vágja ki és forgassa el a képet úgy, hogy csak a szöveg legyen látható, és megfelelő tájolásban legyen.",
|
||||
"create-from-image": "Létrehozás képről",
|
||||
"create-from-images": "Létrehozás képekről",
|
||||
"should-translate-description": "Fordítsa le a receptet a saját nyelvemre",
|
||||
"please-wait-image-procesing": "Kérjük várjon, a kép feldolgozása folyamatban van. Ez eltarthat egy ideig.",
|
||||
"please-wait-images-processing": "Kérjük várjon, a képek feldolgozása folyamatban van. Ez eltarthat egy ideig.",
|
||||
"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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "Élelmiszer nélküli"
|
||||
},
|
||||
"reset-servings-count": "Adagok számának visszaállítása",
|
||||
"not-linked-ingredients": "Kiegészítő hozzávalók"
|
||||
"not-linked-ingredients": "Kiegészítő hozzávalók",
|
||||
"upload-another-image": "Másik kép feltöltése",
|
||||
"upload-images": "Képek feltöltése",
|
||||
"upload-more-images": "További képek feltöltése"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Receptkereső",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"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",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"please-wait-images-processing": "Please wait, the images are 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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "No Food"
|
||||
},
|
||||
"reset-servings-count": "Reset Servings Count",
|
||||
"not-linked-ingredients": "Additional Ingredients"
|
||||
"not-linked-ingredients": "Additional Ingredients",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recipe Finder",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"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",
|
||||
"create-from-images": "Create from Images",
|
||||
"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.",
|
||||
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
|
||||
"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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "Nessun Alimento"
|
||||
},
|
||||
"reset-servings-count": "Reimposta conteggio porzioni",
|
||||
"not-linked-ingredients": "Ingredienti Aggiuntivi"
|
||||
"not-linked-ingredients": "Ingredienti Aggiuntivi",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Trova ricette",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"create-recipe-from-an-image": "画像からレシピを作成",
|
||||
"create-recipe-from-an-image-description": "画像をアップロードしてレシピを作成します。 Mealieは、AIを使用して画像からテキストを抽出し、そこからレシピを作成しようとします。",
|
||||
"crop-and-rotate-the-image": "テキストのみが表示され、正しい方向になるように画像をトリミングして回転します。",
|
||||
"create-from-image": "画像から作成",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "レシピを自分の言語に翻訳",
|
||||
"please-wait-image-procesing": "しばらくお待ちください。画像は処理中です。時間がかかる場合があります。",
|
||||
"please-wait-images-processing": "Please wait, the images are 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": "名前を指定してレシピを作成します。すべてのレシピには固有の名前が必要です。",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "食材はありません"
|
||||
},
|
||||
"reset-servings-count": "サービング数をリセット",
|
||||
"not-linked-ingredients": "追加の材料"
|
||||
"not-linked-ingredients": "追加の材料",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "レシピ検索",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"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",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"please-wait-images-processing": "Please wait, the images are 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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "No Food"
|
||||
},
|
||||
"reset-servings-count": "Reset Servings Count",
|
||||
"not-linked-ingredients": "Additional Ingredients"
|
||||
"not-linked-ingredients": "Additional Ingredients",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recipe Finder",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"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",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "Translate the recipe into my language",
|
||||
"please-wait-image-procesing": "Please wait, the image is processing. This may take some time.",
|
||||
"please-wait-images-processing": "Please wait, the images are 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.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "No Food"
|
||||
},
|
||||
"reset-servings-count": "Reset Servings Count",
|
||||
"not-linked-ingredients": "Additional Ingredients"
|
||||
"not-linked-ingredients": "Additional Ingredients",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recipe Finder",
|
||||
|
||||
@@ -599,9 +599,10 @@
|
||||
"create-recipe-from-an-image": "Izveidojiet recepti no attēla",
|
||||
"create-recipe-from-an-image-description": "Izveidojiet recepti, augšupielādējot tās attēlu. Mealie mēģinās iegūt tekstu no attēla, izmantojot AI, un no tā izveidot recepti.",
|
||||
"crop-and-rotate-the-image": "Apgrieziet un pagrieziet attēlu tā, lai būtu redzams tikai teksts un tas būtu pareizajā orientācijā.",
|
||||
"create-from-image": "Izveidot no attēla",
|
||||
"create-from-images": "Create from Images",
|
||||
"should-translate-description": "Tulkojiet recepti manā valodā",
|
||||
"please-wait-image-procesing": "Lūdzu, pagaidiet, attēls tiek apstrādāts. Tas var aizņemt kādu laiku.",
|
||||
"please-wait-images-processing": "Please wait, the images are processing. This may take some time.",
|
||||
"bulk-url-import": "Lielapjoma URL importēšana",
|
||||
"debug-scraper": "Atkļūdošanas skrāpis",
|
||||
"create-a-recipe-by-providing-the-name-all-recipes-must-have-unique-names": "Izveidojiet recepti, norādot nosaukumu. Visām receptēm jābūt unikāliem nosaukumiem.",
|
||||
@@ -660,7 +661,10 @@
|
||||
"no-food": "Nav pārtikas"
|
||||
},
|
||||
"reset-servings-count": "Atiestatīt porciju skaitu",
|
||||
"not-linked-ingredients": "Additional Ingredients"
|
||||
"not-linked-ingredients": "Additional Ingredients",
|
||||
"upload-another-image": "Upload another image",
|
||||
"upload-images": "Upload images",
|
||||
"upload-more-images": "Upload more images"
|
||||
},
|
||||
"recipe-finder": {
|
||||
"recipe-finder": "Recipe Finder",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user