# 🌐 Admin i18n Audit & ÚjrastrukturĂĄlĂĄsi Javaslat **DĂĄtum:** 2026-06-30 **KĂ©szĂ­tette:** Rendszer-Architect **VerziĂł:** 1.0 **CĂ©l:** Admin felĂŒlet nyelvi moduljainak teljes körƱ felmĂ©rĂ©se, központi nyelvi ĂĄllomĂĄny kialakĂ­tĂĄsa, oldalakra bontĂĄsi terv, többnyelvƱ (dropdown) nyelvvĂĄlasztĂł bevezetĂ©se --- ## 1. Jelenlegi Helyzet (As-Is) ### 1.1 HĂĄrom teljesen elkĂŒlönĂŒlƑ i18n rendszer | Rendszer | Hely | FormĂĄtum | FĂĄjlok | Össz. kulcs | Nyelvek | |----------|------|----------|--------|-------------|---------| | **Backend** | `backend/static/locales/` | Nested JSON (UPPER_SNAKE) | 2 db | ~130 sor/fĂĄjl | hu, en | | **Frontend Admin** | `frontend_admin/i18n/locales/` | Nested JSON (camelCase) | 2 db | ~800-900 sor/fĂĄjl | hu, en | | **Frontend Old (src)** | `frontend/src/i18n/` (korĂĄbbi) | TS objektum | 6 db | ~1600 sor/fĂĄjl | hu, en, de, ro, cz, sk | > **⚠ A backend Ă©s a frontend rendszerek teljesen fĂŒggetlenek.** MĂĄs kulcs-sĂ©mĂĄt hasznĂĄlnak (dot-notation vs UPPER_SNAKE_CASE), Ă­gy közöttĂŒk NINCS kulcs-megosztĂĄs. ### 1.2 Frontend Admin jelenlegi struktĂșrĂĄja ``` frontend_admin/i18n/locales/ ├── en.json (902 sor / ~700 kulcs) └── hu.json (804 sor / ~650 kulcs) ``` GyökĂ©r-szekciĂłk a JSON-ben: - `permissions` (~29 kulcs) - `packages` (~67 kulcs) - `garages` → `garages.details`, `garages.analytics`, `garages.employees`, `garages.fleet` (~180 kulcs) - `gamification` → `gamification.badges`, `.competitions`, `.config`, `.dashboard`, `.leaderboard`, `.ledger`, `.levels`, `.params`, `.point_rules`, `.seasons`, `.users`, `.user_detail` (~410 kulcs) - `providers` (~85 kulcs) - `users` → `users.details` (~98 kulcs) ### 1.3 Admin oldalak lekĂ©pezĂ©se (Pages ↔ i18n szekciĂłk) | Oldal (Vue fĂĄjl) | i18n SzekciĂł | KulcsszĂĄm | |-----------------|-------------|-----------| | `/` (index.vue) | — | — (dashboard nincs lefordĂ­tva) | | `/permissions/` | `permissions.*` | ~29 | | `/packages/` | `packages.*` | ~67 | | `/garages/` + `garages/[id]/` | `garages.*`, `garages.details.*`, `garages.analytics.*`, `garages.employees.*`, `garages.fleet.*` | ~180 | | `/gamification/` (index) | `gamification.dashboard.*` | ~25 | | `/gamification/badges` | `gamification.badges.*` | ~35 | | `/gamification/competitions` | `gamification.competitions.*` | ~40 | | `/gamification/config` | `gamification.config.*` | ~25 | | `/gamification/leaderboard` | `gamification.leaderboard.*` | ~40 | | `/gamification/ledger` | `gamification.ledger.*` | ~30 | | `/gamification/levels` | `gamification.levels.*` | ~35 | | `/gamification/params` | `gamification.params.*` | ~25 | | `/gamification/point-rules` | `gamification.point_rules.*` | ~40 | | `/gamification/seasons` | `gamification.seasons.*` | ~30 | | `/gamification/users/` + `[id]` | `gamification.users.*`, `gamification.user_detail.*` | ~40+50 | | `/providers/` + `[id]` | `providers.*` | ~85 | | `/users/` + `[id]` | `users.*`, `users.details.*` | ~98 | --- ## 2. FeltĂĄrt ProblĂ©mĂĄk ### 2.1 HiĂĄnyzĂł központi (common/global) nyelvi szekciĂł Jelenleg **NINCS** `common` vagy `global` szekciĂł az admin i18n-ben. Minden ĂĄltalĂĄnos UI mƱvelet (MentĂ©s, MĂ©gse, TörlĂ©s, SzerkesztĂ©s, BetöltĂ©s, Hiba) szekciĂłnkĂ©nt DUPLIKÁLVA van. ### 2.2 MasszĂ­v kulcs-duplikĂĄciĂł A `docs/i18n_duplicate_key_analysis.md` ĂĄltal feltĂĄrt frontend duplikĂĄciĂłk az adminban is jelen vannak. PĂ©ldĂĄk a `frontend_admin` fĂĄjlokbĂłl: | Kulcs (EN) | ElƑfordulĂĄsok szĂĄma | HU fordĂ­tĂĄs | |-----------|-------------------|-------------| | `cancel` | **9+** (permissions, packages, garages.employees, gamification.badges, competitions, levels, params, point_rules, seasons, providers) | "MĂ©gse" | | `save` | **10+** (permissions, packages.details, garages.*, gamification.*, providers, users.details) | "MentĂ©s" | | `loading` | **15+** (minden CRUD szekciĂł) | "BetöltĂ©s..." | | `error` | **10+** (minden CRUD szekciĂł) | "Nem sikerĂŒlt..." | | `retry` | **10+** | "Újra" / "ÚjraprĂłbĂĄlkozĂĄs" (kĂ©t vĂĄltozat!) | | `edit` | **8+** | "SzerkesztĂ©s" | | `delete` | **6+** | "TörlĂ©s" | | `actions` | **6+** | "MƱveletek" | | `no_items` / `no_results` | **8+** | "Nincs..." | | `status` | **6+** | "StĂĄtusz" | | `save_error` | **8+** | "Hiba törtĂ©nt..." | ### 2.3 HU oldalon inkonzisztens fordĂ­tĂĄsok - `retry`: hol "Újra" (`permissions.retry`, `packages.retry`), hol "ÚjraprĂłbĂĄlkozĂĄs" (`gamification.badges.retry`) - `cancel`: hol "MĂ©gse" (többnyire), de van ahol nincs következetesen - `save_success` vs `updated` vs `created`: eltĂ©rƑ sablonok ### 2.4 Csak 2 nyelv tĂĄmogatott az adminban A `nuxt.config.ts` i18n beĂĄllĂ­tĂĄsaiban csak `hu` Ă©s `en` szerepel: ```typescript locales: [ { code: 'hu', iso: 'hu-HU', file: 'hu.json', name: 'Magyar' }, { code: 'en', iso: 'en-GB', file: 'en.json', name: 'English' }, ] ``` A `frontend_old` LanguageSwitcher mĂĄr 4 nyelvet tĂĄmogat (hu, en, de, fr). ElƑzƑ audit szerint a korĂĄbbi `frontend/src/i18n/` is tartalmazott rĂ©szleges de, ro, cz, sk fordĂ­tĂĄsokat. ### 2.5 NyelvvĂĄlasztĂł jelenleg kĂ©tĂĄllĂĄsĂș kapcsolĂł A `frontend_admin/layouts/default.vue` topbar-jĂĄban a nyelvvĂĄlasztĂł **kĂ©t gomb** (HU / EN), nem pedig egy legördĂŒlƑ menĂŒ. Ez nem skĂĄlĂĄzhatĂł 3+ nyelv esetĂ©n. ### 2.6 Backend i18n aszimmetria - A `backend/static/locales/hu.json` (83 sor) Ă©s `en.json` (76 sor) között eltĂ©rĂ©s van a kulcsok szĂĄmĂĄban (pl. `SENTINEL.APPROVAL.REQUIRED` EN: "Approval required", HU-ban hosszabb) - Backend hiĂĄnyzik: nĂ©met Ă©s mĂĄs nyelvƱ backend fordĂ­tĂĄsok --- ## 3. Javasolt MegoldĂĄs (To-Be) ### 3.1 Központi/globĂĄlis nyelvi ĂĄllomĂĄny (`common`) **LĂ©trehozandĂł:** Ășj `common` gyökĂ©r-szekciĂł mindkĂ©t fĂĄjlban Tartalma (javasolt kulcsok): ```json { "common": { "save": "MentĂ©s", "saving": "MentĂ©s...", "cancel": "MĂ©gse", "confirm": "MegerƑsĂ­tĂ©s", "discard": "ElvetĂ©s", "delete": "TörlĂ©s", "deleting": "TörlĂ©s...", "edit": "SzerkesztĂ©s", "create": "LĂ©trehozĂĄs", "close": "BezĂĄrĂĄs", "back": "Vissza", "next": "KövetkezƑ", "previous": "ElƑzƑ", "search": "KeresĂ©s", "filter": "SzƱrĂ©s", "reset": "VisszaĂĄllĂ­tĂĄs", "clear": "TörlĂ©s", "retry": "Újra", "loading": "BetöltĂ©s...", "error": "Hiba", "success": "Siker", "no_results": "Nincs talĂĄlat", "no_data": "Nincs adat", "yes": "Igen", "no": "Nem", "continue": "TovĂĄbb", "exit": "KilĂ©pĂ©s", "save_changes": "VĂĄltoztatĂĄsok MentĂ©se", "confirm_delete": "Biztosan törölni szeretnĂ©d?", "unknown_error": "Ismeretlen hiba", "all": "Mind", "none": "Nincs", "optional": "opcionĂĄlis", "required": "kötelezƑ" } } ``` **HasznĂĄlati elv:** A Vue komponensek elsƑdlegesen a `common.*` kulcsokat hasznĂĄljĂĄk. Csak ha egy gombnak szekciĂł-specifikus szövege van (pl. "Csomag törlĂ©se" ≠ ĂĄltalĂĄnos "TörlĂ©s"), akkor kell szekciĂł-specifikus kulcs. ### 3.2 Oldalakra bontĂĄs javaslata (lazy loading tĂĄmogatĂĄs) Jelenleg a `nuxt.config.ts`-ben `lazy: false` van beĂĄllĂ­tva, ami azt jelenti, hogy minden nyelvi fĂĄjl betöltƑdik indulĂĄskor. A javasolt struktĂșra lehetƑvĂ© teszi a `lazy: true` vĂĄltĂĄst. **Új fĂĄjl struktĂșra:** ``` frontend_admin/i18n/ ├── locales/ │ ├── common.en.json ← központi alapĂ©rtĂ©kek (EN) │ ├── common.hu.json ← központi alapĂ©rtĂ©kek (HU) │ ├── permissions.en.json │ ├── permissions.hu.json │ ├── packages.en.json │ ├── packages.hu.json │ ├── garages.en.json │ ├── garages.hu.json │ ├── providers.en.json │ ├── providers.hu.json │ ├── users.en.json │ ├── users.hu.json │ ├── gamification-dashboard.{en,hu}.json │ ├── gamification-badges.{en,hu}.json │ ├── gamification-competitions.{en,hu}.json │ ├── gamification-config.{en,hu}.json │ ├── gamification-leaderboard.{en,hu}.json │ ├── gamification-ledger.{en,hu}.json │ ├── gamification-levels.{en,hu}.json │ ├── gamification-params.{en,hu}.json │ ├── gamification-point-rules.{en,hu}.json │ ├── gamification-seasons.{en,hu}.json │ ├── gamification-users.{en,hu}.json │ └── gamification-user-detail.{en,hu}.json ``` **`nuxt.config.ts` mĂłdosĂ­tĂĄsa:** ```typescript i18n: { locales: [ { code: 'hu', iso: 'hu-HU', file: 'common.hu.json', name: 'Magyar' }, { code: 'en', iso: 'en-GB', file: 'common.en.json', name: 'English' }, { code: 'de', iso: 'de-DE', file: 'common.de.json', name: 'Deutsch' }, ], defaultLocale: 'hu', lazy: true, langDir: 'locales/', strategy: 'no_prefix', detectBrowserLanguage: { useCookie: true, cookieKey: 'i18n_redirected', redirectOn: 'root', }, } ``` ### 3.3 TöbbnyelvƱsĂ©g (3+ nyelv) bevezetĂ©se **Új nyelv hozzĂĄadĂĄsĂĄnak lĂ©pĂ©sei:** 1. Új fĂĄjl lĂ©trehozĂĄsa: pl. `common.de.json`, `permissions.de.json`, stb. 2. A nyelv felvĂ©tele a `nuxt.config.ts` `locales` tömbjĂ©be 3. FordĂ­tĂĄsok elkĂ©szĂ­tĂ©se (kezdetben csak `common` + a leggyakoribb admin oldalak) 4. Backend oldalon: Ășj `de.json` fĂĄjl a `backend/static/locales/` mappĂĄba 5. A backend `i18n.py` automatikusan betölti, ha a fĂĄjl lĂ©tezik **ElƑkĂ©szĂ­tett nyelvek (rĂ©szleges fordĂ­tĂĄsok meglĂ©te alapjĂĄn):** - **Deutsch (de)** — volt mĂĄr rĂ©szleges fordĂ­tĂĄs a rĂ©gi frontend-ben - **Français (fr)** — volt a LanguageSwitcher-ben - **RomĂąnă (ro)** — volt rĂ©szleges fordĂ­tĂĄs a rĂ©gi frontend-ben - **ČeĆĄtina (cz)** — volt rĂ©szleges fordĂ­tĂĄs a rĂ©gi frontend-ben - **Slovenčina (sk)** — volt rĂ©szleges fordĂ­tĂĄs a rĂ©gi frontend-ben ### 3.4 NyelvvĂĄlasztĂł legördĂŒlƑ menĂŒvĂ© alakĂ­tĂĄsa **Jelenlegi kĂłd** (`frontend_admin/layouts/default.vue`, 158-170. sor): ```html
``` **Javasolt Ășj kĂłd:** ```html
``` **`script` kiegĂ©szĂ­tĂ©s:** ```typescript const langDropdownOpen = ref(false) function getFlagEmoji(code: string): string { const flags: Record = { hu: '🇭đŸ‡ș', en: '🇬🇧', de: 'đŸ‡©đŸ‡Ș', fr: 'đŸ‡«đŸ‡·', ro: 'đŸ‡·đŸ‡Ž', cz: '🇹🇿', sk: '🇾🇰', } return flags[code] || '🌐' } function getCurrentLanguageLabel(): string { const lang = availableLocales.value.find(l => l.code === currentLocale.value) return lang?.name || currentLocale.value.toUpperCase() } ``` ### 3.5 Backend i18n kiegĂ©szĂ­tĂ©se A backend `i18n.py` mĂĄr tĂĄmogatja az automatikus betöltĂ©st — bĂĄrmely `.json` fĂĄjl a `backend/static/locales/` mappĂĄban automatikusan felkerĂŒl a cache-be. Új nyelv esetĂ©n csak a JSON fĂĄjlt kell lĂ©trehozni. A `nuxt.config.ts`-ben a `PATCH /api/v1/auth/me/language` vĂ©gpont mĂĄr tĂĄmogatja a nyelv perzisztĂĄlĂĄsĂĄt a backend felĂ© — ez mƱködni fog Ășj nyelvekkel is, mivel a `preferred_language` mezƑ egy szabad string. --- ## 4. ÜtemezĂ©s (MĂ©rföldkövek) ### M1: Központi `common` szekciĂł lĂ©trehozĂĄsa - Új `common` szekciĂł felvĂ©tele az `en.json` Ă©s `hu.json` fĂĄjlokba - A duplikĂĄlt kulcsok (cancel, save, loading, stb.) eltĂĄvolĂ­tĂĄsa a szekciĂł-specifikus rĂ©szekbƑl - Vue komponensek ĂĄtĂ­rĂĄsa: `$t('common.cancel')` hasznĂĄlata a szekciĂł-specifikus helyett - **Érintett fĂĄjlok:** `frontend_admin/i18n/locales/*.json`, `frontend_admin/pages/*.vue`, `frontend_admin/layouts/default.vue` ### M2: FĂĄjlok oldalakra bontĂĄsa (lazy loading) - A monolit `en.json` Ă©s `hu.json` szĂ©tbontĂĄsa oldal-specifikus fĂĄjlokra - `nuxt.config.ts` frissĂ­tĂ©se (`lazy: true`) - TesztelĂ©s: minden oldal megfelelƑen betölti a sajĂĄt nyelvi fĂĄjljĂĄt - **Érintett fĂĄjlok:** `frontend_admin/i18n/locales/*`, `frontend_admin/nuxt.config.ts` ### M3: NyelvvĂĄlasztĂł dropdown bevezetĂ©se - `default.vue` layoutban a kĂ©tĂĄllĂĄsĂș HU/EN kapcsolĂł cserĂ©je legördĂŒlƑ menĂŒre - Flag emoji tĂĄmogatĂĄs - Több nyelv (de, fr) felvĂ©tele a konfigurĂĄciĂłba - **Érintett fĂĄjlok:** `frontend_admin/layouts/default.vue`, `frontend_admin/nuxt.config.ts` ### M4: Új nyelvek backend tĂĄmogatĂĄsa - `de.json`, `fr.json` lĂ©trehozĂĄsa a `backend/static/locales/` mappĂĄban - LegalĂĄbb a COMMON Ă©s AUTH szekciĂłk lefordĂ­tĂĄsa - **Érintett fĂĄjlok:** `backend/static/locales/*.json` ### M5: Backend i18n aszimmetria javĂ­tĂĄsa - `hu.json` Ă©s `en.json` kulcs-szinkronizĂĄciĂłja - HiĂĄnyzĂł kulcsok pĂłtlĂĄsa - **Érintett fĂĄjlok:** `backend/static/locales/*.json` --- ## 5. KockĂĄzatok Ă©s FĂŒggƑsĂ©gek | KockĂĄzat | HatĂĄs | ValĂłszĂ­nƱsĂ©g | MĂ©rsĂ©klĂ©s | |----------|-------|-------------|-----------| | Vue komponensekben elszĂłrt `$t('szekcio.kulcs')` hĂ­vĂĄsok eltörnek az ĂĄtnevezĂ©s utĂĄn | Magas | Közepes | Codebase search (`$t(`) minden hĂ­vĂĄsra, fokozatos ĂĄtĂĄllĂĄs | | Lazy loading miatt inicializĂĄlĂĄsi kĂ©sleltetĂ©s | Alacsony | Alacsony | `common` fĂĄjl elƑtöltĂ©se | | Backend Ă©s frontend közötti nyelvi kĂłd inkonzisztencia | Közepes | Alacsony | MindkĂ©t oldalon azonos ISO kĂłdok hasznĂĄlata | | Új nyelv hozzĂĄadĂĄsĂĄnĂĄl a teljes admin felĂŒlet nem lesz lefordĂ­tva | Közepes | Magas | RĂ©szleges fordĂ­tĂĄsi stĂĄtusz jelzĂ©se, angol fallback mƱködik | --- ## 6. ÖsszefoglalĂł A jelenlegi admin i18n rendszer funkcionĂĄlisan mƱködik, de strukturĂĄlisan optimalizĂĄlatlan: 1. **~50%-os kulcs-duplikĂĄciĂł** a `common` szekciĂł hiĂĄnya miatt 2. **SkĂĄlĂĄzhatatlan** - a monolit JSON fĂĄjlok 800+ sorosak, nehezen karbantarthatĂłk 3. **Csak 2 nyelv** - a rĂ©gi frontend mĂĄr 6 nyelvet ismert, az admin le van maradva 4. **KĂ©tĂĄllĂĄsĂș kapcsolĂł** - nem bƑvĂ­thetƑ 3+ nyelvre A javasolt restructuring: - Bevezeti a központi `common` szekciĂłt (30+ ĂĄltalĂĄnos kulcs) - Oldalakra bontja a monolit fĂĄjlokat (lazy loading) - Dropdown nyelvvĂĄlasztĂłra cserĂ©li a kapcsolĂłt - ElƑkĂ©szĂ­ti a terepet 6+ nyelv tĂĄmogatĂĄsĂĄhoz - Backend szinkronban marad a frontenddel