Files
service-finder/docs/v201/i18n_audit_backend_2026-04-13.md
2026-06-04 07:26:22 +00:00

300 lines
11 KiB
Markdown

# 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 `UserLiteRegister` séma tartalmaz `lang` mezőt (alapértelmezett: "hu")
- A `UserKYCComplete` séma tartalmaz `preferred_language` mező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ódus `lang` paramétert vár
- A `LocaleManager.get()` metódus `lang` paramé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.translations` tábla a fordítások tárolására
- `is_published` mező 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`)
```python
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`: `lang` mező (alapértelmezett: "hu")
- `UserKYCComplete`: `preferred_language` mező (alapértelmezett: "hu")
- `preferred_currency` mező 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 hardcoded
- `Field(..., 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áscsomag
- `GET /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)
1. **Nyelvfelismerési Middleware Implementálása**
```python
# 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)
```
2. **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
3. **Angol Fordítások Hozzáadása**
- Hozd létre az `en.json` fájlt
- Fordítsd le a meglévő magyar szövegeket
- Bővítsd a fordítási kulcsokat
### 8.2 Középtávú Fejlesztések (Közepes Prioritás)
4. **Többnyelvű Adatbázis Mezők**
```python
# 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]
```
5. **Pydantic Séma Integráció**
- Lokalizált validációs hibaüzenetek
- Automatikus nyelvfelismerés a sémákban
- Dinamikus field description-ök
6. **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)
7. **Fordítási Verziókezelés**
- Audit trail a változtatásokhoz
- Versioning a fordításokhoz
- Rollback lehetőség
8. **Automatikus Fordítás Integráció**
- DeepL/Google Translate API integráció
- Fordítási javaslatok
- Minőségellenőrzés
9. **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:
1. **Query Paraméter:** `?lang=hu`
2. **HTTP Fejléc:** `Accept-Language: hu,en;q=0.9`
3. **JWT Token:** Nyelvi preferencia a token payload-ban
4. **API Végpontok:** Explicit `lang` paraméter
### 9.2 Fordítási API Használata
```javascript
// 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
1. **Prioritás 1:** Middleware implementálása a nyelvfelismeréshez
2. **Prioritás 2:** Hardcoded stringek migrálása a fordítási rendszerbe
3. **Prioritás 3:** Angol fordítások hozzáadása
4. **Prioritás 4:** API végpontok frissítése a nyelvi paraméter támogatásához
5. **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.