mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-02-06 12:41:50 -05:00
Compare commits
37 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b7b191a5ee | ||
|
|
5620370ade | ||
|
|
d333d47e34 | ||
|
|
b34b1c9be3 | ||
|
|
8c5010148d | ||
|
|
a17b0e329e | ||
|
|
8ab69a7d7a | ||
|
|
f4ecf74b91 | ||
|
|
ba9d816f64 | ||
|
|
6895b49543 | ||
|
|
fffe7b05e0 | ||
|
|
1271e0e49b | ||
|
|
478054b724 | ||
|
|
57d259a7a3 | ||
|
|
a4a6d4dfb1 | ||
|
|
f7b4f79312 | ||
|
|
434d312f7c | ||
|
|
bda460b49e | ||
|
|
d3e1c48655 | ||
|
|
b2a3430f2c | ||
|
|
3d792d9333 | ||
|
|
2e028d7e12 | ||
|
|
c63932e8b3 | ||
|
|
3ba2227bc7 | ||
|
|
67af391c6b | ||
|
|
70ae0dac25 | ||
|
|
e15a9c3c9f | ||
|
|
9d40d60b3b | ||
|
|
e2760f7247 | ||
|
|
83bf21b947 | ||
|
|
d1824affff | ||
|
|
4827e1092f | ||
|
|
7db767b075 | ||
|
|
afdd0b15dc | ||
|
|
37c9166a77 | ||
|
|
ba0b9d4cd9 | ||
|
|
9fd99a86b8 |
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
@@ -77,7 +77,7 @@ jobs:
|
||||
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:v${{ env.VERSION_NUM }}/' docs/docs/documentation/getting-started/installation/sqlite.md
|
||||
sed -i 's/:v[0-9]*.[0-9]*.[0-9]*/:v${{ env.VERSION_NUM }}/' docs/docs/documentation/getting-started/installation/postgres.md
|
||||
sed -i 's/^version = "[^"]*"/version = "${{ env.VERSION_NUM }}"/' pyproject.toml
|
||||
sed -i 's/^\s*"version": "[^"]*"/"version": "${{ env.VERSION_NUM }}"/' frontend/package.json
|
||||
sed -i 's/\("version": "\)[^"]*"/\1${{ env.VERSION_NUM }}"/' frontend/package.json
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
|
||||
@@ -12,7 +12,7 @@ repos:
|
||||
exclude: ^tests/data/
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
# Ruff version.
|
||||
rev: v0.13.1
|
||||
rev: v0.13.3
|
||||
hooks:
|
||||
- id: ruff
|
||||
- id: ruff-format
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
###############################################
|
||||
# Frontend Build
|
||||
###############################################
|
||||
FROM node:22@sha256:4973262386dc1cb70f7d6fc48a855027d8f12d2d3b1fe559b9db9a4fcb74668f \
|
||||
FROM node:22@sha256:2bb201f33898d2c0ce638505b426f4dd038cc00e5b2b4cbba17b069f0fff1496 \
|
||||
AS frontend-builder
|
||||
|
||||
WORKDIR /frontend
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
| DEFAULT_GROUP | Home | The default group for users |
|
||||
| DEFAULT_HOUSEHOLD | Family | The default household for users in each group |
|
||||
| BASE_URL | http://localhost:8080 | Used for Notifications |
|
||||
| TOKEN_TIME | 48 | The time in hours that a login/auth token is valid |
|
||||
| TOKEN_TIME | 48 | The time in hours that a login/auth token is valid. Must be <= 87600 (10 years, in hours). |
|
||||
| API_PORT | 9000 | The port exposed by backend API. **Do not change this if you're running in Docker** |
|
||||
| API_DOCS | True | Turns on/off access to the API documentation locally |
|
||||
| TZ | UTC | Must be set to get correct date/time on the server |
|
||||
|
||||
@@ -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:v3.2.1`
|
||||
2. Replace the image for the API container with `ghcr.io/mealie-recipes/mealie:v3.3.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
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ PostgreSQL might be considered if you need to support many concurrent users. In
|
||||
```yaml
|
||||
services:
|
||||
mealie:
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.2.1 # (3)
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.3.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:v3.2.1 # (3)
|
||||
image: ghcr.io/mealie-recipes/mealie:v3.3.1 # (3)
|
||||
container_name: mealie
|
||||
restart: always
|
||||
ports:
|
||||
|
||||
@@ -127,7 +127,7 @@ function addIngredient(ingredients: Array<string> | null = null) {
|
||||
note: x,
|
||||
unit: undefined,
|
||||
food: undefined,
|
||||
quantity: 1,
|
||||
quantity: 0,
|
||||
};
|
||||
});
|
||||
|
||||
@@ -145,7 +145,7 @@ function addIngredient(ingredients: Array<string> | null = null) {
|
||||
unit: undefined,
|
||||
// @ts-expect-error - prop can be null-type by NoUndefinedField type forces it to be set
|
||||
food: undefined,
|
||||
quantity: 1,
|
||||
quantity: 0,
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -159,7 +159,7 @@ function insertNewIngredient(dest: number) {
|
||||
unit: undefined,
|
||||
// @ts-expect-error - prop can be null-type by NoUndefinedField type forces it to be set
|
||||
food: undefined,
|
||||
quantity: 1,
|
||||
quantity: 0,
|
||||
});
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -523,7 +523,7 @@ function insertNewIngredient(index: number) {
|
||||
input: "",
|
||||
confidence: {},
|
||||
ingredient: {
|
||||
quantity: 1.0,
|
||||
quantity: 0,
|
||||
referenceId: uuid4(),
|
||||
},
|
||||
} as ParsedIngredient;
|
||||
|
||||
@@ -128,7 +128,7 @@ export default defineNuxtComponent({
|
||||
|
||||
async function logout() {
|
||||
try {
|
||||
await $auth.signOut({ callbackUrl: "/login?direct=1" });
|
||||
await $auth.signOut("/login?direct=1");
|
||||
}
|
||||
catch (e) {
|
||||
console.error(e);
|
||||
|
||||
@@ -21,7 +21,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Українська (Ukrainian)",
|
||||
value: "uk-UA",
|
||||
progress: 44,
|
||||
progress: 55,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -33,7 +33,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Svenska (Swedish)",
|
||||
value: "sv-SE",
|
||||
progress: 52,
|
||||
progress: 53,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -57,7 +57,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Pусский (Russian)",
|
||||
value: "ru-RU",
|
||||
progress: 40,
|
||||
progress: 41,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -75,7 +75,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Português do Brasil (Brazilian Portuguese)",
|
||||
value: "pt-BR",
|
||||
progress: 45,
|
||||
progress: 46,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -87,13 +87,13 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Norsk (Norwegian)",
|
||||
value: "no-NO",
|
||||
progress: 39,
|
||||
progress: 40,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Nederlands (Dutch)",
|
||||
value: "nl-NL",
|
||||
progress: 49,
|
||||
progress: 52,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -123,13 +123,13 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Italiano (Italian)",
|
||||
value: "it-IT",
|
||||
progress: 41,
|
||||
progress: 43,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Íslenska (Icelandic)",
|
||||
value: "is-IS",
|
||||
progress: 3,
|
||||
progress: 10,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -159,7 +159,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Français (French)",
|
||||
value: "fr-FR",
|
||||
progress: 66,
|
||||
progress: 67,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -189,7 +189,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Español (Spanish)",
|
||||
value: "es-ES",
|
||||
progress: 42,
|
||||
progress: 45,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -207,19 +207,19 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Ελληνικά (Greek)",
|
||||
value: "el-GR",
|
||||
progress: 40,
|
||||
progress: 41,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Deutsch (German)",
|
||||
value: "de-DE",
|
||||
progress: 78,
|
||||
progress: 80,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
name: "Dansk (Danish)",
|
||||
value: "da-DK",
|
||||
progress: 40,
|
||||
progress: 43,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
@@ -231,7 +231,7 @@ export const LOCALES = [
|
||||
{
|
||||
name: "Català (Catalan)",
|
||||
value: "ca-ES",
|
||||
progress: 38,
|
||||
progress: 37,
|
||||
dir: "ltr",
|
||||
},
|
||||
{
|
||||
|
||||
151
frontend/composables/useAuthBackend.ts
Normal file
151
frontend/composables/useAuthBackend.ts
Normal file
@@ -0,0 +1,151 @@
|
||||
import { ref, computed } from "vue";
|
||||
import type { UserOut } from "~/lib/api/types/user";
|
||||
|
||||
interface AuthData {
|
||||
value: UserOut | null;
|
||||
}
|
||||
|
||||
interface AuthStatus {
|
||||
value: "loading" | "authenticated" | "unauthenticated";
|
||||
}
|
||||
|
||||
interface AuthState {
|
||||
data: AuthData;
|
||||
status: AuthStatus;
|
||||
signIn: (credentials: FormData, options?: { redirect?: boolean }) => Promise<void>;
|
||||
signOut: (callbackUrl?: string) => Promise<void>;
|
||||
refresh: () => Promise<void>;
|
||||
getSession: () => Promise<void>;
|
||||
setToken: (token: string | null) => void;
|
||||
}
|
||||
|
||||
const authUser = ref<UserOut | null>(null);
|
||||
const authStatus = ref<"loading" | "authenticated" | "unauthenticated">("loading");
|
||||
|
||||
export const useAuthBackend = function (): AuthState {
|
||||
const { $axios } = useNuxtApp();
|
||||
const router = useRouter();
|
||||
const tokenName = useRuntimeConfig().public.AUTH_TOKEN;
|
||||
const tokenCookie = useCookie(tokenName);
|
||||
|
||||
function setToken(token: string | null) {
|
||||
tokenCookie.value = token;
|
||||
}
|
||||
|
||||
function handleAuthError(error: any, redirect = false) {
|
||||
// Only clear token on auth errors, not network errors
|
||||
if (error?.response?.status === 401) {
|
||||
setToken(null);
|
||||
authUser.value = null;
|
||||
authStatus.value = "unauthenticated";
|
||||
if (redirect) {
|
||||
router.push("/login");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function getSession(): Promise<void> {
|
||||
if (!tokenCookie.value) {
|
||||
authUser.value = null;
|
||||
authStatus.value = "unauthenticated";
|
||||
return;
|
||||
}
|
||||
|
||||
authStatus.value = "loading";
|
||||
try {
|
||||
const { data } = await $axios.get<UserOut>("/api/users/self");
|
||||
authUser.value = data;
|
||||
authStatus.value = "authenticated";
|
||||
}
|
||||
catch (error: any) {
|
||||
console.error("Failed to fetch user session:", error);
|
||||
handleAuthError(error);
|
||||
authStatus.value = "unauthenticated";
|
||||
}
|
||||
}
|
||||
|
||||
async function signIn(credentials: FormData): Promise<void> {
|
||||
authStatus.value = "loading";
|
||||
|
||||
try {
|
||||
const response = await $axios.post("/api/auth/token", credentials, {
|
||||
headers: {
|
||||
"Content-Type": "multipart/form-data",
|
||||
},
|
||||
});
|
||||
|
||||
const { access_token } = response.data;
|
||||
setToken(access_token);
|
||||
await getSession();
|
||||
}
|
||||
catch (error) {
|
||||
authStatus.value = "unauthenticated";
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
async function signOut(callbackUrl: string = ""): Promise<void> {
|
||||
try {
|
||||
await $axios.post("/api/auth/logout");
|
||||
}
|
||||
catch (error) {
|
||||
// Continue with logout even if API call fails
|
||||
console.warn("Logout API call failed:", error);
|
||||
}
|
||||
finally {
|
||||
setToken(null);
|
||||
authUser.value = null;
|
||||
authStatus.value = "unauthenticated";
|
||||
await router.push(callbackUrl || "/login");
|
||||
}
|
||||
}
|
||||
|
||||
async function refresh(): Promise<void> {
|
||||
if (!tokenCookie.value) return;
|
||||
|
||||
try {
|
||||
const response = await $axios.get("/api/auth/refresh");
|
||||
const { access_token } = response.data;
|
||||
setToken(access_token);
|
||||
await getSession();
|
||||
}
|
||||
catch (error: any) {
|
||||
handleAuthError(error, true);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
// Auto-refresh user data periodically when authenticated
|
||||
if (import.meta.client) {
|
||||
let refreshInterval: NodeJS.Timeout | null = null;
|
||||
|
||||
watch(() => authStatus.value, (status) => {
|
||||
if (status === "authenticated") {
|
||||
refreshInterval = setInterval(() => {
|
||||
if (tokenCookie.value) {
|
||||
getSession().catch(() => {
|
||||
// Ignore errors in background refresh
|
||||
});
|
||||
}
|
||||
}, 5 * 60 * 1000); // 5 minutes
|
||||
}
|
||||
else {
|
||||
// Clear interval when not authenticated
|
||||
if (refreshInterval) {
|
||||
clearInterval(refreshInterval);
|
||||
refreshInterval = null;
|
||||
}
|
||||
}
|
||||
}, { immediate: true });
|
||||
}
|
||||
|
||||
return {
|
||||
data: computed(() => authUser.value),
|
||||
status: computed(() => authStatus.value),
|
||||
signIn,
|
||||
signOut,
|
||||
refresh,
|
||||
getSession,
|
||||
setToken,
|
||||
};
|
||||
};
|
||||
@@ -1,9 +1,9 @@
|
||||
import { ref, watch, computed } from "vue";
|
||||
import { useAuthBackend } from "~/composables/useAuthBackend";
|
||||
import type { UserOut } from "~/lib/api/types/user";
|
||||
|
||||
export const useMealieAuth = function () {
|
||||
const auth = useAuth();
|
||||
const { setToken } = useAuthState();
|
||||
const auth = useAuthBackend();
|
||||
const { $axios } = useNuxtApp();
|
||||
|
||||
// User Management
|
||||
@@ -40,7 +40,7 @@ export const useMealieAuth = function () {
|
||||
async function oauthSignIn() {
|
||||
const params = new URLSearchParams(window.location.search);
|
||||
const { data: token } = await $axios.get<{ access_token: string; token_type: "bearer" }>("/api/auth/oauth/callback", { params });
|
||||
setToken(token.access_token);
|
||||
auth.setToken(token.access_token);
|
||||
await auth.getSession();
|
||||
}
|
||||
|
||||
@@ -49,7 +49,6 @@ export const useMealieAuth = function () {
|
||||
loggedIn,
|
||||
signIn: auth.signIn,
|
||||
signOut: auth.signOut,
|
||||
signUp: auth.signUp,
|
||||
refresh: auth.refresh,
|
||||
oauthSignIn,
|
||||
};
|
||||
|
||||
@@ -676,7 +676,7 @@
|
||||
"ingredient-parser-description": "Deine Zutaten wurden erfolgreich geparst. Bitte überprüfe die Zutaten, bei denen wir uns nicht sicher sind.",
|
||||
"ingredient-parser-final-review-description": "Sobald alle Zutaten überprüft wurden, kannst du nochmal alle Zutaten kontrollieren, bevor die Änderungen ins Rezept übernommen werden.",
|
||||
"add-text-as-alias-for-item": "Füge \"{text}\" als Alias für {item} hinzu",
|
||||
"delete-item": "Delete Item"
|
||||
"delete-item": "Element löschen"
|
||||
},
|
||||
"reset-servings-count": "Portionen zurücksetzen",
|
||||
"not-linked-ingredients": "Zusätzliche Zutaten",
|
||||
|
||||
@@ -676,7 +676,7 @@
|
||||
"ingredient-parser-description": "Τα συστατικά σας έχουν αναλυθεί επιτυχώς. Παρακαλούμε ελέγξτε τα συστατικά για τα οποία δεν είμαστε σίγουροι.",
|
||||
"ingredient-parser-final-review-description": "Μόλις εξεταστούν όλα τα συστατικά, θα έχετε μία ακόμη ευκαιρία να επανεξετάσετε όλα τα συστατικά πριν εφαρμόσετε τις αλλαγές στη συνταγή σας.",
|
||||
"add-text-as-alias-for-item": "Προσθήκη \"{text}\" ως ψευδώνυμο για το {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"delete-item": "Διαγραφή αντικειμένου"
|
||||
},
|
||||
"reset-servings-count": "Επαναφορά μέτρησης μερίδων",
|
||||
"not-linked-ingredients": "Πρόσθετα συστατικά",
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
"github": "GitHub",
|
||||
"log-lines": "Líneas de registro",
|
||||
"not-demo": "No Demo",
|
||||
"portfolio": "Portfolio",
|
||||
"portfolio": "Portafolio",
|
||||
"production": "Producción",
|
||||
"support": "Soporte",
|
||||
"version": "Versión",
|
||||
@@ -561,7 +561,7 @@
|
||||
"see-original-text": "Mostrar Texto Original",
|
||||
"original-text-with-value": "Texto original: {originalText}",
|
||||
"ingredient-linker": "Vincular ingredientes",
|
||||
"unlinked": "Not linked yet",
|
||||
"unlinked": "Aún no vinculado",
|
||||
"linked-to-other-step": "Enlazado a otro paso",
|
||||
"auto": "Auto",
|
||||
"cook-mode": "Modo Cocinar",
|
||||
@@ -624,7 +624,7 @@
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "Puede importar directamente desde datos brutos",
|
||||
"import-original-keywords-as-tags": "Importar palabras clave originales como etiquetas",
|
||||
"stay-in-edit-mode": "Permanecer en modo edición",
|
||||
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
|
||||
"parse-recipe-ingredients-after-import": "Analizar los ingredientes de la receta después de importarla",
|
||||
"import-from-zip": "Importar desde zip",
|
||||
"import-from-zip-description": "Importa una receta única que fue exportada desde otra instancia de Mealie.",
|
||||
"import-from-html-or-json": "Importar desde HTML o JSON",
|
||||
@@ -671,12 +671,12 @@
|
||||
"this-unit-could-not-be-parsed-automatically": "Esta unidad no pudo ser procesada automáticamente",
|
||||
"this-food-could-not-be-parsed-automatically": "Esta comida no pudo ser procesada automáticamente",
|
||||
"no-food": "Sin Comida",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"review-parsed-ingredients": "Revisar los ingredientes analizados",
|
||||
"confidence-score": "Puntuación de confianza",
|
||||
"ingredient-parser-description": "Tus ingredientes se han analizado correctamente. Revisa los ingredientes que no nos convencen.",
|
||||
"ingredient-parser-final-review-description": "Una vez que se hayan revisado todos los ingredientes, tendrás una oportunidad más de revisarlos todos antes de aplicar los cambios a tu receta.",
|
||||
"add-text-as-alias-for-item": "Añadir \"{text}\" como alias para {item}",
|
||||
"delete-item": "Borrar elemento"
|
||||
},
|
||||
"reset-servings-count": "Restablecer contador de porciones",
|
||||
"not-linked-ingredients": "Ingredientes adicionales",
|
||||
|
||||
@@ -676,7 +676,7 @@
|
||||
"ingredient-parser-description": "Sikeresen feldolgoztuk a hozzávalókat. Kérljük, nézze át azokat, amelyekben nem vagyunk teljesen biztosak.",
|
||||
"ingredient-parser-final-review-description": "Miután az összes hozzávalót átnézte, még egyszer átnézheti az összes hozzávalót, mielőtt a változtatásokat átvezeti a receptbe.",
|
||||
"add-text-as-alias-for-item": "Adja hozzá a „{text}” nevet {item} aliasaként",
|
||||
"delete-item": "Delete Item"
|
||||
"delete-item": "Elem törlése"
|
||||
},
|
||||
"reset-servings-count": "Adagok számának visszaállítása",
|
||||
"not-linked-ingredients": "Kiegészítő hozzávalók",
|
||||
@@ -1273,7 +1273,7 @@
|
||||
"action-clean-temporary-files-description": "Minden fájl és mappa eltávolítása a .temp könyvtárból",
|
||||
"action-clean-images-name": "Képek tisztítása",
|
||||
"action-clean-images-description": "Minden nem .webp kiterjesztésű kép eltávolítása",
|
||||
"actions-description": "A karbantartási műveletek {destructive_in_bold} és óvatosan használandók. Ezen műveletek bármelyikének végrehajtása {irreversible_in_bold}.",
|
||||
"actions-description": "A karbantartási műveletek {destructive_in_bold} jellegűek, ezért óvatosan kell alkalmazni őket. Ezen műveletek végrehajtása {irreversible_in_bold}.",
|
||||
"actions-description-destructive": "romboló",
|
||||
"actions-description-irreversible": "visszafordíthatatlan",
|
||||
"logs-action-refresh": "Logok frissítése",
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
"demo": "Kynning",
|
||||
"demo-status": "Kynningarstaða",
|
||||
"development": "Þróun",
|
||||
"docs": "Skjöl",
|
||||
"docs": "Upplýsingar",
|
||||
"download-log": "Sækja atvikaskrá",
|
||||
"download-recipe-json": "Síðast sótt JSON",
|
||||
"github": "GitHub",
|
||||
@@ -73,7 +73,7 @@
|
||||
"enable-notifier": "Virkja tilkynningar",
|
||||
"what-events": "Hvaða viðburði ætti þessi tilkynnir að vera áskrifandi að?",
|
||||
"user-events": "Notenda viðburðir",
|
||||
"mealplan-events": "Mataráætlunar viðburðir",
|
||||
"mealplan-events": "Matarplan viðburðir",
|
||||
"when-a-user-in-your-group-creates-a-new-mealplan": "Þegar notandi í þínum hópi býr til nýtt matarplan",
|
||||
"shopping-list-events": "Innkaupslista viðburðir",
|
||||
"cookbook-events": "Matreiðslubóks viðburðir",
|
||||
@@ -99,7 +99,7 @@
|
||||
"delete": "Eyða",
|
||||
"disabled": "Afvirkjað",
|
||||
"download": "Sækja",
|
||||
"duplicate": "Tvöfalda",
|
||||
"duplicate": "Afrita",
|
||||
"edit": "Breyta",
|
||||
"enabled": "Leyft",
|
||||
"exception": "Undantekningar",
|
||||
@@ -161,14 +161,14 @@
|
||||
"sunday": "Sunnudagur",
|
||||
"system": "Kerfi",
|
||||
"templates": "Sniðmót:",
|
||||
"test": "Próf",
|
||||
"test": "Prufa",
|
||||
"themes": "Þema",
|
||||
"thursday": "Fimmtudagur",
|
||||
"title": "Titill",
|
||||
"token": "Tóki",
|
||||
"tuesday": "Þriðjudagur",
|
||||
"type": "Tegund",
|
||||
"update": "Uppfærsla",
|
||||
"update": "Uppfæra",
|
||||
"updated": "Uppfært",
|
||||
"upload": "Hlaða upp",
|
||||
"url": "URL",
|
||||
@@ -192,7 +192,7 @@
|
||||
"a-name-is-required": "Nafn er krafist",
|
||||
"delete-with-name": "Eyða út {name}",
|
||||
"confirm-delete-generic-with-name": "Ertu viss um að þú viljir eyða út {name}?",
|
||||
"confirm-delete-own-admin-account": "Please note that you are trying to delete your own admin account! This action cannot be undone and will permanently delete your account?",
|
||||
"confirm-delete-own-admin-account": "Athugið! Þú ert að reyna að eyða eigin admin aðgangi! Þessa aðgerð er ekki hægt að draga til baka og aðganginum verður varanalega eytt.",
|
||||
"organizer": "Skipuleggjari",
|
||||
"transfer": "Færa",
|
||||
"copy": "Afrita",
|
||||
@@ -200,53 +200,53 @@
|
||||
"timestamp": "Tímastimpill",
|
||||
"last-made": "Síðast gert",
|
||||
"learn-more": "Læra meira",
|
||||
"this-feature-is-currently-inactive": "This feature is currently inactive",
|
||||
"clipboard-not-supported": "Clipboard not supported",
|
||||
"copied-to-clipboard": "Copied to clipboard",
|
||||
"your-browser-does-not-support-clipboard": "Your browser does not support clipboard",
|
||||
"copied-items-to-clipboard": "No item copied to clipboard|One item copied to clipboard|Copied {count} items to clipboard",
|
||||
"this-feature-is-currently-inactive": "Þessi eiginleiki er nú óvirkur",
|
||||
"clipboard-not-supported": "Klippispjald er ekki stutt",
|
||||
"copied-to-clipboard": "Afritað á klippispjald",
|
||||
"your-browser-does-not-support-clipboard": "Vafrinn þinn styður ekki klippispjald",
|
||||
"copied-items-to-clipboard": "Ekkert afritað á klippispjaldið|Eitt atriði afritað á klippisjaldið|{count} atriði afrituð á klippispjaldið",
|
||||
"actions": "Aðgerðir",
|
||||
"selected-count": "Valið: {count}",
|
||||
"export-all": "Export All",
|
||||
"export-all": "Flytja allt út",
|
||||
"refresh": "Endurhlaða",
|
||||
"upload-file": "Hlaða upp skrá",
|
||||
"created-on-date": "Búið til: {0}",
|
||||
"unsaved-changes": "You have unsaved changes. Do you want to save before leaving? Okay to save, Cancel to discard changes.",
|
||||
"clipboard-copy-failure": "Failed to copy to the clipboard.",
|
||||
"confirm-delete-generic-items": "Are you sure you want to delete the following items?",
|
||||
"unsaved-changes": "Þú hefur ekki vistað breytingar. Viltu vista áður en þú ferð? Ýttu á \"Í lagi\" til að vista, \"Hætta við\" til að henda breytingum.",
|
||||
"clipboard-copy-failure": "Mistókst að afrita klippispjaldið.",
|
||||
"confirm-delete-generic-items": "Ertu viss um að þú viljir eyða eftirfylgjandi atriðum?",
|
||||
"organizers": "Skipuleggjarar",
|
||||
"caution": "Varúð",
|
||||
"show-advanced": "Show Advanced",
|
||||
"show-advanced": "Ítarlegar stillingar",
|
||||
"add-field": "Bæta við dálk",
|
||||
"date-created": "Date Created",
|
||||
"date-created": "Búið til",
|
||||
"date-updated": "Dagsetning uppfærð"
|
||||
},
|
||||
"group": {
|
||||
"are-you-sure-you-want-to-delete-the-group": "Ertu viss um að þú viljir eyða <b>{groupName}<b/>?",
|
||||
"cannot-delete-default-group": "Ekki hægt að eyða sjálfvöldum hóp",
|
||||
"cannot-delete-group-with-users": "Cannot delete group with users",
|
||||
"confirm-group-deletion": "Confirm Group Deletion",
|
||||
"cannot-delete-group-with-users": "Get ekki eytt hóp sem inniheldur notendur",
|
||||
"confirm-group-deletion": "Staðfestu að eyða hópnum",
|
||||
"create-group": "Búa til hóp",
|
||||
"error-updating-group": "Villa í að uppfæra hóp",
|
||||
"group": "Hópur",
|
||||
"group-deleted": "Hóp eytt",
|
||||
"group-deletion-failed": "Villa í að eyða hóp",
|
||||
"group-id-with-value": "Group ID: {groupID}",
|
||||
"group-id-with-value": "Hóp ID: {groupID}",
|
||||
"group-name": "Nafn hóps",
|
||||
"group-not-found": "Fann ekki hóp",
|
||||
"group-token": "Group Token",
|
||||
"group-with-value": "Group: {groupID}",
|
||||
"group-token": "Hóp token",
|
||||
"group-with-value": "Hópur: {groupID}",
|
||||
"groups": "Hópar",
|
||||
"manage-groups": "Umsjá hópa",
|
||||
"user-group": "Notendahópur",
|
||||
"user-group-created": "Notendahópur búinn til",
|
||||
"user-group-creation-failed": "User Group Creation Failed",
|
||||
"user-group-creation-failed": "Mistókst að stofna notenda hóp",
|
||||
"settings": {
|
||||
"keep-my-recipes-private": "Keep My Recipes Private",
|
||||
"keep-my-recipes-private-description": "Sets your group and all recipes defaults to private. You can always change this later."
|
||||
"keep-my-recipes-private": "Ekki deila mínum uppskriftum",
|
||||
"keep-my-recipes-private-description": "Hafa sjálfgefið að hópar og uppskriftir sé ekki deilt. Það er hægt að breyta þessu síðar."
|
||||
},
|
||||
"manage-members": "Umsjá meðlima",
|
||||
"manage-members-description": "Manage the permissions of the members in your household. {manage} allows the user to access the data-management page, and {invite} allows the user to generate invitation links for other users. Group owners cannot change their own permissions.",
|
||||
"manage-members-description": "Stjórnaðu aðgangsheimildum annarra í heimilinu. {manage} opnar gagnastjórnunarsíðu og {invite} býr til boðtengla fyrir aðra. Stjórnendur hópa geta ekki breytt eigin heimildum.",
|
||||
"manage": "Umsjá",
|
||||
"manage-household": "Umsjá heimilis",
|
||||
"invite": "Bjóða",
|
||||
@@ -257,109 +257,109 @@
|
||||
"private-group": "Lokaður hópur",
|
||||
"private-group-description": "Ef þú stillir hópinn þinn sem lokaðan hóp lokast á alla almennan aðgang. Þessi stilling hefur forgang fram yfir einstakar stillingar fyrir almenna sýn",
|
||||
"enable-public-access": "Virkja almennan aðgang",
|
||||
"enable-public-access-description": "Make group recipes public by default, and allow visitors to view recipes without logging-in",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Allow users outside of your group to see your recipes",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "When enabled you can use a public share link to share specific recipes without authorizing the user. When disabled, you can only share recipes with users who are in your group or with a pre-generated private link",
|
||||
"enable-public-access-description": "Gera uppskriftir innan hópa aðgengar öllum og leyfa gestum að skoða þær án þess að skrá sig inn",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes": "Leyfa notendum utan þíns hóps að sjá þínar uppskriftir",
|
||||
"allow-users-outside-of-your-group-to-see-your-recipes-description": "Sé þetta virkt getur þú deilt uppskriftum með tengli án þess notandi þurfi að stofna aðgang. Sé þetta óvirkt, er bara hægt að deila uppskriftum innan þíns hóps eða með tilbúnum tengli",
|
||||
"show-nutrition-information": "Sýna næringargildi innihalds",
|
||||
"show-nutrition-information-description": "When enabled the nutrition information will be shown on the recipe if available. If there is no nutrition information available, the nutrition information will not be shown",
|
||||
"show-nutrition-information-description": "Sé þetta virkt eru næringargildi sýnileg. Ef það er engar upplýsingar um næringargildi þá koma þau ekki fram",
|
||||
"show-recipe-assets": "Sýna skrár og efni uppskriftar",
|
||||
"show-recipe-assets-description": "When enabled the recipe assets will be shown on the recipe if available",
|
||||
"default-to-landscape-view": "Default to landscape view",
|
||||
"default-to-landscape-view-description": "When enabled the recipe header section will be shown in landscape view",
|
||||
"disable-users-from-commenting-on-recipes": "Disable users from commenting on recipes",
|
||||
"disable-users-from-commenting-on-recipes-description": "Hides the comment section on the recipe page and disables commenting",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food": "Disable organizing recipe ingredients by units and food",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Hides the Food, Unit, and Amount fields for ingredients and treats ingredients as plain text fields",
|
||||
"show-recipe-assets-description": "Ef virkt munu þær skrár sem hafa verið settar inn með uppskriftinni vera sýnilegar með uppskriftinni",
|
||||
"default-to-landscape-view": "Gera lárétt snið sjálfgefið",
|
||||
"default-to-landscape-view-description": "Ef virkt verður hausinn á uppskriftinni sýndur í láréttu sniði",
|
||||
"disable-users-from-commenting-on-recipes": "Slökkva á að notendur geti skrifað athugasemdir við uppskriftir",
|
||||
"disable-users-from-commenting-on-recipes-description": "Felur möguleikann á að skrifa og sjá athugasemdir við uppskriftir",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food": "Óvirkja röðun innihaldi uppskrifta eftir einingum og matvælum",
|
||||
"disable-organizing-recipe-ingredients-by-units-and-food-description": "Felur matvörur, einingar og magn fyrir innihaldsefni og meðhöndlar innihald sem venjulegan texta reit",
|
||||
"general-preferences": "Almenni valmöguleikar",
|
||||
"group-recipe-preferences": "Group Recipe Preferences",
|
||||
"group-recipe-preferences": "Stillingar fyrir hóp uppskriftir",
|
||||
"report": "Skýrsla",
|
||||
"report-with-id": "Report ID: {id}",
|
||||
"group-management": "Group Management",
|
||||
"admin-group-management": "Admin Group Management",
|
||||
"admin-group-management-text": "Changes to this group will be reflected immediately.",
|
||||
"group-id-value": "Group Id: {0}",
|
||||
"total-households": "Total Households",
|
||||
"you-must-select-a-group-before-selecting-a-household": "You must select a group before selecting a household"
|
||||
"report-with-id": "Skýrslu ID: {id}",
|
||||
"group-management": "Hópastjórnun",
|
||||
"admin-group-management": "Hópastjórnun",
|
||||
"admin-group-management-text": "Breytingar á þessum hóp koma strax fram.",
|
||||
"group-id-value": "Hóp ID: {0}",
|
||||
"total-households": "Fjöldi heimila",
|
||||
"you-must-select-a-group-before-selecting-a-household": "Þú verður að velja hóp áður en þú velur heimili"
|
||||
},
|
||||
"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.",
|
||||
"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"
|
||||
"household": "Heimili",
|
||||
"households": "Heimili",
|
||||
"user-household": "Heimilishópur notanda",
|
||||
"create-household": "Stofna heimili",
|
||||
"household-name": "Heiti heimilis",
|
||||
"household-group": "Hópur heimilis",
|
||||
"household-management": "Umsjá heimilis",
|
||||
"manage-households": "Umsjá heimilis",
|
||||
"admin-household-management": "Umsjá heimilis",
|
||||
"admin-household-management-text": "Breytingar á þessu heimili koma strax fram.",
|
||||
"household-id-value": "Heimilis ID: {0}",
|
||||
"private-household": "Einka heimili",
|
||||
"private-household-description": "Ef þú stillir hópinn þinn sem lokaðan hóp lokast á alla almennan aðgang. Þessi stilling hefur forgang fram yfir einstakar stillingar fyrir almenna sýn",
|
||||
"lock-recipe-edits-from-other-households": "Loka fyrir að önnur heimili geti breytt uppskriftum",
|
||||
"lock-recipe-edits-from-other-households-description": "Þegar virkt þá geta bara notendur í þínu heimili breytt uppskriftum sem er settar inn af þínu heimili",
|
||||
"household-recipe-preferences": "Stillingar fyrir heimilis uppskriftir",
|
||||
"default-recipe-preferences-description": "Þetta eru sjálfgefnar stillingar þegar nýjar uppskriftir eru settar inn í þínu heimili. Þeim er hægt að breyta fyrir hverja uppskrift í stillingum fyrir uppskriftina.",
|
||||
"allow-users-outside-of-your-household-to-see-your-recipes": "Leyfa notendum utan þíns heimilis að sjá ykkar uppskriftir",
|
||||
"allow-users-outside-of-your-household-to-see-your-recipes-description": "Sé þetta virkt getur þú deilt uppskriftum með tengli án þess notandi þurfi að stofna aðgang. Sé þetta óvirkt, er bara hægt að deila uppskriftum innan þíns hóps eða með tilbúnum tengli",
|
||||
"household-preferences": "Stillingar heimilis"
|
||||
},
|
||||
"meal-plan": {
|
||||
"create-a-new-meal-plan": "Create a New Meal Plan",
|
||||
"update-this-meal-plan": "Update this Meal Plan",
|
||||
"dinner-this-week": "Dinner This Week",
|
||||
"dinner-today": "Dinner Today",
|
||||
"dinner-tonight": "DINNER TONIGHT",
|
||||
"edit-meal-plan": "Edit Meal Plan",
|
||||
"end-date": "End Date",
|
||||
"group": "Group (Beta)",
|
||||
"create-a-new-meal-plan": "Búa til nýtt matarplan",
|
||||
"update-this-meal-plan": "Uppfæra matarplan",
|
||||
"dinner-this-week": "Kvöldmaturinn í þessari viku",
|
||||
"dinner-today": "Kvöldmaturinn í dag",
|
||||
"dinner-tonight": "KVÖLDMATUR Í KVÖLD",
|
||||
"edit-meal-plan": "Breyta matarplani",
|
||||
"end-date": "Loka dagsetning",
|
||||
"group": "Hópur (Beta)",
|
||||
"main": "Main",
|
||||
"meal-planner": "Meal Planner",
|
||||
"meal-plans": "Meal Plans",
|
||||
"mealplan-categories": "MEALPLAN CATEGORIES",
|
||||
"mealplan-created": "Mealplan created",
|
||||
"mealplan-creation-failed": "Mealplan creation failed",
|
||||
"mealplan-deleted": "Mealplan Deleted",
|
||||
"mealplan-deletion-failed": "Mealplan deletion failed",
|
||||
"mealplan-settings": "Mealplan Settings",
|
||||
"mealplan-update-failed": "Mealplan update failed",
|
||||
"mealplan-updated": "Mealplan Updated",
|
||||
"mealplan-households-description": "If no household is selected, recipes can be added from any household",
|
||||
"any-category": "Any Category",
|
||||
"any-tag": "Any Tag",
|
||||
"any-household": "Any Household",
|
||||
"no-meal-plan-defined-yet": "No meal plan defined yet",
|
||||
"no-meal-planned-for-today": "No meal planned for today",
|
||||
"numberOfDays-hint": "Number of days on page load",
|
||||
"numberOfDays-label": "Default Days",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Only recipes with these categories will be used in Meal Plans",
|
||||
"planner": "Planner",
|
||||
"meal-planner": "Matarplan",
|
||||
"meal-plans": "Matarplön",
|
||||
"mealplan-categories": "MATARPLANS HÓPAR",
|
||||
"mealplan-created": "Matarplan útbúið",
|
||||
"mealplan-creation-failed": "Mistókst að búa til matarplan",
|
||||
"mealplan-deleted": "Matarplani eytt",
|
||||
"mealplan-deletion-failed": "Mistókst að eyða matarplani",
|
||||
"mealplan-settings": "Stillingar matarplans",
|
||||
"mealplan-update-failed": "Mistókst að uppfæra matarplan",
|
||||
"mealplan-updated": "Matarplan uppfært",
|
||||
"mealplan-households-description": "Ef ekkert heimili er valið er hægt að bæta við uppskriftum frá öllum heimilimum",
|
||||
"any-category": "Allir flokkar",
|
||||
"any-tag": "Allir flokkar",
|
||||
"any-household": "Öll heimili",
|
||||
"no-meal-plan-defined-yet": "Ekkert matarplan hefur verið skilgreint",
|
||||
"no-meal-planned-for-today": "Ekkert matarplan skipulagt í dag",
|
||||
"numberOfDays-hint": "Fjöldi daga við síðuhleðslu",
|
||||
"numberOfDays-label": "Sjálfgefnir dagar",
|
||||
"only-recipes-with-these-categories-will-be-used-in-meal-plans": "Aðeins uppskriftir í þessum flokkum verða notaðir í matarplan",
|
||||
"planner": "Matarplan",
|
||||
"quick-week": "Quick Week",
|
||||
"side": "Side",
|
||||
"sides": "Sides",
|
||||
"start-date": "Start Date",
|
||||
"rule-day": "Rule Day",
|
||||
"meal-type": "Meal Type",
|
||||
"breakfast": "Breakfast",
|
||||
"lunch": "Lunch",
|
||||
"dinner": "Dinner",
|
||||
"type-any": "Any",
|
||||
"day-any": "Any",
|
||||
"editor": "Editor",
|
||||
"meal-recipe": "Meal Recipe",
|
||||
"meal-title": "Meal Title",
|
||||
"meal-note": "Meal Note",
|
||||
"note-only": "Note Only",
|
||||
"random-meal": "Random Meal",
|
||||
"random-dinner": "Random Dinner",
|
||||
"random-side": "Random Side",
|
||||
"this-rule-will-apply": "This rule will apply {dayCriteria} {mealTypeCriteria}.",
|
||||
"to-all-days": "to all days",
|
||||
"on-days": "on {0}s",
|
||||
"for-all-meal-types": "for all meal types",
|
||||
"for-type-meal-types": "for {0} meal types",
|
||||
"meal-plan-rules": "Meal Plan Rules",
|
||||
"new-rule": "New Rule",
|
||||
"meal-plan-rules-description": "You can create rules for auto selecting recipes for your meal plans. These rules are used by the server to determine the random pool of recipes to select from when creating meal plans. Note that if rules have the same day/type constraints then the rule filters will be merged. In practice, it's unnecessary to create duplicate rules, but it's possible to do so.",
|
||||
"side": "Meðlæti",
|
||||
"sides": "Meðlæti",
|
||||
"start-date": "Upphafsdagsetning",
|
||||
"rule-day": "Regla fyrir dag",
|
||||
"meal-type": "Hvernig matur",
|
||||
"breakfast": "Morgunverður",
|
||||
"lunch": "Hádegisverður",
|
||||
"dinner": "Kvöldverður",
|
||||
"type-any": "Allir",
|
||||
"day-any": "Alla",
|
||||
"editor": "Ritill",
|
||||
"meal-recipe": "Uppskrift",
|
||||
"meal-title": "Heiti máltíðar",
|
||||
"meal-note": "Athugasemdir",
|
||||
"note-only": "Bara athugasemd",
|
||||
"random-meal": "Handahófskennd máltíð",
|
||||
"random-dinner": "Handahófskenndur kvöldverður",
|
||||
"random-side": "Handahófskennt meðlæti",
|
||||
"this-rule-will-apply": "Þessi regla gildir {dayCriteria} {mealTypeCriteria}.",
|
||||
"to-all-days": "alla daga",
|
||||
"on-days": "á {0}",
|
||||
"for-all-meal-types": "um allar tegundir máltíða",
|
||||
"for-type-meal-types": "um {0} ",
|
||||
"meal-plan-rules": "Reglur fyrir máltíðar skipulag",
|
||||
"new-rule": "Ný regla",
|
||||
"meal-plan-rules-description": "Þú getur búið til reglur til að velja sjálfvirkt uppskriftir fyrir máltíðar skipulagið. Þessar reglur eru notaðar af kerfinu til að ákvarða hvaða uppskriftir koma til greina þegar máltíðaplön eru búin til af handahófi. Athugaðu að ef reglur hafa sömu skilyrði fyrir dag eða tegund máltíðar, verða síurnar í reglunum sameinaðar. Í reynd er óþarfi að búa til tvítekna reglur, þó það sé mögulegt.",
|
||||
"new-rule-description": "When creating a new rule for a meal plan you can restrict the rule to be applicable for a specific day of the week and/or a specific type of meal. To apply a rule to all days or all meal types you can set the rule to \"Any\" which will apply it to all the possible values for the day and/or meal type.",
|
||||
"recipe-rules": "Recipe Rules",
|
||||
"applies-to-all-days": "Applies to all days",
|
||||
@@ -468,7 +468,7 @@
|
||||
"calories": "Calories",
|
||||
"calories-suffix": "calories",
|
||||
"carbohydrate-content": "Carbohydrate",
|
||||
"categories": "Categories",
|
||||
"categories": "Flokkar",
|
||||
"cholesterol-content": "Cholesterol",
|
||||
"comment-action": "Comment",
|
||||
"comment": "Comment",
|
||||
@@ -479,22 +479,22 @@
|
||||
"description": "Description",
|
||||
"disable-amount": "Disable Ingredient Amounts",
|
||||
"disable-comments": "Disable Comments",
|
||||
"duplicate": "Duplicate recipe",
|
||||
"duplicate-name": "Name of the new recipe",
|
||||
"duplicate": "Afrita uppskrift",
|
||||
"duplicate-name": "Nafn á nýju uppskriftinni",
|
||||
"edit-scale": "Edit Scale",
|
||||
"fat-content": "Fat",
|
||||
"fiber-content": "Fiber",
|
||||
"grams": "grams",
|
||||
"ingredient": "Ingredient",
|
||||
"ingredients": "Ingredients",
|
||||
"grams": "grömm",
|
||||
"ingredient": "Innihald",
|
||||
"ingredients": "Innihald",
|
||||
"insert-ingredient": "Insert Ingredient",
|
||||
"insert-section": "Insert Section",
|
||||
"insert-above": "Insert Above",
|
||||
"insert-below": "Insert Below",
|
||||
"instructions": "Instructions",
|
||||
"instructions": "Aðferð",
|
||||
"key-name-required": "Key Name Required",
|
||||
"landscape-view-coming-soon": "Landscape View",
|
||||
"milligrams": "milligrams",
|
||||
"milligrams": "milligrömm",
|
||||
"new-key-name": "New Key Name",
|
||||
"no-white-space-allowed": "No White Space Allowed",
|
||||
"note": "Note",
|
||||
@@ -525,8 +525,8 @@
|
||||
"share-recipe-message": "I wanted to share my {0} recipe with you.",
|
||||
"show-nutrition-values": "Show Nutrition Values",
|
||||
"sodium-content": "Sodium",
|
||||
"step-index": "Step: {step}",
|
||||
"sugar-content": "Sugar",
|
||||
"step-index": "Skref {step}",
|
||||
"sugar-content": "Sykur",
|
||||
"title": "Title",
|
||||
"total-time": "Total Time",
|
||||
"trans-fat-content": "Trans-fat",
|
||||
@@ -535,7 +535,7 @@
|
||||
"no-recipe": "No Recipe",
|
||||
"locked-by-owner": "Locked by Owner",
|
||||
"join-the-conversation": "Join the Conversation",
|
||||
"add-recipe-to-mealplan": "Add Recipe to Mealplan",
|
||||
"add-recipe-to-mealplan": "Bæta uppskrift við matarplan",
|
||||
"entry-type": "Entry Type",
|
||||
"date-format-hint": "MM/DD/YYYY format",
|
||||
"date-format-hint-yyyy-mm-dd": "YYYY-MM-DD format",
|
||||
@@ -545,9 +545,9 @@
|
||||
"recipe-added-to-list": "Recipe added to list",
|
||||
"recipes-added-to-list": "Recipes added to list",
|
||||
"successfully-added-to-list": "Successfully added to list",
|
||||
"recipe-added-to-mealplan": "Recipe added to mealplan",
|
||||
"recipe-added-to-mealplan": "Uppskrift bætt við matarplan",
|
||||
"failed-to-add-recipes-to-list": "Failed to add recipe to list",
|
||||
"failed-to-add-recipe-to-mealplan": "Failed to add recipe to mealplan",
|
||||
"failed-to-add-recipe-to-mealplan": "Mistókst að bæta uppskrift við matarplan",
|
||||
"failed-to-add-to-list": "Failed to add to list",
|
||||
"yield": "Yield",
|
||||
"yields-amount-with-text": "Yields {amount} {text}",
|
||||
@@ -560,12 +560,12 @@
|
||||
"toggle-section": "Toggle Section",
|
||||
"see-original-text": "See Original Text",
|
||||
"original-text-with-value": "Original Text: {originalText}",
|
||||
"ingredient-linker": "Ingredient Linker",
|
||||
"ingredient-linker": "Tengja innihald",
|
||||
"unlinked": "Not linked yet",
|
||||
"linked-to-other-step": "Linked to other step",
|
||||
"linked-to-other-step": "Tengt við önnur skref",
|
||||
"auto": "Auto",
|
||||
"cook-mode": "Cook Mode",
|
||||
"link-ingredients": "Link Ingredients",
|
||||
"link-ingredients": "Tengja við innihald",
|
||||
"merge-above": "Merge Above",
|
||||
"move-to-bottom": "Move To Bottom",
|
||||
"move-to-top": "Move To Top",
|
||||
@@ -654,7 +654,7 @@
|
||||
"upload-image": "Upload image",
|
||||
"screen-awake": "Keep Screen Awake",
|
||||
"remove-image": "Remove image",
|
||||
"nextStep": "Next step",
|
||||
"nextStep": "Næsta skref",
|
||||
"recipe-actions": "Recipe Actions",
|
||||
"parser": {
|
||||
"ingredient-parser": "Ingredient Parser",
|
||||
@@ -725,7 +725,7 @@
|
||||
},
|
||||
"settings": {
|
||||
"add-a-new-theme": "Add a New Theme",
|
||||
"admin-settings": "Admin Settings",
|
||||
"admin-settings": "Stjórnanda stillingar",
|
||||
"backup": {
|
||||
"backup-created": "Backup created successfully",
|
||||
"backup-created-at-response-export_path": "Backup Created at {path}",
|
||||
@@ -758,7 +758,7 @@
|
||||
"first-day-of-week": "First day of the week",
|
||||
"group-settings-updated": "Group Settings Updated",
|
||||
"homepage": {
|
||||
"all-categories": "All Categories",
|
||||
"all-categories": "Allir flokkar",
|
||||
"card-per-section": "Card Per Section",
|
||||
"home-page": "Home Page",
|
||||
"home-page-sections": "Home Page Sections",
|
||||
@@ -774,11 +774,11 @@
|
||||
"organize": "Organize",
|
||||
"page-name": "Page Name",
|
||||
"pages": "Pages",
|
||||
"profile": "Profile",
|
||||
"profile": "Prófíll",
|
||||
"remove-existing-entries-matching-imported-entries": "Remove existing entries matching imported entries",
|
||||
"set-new-time": "Set New Time",
|
||||
"settings-update-failed": "Settings update failed",
|
||||
"settings-updated": "Settings updated",
|
||||
"settings-updated": "Stillingar uppfærðar",
|
||||
"site-settings": "Site Settings",
|
||||
"theme": {
|
||||
"accent": "Accent",
|
||||
@@ -799,7 +799,7 @@
|
||||
"theme-name": "Theme Name",
|
||||
"theme-name-is-required": "Theme Name is required.",
|
||||
"theme-saved": "Theme Saved",
|
||||
"theme-updated": "Theme updated",
|
||||
"theme-updated": "Þema uppfært",
|
||||
"warning": "Warning",
|
||||
"light-mode": "Light Mode",
|
||||
"dark-mode": "Dark Mode"
|
||||
@@ -851,7 +851,7 @@
|
||||
"not-ready": "Not Ready - Check Environmental Variables",
|
||||
"succeeded": "Succeeded",
|
||||
"failed": "Failed",
|
||||
"general-about": "General About",
|
||||
"general-about": "Upplýsingar",
|
||||
"application-version": "Application Version",
|
||||
"application-version-error-text": "Your current version ({0}) does not match the latest release. Considering updating to the latest version ({1}).",
|
||||
"mealie-is-up-to-date": "Mealie is up to date",
|
||||
@@ -884,7 +884,7 @@
|
||||
"shopping-lists": "Innkaupalisti",
|
||||
"food": "Food",
|
||||
"note": "Note",
|
||||
"label": "Label",
|
||||
"label": "Merkingar",
|
||||
"save-label": "Save Label",
|
||||
"linked-item-warning": "This item is linked to one or more recipe. Adjusting the units or foods will yield unexpected results when adding or removing the recipe from this list.",
|
||||
"toggle-food": "Toggle Food",
|
||||
@@ -911,13 +911,13 @@
|
||||
"sidebar": {
|
||||
"all-recipes": "All Recipes",
|
||||
"backups": "Backups",
|
||||
"categories": "Categories",
|
||||
"categories": "Flokkar",
|
||||
"cookbooks": "Cookbooks",
|
||||
"dashboard": "Dashboard",
|
||||
"home-page": "Home Page",
|
||||
"manage-users": "Manage Users",
|
||||
"migrations": "Migrations",
|
||||
"profile": "Profile",
|
||||
"profile": "Prófíll",
|
||||
"search": "Search",
|
||||
"site-settings": "Site Settings",
|
||||
"tags": "Tags",
|
||||
@@ -964,7 +964,7 @@
|
||||
"tool": "Tool"
|
||||
},
|
||||
"user": {
|
||||
"admin": "Admin",
|
||||
"admin": "Stjórnandi",
|
||||
"are-you-sure-you-want-to-delete-the-link": "Are you sure you want to delete the link <b>{link}<b/>?",
|
||||
"are-you-sure-you-want-to-delete-the-user": "Are you sure you want to delete the user <b>{activeName} ID: {activeId}<b/>?",
|
||||
"auth-method": "Auth Method",
|
||||
@@ -996,14 +996,14 @@
|
||||
"password-has-been-reset-to-the-default-password": "Password has been reset to the default password",
|
||||
"password-must-match": "Password must match",
|
||||
"password-reset-failed": "Password reset failed",
|
||||
"password-updated": "Password updated",
|
||||
"password-updated": "Lykilorð uppfært",
|
||||
"password": "Password",
|
||||
"password-strength": "Password is {strength}",
|
||||
"please-enter-password": "Please enter your new password.",
|
||||
"register": "Register",
|
||||
"reset-password": "Reset Password",
|
||||
"sign-in": "Sign in",
|
||||
"total-mealplans": "Total MealPlans",
|
||||
"total-mealplans": "Fjöldi matarplana",
|
||||
"total-users": "Total Users",
|
||||
"upload-photo": "Upload Photo",
|
||||
"use-8-characters-or-more-for-your-password": "Use 8 characters or more for your password",
|
||||
@@ -1015,9 +1015,9 @@
|
||||
"user-password": "User Password",
|
||||
"user-successfully-logged-in": "User Successfully Logged In",
|
||||
"user-update-failed": "User update failed",
|
||||
"user-updated": "User updated",
|
||||
"user-updated": "Notandaupplýsingar uppfærðar",
|
||||
"user": "User",
|
||||
"username": "Username",
|
||||
"username": "Notandanafn",
|
||||
"users-header": "USERS",
|
||||
"users": "Users",
|
||||
"user-not-found": "User not found",
|
||||
@@ -1028,7 +1028,7 @@
|
||||
"enable-advanced-content": "Enable Advanced Content",
|
||||
"enable-advanced-content-description": "Enables advanced features like Recipe Scaling, API keys, Webhooks, and Data Management. Don't worry, you can always change this later",
|
||||
"favorite-recipes": "Favorite Recipes",
|
||||
"email-or-username": "Email or Username",
|
||||
"email-or-username": "Tölvupóstur eða notandanafn",
|
||||
"remember-me": "Remember Me",
|
||||
"please-enter-your-email-and-password": "Please enter your email and password",
|
||||
"invalid-credentials": "Invalid Credentials",
|
||||
@@ -1042,14 +1042,14 @@
|
||||
},
|
||||
"user-management": "User Management",
|
||||
"reset-locked-users": "Reset Locked Users",
|
||||
"admin-user-creation": "Admin User Creation",
|
||||
"admin-user-management": "Admin User Management",
|
||||
"admin-user-creation": "Búa til stjórnandaaðgang",
|
||||
"admin-user-management": "Stjórna notendum",
|
||||
"user-details": "User Details",
|
||||
"user-name": "User Name",
|
||||
"authentication-method": "Authentication Method",
|
||||
"authentication-method-hint": "This specifies how a user will authenticate with Mealie. If you're not sure, choose 'Mealie'",
|
||||
"permissions": "Permissions",
|
||||
"administrator": "Administrator",
|
||||
"administrator": "Stjórnandi",
|
||||
"user-can-invite-other-to-group": "User can invite others to group",
|
||||
"user-can-manage-group": "User can manage group",
|
||||
"user-can-manage-household": "User can manage household",
|
||||
@@ -1128,10 +1128,10 @@
|
||||
"data-exports-description": "This section provides links to available exports that are ready to download. These exports do expire, so be sure to grab them while they're still available.",
|
||||
"data-exports": "Data Exports",
|
||||
"tag": "Tag",
|
||||
"categorize": "Categorize",
|
||||
"update-settings": "Update Settings",
|
||||
"categorize": "Flokka",
|
||||
"update-settings": "Uppfæra stillingar",
|
||||
"tag-recipes": "Tag Recipes",
|
||||
"categorize-recipes": "Categorize Recipes",
|
||||
"categorize-recipes": "Flokka uppskriftir",
|
||||
"export-recipes": "Export Recipes",
|
||||
"delete-recipes": "Delete Recipes",
|
||||
"source-unit-will-be-deleted": "Source Unit will be deleted"
|
||||
@@ -1153,8 +1153,8 @@
|
||||
"columns": "Columns",
|
||||
"combine": "Combine",
|
||||
"categories": {
|
||||
"edit-category": "Edit Category",
|
||||
"new-category": "New Category",
|
||||
"edit-category": "Breyta flokkum",
|
||||
"new-category": "Nýr flokkur",
|
||||
"category-data": "Category Data"
|
||||
},
|
||||
"tags": {
|
||||
@@ -1182,7 +1182,7 @@
|
||||
},
|
||||
"validation": {
|
||||
"group-name-is-taken": "Group name is taken",
|
||||
"username-is-taken": "Username is taken",
|
||||
"username-is-taken": "Notandanafn er þegar í notkun",
|
||||
"email-is-taken": "Email is taken",
|
||||
"this-field-is-required": "This Field is Required"
|
||||
},
|
||||
@@ -1212,7 +1212,7 @@
|
||||
},
|
||||
"demo": {
|
||||
"info_message_with_version": "This is a Demo for version: {version}",
|
||||
"demo_username": "Username: {username}",
|
||||
"demo_username": "Notandi: {username}",
|
||||
"demo_password": "Password: {password}"
|
||||
},
|
||||
"ocr-editor": {
|
||||
@@ -1291,13 +1291,13 @@
|
||||
"openai": "OpenAI",
|
||||
"show-individual-confidence": "Show individual confidence",
|
||||
"ingredient-text": "Ingredient Text",
|
||||
"average-confident": "{0} Confident",
|
||||
"average-confident": "{0} öryggi",
|
||||
"try-an-example": "Try an example",
|
||||
"parser": "Parser",
|
||||
"background-tasks": "Background Tasks",
|
||||
"background-tasks-description": "Here you can view all the running background tasks and their status",
|
||||
"no-logs-found": "No Logs Found",
|
||||
"tasks": "Tasks",
|
||||
"tasks": "Verkefni",
|
||||
"setup": {
|
||||
"first-time-setup": "First Time Setup",
|
||||
"welcome-to-mealie-get-started": "Welcome to Mealie! Let's get started",
|
||||
@@ -1332,14 +1332,14 @@
|
||||
"personal": "Personal",
|
||||
"personal-description": "These are settings that are personal to you. Changes here won't affect other users.",
|
||||
"user-settings": "User Settings",
|
||||
"user-settings-description": "Manage your preferences, change your password, and update your email.",
|
||||
"user-settings-description": "Breyta þínum stillingum, breyta lykilorði og breyta tölvupósti.",
|
||||
"api-tokens-description": "Manage your API Tokens for access from external applications.",
|
||||
"group-description": "These items are shared within your group. Editing one of them will change it for the whole group!",
|
||||
"group-settings": "Group Settings",
|
||||
"group-settings-description": "Manage your common group settings, like privacy settings.",
|
||||
"household-description": "These items are shared within your household. Editing one of them will change it for the whole household!",
|
||||
"household-settings": "Household Settings",
|
||||
"household-settings-description": "Manage your household settings, like mealplan and privacy settings.",
|
||||
"household-settings-description": "Stjórnaðu stillingum heimilis, eins og matarplani og persónuverndarstillingum.",
|
||||
"cookbooks-description": "Manage a collection of recipe categories and generate pages for them.",
|
||||
"members": "Members",
|
||||
"members-description": "See who's in your household and manage their permissions.",
|
||||
@@ -1355,7 +1355,7 @@
|
||||
"personal-information": "Personal Information",
|
||||
"preferences": "Preferences",
|
||||
"show-advanced-description": "Show advanced features (API Keys, Webhooks, and Data Management)",
|
||||
"back-to-profile": "Back to Profile",
|
||||
"back-to-profile": "Til baka í prófíl",
|
||||
"looking-for-privacy-settings": "Looking for Privacy Settings?",
|
||||
"manage-your-api-tokens": "Manage Your API Tokens",
|
||||
"manage-user-profile": "Manage User Profile",
|
||||
@@ -1374,7 +1374,7 @@
|
||||
"public-cookbook-description": "Public Cookbooks can be shared with non-mealie users and will be displayed on your groups page.",
|
||||
"filter-options": "Filter Options",
|
||||
"filter-options-description": "When require all is selected the cookbook will only include recipes that have all of the items selected. This applies to each subset of selectors and not a cross section of the selected items.",
|
||||
"require-all-categories": "Require All Categories",
|
||||
"require-all-categories": "Þarf alla flokka",
|
||||
"require-all-tags": "Require All Tags",
|
||||
"require-all-tools": "Require All Tools",
|
||||
"cookbook-name": "Cookbook Name",
|
||||
|
||||
@@ -69,7 +69,7 @@
|
||||
"new-notification": "Nytt varsel",
|
||||
"event-notifiers": "Hendelsesvarsler",
|
||||
"apprise-url-skipped-if-blank": "Apprise-URL (hoppes over hvis tom)",
|
||||
"apprise-url-is-left-intentionally-blank": "Since Apprise URLs typically contain sensitive information, this field is left intentionally blank while editing. If you wish to update the URL, please enter the new one here, otherwise leave it blank to keep the current URL.",
|
||||
"apprise-url-is-left-intentionally-blank": "Siden Apprise URL-er vanligvis inneholder sensitiv informasjon, må dette feltet ikke være tomt mens du redigerer. Hvis du vil oppdatere URL, skriv inn den nye her, ellers la den være tom for å beholde den gjeldende URL.",
|
||||
"enable-notifier": "Aktiver varslingsagenten",
|
||||
"what-events": "Hvilke hendelser skal denne varslingsagenten abonnere på?",
|
||||
"user-events": "Brukerhendelser",
|
||||
@@ -81,7 +81,7 @@
|
||||
"category-events": "Kategorihendelser",
|
||||
"when-a-new-user-joins-your-group": "Når en ny bruker blir med i gruppen din",
|
||||
"recipe-events": "Oppskriftshendelser",
|
||||
"label-events": "Label Events"
|
||||
"label-events": "Merk hendelser"
|
||||
},
|
||||
"general": {
|
||||
"add": "Legg til",
|
||||
@@ -561,7 +561,7 @@
|
||||
"see-original-text": "Se opprinnelig tekst",
|
||||
"original-text-with-value": "Opprinnelig tekst: {originalText}",
|
||||
"ingredient-linker": "Tilknytt ingredienser",
|
||||
"unlinked": "Not linked yet",
|
||||
"unlinked": "Ingen lenke enda",
|
||||
"linked-to-other-step": "Tilknyttet et annet steg",
|
||||
"auto": "Automatisk",
|
||||
"cook-mode": "Tilberedelsesmodus",
|
||||
@@ -590,7 +590,7 @@
|
||||
"api-extras-description": "Ekstramaterialer til oppskrifter er en viktig funksjon i Mealie API-en. De lar deg opprette egendefinerte JSON-nøkkel/verdi-par innenfor en oppskrift for å referere fra tredjepartsapplikasjoner. Du kan bruke disse nøklene til å gi informasjon for eksempel for å utløse automatiseringer eller egendefinerte meldinger som skal videreformidles til ønsket enhet.",
|
||||
"message-key": "Meldingsnøkkel",
|
||||
"parse": "Analyser",
|
||||
"ingredients-not-parsed-description": "It looks like your ingredients aren't parsed yet. Click the \"{parse}\" button below to parse your ingredients into structured foods.",
|
||||
"ingredients-not-parsed-description": "Det ser ut som ingridensene ikke har blitt analysert enda. Klikk\"{parse}\"-knappen under for å analysere ingrediensese som strukturert matvarer.",
|
||||
"attach-images-hint": "Fest bilder ved å dra og slippe dem inn i redigereringsverktøyet",
|
||||
"drop-image": "Slipp bilde",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Aktiver ingrediensmengder for å bruke denne funksjonen",
|
||||
@@ -624,7 +624,7 @@
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "Du kan importere fra rådata direkte",
|
||||
"import-original-keywords-as-tags": "Importer originale søkeord som emneord",
|
||||
"stay-in-edit-mode": "Forbli i redigeringsmodus",
|
||||
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
|
||||
"parse-recipe-ingredients-after-import": "Analyser oppskriftens ingredienser etter at importen er fullført",
|
||||
"import-from-zip": "Importer fra zip-fil",
|
||||
"import-from-zip-description": "Importer en enkelt oppskrift som ble eksportert fra en annen Mealie-instans.",
|
||||
"import-from-html-or-json": "Importer fra HTML eller JSON",
|
||||
@@ -668,15 +668,15 @@
|
||||
"no-unit": "Ingen enhet",
|
||||
"missing-unit": "Opprett manglende enhet: {unit}",
|
||||
"missing-food": "Opprett manglende mat: {food}",
|
||||
"this-unit-could-not-be-parsed-automatically": "This unit could not be parsed automatically",
|
||||
"this-unit-could-not-be-parsed-automatically": "Denne enheten kunne ikke analyseres automatisk",
|
||||
"this-food-could-not-be-parsed-automatically": "Denne maten kunne ikke leses automatisk",
|
||||
"no-food": "Ingen matvarer",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"review-parsed-ingredients": "Gjennomgå de analyserte ingrediensene",
|
||||
"confidence-score": "Tillit score",
|
||||
"ingredient-parser-description": "Ingrediensene har blitt analysert. Venligst gjennomgå ingrediensene vi ikke er sikkre på.",
|
||||
"ingredient-parser-final-review-description": "Når alle ingredienser er gjennomgått, har du en siste sjanse til å gjennomgå alle ingrediensene før du tar i bruk endringene på oppskriften din.",
|
||||
"add-text-as-alias-for-item": "Legg til \"{text}\" som kallenavn for {item}",
|
||||
"delete-item": "Slett gjenstanden"
|
||||
},
|
||||
"reset-servings-count": "Nullstill antall porsjoner",
|
||||
"not-linked-ingredients": "Tilleggsingredienser",
|
||||
@@ -1177,7 +1177,7 @@
|
||||
"group-details": "Gruppedetaljer",
|
||||
"group-details-description": "Før du oppretter en konto må du opprette en gruppe. Gruppen din vil bare inneholde deg, men du vil kunne invitere andre senere. Medlemmer i gruppen din kan dele måltider, handlelister, oppskrifter med mer!",
|
||||
"use-seed-data": "Bruk tilføringsdata",
|
||||
"use-seed-data-description": "Mealie ships with a collection of Foods, Units, and Labels that can be used to populate your group with helpful data for organizing your recipes. These are translated into the language you currently have selected. You can always add to or modify this data later.",
|
||||
"use-seed-data-description": "Mealie leveres med en kolleksjon av matvarer, enheter og etiketter, som can bli brukt til å utfylle gruppen med hjelpsom data for organisering av oppskrifter. Disse er oversatt over til språket du har valgt. Du kan alltid legge til eller modifisere denne dataen senere.",
|
||||
"account-details": "Kontodetaljer"
|
||||
},
|
||||
"validation": {
|
||||
|
||||
@@ -624,7 +624,7 @@
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "Możesz zaimportować bezpośrednio z surowych danych",
|
||||
"import-original-keywords-as-tags": "Importuj oryginalne słowa kluczowe jako tagi",
|
||||
"stay-in-edit-mode": "Pozostań w trybie edycji",
|
||||
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
|
||||
"parse-recipe-ingredients-after-import": "Analizuj składniki receptury po zaimportowaniu",
|
||||
"import-from-zip": "Importuj z pliku Zip",
|
||||
"import-from-zip-description": "Importuj pojedynczy przepis, który został wyeksportowany z innej instancji Mealie.",
|
||||
"import-from-html-or-json": "Importuj z HTML lub JSON",
|
||||
@@ -671,12 +671,12 @@
|
||||
"this-unit-could-not-be-parsed-automatically": "Nie można przetworzyć tej jednostki automatycznie",
|
||||
"this-food-could-not-be-parsed-automatically": "Nie można przetworzyć tego jedzenia automatycznie",
|
||||
"no-food": "Brak potrawy",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"review-parsed-ingredients": "Przejrzyj przeanalizowane składniki",
|
||||
"confidence-score": "Wskaźnik pewności",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"delete-item": "Usuń przedmiot"
|
||||
},
|
||||
"reset-servings-count": "Zresetuj liczbę porcji",
|
||||
"not-linked-ingredients": "Dodatkowe składniki",
|
||||
|
||||
@@ -671,12 +671,12 @@
|
||||
"this-unit-could-not-be-parsed-automatically": "Esta unidade não pôde ser analisada automaticamente",
|
||||
"this-food-could-not-be-parsed-automatically": "Este alimento não pôde ser analisado automaticamente",
|
||||
"no-food": "Sem Comida",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"review-parsed-ingredients": "Revisar ingredientes analisados",
|
||||
"confidence-score": "Nota de Confiança",
|
||||
"ingredient-parser-description": "Seus ingredientes foram analisados com sucesso. Por favor, verifique os ingredientes que não temos certeza.",
|
||||
"ingredient-parser-final-review-description": "Depois que todos os ingredientes forem revisados, você terá mais uma chance de revisar todos os ingredientes antes de aplicar as mudanças em sua receita.",
|
||||
"add-text-as-alias-for-item": "Adicionar \"{text}\" como apelido para {item}",
|
||||
"delete-item": "Excluir item"
|
||||
},
|
||||
"reset-servings-count": "Redefinir Contagem de Porções",
|
||||
"not-linked-ingredients": "Ingredientes adicionais",
|
||||
|
||||
@@ -549,7 +549,7 @@
|
||||
"failed-to-add-recipes-to-list": "Pridanie receptu do zoznamu zlyhalo",
|
||||
"failed-to-add-recipe-to-mealplan": "Pridanie receptu do stravovacieho plánu zlyhalo",
|
||||
"failed-to-add-to-list": "Pridanie do zoznamu zlyhalo",
|
||||
"yield": "Počet porcií",
|
||||
"yield": "Množstvo",
|
||||
"yields-amount-with-text": "Pre {amount} {text}",
|
||||
"yield-text": "Jednotka množstva",
|
||||
"quantity": "Množstvo",
|
||||
@@ -590,7 +590,7 @@
|
||||
"api-extras-description": "API dolnky receptov sú kľúčovou funkcionalitou Mealie API. Umožňujú používateľom vytvárať vlastné JSON páry kľúč/hodnota v rámci receptu, a využiť v aplikáciách tretích strán. Údaje uložené pod jednotlivými kľúčmi je možné využiť napríklad ako spúšťač automatizovaných procesov, či pri zasielaní vlastných správ do vami zvolených zariadení.",
|
||||
"message-key": "Kľúč správy",
|
||||
"parse": "Analyzovať",
|
||||
"ingredients-not-parsed-description": "",
|
||||
"ingredients-not-parsed-description": "Zdá sa, že vaše suroviny neboli zatiaľ analyzované. Kliknite na tlačidlo \"{parse}\" nižšie, aby ste rozložili ingrediencie do štrukturovaných potravín.",
|
||||
"attach-images-hint": "Pridaj obrázky ich potiahnutím a pustením na editor",
|
||||
"drop-image": "Odstrániť obrázok",
|
||||
"enable-ingredient-amounts-to-use-this-feature": "Povoľ množstvám prísad využívať túto vlastnosť",
|
||||
@@ -624,7 +624,7 @@
|
||||
"scrape-recipe-you-can-import-from-raw-data-directly": "Môžete importovať priamo nespracované údaje",
|
||||
"import-original-keywords-as-tags": "Importovať pôvodné kľúčové slová ako štítky",
|
||||
"stay-in-edit-mode": "Zostať v režime editovania",
|
||||
"parse-recipe-ingredients-after-import": "Parse recipe ingredients after import",
|
||||
"parse-recipe-ingredients-after-import": "Analyzovať ingrediencie po importe",
|
||||
"import-from-zip": "Importovať zo Zip-súboru",
|
||||
"import-from-zip-description": "Importovať recept exportovaný z inej Mealie inštalácie.",
|
||||
"import-from-html-or-json": "Importovať z HTML alebo JSONu",
|
||||
@@ -671,12 +671,12 @@
|
||||
"this-unit-could-not-be-parsed-automatically": "Túto jednotku nebolo možné parsovať automaticky",
|
||||
"this-food-could-not-be-parsed-automatically": "Toto jedlo nebolo možné parsovať automaticky",
|
||||
"no-food": "Žiadne suroviny",
|
||||
"review-parsed-ingredients": "Review parsed ingredients",
|
||||
"confidence-score": "Confidence Score",
|
||||
"ingredient-parser-description": "Your ingredients have been successfully parsed. Please review the ingredients we're not sure about.",
|
||||
"ingredient-parser-final-review-description": "Once all ingredients have been reviewed, you'll have one more chance to review all ingredients before applying the changes to your recipe.",
|
||||
"add-text-as-alias-for-item": "Add \"{text}\" as alias for {item}",
|
||||
"delete-item": "Delete Item"
|
||||
"review-parsed-ingredients": "Skontrolovať analyzované ingrediencie",
|
||||
"confidence-score": "Skóre istoty",
|
||||
"ingredient-parser-description": "Vaše ingrediencie boli úspešne zanalyzované. Prosím prekontrolujte ingrediencie pri ktorých nemáme istotu.",
|
||||
"ingredient-parser-final-review-description": "Keď skontrolujete všetky ingrediencie, budete mať ešte jednu možnosť skontrolovať ich pred tým než uložíte zmeny vo svojom recepte.",
|
||||
"add-text-as-alias-for-item": "Pridať \"{text}\" ako alias pre {item}",
|
||||
"delete-item": "Zmazať položku"
|
||||
},
|
||||
"reset-servings-count": "Resetovať počet porcií",
|
||||
"not-linked-ingredients": "Ďalšie suroviny",
|
||||
@@ -1072,7 +1072,7 @@
|
||||
"foods": {
|
||||
"merge-dialog-text": "Kombináciou vybraných potravín sa zdrojové jedlo a cieľové jedlo zlúčia do jedného jedla. Zdrojové jedlo bude vymazané a všetky odkazy na zdrojové jedlo budú aktualizované tak, aby ukazovali na cieľové jedlo.",
|
||||
"merge-food-example": "Zlučujem {food1} do {food2}",
|
||||
"seed-dialog-text": "Naplňte databázu potravinami vo vašom jazyku. Tým vytvoríte viac ako 200 bežných potravín, ktoré môžete použiť na organizovanie vašej databáze. Potraviny sú preložené vďaka úsiliu komunity.",
|
||||
"seed-dialog-text": "Naplňte databázu potravinami vo vašom jazyku. Tým vytvoríte viac ako 2700 bežných potravín, ktoré môžete použiť na organizovanie vašej databáze. Potraviny sú preložené vďaka úsiliu komunity.",
|
||||
"seed-dialog-warning": "V databáze už máte nejaké údaje. Táto akcia neodstráni duplicitné položky, budete ich musieť odstrániť ručne.",
|
||||
"combine-food": "Kombinované jedlo",
|
||||
"source-food": "Zdrojové jedlo",
|
||||
@@ -1177,7 +1177,7 @@
|
||||
"group-details": "Podrobnosti o skupine",
|
||||
"group-details-description": "Pred vytvorením účtu musíte vytvoriť skupinu. Vaša skupina bude obsahovať iba vás, ale neskôr budete môcť pozvať ostatných. Členovia vašej skupiny môžu zdieľať stravovacie plány, nákupné zoznamy, recepty a ďalšie!",
|
||||
"use-seed-data": "Použiť predvolené dáta",
|
||||
"use-seed-data-description": "Mealie sa dodáva so zbierkou ingrediencií, jednotiek a označení. Môžete ich použiť vo vašej skupine pre lepšiu organizáciu vašich receptov. Tieto sú preložené do jazyka, ktorý ste si práve zvolili. Tieto dáta môžete kedykoľvek doplniť alebo zmeniť.",
|
||||
"use-seed-data-description": "Mealie sa dodáva so zbierkou potravín, jednotiek a označení, ktorými môžete naplniť vašu skupinu užitočnými dátami pre lepšiu organizáciu vašich receptov. Tieto sú preložené do jazyka, ktorý ste si práve zvolili. Tieto dáta môžete kedykoľvek doplniť alebo zmeniť.",
|
||||
"account-details": "Detaily účtu"
|
||||
},
|
||||
"validation": {
|
||||
@@ -1347,7 +1347,7 @@
|
||||
"notifiers": "Notifikátory",
|
||||
"notifiers-description": "Nastaviť e-mail a push notifikácie, ktoré sa spúšťajú pri špecifických udalostiach.",
|
||||
"manage-data": "Spravovať dáta",
|
||||
"manage-data-description": "Spravujte svoje údaje, jedlá, jednotky, kategórie, štítky a ďalšie.",
|
||||
"manage-data-description": "Spravujte svoje údaje, potraviny, jednotky, kategórie, štítky a ďalšie.",
|
||||
"data-migrations": "Migrácie dát",
|
||||
"data-migrations-description": "Migrujte svoje existujúce údaje z iných aplikácií, ako sú Nextcloud Recipes a Chowdown.",
|
||||
"email-sent": "E-mail Odoslaný",
|
||||
|
||||
@@ -9,7 +9,6 @@ export default defineNuxtConfig({
|
||||
modules: [
|
||||
"@vite-pwa/nuxt",
|
||||
"@nuxtjs/i18n",
|
||||
"@sidebase/nuxt-auth",
|
||||
"@nuxt/fonts",
|
||||
"vuetify-nuxt-module",
|
||||
"@nuxt/eslint",
|
||||
@@ -126,29 +125,6 @@ export default defineNuxtConfig({
|
||||
baseURL: process.env.SUB_PATH || "",
|
||||
},
|
||||
|
||||
auth: {
|
||||
isEnabled: true,
|
||||
// disableServerSideAuth: true,
|
||||
originEnvKey: "AUTH_ORIGIN",
|
||||
baseURL: "/api",
|
||||
provider: {
|
||||
type: "local",
|
||||
endpoints: {
|
||||
signIn: { path: "/auth/token", method: "post" },
|
||||
signOut: { path: "/auth/logout", method: "post" },
|
||||
getSession: { path: "/users/self", method: "get" },
|
||||
},
|
||||
token: {
|
||||
signInResponseTokenPointer: "/access_token",
|
||||
type: "Bearer",
|
||||
cookieName: AUTH_TOKEN,
|
||||
},
|
||||
pages: {
|
||||
login: "/login",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
// eslint rules
|
||||
eslint: {
|
||||
config: {
|
||||
@@ -269,7 +245,7 @@ export default defineNuxtConfig({
|
||||
"browser",
|
||||
"window-controls-overlay",
|
||||
],
|
||||
orientation: "portrait-primary",
|
||||
orientation: "any",
|
||||
categories: ["food", "lifestyle"],
|
||||
prefer_related_applications: false,
|
||||
handle_links: "preferred",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "mealie",
|
||||
"version": "3.2.1",
|
||||
"version": "3.3.1",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "nuxt dev",
|
||||
@@ -21,7 +21,6 @@
|
||||
"@mdi/js": "^7.4.47",
|
||||
"@nuxt/fonts": "^0.11.4",
|
||||
"@nuxtjs/i18n": "^9.2.1",
|
||||
"@sidebase/nuxt-auth": "^1.1.0",
|
||||
"@vite-pwa/nuxt": "^0.10.6",
|
||||
"@vueuse/core": "^12.7.0",
|
||||
"axios": "^1.8.1",
|
||||
@@ -30,7 +29,6 @@
|
||||
"isomorphic-dompurify": "^2.28.0",
|
||||
"json-editor-vue": "^0.18.1",
|
||||
"marked": "^15.0.12",
|
||||
"next-auth": "~4.24.0",
|
||||
"nuxt": "^3.19.2",
|
||||
"vite": "^6.2.0",
|
||||
"vue-advanced-cropper": "^2.8.9",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<script setup lang="ts">
|
||||
definePageMeta({
|
||||
middleware: ["sidebase-auth", "admin-only"],
|
||||
middleware: ["admin-only"],
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
@@ -244,6 +244,7 @@ import UserRegistrationForm from "~/components/Domain/User/UserRegistrationForm.
|
||||
|
||||
definePageMeta({
|
||||
layout: "blank",
|
||||
middleware: ["admin-only"],
|
||||
});
|
||||
|
||||
// ================================================================
|
||||
@@ -264,13 +265,6 @@ useSeoMeta({
|
||||
title: i18n.t("admin.setup.first-time-setup"),
|
||||
});
|
||||
|
||||
if (!$auth.loggedIn.value) {
|
||||
router.push("/login");
|
||||
}
|
||||
else if (!$auth.user.value?.admin) {
|
||||
router.push(groupSlug.value ? `/g/${groupSlug.value}` : "/login");
|
||||
}
|
||||
|
||||
enum Pages {
|
||||
LANDING = 0,
|
||||
USER_INFO = 1,
|
||||
|
||||
@@ -194,6 +194,16 @@
|
||||
</a>
|
||||
</v-list-item-subtitle>
|
||||
</template>
|
||||
<template v-else-if="property.slot === 'version' && property.value !== 'develop' && property.value !== 'nightly'">
|
||||
<v-list-item-subtitle>
|
||||
<a
|
||||
target="_blank"
|
||||
:href="`https://github.com/mealie-recipes/mealie/releases/tag/${property.value}`"
|
||||
>
|
||||
{{ property.value }}
|
||||
</a>
|
||||
</v-list-item-subtitle>
|
||||
</template>
|
||||
<template v-else>
|
||||
<v-list-item-subtitle>
|
||||
{{ property.value }}
|
||||
@@ -400,6 +410,7 @@ export default defineNuxtComponent({
|
||||
rawAppInfo.value.versionLatest = data.versionLatest;
|
||||
const prettyInfo = [
|
||||
{
|
||||
slot: "version",
|
||||
name: i18n.t("about.version"),
|
||||
icon: $globals.icons.information,
|
||||
value: data.version,
|
||||
|
||||
@@ -145,7 +145,7 @@ import { useCookbookPreferences } from "~/composables/use-users/preferences";
|
||||
|
||||
export default defineNuxtComponent({
|
||||
components: { CookbookEditor, VueDraggable },
|
||||
middleware: ["sidebase-auth", "group-only"],
|
||||
middleware: ["group-only"],
|
||||
setup() {
|
||||
const dialogStates = reactive({
|
||||
create: false,
|
||||
|
||||
@@ -19,20 +19,21 @@ import type { Recipe } from "~/lib/api/types/recipe";
|
||||
const $auth = useMealieAuth();
|
||||
const { isOwnGroup } = useLoggedInState();
|
||||
const route = useRoute();
|
||||
const title = ref(route.meta?.title ?? "");
|
||||
const title = ref(route.meta?.title as string || "");
|
||||
useSeoMeta({ title });
|
||||
|
||||
const router = useRouter();
|
||||
const slug = route.params.slug as string;
|
||||
|
||||
const recipe = ref<Recipe | null>(null);
|
||||
if (isOwnGroup.value) {
|
||||
function loadRecipe() {
|
||||
const { recipe: data } = useRecipe(slug);
|
||||
watch(data, (value) => {
|
||||
recipe.value = value;
|
||||
});
|
||||
}
|
||||
else {
|
||||
|
||||
async function loadPublicRecipe() {
|
||||
const groupSlug = computed(() => route.params.groupSlug as string || $auth.user.value?.groupSlug || "");
|
||||
const api = usePublicExploreApi(groupSlug.value);
|
||||
const { data } = await useAsyncData(useAsyncKey(), async () => {
|
||||
@@ -47,6 +48,13 @@ else {
|
||||
recipe.value = data.value;
|
||||
}
|
||||
|
||||
if (isOwnGroup.value) {
|
||||
loadRecipe();
|
||||
}
|
||||
else {
|
||||
onMounted(loadPublicRecipe);
|
||||
}
|
||||
|
||||
whenever(
|
||||
() => recipe.value,
|
||||
() => {
|
||||
|
||||
@@ -49,7 +49,7 @@ import AdvancedOnly from "~/components/global/AdvancedOnly.vue";
|
||||
|
||||
export default defineNuxtComponent({
|
||||
components: { AdvancedOnly },
|
||||
middleware: ["sidebase-auth", "group-only"],
|
||||
middleware: ["group-only"],
|
||||
setup() {
|
||||
const i18n = useI18n();
|
||||
const $auth = useMealieAuth();
|
||||
|
||||
@@ -23,7 +23,7 @@ export default defineNuxtComponent({
|
||||
components: {
|
||||
RecipeOrganizerPage,
|
||||
},
|
||||
middleware: ["sidebase-auth", "group-only"],
|
||||
middleware: ["group-only"],
|
||||
setup() {
|
||||
const { store, actions } = useCategoryStore();
|
||||
const i18n = useI18n();
|
||||
|
||||
@@ -23,7 +23,7 @@ export default defineNuxtComponent({
|
||||
components: {
|
||||
RecipeOrganizerPage,
|
||||
},
|
||||
middleware: ["sidebase-auth", "group-only"],
|
||||
middleware: ["group-only"],
|
||||
setup() {
|
||||
const { store, actions } = useTagStore();
|
||||
const i18n = useI18n();
|
||||
|
||||
@@ -36,7 +36,7 @@ import RecipeTimeline from "~/components/Domain/Recipe/RecipeTimeline.vue";
|
||||
|
||||
export default defineNuxtComponent({
|
||||
components: { RecipeTimeline },
|
||||
middleware: ["sidebase-auth", "group-only"],
|
||||
middleware: ["group-only"],
|
||||
setup() {
|
||||
const i18n = useI18n();
|
||||
const api = useUserApi();
|
||||
|
||||
@@ -28,7 +28,7 @@ export default defineNuxtComponent({
|
||||
components: {
|
||||
RecipeOrganizerPage,
|
||||
},
|
||||
middleware: ["sidebase-auth", "group-only"],
|
||||
middleware: ["group-only"],
|
||||
setup() {
|
||||
const $auth = useMealieAuth();
|
||||
const toolStore = useToolStore();
|
||||
|
||||
@@ -25,7 +25,7 @@ const router = useRouter();
|
||||
const recipeId = route.params.id as string;
|
||||
const api = usePublicApi();
|
||||
|
||||
const title = ref(route.meta?.title ?? "");
|
||||
const title = ref(route.meta?.title as string ?? "");
|
||||
useSeoMeta({
|
||||
title,
|
||||
});
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
|
||||
<script lang="ts">
|
||||
export default defineNuxtComponent({
|
||||
middleware: ["sidebase-auth", "can-organize-only"],
|
||||
middleware: ["can-organize-only"],
|
||||
setup() {
|
||||
const i18n = useI18n();
|
||||
const buttonLookup: { [key: string]: string } = {
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
import { useGroupSelf } from "~/composables/use-groups";
|
||||
|
||||
export default defineNuxtComponent({
|
||||
middleware: ["sidebase-auth", "can-manage-only"],
|
||||
middleware: ["can-manage-only"],
|
||||
setup() {
|
||||
const { group, actions: groupActions } = useGroupSelf();
|
||||
const i18n = useI18n();
|
||||
|
||||
@@ -127,7 +127,7 @@ const MIGRATIONS = {
|
||||
};
|
||||
|
||||
export default defineNuxtComponent({
|
||||
middleware: ["sidebase-auth", "advanced-only"],
|
||||
middleware: ["advanced-only"],
|
||||
setup() {
|
||||
const i18n = useI18n();
|
||||
const { $globals } = useNuxtApp();
|
||||
|
||||
@@ -52,7 +52,6 @@ import { useUserApi } from "~/composables/api";
|
||||
import type { ReportOut } from "~/lib/api/types/reports";
|
||||
|
||||
export default defineNuxtComponent({
|
||||
middleware: "sidebase-auth",
|
||||
setup() {
|
||||
const route = useRoute();
|
||||
const id = route.params.id as string;
|
||||
|
||||
@@ -43,7 +43,7 @@ export default defineNuxtComponent({
|
||||
components: {
|
||||
HouseholdPreferencesEditor,
|
||||
},
|
||||
middleware: ["sidebase-auth", "can-manage-household-only"],
|
||||
middleware: ["can-manage-household-only"],
|
||||
setup() {
|
||||
const { household, actions: householdActions } = useHouseholdSelf();
|
||||
const i18n = useI18n();
|
||||
|
||||
@@ -75,7 +75,6 @@ import { useMealplans } from "~/composables/use-group-mealplan";
|
||||
import { useUserMealPlanPreferences } from "~/composables/use-users/preferences";
|
||||
|
||||
export default defineNuxtComponent({
|
||||
middleware: ["sidebase-auth"],
|
||||
setup() {
|
||||
const route = useRoute();
|
||||
const router = useRouter();
|
||||
|
||||
@@ -183,7 +183,6 @@ export default defineNuxtComponent({
|
||||
GroupMealPlanRuleForm,
|
||||
RecipeChips,
|
||||
},
|
||||
middleware: ["sidebase-auth"],
|
||||
props: {
|
||||
modelValue: {
|
||||
type: Boolean,
|
||||
|
||||
@@ -124,7 +124,6 @@ export default defineNuxtComponent({
|
||||
components: {
|
||||
UserAvatar,
|
||||
},
|
||||
middleware: ["sidebase-auth"],
|
||||
setup() {
|
||||
const $auth = useMealieAuth();
|
||||
const api = useUserApi();
|
||||
|
||||
@@ -199,7 +199,7 @@ interface OptionSection {
|
||||
}
|
||||
|
||||
export default defineNuxtComponent({
|
||||
middleware: ["sidebase-auth", "advanced-only"],
|
||||
middleware: ["advanced-only"],
|
||||
setup() {
|
||||
const api = useUserApi();
|
||||
const i18n = useI18n();
|
||||
|
||||
@@ -75,7 +75,7 @@ import { alert } from "~/composables/use-toast";
|
||||
|
||||
export default defineNuxtComponent({
|
||||
components: { GroupWebhookEditor },
|
||||
middleware: ["sidebase-auth", "advanced-only"],
|
||||
middleware: ["advanced-only"],
|
||||
setup() {
|
||||
const i18n = useI18n();
|
||||
const { actions, webhooks } = useGroupWebhooks();
|
||||
|
||||
@@ -304,7 +304,6 @@ export default defineNuxtComponent({
|
||||
oidcLoggingIn.value = true;
|
||||
try {
|
||||
await $auth.oauthSignIn();
|
||||
window.location.href = "/"; // Reload the app to get the new user
|
||||
}
|
||||
catch (error) {
|
||||
await router.replace("/login?direct=1");
|
||||
@@ -330,8 +329,7 @@ export default defineNuxtComponent({
|
||||
formData.append("remember_me", String(form.remember));
|
||||
|
||||
try {
|
||||
await $auth.signIn(formData, { redirect: false });
|
||||
window.location.href = "/"; // Reload the app to get the new user
|
||||
await $auth.signIn(formData);
|
||||
}
|
||||
catch (error) {
|
||||
console.log(error);
|
||||
|
||||
@@ -131,7 +131,6 @@ import { useShoppingListPreferences } from "~/composables/use-users/preferences"
|
||||
import type { UserOut } from "~/lib/api/types/user";
|
||||
|
||||
export default defineNuxtComponent({
|
||||
middleware: "sidebase-auth",
|
||||
setup() {
|
||||
const $auth = useMealieAuth();
|
||||
const i18n = useI18n();
|
||||
|
||||
@@ -21,7 +21,6 @@ import { useLoggedInState } from "~/composables/use-logged-in-state";
|
||||
|
||||
export default defineNuxtComponent({
|
||||
components: { RecipeCardSection },
|
||||
middleware: "sidebase-auth",
|
||||
setup() {
|
||||
const route = useRoute();
|
||||
const i18n = useI18n();
|
||||
|
||||
@@ -111,7 +111,7 @@ import { useUserApi } from "~/composables/api";
|
||||
import type { VForm } from "~/types/auto-forms";
|
||||
|
||||
export default defineNuxtComponent({
|
||||
middleware: ["sidebase-auth", "advanced-only"],
|
||||
middleware: ["advanced-only"],
|
||||
setup() {
|
||||
const i18n = useI18n();
|
||||
const $auth = useMealieAuth();
|
||||
|
||||
@@ -213,7 +213,6 @@ export default defineNuxtComponent({
|
||||
UserAvatar,
|
||||
UserPasswordStrength,
|
||||
},
|
||||
middleware: "sidebase-auth",
|
||||
setup() {
|
||||
const i18n = useI18n();
|
||||
const $auth = useMealieAuth();
|
||||
|
||||
@@ -291,7 +291,6 @@ export default defineNuxtComponent({
|
||||
UserAvatar,
|
||||
StatsCards,
|
||||
},
|
||||
middleware: "sidebase-auth",
|
||||
scrollToTop: true,
|
||||
async setup() {
|
||||
const i18n = useI18n();
|
||||
|
||||
9
frontend/plugins/init-auth.client.ts
Normal file
9
frontend/plugins/init-auth.client.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
export default defineNuxtPlugin({
|
||||
async setup() {
|
||||
const auth = useAuthBackend();
|
||||
|
||||
console.debug("Initializing auth plugin");
|
||||
await auth.getSession();
|
||||
console.debug("Auth plugin initialized");
|
||||
},
|
||||
});
|
||||
@@ -835,7 +835,7 @@
|
||||
"@babel/types" "^7.4.4"
|
||||
esutils "^2.0.2"
|
||||
|
||||
"@babel/runtime@^7.11.2", "@babel/runtime@^7.20.13":
|
||||
"@babel/runtime@^7.11.2":
|
||||
version "7.28.4"
|
||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.28.4.tgz#a70226016fabe25c5783b2f22d3e1c9bc5ca3326"
|
||||
integrity sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==
|
||||
@@ -1989,7 +1989,7 @@
|
||||
unplugin "^2.3.3"
|
||||
unstorage "^1.16.0"
|
||||
|
||||
"@nuxt/kit@3.19.2", "@nuxt/kit@^3.12.4", "@nuxt/kit@^3.15.4", "@nuxt/kit@^3.17.2", "@nuxt/kit@^3.17.3", "@nuxt/kit@^3.17.6", "@nuxt/kit@^3.19.2", "@nuxt/kit@^3.5.0", "@nuxt/kit@^3.9.0":
|
||||
"@nuxt/kit@3.19.2", "@nuxt/kit@^3.12.4", "@nuxt/kit@^3.15.4", "@nuxt/kit@^3.17.2", "@nuxt/kit@^3.17.3", "@nuxt/kit@^3.19.2", "@nuxt/kit@^3.5.0", "@nuxt/kit@^3.9.0":
|
||||
version "3.19.2"
|
||||
resolved "https://registry.yarnpkg.com/@nuxt/kit/-/kit-3.19.2.tgz#e49bd5e6672fdf21289f24603151e42a77b97e51"
|
||||
integrity sha512-+QiqO0WcIxsKLUqXdVn3m4rzTRm2fO9MZgd330utCAaagGmHsgiMJp67kE14boJEPutnikfz3qOmrzBnDIHUUg==
|
||||
@@ -2529,11 +2529,6 @@
|
||||
resolved "https://registry.yarnpkg.com/@oxc-transform/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.87.0.tgz#798fd95ab7425be75a0a69b40f92ffef8610e32c"
|
||||
integrity sha512-jG/MhMjfSdyj5KyhnwNWr4mnAlAsz+gNUYpjQ+UXWsfsoB3f8HqbsTkG02RBtNa/IuVQYvYYVf1eIimNN3gBEQ==
|
||||
|
||||
"@panva/hkdf@^1.0.2":
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.2.1.tgz#cb0d111ef700136f4580349ff0226bf25c853f23"
|
||||
integrity sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==
|
||||
|
||||
"@parcel/watcher-android-arm64@2.5.1":
|
||||
version "2.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1"
|
||||
@@ -2927,20 +2922,6 @@
|
||||
resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8"
|
||||
integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==
|
||||
|
||||
"@sidebase/nuxt-auth@^1.1.0":
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/@sidebase/nuxt-auth/-/nuxt-auth-1.1.0.tgz#c5ad29d5703f8a75503761120f9817314eb3d807"
|
||||
integrity sha512-2Lj8dmlWE1tIA2CdGlekQsVUpgy2W56jaN9WDukJWxmuSDZRNK+CqxSXReYEHF+gb2tDRLMdhmyk0JUPfnRANg==
|
||||
dependencies:
|
||||
"@nuxt/kit" "^3.17.6"
|
||||
defu "^6.1.4"
|
||||
h3 "^1.15.3"
|
||||
knitwork "^1.2.0"
|
||||
nitropack "^2.11.13"
|
||||
requrl "^3.0.2"
|
||||
scule "^1.3.0"
|
||||
ufo "^1.6.1"
|
||||
|
||||
"@sinclair/typebox@^0.27.8":
|
||||
version "0.27.8"
|
||||
resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e"
|
||||
@@ -4800,11 +4781,6 @@ cookie-es@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/cookie-es/-/cookie-es-2.0.0.tgz#ca6163d7ef8686ea6bbdd551f1de575569c1ed69"
|
||||
integrity sha512-RAj4E421UYRgqokKUmotqAwuplYw15qtdXfY+hGzgCJ/MBjCVZcSoHK/kH9kocfjRjcDME7IiDWR/1WX1TM2Pg==
|
||||
|
||||
cookie@^0.7.0:
|
||||
version "0.7.2"
|
||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7"
|
||||
integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==
|
||||
|
||||
cookie@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.0.2.tgz#27360701532116bd3f1f9416929d176afe1e4610"
|
||||
@@ -7249,11 +7225,6 @@ jmespath@^0.16.0:
|
||||
resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.16.0.tgz#b15b0a85dfd4d930d43e69ed605943c802785076"
|
||||
integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==
|
||||
|
||||
jose@^4.15.5, jose@^4.15.9:
|
||||
version "4.15.9"
|
||||
resolved "https://registry.yarnpkg.com/jose/-/jose-4.15.9.tgz#9b68eda29e9a0614c042fa29387196c7dd800100"
|
||||
integrity sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==
|
||||
|
||||
js-tokens@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
||||
@@ -7671,13 +7642,6 @@ lru-cache@^5.1.1:
|
||||
dependencies:
|
||||
yallist "^3.0.2"
|
||||
|
||||
lru-cache@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
|
||||
integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
|
||||
dependencies:
|
||||
yallist "^4.0.0"
|
||||
|
||||
magic-regexp@^0.10.0:
|
||||
version "0.10.0"
|
||||
resolved "https://registry.yarnpkg.com/magic-regexp/-/magic-regexp-0.10.0.tgz#78b4421a50d2b7a67129bf2c424a333927c3a0e5"
|
||||
@@ -7942,22 +7906,7 @@ natural-compare@^1.4.0:
|
||||
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
|
||||
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
|
||||
|
||||
next-auth@~4.24.0:
|
||||
version "4.24.11"
|
||||
resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-4.24.11.tgz#16eeb76d37fbc8fe887561b454f8167f490c381f"
|
||||
integrity sha512-pCFXzIDQX7xmHFs4KVH4luCjaCbuPRtZ9oBUjUhOk84mZ9WVPf94n87TxYI4rSRf9HmfHEF8Yep3JrYDVOo3Cw==
|
||||
dependencies:
|
||||
"@babel/runtime" "^7.20.13"
|
||||
"@panva/hkdf" "^1.0.2"
|
||||
cookie "^0.7.0"
|
||||
jose "^4.15.5"
|
||||
oauth "^0.9.15"
|
||||
openid-client "^5.4.0"
|
||||
preact "^10.6.3"
|
||||
preact-render-to-string "^5.1.19"
|
||||
uuid "^8.3.2"
|
||||
|
||||
nitropack@^2.11.13, nitropack@^2.12.5:
|
||||
nitropack@^2.12.5:
|
||||
version "2.12.6"
|
||||
resolved "https://registry.yarnpkg.com/nitropack/-/nitropack-2.12.6.tgz#7743f88c2c9710347f982341c356a4bf56cbce6d"
|
||||
integrity sha512-DEq31s0SP4/Z5DIoVBRo9DbWFPWwIoYD4cQMEz7eE+iJMiAP+1k9A3B9kcc6Ihc0jDJmfUcHYyh6h2XlynCx6g==
|
||||
@@ -8199,16 +8148,6 @@ nypm@^0.6.0, nypm@^0.6.1, nypm@^0.6.2:
|
||||
pkg-types "^2.3.0"
|
||||
tinyexec "^1.0.1"
|
||||
|
||||
oauth@^0.9.15:
|
||||
version "0.9.15"
|
||||
resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1"
|
||||
integrity sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==
|
||||
|
||||
object-hash@^2.2.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-2.2.0.tgz#5ad518581eefc443bd763472b8ff2e9c2c0d54a5"
|
||||
integrity sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==
|
||||
|
||||
object-inspect@^1.13.3, object-inspect@^1.13.4:
|
||||
version "1.13.4"
|
||||
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213"
|
||||
@@ -8274,11 +8213,6 @@ ohash@^2.0.0, ohash@^2.0.11:
|
||||
resolved "https://registry.yarnpkg.com/ohash/-/ohash-2.0.11.tgz#60b11e8cff62ca9dee88d13747a5baa145f5900b"
|
||||
integrity sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==
|
||||
|
||||
oidc-token-hash@^5.0.3:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.yarnpkg.com/oidc-token-hash/-/oidc-token-hash-5.1.1.tgz#d35e31ca26d3a26678f5e9bda100b095ab58011f"
|
||||
integrity sha512-D7EmwxJV6DsEB6vOFLrBM2OzsVgQzgPWyHlV2OOAVj772n+WTXpudC9e9u5BVKQnYwaD30Ivhi9b+4UeBcGu9g==
|
||||
|
||||
on-change@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.yarnpkg.com/on-change/-/on-change-5.0.1.tgz#ced60d262211eee41043e7479515b4875d1744ef"
|
||||
@@ -8331,16 +8265,6 @@ open@^8.0.0:
|
||||
is-docker "^2.1.1"
|
||||
is-wsl "^2.2.0"
|
||||
|
||||
openid-client@^5.4.0:
|
||||
version "5.7.1"
|
||||
resolved "https://registry.yarnpkg.com/openid-client/-/openid-client-5.7.1.tgz#34cace862a3e6472ed7d0a8616ef73b7fb85a9c3"
|
||||
integrity sha512-jDBPgSVfTnkIh71Hg9pRvtJc6wTwqjRkN88+gCFtYWrlP4Yx2Dsrow8uPi3qLr/aeymPF3o2+dS+wOpglK04ew==
|
||||
dependencies:
|
||||
jose "^4.15.9"
|
||||
lru-cache "^6.0.0"
|
||||
object-hash "^2.2.0"
|
||||
oidc-token-hash "^5.0.3"
|
||||
|
||||
optionator@^0.9.3:
|
||||
version "0.9.4"
|
||||
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734"
|
||||
@@ -8929,18 +8853,6 @@ postcss@^8.5.3, postcss@^8.5.6:
|
||||
picocolors "^1.1.1"
|
||||
source-map-js "^1.2.1"
|
||||
|
||||
preact-render-to-string@^5.1.19:
|
||||
version "5.2.6"
|
||||
resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz#0ff0c86cd118d30affb825193f18e92bd59d0604"
|
||||
integrity sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==
|
||||
dependencies:
|
||||
pretty-format "^3.8.0"
|
||||
|
||||
preact@^10.6.3:
|
||||
version "10.27.2"
|
||||
resolved "https://registry.yarnpkg.com/preact/-/preact-10.27.2.tgz#19b9009c1be801a76a0aaf0fe5ba665985a09312"
|
||||
integrity sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==
|
||||
|
||||
prelude-ls@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
|
||||
@@ -8973,11 +8885,6 @@ pretty-bytes@^7.0.1:
|
||||
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-7.1.0.tgz#d788c9906241dbdcd4defab51b6d7470243db9bd"
|
||||
integrity sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==
|
||||
|
||||
pretty-format@^3.8.0:
|
||||
version "3.8.0"
|
||||
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385"
|
||||
integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==
|
||||
|
||||
process-nextick-args@~2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
|
||||
@@ -9224,11 +9131,6 @@ require-from-string@^2.0.2:
|
||||
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
|
||||
integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
|
||||
|
||||
requrl@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.yarnpkg.com/requrl/-/requrl-3.0.2.tgz#d376104193b02a2d874dde68454c2db2dfeb0fac"
|
||||
integrity sha512-f3gjR6d8MhOpn46PP+DSJywbmxi95fxQm3coXBFwognjFLla9X6tr8BdNyaIKNOEkaRbRcm0/zYAqN19N1oyhg==
|
||||
|
||||
resolve-from@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
|
||||
@@ -10842,11 +10744,6 @@ util-deprecate@^1.0.2, util-deprecate@~1.0.1:
|
||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
|
||||
|
||||
uuid@^8.3.2:
|
||||
version "8.3.2"
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
|
||||
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
|
||||
|
||||
validate-npm-package-license@^3.0.1:
|
||||
version "3.0.4"
|
||||
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
|
||||
@@ -11566,11 +11463,6 @@ yallist@^3.0.2:
|
||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
|
||||
integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
|
||||
|
||||
yallist@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
||||
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
|
||||
|
||||
yallist@^5.0.0:
|
||||
version "5.0.0"
|
||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-5.0.0.tgz#00e2de443639ed0d78fd87de0d27469fbcffb533"
|
||||
|
||||
@@ -21,13 +21,16 @@ class FakeHasher:
|
||||
|
||||
|
||||
class BcryptHasher:
|
||||
def _get_password_bytes(self, password: str) -> bytes:
|
||||
return password.encode("utf-8")[:72]
|
||||
|
||||
def hash(self, password: str) -> str:
|
||||
password_bytes = password.encode("utf-8")
|
||||
password_bytes = self._get_password_bytes(password)
|
||||
hashed = bcrypt.hashpw(password_bytes, bcrypt.gensalt())
|
||||
return hashed.decode("utf-8")
|
||||
|
||||
def verify(self, password: str, hashed: str) -> bool:
|
||||
password_bytes = password.encode("utf-8")
|
||||
password_bytes = self._get_password_bytes(password)
|
||||
hashed_bytes = hashed.encode("utf-8")
|
||||
return bcrypt.checkpw(password_bytes, hashed_bytes)
|
||||
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} is geskep, {url}",
|
||||
"generic-updated-with-url": "{name} is opgedateer, {url}",
|
||||
"generic-duplicated": "{name} is gekopieer",
|
||||
"generic-deleted": "{name} is verwyder"
|
||||
"generic-deleted": "{name} is verwyder",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "year|years",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "تم إنشاء {name}، {url}",
|
||||
"generic-updated-with-url": "{name} تم تحديثه، {url}",
|
||||
"generic-duplicated": "تم تكرار {name}",
|
||||
"generic-deleted": "تم حذف {name}"
|
||||
"generic-deleted": "تم حذف {name}",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "سنة|سنوات",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} беше създадено, {url}",
|
||||
"generic-updated-with-url": "{name} беше актуализирано, {url}",
|
||||
"generic-duplicated": "{name} е дублирано",
|
||||
"generic-deleted": "{name} беше изтрито"
|
||||
"generic-deleted": "{name} беше изтрито",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "година|години",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} ha estat creat, {url}",
|
||||
"generic-updated-with-url": "{name} ha estat actualitzat, {url}",
|
||||
"generic-duplicated": "S'ha duplicat {name}",
|
||||
"generic-deleted": "{name} ha estat eliminat"
|
||||
"generic-deleted": "{name} ha estat eliminat",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "any|anys",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} byl vytvořen, {url}",
|
||||
"generic-updated-with-url": "{name} byl aktualizován, {url}",
|
||||
"generic-duplicated": "{name} byl duplikován",
|
||||
"generic-deleted": "{name} byl odstraněn"
|
||||
"generic-deleted": "{name} byl odstraněn",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "rok|roky",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} er oprettet, {url}",
|
||||
"generic-updated-with-url": "{name} er blevet opdateret, {url}",
|
||||
"generic-duplicated": "{name} er blevet duplikeret",
|
||||
"generic-deleted": "{name} er blevet slettet"
|
||||
"generic-deleted": "{name} er blevet slettet",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "år|år",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} wurde erstellt, {url}",
|
||||
"generic-updated-with-url": "{name} wurde aktualisiert, {url}",
|
||||
"generic-duplicated": "{name} wurde dupliziert",
|
||||
"generic-deleted": "{name} wurde gelöscht"
|
||||
"generic-deleted": "{name} wurde gelöscht",
|
||||
"logged-out": "Abgemeldet"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "Jahr|Jahre",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "Το {name} δημιουργήθηκε, {url}",
|
||||
"generic-updated-with-url": "Το {name} ενημερώθηκε, {url}",
|
||||
"generic-duplicated": "Δημιουργήθηκε διπλότυπο του {name}",
|
||||
"generic-deleted": "Το {name} διαγράφηκε"
|
||||
"generic-deleted": "Το {name} διαγράφηκε",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "χρόνος | χρόνια",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} has been created, {url}",
|
||||
"generic-updated-with-url": "{name} has been updated, {url}",
|
||||
"generic-duplicated": "{name} has been duplicated",
|
||||
"generic-deleted": "{name} has been deleted"
|
||||
"generic-deleted": "{name} has been deleted",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "year|years",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} has been created, {url}",
|
||||
"generic-updated-with-url": "{name} has been updated, {url}",
|
||||
"generic-duplicated": "{name} has been duplicated",
|
||||
"generic-deleted": "{name} has been deleted"
|
||||
"generic-deleted": "{name} has been deleted",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "year|years",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "Se ha creado {name}, {url}",
|
||||
"generic-updated-with-url": "Se ha actualizado {name}, {url}",
|
||||
"generic-duplicated": "Se ha duplicado {name}",
|
||||
"generic-deleted": "Se ha eliminado {name}"
|
||||
"generic-deleted": "Se ha eliminado {name}",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "año|años",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} loodud, {url}",
|
||||
"generic-updated-with-url": "{name} uuendatud, {url}",
|
||||
"generic-duplicated": "{name} on duplitseeritud",
|
||||
"generic-deleted": "{name} kustutatud"
|
||||
"generic-deleted": "{name} kustutatud",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "aasta|aastad",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} on luotu, {url}",
|
||||
"generic-updated-with-url": "{name} on päivitetty, {url}",
|
||||
"generic-duplicated": "{name} on kahdennettu",
|
||||
"generic-deleted": "{name} on poistettu"
|
||||
"generic-deleted": "{name} on poistettu",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "vuosi|vuotta",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} a été créé, {url}",
|
||||
"generic-updated-with-url": "{name} a été mis à jour, {url}",
|
||||
"generic-duplicated": "{name} a été dupliqué",
|
||||
"generic-deleted": "{name} a été supprimé"
|
||||
"generic-deleted": "{name} a été supprimé",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "année|années",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} a été créé, {url}",
|
||||
"generic-updated-with-url": "{name} a été mis à jour, {url}",
|
||||
"generic-duplicated": "{name} a été dupliqué",
|
||||
"generic-deleted": "{name} a été supprimé"
|
||||
"generic-deleted": "{name} a été supprimé",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "année|années",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} a été créé, {url}",
|
||||
"generic-updated-with-url": "{name} a été mis à jour, {url}",
|
||||
"generic-duplicated": "{name} a été dupliqué",
|
||||
"generic-deleted": "{name} a été supprimé"
|
||||
"generic-deleted": "{name} a été supprimé",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "année|années",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} foi creado, {url}",
|
||||
"generic-updated-with-url": "{name} foi atualizado, {url}",
|
||||
"generic-duplicated": "{name} foi duplicado",
|
||||
"generic-deleted": "{name} foi eliminado"
|
||||
"generic-deleted": "{name} foi eliminado",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "ano|anos",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} נוצר, {url}",
|
||||
"generic-updated-with-url": "{name} עודכן, {url}",
|
||||
"generic-duplicated": "{name} שוכפל",
|
||||
"generic-deleted": "{name} נמחק"
|
||||
"generic-deleted": "{name} נמחק",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "שנה|שנים",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} je kreiran, {url}",
|
||||
"generic-updated-with-url": "{name} je ažuriran, {url}",
|
||||
"generic-duplicated": "{name} je dupliciran",
|
||||
"generic-deleted": "{name} je obrisan"
|
||||
"generic-deleted": "{name} je obrisan",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "year|years",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} létrehozva, {url}",
|
||||
"generic-updated-with-url": "{name} frissítve, {url}",
|
||||
"generic-duplicated": "{name} duplikálva",
|
||||
"generic-deleted": "{name} törölve lett"
|
||||
"generic-deleted": "{name} törölve lett",
|
||||
"logged-out": "Kijelentkezett"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "év",
|
||||
|
||||
@@ -1,80 +1,81 @@
|
||||
{
|
||||
"generic": {
|
||||
"server-error": "An unexpected error occurred"
|
||||
"server-error": "Óvænt villa kom upp"
|
||||
},
|
||||
"recipe": {
|
||||
"unique-name-error": "Recipe names must be unique",
|
||||
"recipe-created": "Recipe Created",
|
||||
"unique-name-error": "Nöfn uppskrifta þurfa að vera einstök",
|
||||
"recipe-created": "Uppskrift stofnuð",
|
||||
"recipe-defaults": {
|
||||
"ingredient-note": "1 Cup Flour",
|
||||
"step-text": "Recipe steps as well as other fields in the recipe page support markdown syntax.\n\n**Add a link**\n\n[My Link](https://demo.mealie.io)\n"
|
||||
"ingredient-note": "1 bolli hveiti",
|
||||
"step-text": "Hægt er að nota markdown málskipan (syntax) í uppskriftinni og öðrum reitum.\n\n**Bæta við tengli**\n\n[Minn tengill](https://demo.mealie.io)\n"
|
||||
},
|
||||
"servings-text": {
|
||||
"makes": "Makes",
|
||||
"serves": "Serves",
|
||||
"serving": "Serving",
|
||||
"servings": "Servings",
|
||||
"yield": "Yield",
|
||||
"yields": "Yields"
|
||||
"makes": "Framkvæmir",
|
||||
"serves": "Skammtar",
|
||||
"serving": "Skammtur",
|
||||
"servings": "Skammtar",
|
||||
"yield": "Skilar",
|
||||
"yields": "Skilar"
|
||||
}
|
||||
},
|
||||
"mealplan": {
|
||||
"no-recipes-match-your-rules": "No recipes match your rules"
|
||||
"no-recipes-match-your-rules": "Eingin uppskrift passar við settar reglur"
|
||||
},
|
||||
"user": {
|
||||
"user-updated": "User updated",
|
||||
"password-updated": "Password updated",
|
||||
"invalid-current-password": "Invalid current password",
|
||||
"ldap-update-password-unavailable": "Unable to update password, user is controlled by LDAP"
|
||||
"user-updated": "Notandaupplýsingar uppfærðar",
|
||||
"password-updated": "Lykilorð uppfært",
|
||||
"invalid-current-password": "Núverandi lykilorð er rangt",
|
||||
"ldap-update-password-unavailable": "Ekki var hægt að uppfæra lykilorð, notanda er stjórnað af LDAP"
|
||||
},
|
||||
"group": {
|
||||
"report-deleted": "Report deleted."
|
||||
"report-deleted": "Skýrslu eytt."
|
||||
},
|
||||
"exceptions": {
|
||||
"permission_denied": "You do not have permission to perform this action",
|
||||
"no-entry-found": "The requested resource was not found",
|
||||
"integrity-error": "Database integrity error",
|
||||
"username-conflict-error": "This username is already taken",
|
||||
"email-conflict-error": "This email is already in use"
|
||||
"permission_denied": "Þú hefur ekki réttindi til að framkvæma þessa aðgerð",
|
||||
"no-entry-found": "Umbeðin síða fannst ekki",
|
||||
"integrity-error": "Villa í gagnagrunni",
|
||||
"username-conflict-error": "Notandanafn er þegar í notkun",
|
||||
"email-conflict-error": "Tölvupóstur er þegar í notkun"
|
||||
},
|
||||
"notifications": {
|
||||
"generic-created": "{name} was created",
|
||||
"generic-updated": "{name} was updated",
|
||||
"generic-created-with-url": "{name} has been created, {url}",
|
||||
"generic-updated-with-url": "{name} has been updated, {url}",
|
||||
"generic-duplicated": "{name} has been duplicated",
|
||||
"generic-deleted": "{name} has been deleted"
|
||||
"generic-created": "{name} var stofnað",
|
||||
"generic-updated": "{name} var uppfært",
|
||||
"generic-created-with-url": "{name} hefur verið stofnað, {url}",
|
||||
"generic-updated-with-url": "{name} hefur verið uppfært, {url}",
|
||||
"generic-duplicated": "{name} hefur verið afritað",
|
||||
"generic-deleted": "{name} hefur verið eytt",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "year|years",
|
||||
"day": "day|days",
|
||||
"hour": "hour|hours",
|
||||
"minute": "minute|minutes",
|
||||
"second": "second|seconds",
|
||||
"millisecond": "millisecond|milliseconds",
|
||||
"microsecond": "microsecond|microseconds"
|
||||
"year": "ár",
|
||||
"day": "dagur|dagar",
|
||||
"hour": "klukkustund|klukkustundir",
|
||||
"minute": "mínluta|mínútur",
|
||||
"second": "sekúnda|sekúndur",
|
||||
"millisecond": "millisekúnda|millisekúndur",
|
||||
"microsecond": "míkrósekúnda|míkrósekúndur"
|
||||
},
|
||||
"emails": {
|
||||
"password": {
|
||||
"subject": "Mealie Forgot Password",
|
||||
"header_text": "Forgot Password",
|
||||
"message_top": "You have requested to reset your password.",
|
||||
"message_bottom": "Please click the button above to reset your password.",
|
||||
"button_text": "Reset Password"
|
||||
"subject": "Mealie Gleymt Lykilorð",
|
||||
"header_text": "Gleymt Lykilorð",
|
||||
"message_top": "Þú hefur óskað eftir að endursetja lykilorðið þitt.",
|
||||
"message_bottom": "Vinsamlegast smelltu á hnappinn hér að ofan til að endursetja lykilorðið þitt.",
|
||||
"button_text": "Endursetja lykilorð"
|
||||
},
|
||||
"invitation": {
|
||||
"subject": "Invitation to join Mealie",
|
||||
"header_text": "You're Invited!",
|
||||
"message_top": "You have been invited to join Mealie.",
|
||||
"message_bottom": "Please click the button above to accept the invitation.",
|
||||
"button_text": "Accept Invitation"
|
||||
"subject": "Boð um að skoða Mealie",
|
||||
"header_text": "Þér er boðið!",
|
||||
"message_top": "Þér hefur verið boðið að skoða Mealie.",
|
||||
"message_bottom": "Vinsamlegast ýttu á takkann hér að ofan til að samþykkja boðið.",
|
||||
"button_text": "Samþykkja boð"
|
||||
},
|
||||
"test": {
|
||||
"subject": "Mealie Test Email",
|
||||
"header_text": "Test Email",
|
||||
"message_top": "This is a test email.",
|
||||
"message_bottom": "Please click the button above to test the email.",
|
||||
"button_text": "Open Mealie"
|
||||
"subject": "Mealie prufupóstur",
|
||||
"header_text": "Prufupóstur",
|
||||
"message_top": "Þetta er prufupóstur.",
|
||||
"message_bottom": "Vinsamlegast ýttu á takkan hér fyrir ofan til að prófa póstinn.",
|
||||
"button_text": "Opna Mealie"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} è stato creato, {url}",
|
||||
"generic-updated-with-url": "{name} è stato aggiornato, {url}",
|
||||
"generic-duplicated": "{name} è stato duplicato",
|
||||
"generic-deleted": "{name} è stato eliminato"
|
||||
"generic-deleted": "{name} è stato eliminato",
|
||||
"logged-out": "Disconnesso"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "anno|anni",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} が作成されました: {url}",
|
||||
"generic-updated-with-url": "{name} が更新されました: {url}",
|
||||
"generic-duplicated": "{name} が複製されました",
|
||||
"generic-deleted": "{name} が削除されました"
|
||||
"generic-deleted": "{name} が削除されました",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "年",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} has been created, {url}",
|
||||
"generic-updated-with-url": "{name} has been updated, {url}",
|
||||
"generic-duplicated": "{name} has been duplicated",
|
||||
"generic-deleted": "{name} has been deleted"
|
||||
"generic-deleted": "{name} has been deleted",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "year|years",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} sukurtas, {url}",
|
||||
"generic-updated-with-url": "{name} atnaujintas, {url}",
|
||||
"generic-duplicated": "{name} buvo nukopijuotas",
|
||||
"generic-deleted": "{name} ištrintas"
|
||||
"generic-deleted": "{name} ištrintas",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "metai|metai",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} tika izveidots, {url}",
|
||||
"generic-updated-with-url": "{name} tika atjaunots, {url}",
|
||||
"generic-duplicated": "{name} tika dublicēts",
|
||||
"generic-deleted": "{name} tika dzēsts"
|
||||
"generic-deleted": "{name} tika dzēsts",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "gads|gadi",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} is aangemaakt, {url}",
|
||||
"generic-updated-with-url": "{name} is bijgewerkt, {url}",
|
||||
"generic-duplicated": "{name} is gekopieerd",
|
||||
"generic-deleted": "{name} is verwijderd"
|
||||
"generic-deleted": "{name} is verwijderd",
|
||||
"logged-out": ""
|
||||
},
|
||||
"datetime": {
|
||||
"year": "jaar|jaren",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} har blitt opprettet, {url}",
|
||||
"generic-updated-with-url": "{name} har blitt oppdatert, {url}",
|
||||
"generic-duplicated": "{name} har blitt duplisert",
|
||||
"generic-deleted": "{name} har blitt slettet"
|
||||
"generic-deleted": "{name} har blitt slettet",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "år|år",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "Stworzono {name}, {url}",
|
||||
"generic-updated-with-url": "Zaktualizowano {name}, {url}",
|
||||
"generic-duplicated": "Zduplikowano {name}",
|
||||
"generic-deleted": "Usunięto {name}"
|
||||
"generic-deleted": "Usunięto {name}",
|
||||
"logged-out": "Wylogowano"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "rok|lat",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} foi criado, {url}",
|
||||
"generic-updated-with-url": "{name} foi atualizado, {url}",
|
||||
"generic-duplicated": "{name} foi duplicada",
|
||||
"generic-deleted": "{name} foi excluído"
|
||||
"generic-deleted": "{name} foi excluído",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "ano|anos",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} foi criado, {url}",
|
||||
"generic-updated-with-url": "{name} foi atualizado, {url}",
|
||||
"generic-duplicated": "{name} foi duplicado",
|
||||
"generic-deleted": "{name} foi removido"
|
||||
"generic-deleted": "{name} foi removido",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "ano|anos",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} a fost creat, {url}",
|
||||
"generic-updated-with-url": "{name} a fost actualizat, {url}",
|
||||
"generic-duplicated": "{name} a fost duplicat",
|
||||
"generic-deleted": "{name} a fost șters"
|
||||
"generic-deleted": "{name} a fost șters",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "an|ani",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} был создан, {url}",
|
||||
"generic-updated-with-url": "{name} был обновлен, {url}",
|
||||
"generic-duplicated": "Копия {name} была создана",
|
||||
"generic-deleted": "{name} был удален"
|
||||
"generic-deleted": "{name} был удален",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "год|лет",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} bol vytvorený, {url}",
|
||||
"generic-updated-with-url": "{name} bol aktualizovaný, {url}",
|
||||
"generic-duplicated": "{name} bol duplikovaný",
|
||||
"generic-deleted": "{name} bol vymazaný"
|
||||
"generic-deleted": "{name} bol vymazaný",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "rok|roky",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} je bil narejen, {url}",
|
||||
"generic-updated-with-url": "{name} je bil posodobljen, {url}",
|
||||
"generic-duplicated": "{name} je bilo podvojeno",
|
||||
"generic-deleted": "{name} je bil izbrisan"
|
||||
"generic-deleted": "{name} je bil izbrisan",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "leto|let",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} је направљено, {url}",
|
||||
"generic-updated-with-url": "{name} је ажурирано, {url}",
|
||||
"generic-duplicated": "{name} је дуплиран",
|
||||
"generic-deleted": "{name} је обрисан"
|
||||
"generic-deleted": "{name} је обрисан",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "year|years",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} har skapats, {url}",
|
||||
"generic-updated-with-url": "{name} har uppdaterats, {url}",
|
||||
"generic-duplicated": "{name} har duplicerats",
|
||||
"generic-deleted": "{name} har tagits bort"
|
||||
"generic-deleted": "{name} har tagits bort",
|
||||
"logged-out": "Utloggad"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "år|år",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} oluşturuldu, {url}",
|
||||
"generic-updated-with-url": "{name} güncellendi, {url}",
|
||||
"generic-duplicated": "{name} yinelendi",
|
||||
"generic-deleted": "{name} silindi"
|
||||
"generic-deleted": "{name} silindi",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "yıl|yıl",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} створено, {url}",
|
||||
"generic-updated-with-url": "{name} оновлено, {url}",
|
||||
"generic-duplicated": "{name} дубльовано",
|
||||
"generic-deleted": "{name} видалено"
|
||||
"generic-deleted": "{name} видалено",
|
||||
"logged-out": "Вихід із системи"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "рік|роки",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} has been created, {url}",
|
||||
"generic-updated-with-url": "{name} has been updated, {url}",
|
||||
"generic-duplicated": "{name} has been duplicated",
|
||||
"generic-deleted": "{name} has been deleted"
|
||||
"generic-deleted": "{name} has been deleted",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "year|years",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} 已创建, {url}",
|
||||
"generic-updated-with-url": "{name} 已创建, {url}",
|
||||
"generic-duplicated": "{name} 已复制",
|
||||
"generic-deleted": "{name} 已删除"
|
||||
"generic-deleted": "{name} 已删除",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "年|年",
|
||||
|
||||
@@ -43,7 +43,8 @@
|
||||
"generic-created-with-url": "{name} has been created, {url}",
|
||||
"generic-updated-with-url": "{name} has been updated, {url}",
|
||||
"generic-duplicated": "{name} has been duplicated",
|
||||
"generic-deleted": "{name} has been deleted"
|
||||
"generic-deleted": "{name} has been deleted",
|
||||
"logged-out": "Logged out"
|
||||
},
|
||||
"datetime": {
|
||||
"year": "year|years",
|
||||
|
||||
@@ -695,7 +695,7 @@
|
||||
"coconut": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "coconut",
|
||||
"name": "kokosnød",
|
||||
"plural_name": "kokosnødder"
|
||||
},
|
||||
"craisin": {
|
||||
@@ -7908,8 +7908,8 @@
|
||||
"potato starch": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "potato starch",
|
||||
"plural_name": "potato starches"
|
||||
"name": "kartoffelstivelse",
|
||||
"plural_name": "kartoffelstivelse"
|
||||
},
|
||||
"jello": {
|
||||
"aliases": [],
|
||||
@@ -8040,8 +8040,8 @@
|
||||
"potato flake": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "potato flake",
|
||||
"plural_name": "potato flakes"
|
||||
"name": "kartoffel flager",
|
||||
"plural_name": "kartoffel flager"
|
||||
},
|
||||
"masa harina": {
|
||||
"aliases": [],
|
||||
@@ -8250,8 +8250,8 @@
|
||||
"potato flour": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "potato flour",
|
||||
"plural_name": "potato flours"
|
||||
"name": "kartoffelmel",
|
||||
"plural_name": "kartoffelmel"
|
||||
},
|
||||
"ready-made icing": {
|
||||
"aliases": [],
|
||||
@@ -9764,8 +9764,8 @@
|
||||
"sweet potato noodle": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "sweet potato noodle",
|
||||
"plural_name": "sweet potato noodles"
|
||||
"name": "sød kartoffel nudel",
|
||||
"plural_name": "sød kartoffel nudler"
|
||||
},
|
||||
"acini di pepe": {
|
||||
"aliases": [],
|
||||
@@ -10162,8 +10162,8 @@
|
||||
"potato chip": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "potato chip",
|
||||
"plural_name": "potato chips"
|
||||
"name": "kartoffel chip",
|
||||
"plural_name": "kartoffelchips"
|
||||
},
|
||||
"naan": {
|
||||
"aliases": [],
|
||||
@@ -10258,8 +10258,8 @@
|
||||
"potato bread": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "potato bread",
|
||||
"plural_name": "potato breads"
|
||||
"name": "kartoffel brød",
|
||||
"plural_name": "kartoffel brød"
|
||||
},
|
||||
"muffin": {
|
||||
"aliases": [],
|
||||
@@ -10348,8 +10348,8 @@
|
||||
"sweet potato fry": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "sweet potato fry",
|
||||
"plural_name": "sweet potato fries"
|
||||
"name": "sødekartoffel fritter",
|
||||
"plural_name": "sødekartoffel fritter"
|
||||
},
|
||||
"sev": {
|
||||
"aliases": [],
|
||||
@@ -10618,8 +10618,8 @@
|
||||
"potato waffle": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "potato waffle",
|
||||
"plural_name": "potato waffles"
|
||||
"name": "kartoffelvaffel",
|
||||
"plural_name": "kartoffelvafler"
|
||||
},
|
||||
"tartlet shell": {
|
||||
"aliases": [],
|
||||
@@ -12454,8 +12454,8 @@
|
||||
"canned sweet potato": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "canned sweet potato",
|
||||
"plural_name": "canned sweet potatoes"
|
||||
"name": "søde kartofel på dåse",
|
||||
"plural_name": "søde kartofler på dåse"
|
||||
},
|
||||
"canned pear": {
|
||||
"aliases": [],
|
||||
@@ -12652,8 +12652,8 @@
|
||||
"canned potato": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "canned potato",
|
||||
"plural_name": "canned potatoes"
|
||||
"name": "kartoffel på dåse",
|
||||
"plural_name": "kartofler på dåse"
|
||||
},
|
||||
"okra pickle": {
|
||||
"aliases": [],
|
||||
@@ -13466,8 +13466,8 @@
|
||||
"cream of potato": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "cream of potato",
|
||||
"plural_name": "cream of potato"
|
||||
"name": "kartoffelcreme",
|
||||
"plural_name": "kartoffelcreme"
|
||||
},
|
||||
"golden mushroom soup": {
|
||||
"aliases": [],
|
||||
@@ -13808,8 +13808,8 @@
|
||||
"potato soup mix": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "potato soup mix",
|
||||
"plural_name": "potato soup mixes"
|
||||
"name": "kartoffelsuppeblanding",
|
||||
"plural_name": "kartoffelsuppeblandinger"
|
||||
},
|
||||
"callaloo": {
|
||||
"aliases": [],
|
||||
|
||||
@@ -6012,7 +6012,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "Senfsaat",
|
||||
"plural_name": "Senfsaat"
|
||||
"plural_name": "Senfsaaten"
|
||||
},
|
||||
"white pepper": {
|
||||
"aliases": [],
|
||||
@@ -8506,8 +8506,8 @@
|
||||
"egg wrap": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "egg wrap",
|
||||
"plural_name": "egg wraps"
|
||||
"name": "Eier-Wrap",
|
||||
"plural_name": "Eier-Wraps"
|
||||
},
|
||||
"samosa sheet": {
|
||||
"aliases": [],
|
||||
@@ -8524,7 +8524,7 @@
|
||||
"brick pastry": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "brick pastry",
|
||||
"name": "Brik-Teig",
|
||||
"plural_name": "brick pastries"
|
||||
}
|
||||
}
|
||||
@@ -11527,7 +11527,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "Senf",
|
||||
"plural_name": "mustards"
|
||||
"plural_name": "Senf"
|
||||
},
|
||||
"fish sauce": {
|
||||
"aliases": [],
|
||||
@@ -11581,7 +11581,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "brown mustard",
|
||||
"plural_name": "brown mustards"
|
||||
"plural_name": "brauner Senf"
|
||||
},
|
||||
"wing sauce": {
|
||||
"aliases": [],
|
||||
@@ -11671,7 +11671,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "Honigsenf",
|
||||
"plural_name": "honey mustards"
|
||||
"plural_name": "Honigsenf"
|
||||
},
|
||||
"mango chutney": {
|
||||
"aliases": [],
|
||||
@@ -11683,7 +11683,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "english mustard",
|
||||
"plural_name": "english mustards"
|
||||
"plural_name": "englischer Senf"
|
||||
},
|
||||
"sambal oelek": {
|
||||
"aliases": [],
|
||||
@@ -16300,7 +16300,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "Maltodextrin",
|
||||
"plural_name": "maltodextrins"
|
||||
"plural_name": "Maltodextrin"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -419,8 +419,8 @@
|
||||
"corn cob": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "corn cob",
|
||||
"plural_name": "corn cobs"
|
||||
"name": "καλαμπόκι",
|
||||
"plural_name": "καλαμπόκια"
|
||||
},
|
||||
"radicchio": {
|
||||
"aliases": [],
|
||||
@@ -2063,8 +2063,8 @@
|
||||
"blue cheese": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "ροκφόρ τυρί ",
|
||||
"plural_name": "ροκφόρ τυριά"
|
||||
"name": "ροκφόρ τυρί",
|
||||
"plural_name": "ροκφόρ τυρί"
|
||||
},
|
||||
"goat cheese": {
|
||||
"aliases": [],
|
||||
@@ -2649,14 +2649,14 @@
|
||||
"yogurt": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "yogurt",
|
||||
"plural_name": "yogurts"
|
||||
"name": "γιαούρτι",
|
||||
"plural_name": "γιαούρτια"
|
||||
},
|
||||
"greek yogurt": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "greek yogurt",
|
||||
"plural_name": "greek yogurts"
|
||||
"name": "γιαούρτι",
|
||||
"plural_name": "γιαούρτια"
|
||||
},
|
||||
"cream": {
|
||||
"aliases": [],
|
||||
@@ -2819,8 +2819,8 @@
|
||||
"frozen yogurt": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "frozen yogurt",
|
||||
"plural_name": "frozen yogurts"
|
||||
"name": "παγωμένο γιαούρτι",
|
||||
"plural_name": "παγωμένα γιαούρτια"
|
||||
},
|
||||
"khoya": {
|
||||
"aliases": [],
|
||||
@@ -10444,8 +10444,8 @@
|
||||
"frozen onion ring": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "frozen onion ring",
|
||||
"plural_name": "frozen onion rings"
|
||||
"name": "κατεψυγμένο onion ring",
|
||||
"plural_name": "κατεψυγμένα onion rings"
|
||||
},
|
||||
"corn muffin": {
|
||||
"aliases": [],
|
||||
@@ -10634,7 +10634,7 @@
|
||||
"olive oil": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "olive oil",
|
||||
"name": "ελαιόλαδο",
|
||||
"plural_name": "olive oils"
|
||||
},
|
||||
"vegetable oil": {
|
||||
@@ -10646,7 +10646,7 @@
|
||||
"extra virgin olive oil": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "extra virgin olive oil",
|
||||
"name": "έξτρα παρθένο ελαιόλαδο",
|
||||
"plural_name": "extra virgin olive oils"
|
||||
},
|
||||
"canola oil": {
|
||||
@@ -12112,8 +12112,8 @@
|
||||
"green olive": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "green olive",
|
||||
"plural_name": "green olives"
|
||||
"name": "πράσινη ελιά",
|
||||
"plural_name": "πράσινες ελιές"
|
||||
},
|
||||
"canned chickpea": {
|
||||
"aliases": [],
|
||||
@@ -12124,8 +12124,8 @@
|
||||
"black olive": {
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "black olive",
|
||||
"plural_name": "black olives"
|
||||
"name": "μαύρη ελιά",
|
||||
"plural_name": "μαύρες ελιές"
|
||||
},
|
||||
"canned black bean": {
|
||||
"aliases": [],
|
||||
|
||||
@@ -5856,7 +5856,7 @@
|
||||
"aliases": [],
|
||||
"description": "",
|
||||
"name": "garlic powder",
|
||||
"plural_name": "garlic powders"
|
||||
"plural_name": "garlic powder"
|
||||
},
|
||||
"oregano": {
|
||||
"aliases": [],
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user