2013-04-11 7 views
7

मुझे लोकेल को गतिशील रूप से बदलना है कि उपयोगकर्ता किस भाषा को चाहता है।ज़ेंड फ्रेमवर्क 2: लोकेल ग्लोबली कैसे सेट करें?

मैं आवेदन/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

कॉन्फ़िगरेशन स्तर पर डिफ़ॉल्ट लोकेल सेट अप करें! ZendSkeletonApplications आवेदन मॉड्यूल से #61 of module.config.php देखें

'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 में फ़ाइल, मुझे नहीं लगता कि निम्नलिखित की आवश्यकता है क्योंकि आपने उपनाम 'एमवीसीटी का उपयोग किया है अनुवादक के लिए ranslator '।

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

मुझे एक ही समस्या थी।

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 से जानकारी के आधार पर स्थान सेट: मेरे उपयोगकर्ता लॉगिन मॉड्यूल में, मैं बूटस्ट्रैप पर 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); 
    } 
    ... 

अंत में, यह करता है वास्तव में लोकेल ग्लोबल नहीं बनाते - इसके बजाय, यह सिर्फ हर अनुरोध के लिए सेट करता है। नेट इफेक्ट कोड कोड के दृष्टिकोण से समान है - यानी, मुझे प्रत्येक नियंत्रक पर लोकेल सेट करने की आवश्यकता नहीं है।

उम्मीद है कि मदद करता है।

संबंधित मुद्दे