11 KiB
Service Finder Backend i18n Audit Report
Dátum: 2026-04-14
Audit célja: A backend forráskód internacionalizációs (i18n) felkészültségének elemzése
Auditált könyvtár: /opt/docker/dev/service_finder/backend/app
1. Nyelvfelismerés és Middleware
1.1 HTTP Fejlécek és Query Paraméterek
A rendszer NEM tartalmaz dedikált middleware-t a nyelvfelismeréshez. A main.py fájlban nincs olyan middleware, amely kezelné az Accept-Language HTTP fejlécet vagy nyelvi query paramétereket.
1.2 Felhasználói Profil Alapú Nyelvfelismerés
A rendszer támogatja a felhasználói profilban tárolt nyelvi preferenciákat:
- A
UserLiteRegisterséma tartalmazlangmezőt (alapértelmezett: "hu") - A
UserKYCCompleteséma tartalmazpreferred_languagemezőt (alapértelmezett: "hu") - A felhasználói adatbázisban a nyelvi preferencia tárolható, de nincs automatikus middleware, amely ezt a beállítást alkalmazná a kérések során
1.3 Nyelvfelismerési Megközelítés
A nyelvfelismerés jelenleg explicit paraméterátadáson alapul:
- A
TranslationService.get_text()metóduslangparamétert vár - A
LocaleManager.get()metóduslangparamétert vár - A frontendnek explicit módon kell átadnia a nyelvi preferenciát
2. Fordítási Rendszer és String Kezelés
2.1 Fordítási Szolgáltatás (translation_service.py)
A rendszer tartalmaz egy teljes értékű fordítási szolgáltatást:
Főbb jellemzők:
- Memória-cache a gyors hozzáféréshez
- Fallback logika (hu → en → kulcs visszaadása)
- Változó behelyettesítés támogatása (
{{name}}szintaxis) - Hierarchikus kulcsok támogatása (
AUTH.LOGIN.TITLE) - JSON export a frontend számára
Adatbázis integráció:
system.translationstábla a fordítások tárolásárais_publishedmező a publikációs állapot kezelésére- Dinamikus cache frissítés
2.2 Locale Manager (i18n.py)
Egyszerűsített JSON-alapú locale kezelő:
- Statikus JSON fájlok betöltése
- Hierarchikus kulcsok kezelése
- Rövid alias (
t) a könnyű használathoz
2.3 Hardcoded Stringek
Az audit során a következő típusú hardcoded stringeket azonosítottam:
Hibaüzenetek (deps.py):
- "Érvénytelen vagy lejárt munkamenet."
- "Token azonosítási hiba."
- "A felhasználó nem található."
- "A művelethez aktív profil és KYC azonosítás szükséges."
- "Nincs jogosultsága ehhez az erőforráshoz."
Auth végpont (auth.py):
- "Hibás adatok."
- "Regisztráció sikeres. Aktivációs e-mail elküldve."
- "Email sikeresen megerősítve."
Megfigyelés: A hardcoded stringek kizárólag magyar nyelven vannak, ami korlátozza a többnyelvűséget.
3. Adatbázis Séma és Modellek
3.1 Translation Modell (system.translation)
class Translation(Base):
__tablename__ = "translations"
__table_args__ = {"schema": "system"}
id: Mapped[int]
key: Mapped[str] # Fordítási kulcs
lang: Mapped[str] # Nyelvi kód (hu, en, de)
value: Mapped[str] # Fordított szöveg
is_published: Mapped[bool] # Publikációs állapot
Erősségek:
- Dedikált tábla a fordításoknak
- Nyelvi kód indexelése
- Publikációs állapot kezelése
Gyengeségek:
- Nincs versioning vagy audit trail
- Nincs szerző/felelős mező
- Nincs kategóriázás vagy csoportosítás
3.2 Egyéb Modellek Többnyelvűsége
A többi modell (pl. VehicleModelDefinition, VehicleType, FeatureDefinition) NEM tartalmaz többnyelvű mezőket:
- Minden szöveges mező egyetlen nyelven tárolódik
- Nincs JSONB mező fordításokhoz
- Nincs kapcsolt fordítási tábla
Kivétel: A marketing_name_aliases JSONB mező tartalmazhat alternatív neveket, de ez nem nyelvi fordítás, hanem marketing alias.
4. Pydantic Sémák és Validáció
4.1 Nyelvi Beállítások a Sémákban
UserLiteRegister:langmező (alapértelmezett: "hu")UserKYCComplete:preferred_languagemező (alapértelmezett: "hu")preferred_currencymező a pénznem preferenciákhoz
4.2 Hibaüzenetek Validációban
A Pydantic sémák nem használják a fordítási rendszert a validációs hibaüzenetekhez:
Field(..., description="Minimum 8 karakter hosszú jelszó")- magyar hardcodedField(..., pattern=r"^\+?[0-9]{7,15}$")- nincs lokalizált hibaüzenet
5. Fájlstruktúra és Locales
5.1 Könyvtárszerkezet
backend/app/
├── locales/
│ └── hu.json # Magyar fordítások
├── core/
│ └── i18n.py # Locale manager
├── services/
│ └── translation_service.py # Fordítási szolgáltatás
└── static/locales/ # Frontend számára exportált JSON-ok
5.2 Locales Tartalom (hu.json)
A hu.json fájl jelenlegi tartalma:
- Email sablonok (regisztráció, jelszó visszaállítás)
- Közös UI elemek (SAVE, CANCEL, DELETE)
- Jármű kapcsolatos szövegek
- Költség kapcsolatos szövegek
Hiányosságok:
- Csak magyar nyelvű fordítások
- Nincs angol (
en.json) vagy más nyelvi fájl - Korlátozott számú fordítási kulcs (~20 kulcs)
6. API Végpontok
6.1 Nyilvános i18n API (translations.py)
Végpontok:
GET /api/v1/translations/{lang}- Teljes fordításcsomagGET /api/v1/translations/{lang}/{key:path}- Specifikus kulcs
Jellemzők:
- Nincs autentikáció szükséges
- Fallback angol nyelvre
- Hierarchikus kulcsok támogatása
6.2 Egyéb Végpontok i18n Használata
A többi API végpont NEM használja a fordítási rendszert:
- Minden válasz és hibaüzenet magyar nyelven
- Nincs nyelvi paraméter átadása
- Nincs automatikus nyelvfelismerés
7. i18n Readiness Értékelés (1-10 skála)
7.1 Összesített Pontszám: 4/10
Alapok (3/5):
- ✅ Fordítási tábla az adatbázisban
- ✅ Fordítási szolgáltatás implementálva
- ✅ Locale manager implementálva
- ✅ API végpont a fordításokhoz
- ❌ Hiányzik a nyelvfelismerési middleware
String Kezelés (2/5):
- ✅ Hierarchikus kulcsok támogatása
- ✅ Változó behelyettesítés
- ✅ Fallback logika
- ❌ Hardcoded stringek a kódban
- ❌ Nem használják a végpontok a fordítási rendszert
Adatbázis Támogatás (1/5):
- ✅ Alap Translation modell
- ❌ Nincs többnyelvű mező támogatás
- ❌ Nincs JSONB fordítási mező
- ❌ Nincs kapcsolt fordítási tábla
- ❌ Nincs tartalom versioning
Frontend Integráció (3/5):
- ✅ JSON export a frontend számára
- ✅ Nyilvános API végpont
- ✅ Hierarchikus struktúra
- ❌ Csak magyar nyelvű fordítások
- ❌ Korlátozott számú fordítási kulcs
8. Javaslatok a Fejlesztéshez
8.1 Azonnali Műveletek (Magas Prioritás)
-
Nyelvfelismerési Middleware Implementálása
# Példa middleware a nyelvfelismeréshez class LocaleMiddleware: async def __call__(self, request: Request, call_next): # 1. Query paraméter: ?lang=hu # 2. Accept-Language header # 3. Felhasználói profil # 4. Alapértelmezett (hu) request.state.locale = determine_locale(request) return await call_next(request) -
Hardcoded Stringek Migrálása
- Azonosítsd az összes hardcoded stringet a kódban
- Hozd létre a megfelelő fordítási kulcsokat
- Cseréld le a
translation_service.get_text()hívásokra
-
Angol Fordítások Hozzáadása
- Hozd létre az
en.jsonfájlt - Fordítsd le a meglévő magyar szövegeket
- Bővítsd a fordítási kulcsokat
- Hozd létre az
8.2 Középtávú Fejlesztések (Közepes Prioritás)
-
Többnyelvű Adatbázis Mezők
# JSONB mező fordításokhoz class VehicleType(Base): name_translations: Mapped[dict] = mapped_column(JSONB, default={}) # Vagy kapcsolt fordítási tábla class VehicleTypeTranslation(Base): vehicle_type_id: Mapped[int] lang: Mapped[str] name: Mapped[str] -
Pydantic Séma Integráció
- Lokalizált validációs hibaüzenetek
- Automatikus nyelvfelismerés a sémákban
- Dinamikus field description-ök
-
Fordítási Admin Felület
- CRUD műveletek a fordításokhoz
- Bulk import/export
- Fordítási állapot követés
8.3 Hosszútávú Fejlesztések (Alacsony Prioritás)
-
Fordítási Verziókezelés
- Audit trail a változtatásokhoz
- Versioning a fordításokhoz
- Rollback lehetőség
-
Automatikus Fordítás Integráció
- DeepL/Google Translate API integráció
- Fordítási javaslatok
- Minőségellenőrzés
-
Nyelvi Csomagok Kezelése
- Moduláris nyelvi csomagok
- Community fordítások
- Nyelvi variánsok (pl. hu-HU, hu-RO)
9. Technikai Specifikációk a Frontend Integrációhoz
9.1 Nyelvi Paraméter Átadása
A frontendnek a következő módokon kell átadnia a nyelvi preferenciát:
- Query Paraméter:
?lang=hu - HTTP Fejléc:
Accept-Language: hu,en;q=0.9 - JWT Token: Nyelvi preferencia a token payload-ban
- API Végpontok: Explicit
langparaméter
9.2 Fordítási API Használata
// 1. Teljes fordításcsomag letöltése
fetch('/api/v1/translations/hu')
// 2. Specifikus kulcs lekérése
fetch('/api/v1/translations/hu/AUTH.LOGIN.TITLE')
// 3. Fallback logika a frontenden
async function getTranslation(key, lang = 'hu') {
try {
const response = await fetch(`/api/v1/translations/${lang}/${key}`);
return await response.json();
} catch {
// Fallback angolra
const response = await fetch(`/api/v1/translations/en/${key}`);
return await response.json();
}
}
9.3 Cache Stratégia
- Szerveroldali: Memória cache a
TranslationService-ben - Kliensoldali: LocalStorage vagy Service Worker cache
- CDN: Statikus JSON fájlok CDN-en keresztül
10. Következő Lépések
- Prioritás 1: Middleware implementálása a nyelvfelismeréshez
- Prioritás 2: Hardcoded stringek migrálása a fordítási rendszerbe
- Prioritás 3: Angol fordítások hozzáadása
- Prioritás 4: API végpontok frissítése a nyelvi paraméter támogatásához
- Prioritás 5: Frontend dokumentáció a nyelvi integrációhoz
Összefoglalás: A Service Finder backend rendelkezik egy jól felépített fordítási infrastruktúrával, de az implementáció hiányos. A rendszer képes tárolni és kiszolgálni a fordításokat, de a tényleges használat korlátozott. A legnagyobb hiányosság a nyelvfelismerés hiánya és a hardcoded stringek dominanciája. A javasolt fejlesztések megvalósításával a rendszer teljes értékű többnyelvű támogatást nyújthat a frontend számára.