2013-04-11 4 views
7

Yerel ayarı, kullanıcının istediği dile bağlı olarak dinamik olarak değiştirmem gerekiyor.Zend framework 2: Yerel ayarları nasıl belirleyebilirim?

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

Ama dilleri değiştirmek istiyorsanız, nasıl, denetleyici yapabilirsiniz:

böyle Başvurusu/Module.php içinde yerel ayarlayabilirsiniz? Bunu denedim, ancak bundan sonra yerel ayarı yalnızca bu bir istek için değiştirebilirim ve global değil.

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

cevap

2

Yapılandırma düzeyinde varsayılan yerel ayarı ayarlayın! ZendSkeletonApplications Uygulama Modülü'nden #61 of module.config.php Bkz

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

Ancak, kullanıcıya bağlı olarak dinamik olarak değiştirmem gerekiyor. – sgleser87

+0

Bu, Kullanıcılar Oturum verisi (veya UserEntity) – Sam

+0

'a dayanarak İstek başına ayarlanır ve kodu nasıl değiştirebilirim? – sgleser87

0

benim için bu çalışma:

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

}

Ve 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 olarak dosya, ben 'MvcT takma adını kullandıysanız aşağıdakilerin gerekli olduğunu düşünmüyorum çevirmen için 'çevirici'.

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

Aynı sorunu yaşadım. O olay geldiğinde, ben URL'den bilgi dayalı yerel ayarı Sonra

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

: my kullanıcı girişi modülünde, ben açılışta MvcEvent için kayıtlı

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

Sonunda, bunu yapar yerel ayarı global yapmaz - bunun yerine, her istek için ayarlar. Net etki, kod açısından aynıdır - yani, her denetleyicide yerel ayarı yapmak zorunda değilim.

Bu yardımcı olur umarım.