以下是我到目前为止所做的事情 -
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-else
或switch
语句。
某些网站可能使用20种或更多种语言。
提前致谢。
答案 0 :(得分:2)
简单回答:使用SlmLocale。我编写了模块来实现区域设置检测DRY以及不同的用例。
不要试图将本地化纳入您的路线。这允许您在路由之前检测语言环境时具有可翻译路由。此外,它可以帮助您极大地改变具有不同URI的语言环境。
您在流程中犯的错误是您在引导期间从事件中获取路由匹配。但是,在路由之前会发生引导,因此您无法在该阶段获取路由匹配参数。
TL; DR:结账SlmLocale,它可以帮助您解决所有问题。