2013-04-11 6 views
7

Я должен динамически менять языковой стандарт в зависимости от того, какой язык пользователь хочет.Zend framework 2: Как установить локаль globaly?

Я могу установить локаль в Заявлении/module.php, как это:

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

Но, как я могу сделать это в контроллере, если я хочу изменить язык? Я пробовал это, но после этого я могу изменить локаль только для этого одного запроса, а не глобального.

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

ответ

2

Настройте языковой стандарт по умолчанию на уровне конфигурации! См #61 of module.config.php из модуля Application ZendSkeletonApplications

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

Но я должен изменить его динамически, в зависимости от пользователя. – sgleser87

+0

Это будет установлено для каждого запроса, тогда на основе данных сеанса пользователей (или UserEntity) – Sam

+0

И как я могу изменить его в коде? – sgleser87

0

Эта работа для меня:

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

}

И мой 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

В modal.config файл, я не думаю, что требуется следующее, поскольку вы использовали псевдоним 'MvcT переводчик "для переводчика.

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

У меня была та же проблема. В моем модуле авторизации пользователя, я зарегистрировался MvcEvent на начальной загрузки:

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

Затем, когда приходит это событие, я установил локаль на основе информации из 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); 
    } 
    ... 

В конце концов, это делает на самом деле не делает локаль глобальной - вместо этого она просто устанавливает ее для каждого запроса. Чистый эффект тот же, с кодовой точки зрения, то есть мне не нужно устанавливать локаль на каждом контроллере.

Надеюсь, что это поможет.