2013-04-11 3 views
7

Ich muss das Gebietsschema dynamisch je nachdem, welche Sprache der Benutzer möchte.Zend Framework 2: Wie setze ich locale globaly?

kann ich das Gebietsschema in der Anwendung/module.php wie folgt festgelegt:

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

Aber, wie kann ich tun dies in der Steuerung, wenn ich Sprachen ändern? Ich habe das versucht, aber danach kann ich das Gebietsschema nur für diese eine Anfrage ändern und nicht global.

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

Antwort

2

Richten Sie das Standardgebietsschema auf Konfigurationsebene ein! Siehe #61 of module.config.php von ZendSkeletonApplications Applikationsmodul

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

Aber ich muss es dynamisch ändern, abhängig vom Benutzer. – sgleser87

+0

Das würde pro Anfrage dann festgelegt werden, basierend auf Benutzersitzungsdaten (oder UserEntity) – Sam

+0

Und wie kann ich es im Code ändern? – sgleser87

0

Diese Arbeit für mich:

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

}

Und mein 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

Im modal.config Ich glaube nicht, dass Folgendes erforderlich ist, da Sie den Alias ​​'MvcT' verwendet haben Übersetzer für Übersetzer.

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

Ich hatte das gleiche Problem. In meinem Benutzer-Login-Modul, die ich für MvcEvent auf Bootstrap registriert:

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

Dann, wenn das Ereignis kommt, ich das Gebietsschema festgelegt, basierend auf Informationen von der 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); 
    } 
    ... 

Am Ende dieses tut Das Gebietsschema wird nicht wirklich global gemacht, sondern es wird nur für jede Anfrage festgelegt. Der Nettoeffekt ist vom Codepunkt her der gleiche - d. H. Ich muss das Gebietsschema nicht auf jedem Controller einstellen.

Hoffe, dass hilft.