Zend框架2:如何全局设置区域设置?

时间:2013-04-11 10:53:47

标签: zend-framework zend-framework2 zend-translate

我必须根据用户想要的语言动态更改语言环境。

我可以像这样设置Application / 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');

5 个答案:

答案 0 :(得分:2)

在配置级别设置默认语言环境!请参阅ZendSkeletonApplications应用程序模块中的#61 of module.config.php

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

答案 1 :(得分:1)

我有同样的问题。在我的用户登录模块中,我在bootstrap上注册了MvcEvent:

where

然后,当该事件发生时,我根据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);
}

最后,这并没有真正使语言环境成为全局 - 相反,它只是为每个请求设置它。从代码的角度来看,净效果是相同的 - 即,我不必在每个控制器上设置语言环境。

希望有所帮助。

答案 2 :(得分: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__,
         ),
     ),
 ),

答案 3 :(得分:0)

在modal.config文件中,我认为不需要以下内容,因为您已使用别名“MvcTranslator”进行翻译。

add(0, 0).
add(N, [R]) :-
   N1 is N-1,
   add(N1, [R|N]).

答案 4 :(得分:0)

在ZF2中,始终根据每个请求设置语言环境。您可以在引导程序上执行该操作:

// create a copy of HashMap as a TreeMap
NavigableMap<String, Order> navigableMap = new TreeMap<>(getOrderBook());

// remove unwanted entries (inverted condition)
navigableMap.entrySet().removeIf(e ->
     !e.getValue().getPairName().equals("AB") ||
     !e.getValue().getCompletedStatus().equals("InProgress") ||
     !e.getValue().getOrderType().equals("Buy"));

// NavigableMap::lastEntry gets an entry with the highest key (by the comparator)
double zscore = sortedMap.lastEntry().getValue().getzScore();

以及以后在控制器中,如果要更改:

$translator = $event->getApplication()->getServiceManager()->get('translator');
$translator->setLocale($locale);
$translator->addTranslationFile(
        'phpArray', DATA_PATH . DIRECTORY_SEPARATOR . 'languages' . DIRECTORY_SEPARATOR . $locale . '.php', 'default', $locale
);

如果您更改选定的语言环境,则必须再次添加翻译文件路径以使其起作用