Zend Framework 2中的MultiLingual站点 - 从URL参数设置setLocale()的值

时间:2014-06-26 13:50:38

标签: php zend-framework2 translation multilingual

以下是我到目前为止所做的事情 -

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',
        ),
    ),
),

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',
                ),
            ),
        ),
    ),
),

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

view -

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

注意:网址 - http://zf2-tutorial.localhost/fr/album,运行正常。翻译成功。


查询 -

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

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

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

提前致谢。

1 个答案:

答案 0 :(得分:2)

简单回答:使用SlmLocale。我编写了模块来实现区域设置检测DRY以及不同的用例。

不要试图将本地化纳入您的路线。这允许您在路由之前检测语言环境时具有可翻译路由。此外,它可以帮助您极大地改变具有不同URI的语言环境。

您在流程中犯的错误是您在引导期间从事件中获取路由匹配。但是,在路由之前会发生引导,因此您无法在该阶段获取路由匹配参数。

TL; DR:结账SlmLocale,它可以帮助您解决所有问题。