到目前为止我所做的是-
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-else
或switch
语句。
有些网站可能使用20种或更多语言。
简单的答案:使用SlmLocale。我写了模块来实现语言环境检测DRY和不同的用例。
不要试图在你的路由中加入本地化。这允许您在路由之前检测区域设置时拥有可翻译的路由。此外,它还极大地帮助您使用不同的uri更改区域设置。
你在过程中犯的一个错误是,你在引导过程中从事件中获取路由匹配。然而,引导发生在路由之前,所以你不能在那个阶段获得路由匹配参数。
TL;DR: checkout SlmLocale,它应该可以帮助你解决所有的问题。