Aplicațiile publice în română pot adăuga ulterior engleză sau invers; localizarea bine făcută separă textul de logică. Laravel oferă helperi `__()`, `@lang` și fișiere PHP/JSON în `lang/`. Discuția acoperă fallback, locale dinamic și capcanele la validare, plus cum eviți stringuri englezești rămase în UI după switch la ro.
Grupează chei pe domeniu (`forum.php`, `auth.php`) în loc de un fișier uriaș. Chei descriptive (`thread.reply_count`) bat propoziții întregi ca index. Pentru texte scurte UI, JSON lang poate fi mai ușor de exportat către traducători. Evită concatenarea stringurilor traduse cu bucăți dinamice în ordine fixă — folosește placeholders `:name`. Verifică periodic chei orfane după refactor — un `__()` către cheie inexistentă rupe încrederea în traducere.
Middleware poate citi preferința utilizatorului, segment de URL (`/en/forum`) sau header Accept-Language. `App::setLocale()` trebuie apelat devreme în request. Fallback locale asigură că o cheie lipsă în ro nu aruncă cheia brută în producție dacă configurezi logging pentru missing translations. Cache-ul traducerilor poate accelera producția, dar necesită clear la deploy când adaugi chei noi.
Mesajele de eroare la Form Request pot fi suprascrise per regulă sau centralizate în `lang/ro/validation.php`. Atributele umanizate (`attributes.email`) îmbunătățesc textul „The email field is required”. Pluralizarea românească nu mapează perfect pe regulile englezești — uneori ai nevoie de variantă explicită per număr. Mesajele custom pentru reguli complexe (`required_if`) merită testate în ambele limbi dacă suporti switch.
Datele și numerele afișate folosesc Carbon tradus sau `NumberFormatter` când e cazul. Timezone-ul utilizatorului e separat de locale; un timestamp UTC stocat corect se convertește la afișare. Nu hardcoda luni sau zile în Blade — treci prin helperi localizați. Formatele scurte de dată în listă versus detaliu pot folosi același locale dar pattern diferit, setat central.
Organizarea cheilor
Grupează chei pe domeniu (`forum.php`, `auth.php`) în loc de un fișier uriaș. Chei descriptive (`thread.reply_count`) bat propoziții întregi ca index. Pentru texte scurte UI, JSON lang poate fi mai ușor de exportat către traducători. Evită concatenarea stringurilor traduse cu bucăți dinamice în ordine fixă — folosește placeholders `:name`. Verifică periodic chei orfane după refactor — un `__()` către cheie inexistentă rupe încrederea în traducere.
Setarea locale la runtime
Middleware poate citi preferința utilizatorului, segment de URL (`/en/forum`) sau header Accept-Language. `App::setLocale()` trebuie apelat devreme în request. Fallback locale asigură că o cheie lipsă în ro nu aruncă cheia brută în producție dacă configurezi logging pentru missing translations. Cache-ul traducerilor poate accelera producția, dar necesită clear la deploy când adaugi chei noi.
Validare și mesaje
Mesajele de eroare la Form Request pot fi suprascrise per regulă sau centralizate în `lang/ro/validation.php`. Atributele umanizate (`attributes.email`) îmbunătățesc textul „The email field is required”. Pluralizarea românească nu mapează perfect pe regulile englezești — uneori ai nevoie de variantă explicită per număr. Mesajele custom pentru reguli complexe (`required_if`) merită testate în ambele limbi dacă suporti switch.
Formatare regională
Datele și numerele afișate folosesc Carbon tradus sau `NumberFormatter` când e cazul. Timezone-ul utilizatorului e separat de locale; un timestamp UTC stocat corect se convertește la afișare. Nu hardcoda luni sau zile în Blade — treci prin helperi localizați. Formatele scurte de dată în listă versus detaliu pot folosi același locale dar pattern diferit, setat central.