2013-04-11 13 views
7

私はユーザーが望む言語に応じてロケールを動的に変更する必要があります。Zend framework 2:ロケールをグローバルに設定するには?

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

をしかし、私は、言語を変更したい場合は、どのように私は、コントローラでこれを行うことができます。

私はこのようなアプリケーション/ Module.phpでロケールを設定することができますか?私はこれを試しましたが、この後、私はロケールをグローバルではなくこの1つのリクエストに対してのみ変更できます。

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

答えて

2

設定レベルでデフォルトのロケールを設定してください! ZendSkeletonApplicationsアプリケーションモジュールから#61 of module.config.phpを参照してください

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

しかし、ユーザーに応じて動的に変更する必要があります。 – sgleser87

+0

これは、ユーザーセッションデータ(またはUserEntity)に基づいて、Requestごとに設定されます – 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

私は同じ問題がありました。そのイベントが来るとき、私はURLからの情報に基づいてロケールを設定すると

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

:私のユーザーのログインモジュールでは、私はブートストラップにMvcEventに登録さ

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

最後に、これはありませんロケールをグローバルにするのではなく、すべてのリクエストに対してロケールを設定するだけです。コードの観点からは、すべてのコントローラでロケールを設定する必要はありません。

希望に役立ちます。

関連する問題