2013-04-11 22 views
7

Muszę zmieniać ustawienia regionalne dynamicznie w zależności od tego, jakiego języka chce użytkownik.Zend framework 2: Jak ustawić locale globaly?

mogę ustawić ustawienia regionalne we Wniosku/Module.php tak:

public function onBootstrap(MvcEvent $e) 
{ 
    $translator = $e->getApplication()->getServiceManager()->get('translator'); 
    $translator->setLocale('hu_HU'); 
} 

Ale, jak mogę to zrobić w sterowniku, jeśli chcę zmienić języka? Próbowałem tego, ale po tym mogę zmienić ustawienia tylko dla tego jednego żądania, a nie globalnego.

$translator = $this->getServiceLocator()->get('translator'); 
$translator->setLocale('srb_SRB'); 

Odpowiedz

2

Skonfiguruj domyślne ustawienia regionalne na poziomie konfiguracji! Zobacz #61 of module.config.php z modułem aplikacyjnym ZendSkeletonApplications

'translator' => array(
    'locale' => 'en_US', 
) 
+0

Ale muszę zmienić ją dynamicznie, w zależności od użytkownika. – sgleser87

+0

Zostanie to ustawione na żądanie, na podstawie danych dotyczących sesji użytkowników (lub UserEntity). – Sam

+0

. Jak mogę to zmienić w kodzie? – sgleser87

0

To praca dla mnie:

public function onBootstrap(MvcEvent $e) 
{ 
    $localeFromHttp = \Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']); 
      if (false === stripos($localeFromHttp, '-')) { 
       $locale = $localeFromHttp . '_' . strtoupper($localeFromHttp); 

       $e->getApplication() 
        ->getServiceManager() 
        ->get('MvcTranslator') 
        ->setLocale($locale);    
       } 
       else { 

        $e->getApplication()->getServiceManager()->get('MvcTranslator')->setFallbackLocale('en_US'); 
       } 

}

A moja modal.config.php:

'service_manager' => array(
    'abstract_factories' => array(
     'Zend\Cache\Service\StorageCacheAbstractServiceFactory', 
     'Zend\Log\LoggerAbstractServiceFactory', 
    ), 
    'aliases' => array(
     'translator' => 'MvcTranslator', 
    ), 
), 
'service_manager' => array(
    'factories' => array(
     'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', 
    ), 
), 
'translator' => array(
    'translation_file_patterns' => array(
     array(
      'type'  => 'gettext', 
      'base_dir' => __DIR__ . '/../language', 
      'pattern' => '%s.mo', 
      'text_domain' => __NAMESPACE__, 
     ), 
    ), 
), 
0

W modal.config plik, nie sądzę, że poniższe jest wymagane, ponieważ użyłeś aliasu "MvcT "ranslator" dla tłumacza.

'service_manager' => array(
'factories' => array(
    'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory', 
), 
1

Miałem ten sam problem. W moim module logowania użytkownika, I zarejestrowany dla MvcEvent na bootstrap:

use Zend\Mvc\MvcEvent; 
use Zend\Mvc\Controller\AbstractActionController; 
use Zend\Session\SessionManager; 
use Zend\Session\Container as SessionContainer; 
use \Zend\I18n\Translator\TranslatorInterface; 

... 

public function onBootstrap(MvcEvent $event) 
{ 
    // Get event manager. 
    $eventManager = $event->getApplication()->getEventManager(); 
    $sharedEventManager = $eventManager->getSharedManager(); 
    // Register the event listener method. 
    $sharedEventManager->attach(AbstractActionController::class, 
      MvcEvent::EVENT_DISPATCH, [$this, 'onDispatch'], 100); 
} 

Potem, gdy zdarzenie pochodzi, ustawić locale na podstawie informacji z adresem URL:

public function onDispatch(MvcEvent $event) 
{ 
    $servicemanager = $event->getApplication()->getServiceManager(); 
    $lang = $event->getRouteMatch()->getParam('lang','jp-JP'); 

    $translator = $servicemanager->get(TranslatorInterface::class); 
    if($translator != null) 
    { 
     $translator->setLocale($lang); 
    } 
    ... 

w końcu to robi tak naprawdę nie zmienia lokalizacji na globalną - zamiast tego ustawia ją dla każdego żądania. Efekt netto jest taki sam, z punktu widzenia kodu - tzn. Nie muszę ustawiać ustawień regionalnych na każdym kontrolerze.

Nadzieję, że pomaga.