Zend framework2 ZF2翻译

Zend framework2 ZF2翻译,zend-framework2,translation,Zend Framework2,Translation,我有两个模块-应用程序和StickyNotes。我需要在所有页面上使用翻译 我所做的: 1) 视图中: 2) 在Application\Module.php中: public function onBootstrap(MvcEvent $e) { $translator = $e->getApplication()->getServiceManager()->get('translator'); $eventManager = $e->getApplica

我有两个模块-应用程序和StickyNotes。我需要在所有页面上使用翻译

我所做的:

1) 视图中:

2) 在Application\Module.php中:

public function onBootstrap(MvcEvent $e)
{
    $translator = $e->getApplication()->getServiceManager()->get('translator');
    $eventManager = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
    $app = $e->getParam('application');
    $app->getEventManager()->attach('render', array($this, 'setLayoutTitle'));
    $translator->setLocale('ru_RU');
    echo $translator->getLocale(); //ru_RU
}
public function onBootstrap(MvcEvent $e)
{
    $translator = $e->getApplication()->getServiceManager()->get('translator');
    $translator->setLocale('ru_RU');
    echo $translator->getLocale(); //ru_RU
}
3) 在StickyNotes\Module.php中:

public function onBootstrap(MvcEvent $e)
{
    $translator = $e->getApplication()->getServiceManager()->get('translator');
    $eventManager = $e->getApplication()->getEventManager();
    $moduleRouteListener = new ModuleRouteListener();
    $moduleRouteListener->attach($eventManager);
    $app = $e->getParam('application');
    $app->getEventManager()->attach('render', array($this, 'setLayoutTitle'));
    $translator->setLocale('ru_RU');
    echo $translator->getLocale(); //ru_RU
}
public function onBootstrap(MvcEvent $e)
{
    $translator = $e->getApplication()->getServiceManager()->get('translator');
    $translator->setLocale('ru_RU');
    echo $translator->getLocale(); //ru_RU
}
4) 应用程序\..\module.config.php:

'service_manager' => array(
    'factories' => array(
        'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
    ),
),

'aliases' => array(
    'translator' => 'MvcTranslator',
),

'translator' => array(
    'locale' => 'en_US',
    'translation_file_patterns' => array(
        array(
            'type'     => 'gettext',
            'base_dir' => __DIR__ . '/../language',
            'pattern'  => '%s.mo',
        ),
    ),
),
5) StickyNotes\..\module.config.php相同:

'service_manager' => array(
    'factories' => array(
        'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
    ),
),

'aliases' => array(
    'translator' => 'MvcTranslator',
),

'translator' => array(
    'locale' => 'en_US',
    'translation_file_patterns' => array(
        array(
            'type'     => 'gettext',
            'base_dir' => __DIR__ . '/../language',
            'pattern'  => '%s.mo',
        ),
    ),
),
如果我尝试
$translator->getLocale()输出“ru_ru”,但翻译不起作用

另外,如果我手动将
'locale'=>'en_-US',
更改为
'locale'=>'ru_-ru',

翻译工作很好。谢谢你的回答

仅在Application\module.config.php中放置translator config,并确保您在Application模块中有language文件夹,并在其上放置*.mo和*.po文件

实际上,您不需要在每个模块中设置区域设置。仅放入Application\Module.php

在poedit目录->属性->源关键字->检查“翻译”单词是否存在,最好是第一个

最后,
已弃用。使用

更新1:
很抱歉,此代码
未被弃用,但PHP手册建议为


在Application\Module.php中

public function onBootstrap(MvcEvent $e) {
        $translator = $e->getApplication()->getServiceManager()->get('translator');
            $lang = $e->getRequest()->getQuery('lang'); // new language
            $session = new Container('base');
            if($lang == null && $lang == ''){
                if ($session->offsetExists('lang')) {
                    $lang = $session->offsetGet('lang'); // current language
                }else{
                    $lang = Settings::DEFAULT_LANGUAGE; // default language
                }
            }
            $session->offsetSet('lang', $lang);
            $loc = Settings::$locations[$lang];
            $translator
            ->setLocale($loc)
            ->setFallbackLocale(Settings::DEFAULT_LANGUAGE .'_' . Settings::DEFAULT_LOCATION);
    }
和设置类

class Settings{
   const DEFAULT_LOCATION =  'IR';
   const DEFAULT_LANGUAGE = 'fa';

   public static $locations = array(
        'fa'=>'fa_IR',
            'sa'=>'sa_SA',//Arabic (sa, sa-SA)
        'tr'=>'tr_TR',
        'en'=>'en_US'
    );
}

此问题是由于缺少intl扩展造成的

所以只需要以下步骤:

我必须安装PHP Intl扩展:

sudo apt-get install php5-intl
Apache重新启动:

sudo service apache2 restart
检查编译的扩展名:

php -m

您是否尝试删除module.config.php中的'locale'=>'en_US'?不知道它是否相关,但是您的
别名
数组应该位于
服务管理器
数组中如果我删除'locale',我有此异常
致命错误:未捕获的异常“Zend\I18n\exception\ExtensionNotLoadedException”,带有消息“Zend\I18n\Translator组件需要intl PHP扩展名”
。关于
别名
-如果我添加
服务\u管理器
,则显示错误-别名已包含。我尝试执行了您所说的所有操作,但翻译仍然无效。我不知道这个解决方案有多好,但对我来说,它的工作原理是:在引导中
$viewModel=$e->getApplication()->getMvcEvent()->getViewModel()$viewModel->language=$session->offsetGet('lang');`查看:
这是什么意思$viewModel->language=$session->offsetGet('lang');从会话中放置语言视图模型。实际上从PHP5.4开始就支持了@对于<5.4版本的Wallter,这是正确的,但由于5.4
已解决,谢谢。我删除了
'factories'=>数组('translator'=>'Zend\I18n\translator\translator\translator服务工厂',),
,所有的翻译工作正常。