我是ZF2的新手,并尝试过设置区域设置切换器。代码似乎有效,但无论我如何尝试,我都无法实现转换。我有本地化的DB调用,一切正常,但默认的gettext / Zend Translate永远不会改变默认的语言环境。
我的代码如下:
module.config.php
<?php
return array(
'website' => 'o',
'accepted_locales' => array(
'en_GB' => array(
'country' => 'gb',
'language' => 'en',
'display_name' => 'English',
),
'no_NO' => array(
'country' => 'no',
'language' => 'no',
'display_name' => 'Norsk',
),
),
'default_locale' => 'en_GB',
'controllers' => array(
'invokables' => array(
'Foo\Controller\Bar' => 'Foo\Controller\BarController',
),
),
'router' => array(
'routes' => array(
'oranisation' => array(
'type' => 'segment',
'options' => array(
'route' => '/[:controller][/:action][/:id]',
'constraints' => array(
'action' => '[a-zA-Z][a-zA-Z0-9_-]*',
'id' => '[0-9]+',
),
'defaults' => array(
'__NAMESPACE__' => 'Foo\Controller',
'controller' => 'Bar',
'action' => 'index',
),
),
),
),
),
'translator' => array(
'translation_file_patterns' => array(
array(
'type' => 'gettext',
'base_dir' => __DIR__ . '/../language',
'pattern' => '%s.mo',
),
),
),
'view_manager' => array(
'template_path_stack' => array(
'Organisation' => __DIR__ . '/../view',
),
),
'view_manager' => array(
'display_not_found_reason' => true,
'display_exceptions' => true,
'doctype' => 'HTML5',
'template_map' => array(
'layout/layout' => __DIR__ . '/../view/layout/layout.phtml',
[...]
),
'template_path_stack' => array(
__DIR__ . '/../view',
),
),
);
自定义抽象控制器 - 在项目中所有控制器上调用所有操作的方法
/**
* Determines most appropriate locale by checking browser locale, then using a default if
* browser is unsupported.
*
* @return String
*/
protected function getBestLocale()
{
$locales = $this->getServiceLocator()->get('Config')['accepted_locales'];
if ( isset($_GET['locale']) && in_array($_GET['locale'], array_keys($locales)) ) {
// If locale has been set manually, and is valid, configure the translator
$locale = $_GET['locale'];
} else {
if ( in_array($this->getRequest()->getCookie()->locale, array_keys($locales)) ) {
// If the locale is already set, ensure it's valid, and confirm the current locale
$locale = $this->getRequest()->getCookie()->locale;
} elseif ( in_array(locale_accept_from_http($this->getRequest()->getHeader()), array_keys($locales)) ) {
// If still not set, we will set from the client header
$locale = locale_accept_from_http($this->getRequest()->getHeader());
} else {
// Default
$locale = $this->getServiceLocator()->get('Config')['default_locale'];
}
}
$cookie = new SetCookie('locale', $locale, time()+60*60*24*30, null, 'localhost');
$this->getResponse()->getHeaders()->addHeader($cookie);
Locale::setDefault($locale);
$this->getServiceLocator()->get('Translator')->setLocale($locale);
return $locale;
}
我有翻译文件(.po / .mo设置为en_GB和no_NO),我在我的视图中调用以下内容:
<?php echo $this->translate('File list'); ?>
我总是得到未翻译的字符串。
似乎有各种方法来实现这一点,而且变化很混乱 - 所以具体来说,我使用的是ZF 2.3.0。我错过了什么?提前谢谢。
答案 0 :(得分:0)
Zend支持的语言环境列表:http://framework.zend.com/manual/1.12/en/zend.locale.appendix.html
Zend不支持no_NO。可能更好地使用nn_NO或nb_NO或其他东西。
答案 1 :(得分:0)
好吧,这有点像黑客攻击,但我得到了它的工作 - 翻译器似乎没有正确填充,所以$this->translate('...')
没有使用我正在配置的翻译对象出于某种原因,添加以下行:
$translator = $this->getServiceLocator()->get('translator');
$view->setVariable('translator', $translator);
我现在可以使用:
<?php echo $this->translator->translate('...'); ?>
具有所需的效果。如果有人有重新附加这些translator
变量的好方法,我仍然会很感激,因为这仍然是一个非常黑客的解决方案。