Zend Framework 2.3翻译忽略手动setLocale() - 可能的gettext问题

时间:2014-03-29 13:33:37

标签: php localization zend-framework2 gettext

我是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。我错过了什么?提前谢谢。

2 个答案:

答案 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变量的好方法,我仍然会很感激,因为这仍然是一个非常黑客的解决方案。