SyMfonAK - vyvíjame databázy pomocou frameworku Symfony

Ako pracovať s užívateľskými locale (How to Work with the User's Locale)

Z SyMfonAK
Prejsť na: navigácia, hľadanie

Symfony dokumentáciaPreklad (i18N) → Ako pracovať s užívateľskými locale (How to Work with the User's Locale)


originál návod

Locale získame z požiadavky prostredníctvom objektu Request

use Symfony\Component\HttpFoundation\Request;

public function index(Request $request)
{
    $locale = $request->getLocale();
}


Takto si vieme pripraviť vlastného počúvajúceho ("listener"), ktorého musíme spúšťať ešte pred procesom LocaleListener a pred translátorom.

public function onKernelRequest(RequestEvent $event)
{
    $request = $event->getRequest();

    // some logic to determine the $locale
    $request->setLocale($locale);
}

Prioritu musíme nastaviť vyššiu než LocaleListener. Poradie spúšťania a priority zistíme príkazom

debug:event kernel.request

(napr. php bin/console debug:event kernel.request)

Ako nastaviť Locale užívateľovi ako "lepkavé" sa dozviete tu

V kontroléri je už neskoro nastavovať $request->setLocale(). Treba to spraviť cez vlastný počúvajúci (Listener), ako je uvedené vyššie, pomocou URL, viď nižšie, alebo volať setLocale() priamo v službe translátora.


Locale a URL

Rôzne odpovede podľa Locale na tú istú URL predstavuje mierne porušenie zásady, že z jednej URL prichádzajú rovnaké údaje. Preto je lepšou stratégiu používať v URL špeciálny _locale parameter.

# config/routes.yaml
contact:
    path:       /{_locale}/contact
    controller: App\Controller\ContactController::index
    requirements:
        _locale: en|fr|de

alebo

index:
    path: /{_locale}
    controller: App\Controller\PrehladController::index
    locale: sk
    requirements:
      _locale : sk|en

Aby sa ušetrila práca s opakovaním písaním rozsahu prípustných hodnôt pre Locale v každom budúcom URL, je vhodné požiadavky na Locale definovať ako container parameter

Prednastavenie Locale (setting a Default Locale)

Čo ak užívateľ nemá nastavené Locale? Takto možno garantovať nastavenie.

# config/packages/translation.yaml
framework:
    default_locale: en