Zend框架2中的多语言站点-从URL参数设置setLocale()的值


MultiLingual Site in Zend Framework 2 - set value of setLocale() from URL param

到目前为止我所做的是-

In Application Module - module.config.php -

'service_manager' => array(
    [....],
    'aliases' => array(
        'translator' => 'MvcTranslator',
    ),
),
'translator' => array(
    'locale' => 'en_US',
    'translation_file_patterns' => array(
        array(
            'type' => 'gettext',
            'base_dir' => __DIR__ . '/../language',
            'pattern' => '%s.mo',
        ),
    ),
),

In Album Module - module.config.php -

'router' => array(
    'routes' => array(
        'album' => array(
            'type'    => 'segment',
            'options' => array(
                'route'    => '[/:lang]/album[/:action][/:id]',
                'constraints' => array(
                    'lang' => '[a-zA-Z]*',
                    'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
                    'id'     => '[0-9]+',
                ),
                'defaults' => array(
                    'controller' => 'Album'Controller'Album',
                    'action'     => 'index',
                ),
            ),
        ),
    ),
),

In Album Module - Module.php -

public function onBootstrap(MvcEvent $e) {
    $sm = $e->getApplication()->getServiceManager();
    $router = $sm->get('router');
    $request = $sm->get('request');
    $matchedRoute = $router->match($request);
    $params = $matchedRoute->getParams();
    if(isset($params['lang']) && $params['lang'] !== '') {
        $translator = $e->getApplication()->getServiceManager()->get('translator');
        //or
        //$translator = $e->getApplication()->getServiceManager()->get('MvcTranslator');
        if($params['lang'] == 'en')
            $translator->setLocale('en_US');
        elseif($params['lang'] == 'fr')
            $translator->setLocale('fr_FR');
        else
            $translator->setLocale('en_US');
    }
}

In view -

echo $this->translate('Home');

注意:URL - http://zf2-tutorial.localhost/fr/album,工作很好。翻译成功。


查询——

$translator->setLocale('en');似乎与ZF1一起工作,但不与ZF2一起工作。

我需要知道是否有任何方法可以直接设置URL参数值,如$translator->setLocale($params['lang']);,而不是长if-elseswitch语句。

有些网站可能使用20种或更多语言。

简单的答案:使用SlmLocale。我写了模块来实现语言环境检测DRY和不同的用例。

不要试图在你的路由中加入本地化。这允许您在路由之前检测区域设置时拥有可翻译的路由。此外,它还极大地帮助您使用不同的uri更改区域设置。

你在过程中犯的一个错误是,你在引导过程中从事件中获取路由匹配。然而,引导发生在路由之前,所以你不能在那个阶段获得路由匹配参数。

TL;DR: checkout SlmLocale,它应该可以帮助你解决所有的问题。