2013-04-11 14 views
7

Tôi phải thay đổi ngôn ngữ theo cách động tùy thuộc vào ngôn ngữ mà người dùng muốn.Zend framework 2: Làm thế nào để thiết lập locale globaly?

tôi có thể thiết lập miền địa phương trong Application/Module.php như thế này:

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

Nhưng, làm thế nào tôi có thể làm điều này trong bộ điều khiển, nếu tôi muốn thay đổi ngôn ngữ? Tôi đã thử điều này, nhưng sau này tôi có thể thay đổi miền địa phương chỉ cho một yêu cầu này và không phải toàn cầu.

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

Trả lời

2

Thiết lập ngôn ngữ mặc định ở cấp cấu hình! Xem #61 of module.config.php từ ZendSkeletonApplications Mô-đun ứng dụng

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

Nhưng tôi phải thay đổi động, tùy thuộc vào người dùng. – sgleser87

+0

Điều đó sẽ được đặt theo Yêu cầu, dựa trên dữ liệu Phiên người dùng (hoặc UserEntity) – Sam

+0

Và làm cách nào tôi có thể thay đổi mã trong mã? – sgleser87

0

Công việc này cho tôi:

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

}

Và modal.config.php tôi:

'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

Trong modal.config tập tin, tôi không nghĩ rằng sau đây là cần thiết như bạn đã sử dụng bí danh 'MvcT ranslator 'cho dịch giả.

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

Tôi gặp vấn đề tương tự. Trong mô-đun dùng đăng nhập của tôi, tôi đã đăng ký cho MvcEvent trên 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); 
} 

Sau đó, khi sự kiện đó đến, tôi đặt locale dựa trên thông tin từ 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); 
    } 
    ... 

Cuối cùng, điều này không thực sự làm cho miền địa phương toàn cầu - thay vào đó, nó chỉ đặt nó cho mọi yêu cầu. Hiệu ứng ròng là như nhau, từ điểm mã xem - tức là, tôi không phải đặt ngôn ngữ trên mọi bộ điều khiển.

Hy vọng điều đó sẽ hữu ích.