2013-04-11 15 views
7

Devo cambiare la locale in modo dinamico a seconda della lingua che l'utente desidera.Zend framework 2: Come impostare la lingua globale?

posso impostare l'impostazione internazionale nella Domanda/Module.php come questo:

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

Ma, come posso fare questo nel controllore, se voglio cambiare le lingue? Ho provato questo, ma dopo questo posso cambiare la locale solo per questa richiesta e non globale.

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

risposta

2

Impostare le impostazioni internazionali predefinite a livello di configurazione! Vedere #61 of module.config.php dal modulo Application ZendSkeletonApplications

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

Ma devo cambiarlo in modo dinamico, a seconda dell'utente. – sgleser87

+0

Quello sarebbe impostato per Richiesta quindi, in base ai dati della sessione utente (o UserEntity) – Sam

+0

E come posso modificarlo nel codice? – sgleser87

0

questo lavoro per me:

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'); 
       } 

}

E il mio 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

Nel modal.config file, non penso che quanto segue sia necessario in quanto hai usato l'alias 'MvcT ranslator 'per traduttore.

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

Ho avuto lo stesso problema. Nel mio modulo di login utente, ho registrato per MvcEvent il 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); 
} 

Poi, quando l'evento viene, ho impostato il locale sulla base di informazioni dal 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); 
    } 
    ... 

Alla fine, questo non fa in realtà non rende globali le impostazioni internazionali, ma lo imposta per ogni richiesta. L'effetto netto è lo stesso, dal punto di vista del codice - cioè, non devo impostare la locale su ogni controller.

Spero che questo aiuti.