diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..61dcb6d
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,25 @@
+{
+ "i18n-ally.localesPaths": [
+ "frontend/src/locales"
+ ],
+ "vue-i18n.sourceLocale": "sk",
+ "vue-i18n.i18nPaths": "frontend/src/locales",
+ "i18n-ally.dirStructure": "file",
+ "i18n-ally.displayLanguage": "sk",
+ "i18n-ally.enabledFrameworks": [
+ "vue",
+ "php-gettext"
+ ],
+ "i18n-ally.enabledParsers": [
+ "json",
+ "js"
+ ],
+ "i18n-ally.extract.keyMaxLength": 128,
+ "i18n-ally.keystyle": "flat",
+ "i18n-ally.tabStyle": "tab",
+ "i18n-ally.sourceLanguage": "sk",
+ "i18n-ally.extract.autoDetect": true,
+ "i18n-ally.extract.ignoredByFiles": {
+
+ }
+}
\ No newline at end of file
diff --git a/backend/composer.lock b/backend/composer.lock
index 2ca67a6..8645494 100644
--- a/backend/composer.lock
+++ b/backend/composer.lock
@@ -8,11 +8,11 @@
"packages": [
{
"name": "tpsoft/apilite",
- "version": "v1.2.0",
+ "version": "v1.2.1",
"source": {
"type": "git",
"url": "https://gitea.tpsoft.org/TPsoft.org/APIlite.git",
- "reference": "d258bcc91948424711dd79fde57254e1384d0091"
+ "reference": "951fe36da3184bf29398a067f2218af768e5d280"
},
"require": {
"php": ">=8.2"
@@ -53,7 +53,7 @@
"type": "other"
}
],
- "time": "2026-02-13T08:54:08+00:00"
+ "time": "2026-02-14T05:28:03+00:00"
},
{
"name": "tpsoft/dbmodel",
diff --git a/doc/prompt.txt b/doc/prompt.txt
new file mode 100644
index 0000000..4f941dd
--- /dev/null
+++ b/doc/prompt.txt
@@ -0,0 +1,39 @@
+----- 2026-02-14 05:35:18 -----------------------------------------------------
+Si senior Vue 3 + TypeScript architekt. Robím aplikáciu Nutrio (nutrition tracker).
+Backend API v PHP je hotové. Frontend má zatiaľ iba login obrazovku, kde sa pri prihlásení automaticky zaregistruje používateľ.
+Po prihlásení chcem vnútornú časť aplikácie (authenticated area) s jednoduchým, čistým SaaS dizajnom.
+
+Ciele:
+1) Navrhni routing štruktúru (Vue Router) pre verejnú časť (login) a privátnu časť (app), vrátane guards.
+2) Navrhni layouty:
+ - AuthLayout (pre login) uz je spraveny v frontend\src\views\AuthView.vue
+ - AppLayout (sidebar na desktope, bottom tabs na mobile; aspoň navrhni komponentovú štruktúru)
+3) Navrhni pages a komponenty pre minimálne:
+ - Today (diár pre konkrétny deň): raňajky/obed/večera; výber jedálnička pre čas dňa; zobrazenie súčtov (kcal, B/S/T)
+ - Meals (knižnica jedálničkov): list + filter podľa meal_type; detail/edit jedálnička s položkami (ingredient + grams)
+ - Ingredients (databáza surovín): list + create/edit
+ - Stats (základný prehľad; môže byť placeholder)
+ - Settings (logout)
+4) Výpočty totals nerobím cez SQL VIEW – počítaj ich na FE pri zobrazení (alebo cez 1 jednoduchú helper funkciu).
+ Makrá sú uložené na 100g: protein_g_100, carbs_g_100, sugar_g_100, fat_g_100, fiber_g_100.
+ Pre položku s grams: macro = grams/100 * macro_100.
+ kcal = protein*4 + carbs*4 + fat*9. (Sugar je podmnožina carbs, neráta sa zvlášť do kcal.)
+5) Navrhni štruktúru projektu:
+ - /src/router
+ - /src/views
+ - /src/components
+ - /src/stores (Pinia)
+ - /src/utils (nutrition math)
+6) Daj konkrétny návrh názvov súborov a exportov + ukážku kódu:
+ - router index.ts s routes + guard
+ - auth store (token/user)
+ - nutrition utils (computeMealTotals, computeDayTotals)
+ - typy (Ingredient, Meal, MealItem, DiaryEntry)
+
+Preferencie:
+- Vue 3 + Composition API + TypeScript
+- Pinia
+- Vue Router
+- UI môže byť čisté bez knižnice, alebo minimalisticky (napr. jednoduché CSS/Tailwind – rozhodni a drž konzistentne).
+- Použi slovenské názvy v UI (Raňajky, Obed, Večera), ale kľúče v kóde nech sú anglické (breakfast/lunch/dinner).
+Výstup: konkrétny návrh + ukážky kódu, nie všeobecné rady.
diff --git a/frontend/.vscode/extensions.json b/frontend/.vscode/extensions.json
new file mode 100644
index 0000000..3f84126
--- /dev/null
+++ b/frontend/.vscode/extensions.json
@@ -0,0 +1,9 @@
+{
+ "recommendations": [
+ "Vue.volar",
+ "dbaeumer.vscode-eslint",
+ "EditorConfig.EditorConfig",
+ "oxc.oxc-vscode",
+ "esbenp.prettier-vscode"
+ ]
+}
diff --git a/frontend/index.html b/frontend/index.html
index 9e5fc8f..cc7a837 100644
--- a/frontend/index.html
+++ b/frontend/index.html
@@ -4,7 +4,7 @@
-
Vite App
+ Nutrio
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 665f4d8..8d7dac2 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "nutrio",
- "version": "0.0.0",
+ "version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "nutrio",
- "version": "0.0.0",
+ "version": "0.1.0",
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^7.2.0",
"@fortawesome/free-solid-svg-icons": "^7.2.0",
@@ -2292,13 +2292,10 @@
}
},
"node_modules/@vue/devtools-api": {
- "version": "8.0.6",
- "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.0.6.tgz",
- "integrity": "sha512-+lGBI+WTvJmnU2FZqHhEB8J1DXcvNlDeEalz77iYgOdY1jTj1ipSBaKj3sRhYcy+kqA8v/BSuvOz1XJucfQmUA==",
- "license": "MIT",
- "dependencies": {
- "@vue/devtools-kit": "^8.0.6"
- }
+ "version": "6.6.4",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
+ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
+ "license": "MIT"
},
"node_modules/@vue/devtools-core": {
"version": "8.0.6",
@@ -5128,16 +5125,16 @@
}
},
"node_modules/vue-eslint-parser": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz",
- "integrity": "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw==",
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-10.4.0.tgz",
+ "integrity": "sha512-Vxi9pJdbN3ZnVGLODVtZ7y4Y2kzAAE2Cm0CZ3ZDRvydVYxZ6VrnBhLikBsRS+dpwj4Jv4UCv21PTEwF5rQ9WXg==",
"dev": true,
"license": "MIT",
"dependencies": {
"debug": "^4.4.0",
- "eslint-scope": "^8.2.0",
- "eslint-visitor-keys": "^4.2.0",
- "espree": "^10.3.0",
+ "eslint-scope": "^8.2.0 || ^9.0.0",
+ "eslint-visitor-keys": "^4.2.0 || ^5.0.0",
+ "espree": "^10.3.0 || ^11.0.0",
"esquery": "^1.6.0",
"semver": "^7.6.3"
},
@@ -5148,17 +5145,17 @@
"url": "https://github.com/sponsors/mysticatea"
},
"peerDependencies": {
- "eslint": "^8.57.0 || ^9.0.0"
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0"
}
},
"node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
- "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz",
+ "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==",
"dev": true,
"license": "Apache-2.0",
"engines": {
- "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
"url": "https://opencollective.com/eslint"
@@ -5184,12 +5181,6 @@
"vue": "^3.0.0"
}
},
- "node_modules/vue-i18n/node_modules/@vue/devtools-api": {
- "version": "6.6.4",
- "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz",
- "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==",
- "license": "MIT"
- },
"node_modules/vue-router": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-5.0.2.tgz",
@@ -5235,6 +5226,15 @@
}
}
},
+ "node_modules/vue-router/node_modules/@vue/devtools-api": {
+ "version": "8.0.6",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-8.0.6.tgz",
+ "integrity": "sha512-+lGBI+WTvJmnU2FZqHhEB8J1DXcvNlDeEalz77iYgOdY1jTj1ipSBaKj3sRhYcy+kqA8v/BSuvOz1XJucfQmUA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-kit": "^8.0.6"
+ }
+ },
"node_modules/vue-router/node_modules/picomatch": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index 5de74f6..23795d0 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,6 +1,6 @@
{
"name": "nutrio",
- "version": "0.0.0",
+ "version": "0.1.0",
"private": true,
"type": "module",
"scripts": {
diff --git a/frontend/src/BackendAPI.ts b/frontend/src/BackendAPI.ts
index b818d97..2b2f5bb 100644
--- a/frontend/src/BackendAPI.ts
+++ b/frontend/src/BackendAPI.ts
@@ -2,11 +2,12 @@
* Generated by APIlite
* https://gitea.tpsoft.org/TPsoft.org/APIlite
*
- * 2026-02-13 10:00:58 */
+ * 2026-02-14 06:30:12 */
export interface APIliteActionResponse {
status: 'OK';
data: T;
+ msg: string;
}
export interface APIliteErrorResponse {
@@ -36,6 +37,9 @@ export interface APIliteHelpResponse {
javascript_version: string;
typescript_version: string;
actions: APIliteMethodDoc[];
+ status: string;
+ data: string;
+ msg: string;
}
class BackendAPI {
diff --git a/frontend/src/i18n/index.ts b/frontend/src/i18n/index.ts
index 75c4a02..f3cb687 100644
--- a/frontend/src/i18n/index.ts
+++ b/frontend/src/i18n/index.ts
@@ -1,10 +1,10 @@
import { createI18n } from 'vue-i18n'
-import cs from '@/locales/cs'
-import de from '@/locales/de'
-import en from '@/locales/en'
-import es from '@/locales/es'
-import sk from '@/locales/sk'
+import cs from '@/locales/cs.json'
+import de from '@/locales/de.json'
+import en from '@/locales/en.json'
+import es from '@/locales/es.json'
+import sk from '@/locales/sk.json'
export const SUPPORTED_LOCALES = ['sk', 'cs', 'en', 'es', 'de'] as const
export type AppLocale = (typeof SUPPORTED_LOCALES)[number]
@@ -12,33 +12,33 @@ export type AppLocale = (typeof SUPPORTED_LOCALES)[number]
const fallbackLocale: AppLocale = 'sk'
const isSupportedLocale = (value: string | null): value is AppLocale => {
- return value !== null && SUPPORTED_LOCALES.includes(value as AppLocale)
+ return value !== null && SUPPORTED_LOCALES.includes(value as AppLocale)
}
const browserLocale = navigator.language.slice(0, 2).toLowerCase()
const storedLocale = localStorage.getItem('locale')
const locale: AppLocale = isSupportedLocale(storedLocale)
- ? storedLocale
- : isSupportedLocale(browserLocale)
- ? browserLocale
- : fallbackLocale
+ ? storedLocale
+ : isSupportedLocale(browserLocale)
+ ? browserLocale
+ : fallbackLocale
if (!isSupportedLocale(storedLocale) || storedLocale !== locale) {
- localStorage.setItem('locale', locale)
+ localStorage.setItem('locale', locale)
}
const i18n = createI18n({
- legacy: false,
- locale,
- fallbackLocale,
- messages: {
- sk,
- cs,
- en,
- es,
- de,
- },
+ legacy: false,
+ locale,
+ fallbackLocale,
+ messages: {
+ sk,
+ cs,
+ en,
+ es,
+ de,
+ },
})
export default i18n
diff --git a/frontend/src/locales/cs.json b/frontend/src/locales/cs.json
new file mode 100644
index 0000000..bb481e7
--- /dev/null
+++ b/frontend/src/locales/cs.json
@@ -0,0 +1,41 @@
+{
+ "app": {
+ "name": "Nutrio",
+ "slogan": "Plánování jídel, výživa a denní přehled na jednom místě."
+ },
+ "auth": {
+ "title": "Přihlášení",
+ "subtitle": "Použij e-mail a heslo. Pokud účet neexistuje, vytvoří se automaticky.",
+ "emailLabel": "E-mail",
+ "emailPlaceholder": "např. jméno{'@'}domena.cz",
+ "passwordLabel": "Heslo",
+ "passwordPlaceholder": "Zadej heslo",
+ "submit": "Přihlásit se",
+ "submitting": "Zpracovávám...",
+ "helper": "Po úspěšném přihlášení bude token uložen do prohlížeče.",
+ "tokenSaved": "Token byl uložen.",
+ "successLoggedIn": "Přihlášení bylo úspěšné.",
+ "successAutoRegistered": "Účet neexistoval, byl vytvořen a uživatel je přihlášen.",
+ "themeToggle": "Přepnout režim",
+ "languageLabel": "Jazyk",
+ "showPassword": "Zobrazit heslo",
+ "hidePassword": "Skrýt heslo",
+ "errors": {
+ "invalidEmail": "Zadej platný email.",
+ "passwordRequired": "Zadej heslo.",
+ "invalidCredentials": "Email nebo heslo nejsou správně.",
+ "loginFailed": "Přihlášení selhalo. Zkus to znovu."
+ }
+ },
+ "theme": {
+ "light": "Světlý režim",
+ "dark": "Tmavý režim"
+ },
+ "locale": {
+ "sk": "Slovenština",
+ "cs": "Čeština",
+ "en": "Angličtina",
+ "es": "Španělština",
+ "de": "Němčina"
+ }
+}
diff --git a/frontend/src/locales/cs.ts b/frontend/src/locales/cs.ts
deleted file mode 100644
index 06be5ba..0000000
--- a/frontend/src/locales/cs.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-const cs = {
- app: {
- name: 'Nutrio',
- slogan: 'Planovani jidel, vyziva a denni prehled na jednom miste.',
- },
- auth: {
- title: 'Prihlaseni',
- subtitle: 'Pouzij email a heslo. Pokud ucet neexistuje, vytvori se automaticky.',
- emailLabel: 'E-mail',
- emailPlaceholder: "napr. jmeno{'@'}domena.cz",
- passwordLabel: 'Heslo',
- passwordPlaceholder: 'Zadej heslo',
- submit: 'Prihlasit se',
- submitting: 'Zpracovavam...',
- helper: 'Po uspesnem prihlaseni bude token ulozen do prohlizece.',
- tokenSaved: 'Token byl ulozen.',
- successLoggedIn: 'Prihlaseni bylo uspesne.',
- successAutoRegistered: 'Ucet neexistoval, byl vytvoren a uzivatel je prihlasen.',
- themeToggle: 'Prepnout rezim',
- languageLabel: 'Jazyk',
- showPassword: 'Zobrazit heslo',
- hidePassword: 'Skryt heslo',
- errors: {
- invalidEmail: 'Zadej platny email.',
- passwordRequired: 'Zadej heslo.',
- invalidCredentials: 'Email nebo heslo nejsou spravne.',
- loginFailed: 'Prihlaseni selhalo. Zkus to znovu.',
- },
- },
- theme: {
- light: 'Svetly rezim',
- dark: 'Tmavy rezim',
- },
- locale: {
- sk: 'Slovenstina',
- cs: 'Cestina',
- en: 'Anglictina',
- es: 'Spanelstina',
- de: 'Nemcina',
- },
-}
-
-export default cs
diff --git a/frontend/src/locales/de.json b/frontend/src/locales/de.json
new file mode 100644
index 0000000..7849bce
--- /dev/null
+++ b/frontend/src/locales/de.json
@@ -0,0 +1,41 @@
+{
+ "app": {
+ "name": "Nutrio",
+ "slogan": "Mahlzeitenplanung, Ernährung und Tagesübersicht an einem Ort."
+ },
+ "auth": {
+ "title": "Anmelden",
+ "subtitle": "Nutze E-Mail und Passwort. Wenn das Konto nicht existiert, wird es automatisch erstellt.",
+ "emailLabel": "E-Mail",
+ "emailPlaceholder": "z. B. name{'@'}domain.de",
+ "passwordLabel": "Passwort",
+ "passwordPlaceholder": "Passwort eingeben",
+ "submit": "Anmelden",
+ "submitting": "Wird verarbeitet...",
+ "helper": "Nach erfolgreicher Anmeldung wird das Token im Browser gespeichert.",
+ "tokenSaved": "Token wurde gespeichert.",
+ "successLoggedIn": "Anmeldung war erfolgreich.",
+ "successAutoRegistered": "Konto war nicht vorhanden, wurde erstellt und der Benutzer ist nun angemeldet.",
+ "themeToggle": "Modus wechseln",
+ "languageLabel": "Sprache",
+ "showPassword": "Passwort anzeigen",
+ "hidePassword": "Passwort verbergen",
+ "errors": {
+ "invalidEmail": "Gib eine gültige E-Mail-Adresse ein.",
+ "passwordRequired": "Passwort eingeben.",
+ "invalidCredentials": "E-Mail oder Passwort ist falsch.",
+ "loginFailed": "Anmeldung fehlgeschlagen. Bitte versuche es erneut."
+ }
+ },
+ "theme": {
+ "light": "Heller Modus",
+ "dark": "Dunkler Modus"
+ },
+ "locale": {
+ "sk": "Slowakisch",
+ "cs": "Tschechisch",
+ "en": "Englisch",
+ "es": "Spanisch",
+ "de": "Deutsch"
+ }
+}
diff --git a/frontend/src/locales/de.ts b/frontend/src/locales/de.ts
deleted file mode 100644
index 96bc9fb..0000000
--- a/frontend/src/locales/de.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-const de = {
- app: {
- name: 'Nutrio',
- slogan: 'Mahlzeitenplanung, Ernahrung und Tagesubersicht an einem Ort.',
- },
- auth: {
- title: 'Anmelden',
- subtitle: 'Nutze E-Mail und Passwort. Wenn das Konto nicht existiert, wird es automatisch erstellt.',
- emailLabel: 'E-Mail',
- emailPlaceholder: "z. B. name{'@'}domain.de",
- passwordLabel: 'Passwort',
- passwordPlaceholder: 'Passwort eingeben',
- submit: 'Anmelden',
- submitting: 'Wird verarbeitet...',
- helper: 'Nach erfolgreicher Anmeldung wird das Token im Browser gespeichert.',
- tokenSaved: 'Token wurde gespeichert.',
- successLoggedIn: 'Anmeldung war erfolgreich.',
- successAutoRegistered: 'Konto war nicht vorhanden, wurde erstellt und der Benutzer ist nun angemeldet.',
- themeToggle: 'Modus wechseln',
- languageLabel: 'Sprache',
- showPassword: 'Passwort anzeigen',
- hidePassword: 'Passwort verbergen',
- errors: {
- invalidEmail: 'Gib eine gueltige E-Mail-Adresse ein.',
- passwordRequired: 'Passwort eingeben.',
- invalidCredentials: 'E-Mail oder Passwort ist falsch.',
- loginFailed: 'Anmeldung fehlgeschlagen. Bitte versuche es erneut.',
- },
- },
- theme: {
- light: 'Heller Modus',
- dark: 'Dunkler Modus',
- },
- locale: {
- sk: 'Slowakisch',
- cs: 'Tschechisch',
- en: 'Englisch',
- es: 'Spanisch',
- de: 'Deutsch',
- },
-}
-
-export default de
diff --git a/frontend/src/locales/en.json b/frontend/src/locales/en.json
new file mode 100644
index 0000000..d9622f6
--- /dev/null
+++ b/frontend/src/locales/en.json
@@ -0,0 +1,41 @@
+{
+ "app": {
+ "name": "Nutrio",
+ "slogan": "Meal planning, nutrition, and daily totals in one place."
+ },
+ "auth": {
+ "title": "Sign in",
+ "subtitle": "Use your email and password. If the account does not exist, it will be created automatically.",
+ "emailLabel": "Email",
+ "emailPlaceholder": "e.g. name{'@'}domain.com",
+ "passwordLabel": "Password",
+ "passwordPlaceholder": "Enter password",
+ "submit": "Sign in",
+ "submitting": "Processing...",
+ "helper": "After successful sign-in, the token will be stored in your browser.",
+ "tokenSaved": "Token was saved.",
+ "successLoggedIn": "Sign-in was successful.",
+ "successAutoRegistered": "Account did not exist, it was created and the user is now signed in.",
+ "themeToggle": "Toggle mode",
+ "languageLabel": "Language",
+ "showPassword": "Show password",
+ "hidePassword": "Hide password",
+ "errors": {
+ "invalidEmail": "Enter a valid email address.",
+ "passwordRequired": "Enter password.",
+ "invalidCredentials": "Email or password is incorrect.",
+ "loginFailed": "Sign-in failed. Please try again."
+ }
+ },
+ "theme": {
+ "light": "Light mode",
+ "dark": "Dark mode"
+ },
+ "locale": {
+ "sk": "Slovak",
+ "cs": "Czech",
+ "en": "English",
+ "es": "Spanish",
+ "de": "German"
+ }
+}
diff --git a/frontend/src/locales/en.ts b/frontend/src/locales/en.ts
deleted file mode 100644
index 9988cce..0000000
--- a/frontend/src/locales/en.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-const en = {
- app: {
- name: 'Nutrio',
- slogan: 'Meal planning, nutrition, and daily totals in one place.',
- },
- auth: {
- title: 'Sign in',
- subtitle: 'Use your email and password. If the account does not exist, it will be created automatically.',
- emailLabel: 'Email',
- emailPlaceholder: "e.g. name{'@'}domain.com",
- passwordLabel: 'Password',
- passwordPlaceholder: 'Enter password',
- submit: 'Sign in',
- submitting: 'Processing...',
- helper: 'After successful sign-in, the token will be stored in your browser.',
- tokenSaved: 'Token was saved.',
- successLoggedIn: 'Sign-in was successful.',
- successAutoRegistered: 'Account did not exist, it was created and the user is now signed in.',
- themeToggle: 'Toggle mode',
- languageLabel: 'Language',
- showPassword: 'Show password',
- hidePassword: 'Hide password',
- errors: {
- invalidEmail: 'Enter a valid email address.',
- passwordRequired: 'Enter password.',
- invalidCredentials: 'Email or password is incorrect.',
- loginFailed: 'Sign-in failed. Please try again.',
- },
- },
- theme: {
- light: 'Light mode',
- dark: 'Dark mode',
- },
- locale: {
- sk: 'Slovak',
- cs: 'Czech',
- en: 'English',
- es: 'Spanish',
- de: 'German',
- },
-}
-
-export default en
diff --git a/frontend/src/locales/es.json b/frontend/src/locales/es.json
new file mode 100644
index 0000000..62f194b
--- /dev/null
+++ b/frontend/src/locales/es.json
@@ -0,0 +1,41 @@
+{
+ "app": {
+ "name": "Nutrio",
+ "slogan": "Planificación de comidas, nutrición y resumen diario en un solo lugar."
+ },
+ "auth": {
+ "title": "Iniciar sesión",
+ "subtitle": "Usa correo y contraseña. Si la cuenta no existe, se creará automáticamente.",
+ "emailLabel": "Correo",
+ "emailPlaceholder": "p. ej. nombre{'@'}dominio.es",
+ "passwordLabel": "Contraseña",
+ "passwordPlaceholder": "Introduce la contraseña",
+ "submit": "Iniciar sesión",
+ "submitting": "Procesando...",
+ "helper": "Tras iniciar sesión correctamente, el token se guardará en el navegador.",
+ "tokenSaved": "El token se ha guardado.",
+ "successLoggedIn": "Inicio de sesión correcto.",
+ "successAutoRegistered": "La cuenta no existía, se creó y el usuario ha iniciado sesión.",
+ "themeToggle": "Cambiar modo",
+ "languageLabel": "Idioma",
+ "showPassword": "Mostrar contraseña",
+ "hidePassword": "Ocultar contraseña",
+ "errors": {
+ "invalidEmail": "Introduce un correo válido.",
+ "passwordRequired": "Introduce la contraseña.",
+ "invalidCredentials": "El correo o la contraseña son incorrectos.",
+ "loginFailed": "El inicio de sesión falló. Inténtalo de nuevo."
+ }
+ },
+ "theme": {
+ "light": "Modo claro",
+ "dark": "Modo oscuro"
+ },
+ "locale": {
+ "sk": "Eslovaco",
+ "cs": "Checo",
+ "en": "Inglés",
+ "es": "Español",
+ "de": "Alemán"
+ }
+}
diff --git a/frontend/src/locales/es.ts b/frontend/src/locales/es.ts
deleted file mode 100644
index 203300f..0000000
--- a/frontend/src/locales/es.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-const es = {
- app: {
- name: 'Nutrio',
- slogan: 'Planificacion de comidas, nutricion y resumen diario en un solo lugar.',
- },
- auth: {
- title: 'Iniciar sesion',
- subtitle: 'Usa correo y contrasena. Si la cuenta no existe, se creara automaticamente.',
- emailLabel: 'Correo',
- emailPlaceholder: "p. ej. nombre{'@'}dominio.es",
- passwordLabel: 'Contrasena',
- passwordPlaceholder: 'Introduce la contrasena',
- submit: 'Iniciar sesion',
- submitting: 'Procesando...',
- helper: 'Tras iniciar sesion correctamente, el token se guardara en el navegador.',
- tokenSaved: 'El token se ha guardado.',
- successLoggedIn: 'Inicio de sesion correcto.',
- successAutoRegistered: 'La cuenta no existia, se creo y el usuario ha iniciado sesion.',
- themeToggle: 'Cambiar modo',
- languageLabel: 'Idioma',
- showPassword: 'Mostrar contrasena',
- hidePassword: 'Ocultar contrasena',
- errors: {
- invalidEmail: 'Introduce un correo valido.',
- passwordRequired: 'Introduce la contrasena.',
- invalidCredentials: 'El correo o la contrasena son incorrectos.',
- loginFailed: 'El inicio de sesion fallo. Intentalo de nuevo.',
- },
- },
- theme: {
- light: 'Modo claro',
- dark: 'Modo oscuro',
- },
- locale: {
- sk: 'Eslovaco',
- cs: 'Checo',
- en: 'Ingles',
- es: 'Espanol',
- de: 'Aleman',
- },
-}
-
-export default es
diff --git a/frontend/src/locales/sk.json b/frontend/src/locales/sk.json
new file mode 100644
index 0000000..458a0db
--- /dev/null
+++ b/frontend/src/locales/sk.json
@@ -0,0 +1,41 @@
+{
+ "app": {
+ "name": "Nutrio",
+ "slogan": "Plánovanie jedál, výživa a denný prehľad na jednom mieste."
+ },
+ "auth": {
+ "title": "Prihlásenie",
+ "subtitle": "Použi email a heslo. Ak účet neexistuje, vytvorí sa automaticky.",
+ "emailLabel": "Email",
+ "emailPlaceholder": "napr. meno{'@'}domena.sk",
+ "passwordLabel": "Heslo",
+ "passwordPlaceholder": "Zadaj heslo",
+ "submit": "Prihlásiť sa",
+ "submitting": "Spracúvam...",
+ "helper": "Po úspešnom prihlásení bude token uložený do prehliadača.",
+ "tokenSaved": "Token bol uložený.",
+ "successLoggedIn": "Prihlásenie bolo úspešné.",
+ "successAutoRegistered": "Účet neexistoval, bol vytvorený a používateľ je prihlásený.",
+ "themeToggle": "Prepnúť režim",
+ "languageLabel": "Jazyk",
+ "showPassword": "Zobraziť heslo",
+ "hidePassword": "Skryť heslo",
+ "errors": {
+ "invalidEmail": "Zadaj platný email.",
+ "passwordRequired": "Zadaj heslo.",
+ "invalidCredentials": "Email alebo heslo nie sú správne.",
+ "loginFailed": "Prihlásenie zlyhalo. Skús to znova."
+ }
+ },
+ "theme": {
+ "light": "Svetlý režim",
+ "dark": "Tmavý režim"
+ },
+ "locale": {
+ "sk": "Slovenčina",
+ "cs": "Čeština",
+ "en": "Angličtina",
+ "es": "Španielčina",
+ "de": "Nemčina"
+ }
+}
diff --git a/frontend/src/locales/sk.ts b/frontend/src/locales/sk.ts
deleted file mode 100644
index e0f3917..0000000
--- a/frontend/src/locales/sk.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-const sk = {
- app: {
- name: 'Nutrio',
- slogan: 'Plánovanie jedál, výživa a denný prehľad na jednom mieste.',
- },
- auth: {
- title: 'Prihlásenie',
- subtitle: 'Použi email a heslo. Ak účet neexistuje, vytvorí sa automaticky.',
- emailLabel: 'Email',
- emailPlaceholder: "napr. meno{'@'}domena.sk",
- passwordLabel: 'Heslo',
- passwordPlaceholder: 'Zadaj heslo',
- submit: 'Prihlásiť sa',
- submitting: 'Spracúvam...',
- helper: 'Po úspešnom prihlásení bude token uložený do prehliadača.',
- tokenSaved: 'Token bol uložený.',
- successLoggedIn: 'Prihlásenie bolo úspešné.',
- successAutoRegistered: 'Účet neexistoval, bol vytvorený a používateľ je prihlásený.',
- themeToggle: 'Prepnúť režim',
- languageLabel: 'Jazyk',
- showPassword: 'Zobraziť heslo',
- hidePassword: 'Skryť heslo',
- errors: {
- invalidEmail: 'Zadaj platný email.',
- passwordRequired: 'Zadaj heslo.',
- invalidCredentials: 'Email alebo heslo nie sú správne.',
- loginFailed: 'Prihlásenie zlyhalo. Skús to znova.',
- },
- },
- theme: {
- light: 'Svetlý režim',
- dark: 'Tmavý režim',
- },
- locale: {
- sk: 'Slovenčina',
- cs: 'Čeština',
- en: 'Angličtina',
- es: 'Španielčina',
- de: 'Nemčina',
- },
-}
-
-export default sk
diff --git a/frontend/src/views/AuthView.vue b/frontend/src/views/AuthView.vue
index 045586b..83c1cc1 100644
--- a/frontend/src/views/AuthView.vue
+++ b/frontend/src/views/AuthView.vue
@@ -140,7 +140,7 @@ const submitForm = async () => {
}
localStorage.setItem('user_email', userEmail)
- successMessage.value = response.auto_registered
+ successMessage.value = response.data?.auto_registered
? t('auth.successAutoRegistered')
: t('auth.successLoggedIn')