ZF2翻译器在控制器中不起作用?

时间:2015-11-11 13:42:05

标签: zend-framework2

我试图通过ServiceLocator在控制器中进行翻译,但这不是翻译,我在stackoverflow中尝试过很多但是没有成功。我的系统使用多种语言,我的目标是在视图,控制器,表单和过滤器中使用transtor。在我看来,翻译工作正在进行中。任何消化和帮助将不胜感激。

不在控制器中工作:

$this->getServiceLocator()->get('translator')->translate('my text',$myLocale);

我的应用程序mudole.config.php:

'service_manager' => array(
     'abstract_factories' => array(
         'Zend\Cache\Service\StorageCacheAbstractServiceFactory',
         'Zend\Log\LoggerAbstractServiceFactory',
     ),
     'factories' => array(
         'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
     ),
 ),
 'translator' => array(
     'locale' => 'en_US',// 'locale' => 'dk_DK',
     'translation_file_patterns' => array(
         array(

             'type'     => 'gettext',
             'base_dir' => __DIR__ . '/../language',
             'pattern'  => '%s.mo',
         ),
     ),
 ),

我将mudole.config.php中的local更改为另一种语言,但仍未进行翻译。

4 个答案:

答案 0 :(得分:3)

查看帮助者/表单

ZF2附带视图助手Zend\I18n\View\Helper\Translate;这就是为什么您已经可以在视图中使用方法$this->translate($text)

然而,从Zend\I18n\View\Helper\AbstractTranslatorHelper(包括所有表单视图助手)扩展的所有视图助手类也具有“可翻译能力”。

您需要使用$viewHelper->setTranslator($translator)传入翻译,并通过$viewHelper->setTranslatorEnabled(true)启用翻译。

控制器插件

不幸的是,没有默认插件(我能找到)来处理控制器中的翻译器;我想你可能会争辩说文本内容不应该在控制器中。

您可以轻松创建一个如下例子。关键是通过工厂将新的translator服务作为依赖项传递。

namespace MyModule\Controller\Plugin;

use Zend\Mvc\Controller\AbstractPlugin;
use Zend\I18n\Translator\Translator as TranslatorService;

class Translator extends AbstractPlugin
{
    protected $translatorService;

    public function __construct(TranslatorService $translatorService)
    {
        $this->translatorService = $translatorService;
    }

    public function invoke($text = null, array $options = [])
    {
        if (null == $text) {
            return $this;
        }
        return $this->translate($text, $options);
    }

    public function translate($text, array $options = [])
    {
        return $this->translatorService->translate($text);
    }

}

创建工厂类。

namespace MyModule\Controller\Plugin;

use MyModule\Controller\Plugin\Translator;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;

class TranslatorFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $controllerPluginManager)
    {
        $serviceManager = $controllerPluginManager->getServiceLocator();

        return new Translator($serviceManager->get('translator'));
    }
}

module.config.php注册服务。

return [
    'controller_plugins' => [
         'factories' => [
             'translate' => 'MyModule\\Controller\\Plugin\\TranslateFactory',
         ]
    ],
];

然后你可以在控制器类中调用它。

// Directly
$this->translate($text, $options); 

// Or fetch the plugin first
$this->translate()->translate($text, $options);

答案 1 :(得分:2)

似乎语言环境不是直接在翻译文本中设置,而是由 $this->getServiceLocator()->get('translator')->setLocale($locale)设置,现在它正在翻译我的文本。

我的应用程序mudole.config.php:

   'service_manager' => array(
         'factories' => array(
             'translator' => 'Zend\I18n\Translator\TranslatorServiceFactory',
         ),
     ),
     'translator' => array(
         'locale' => 'en_US',
         'translation_file_patterns' => array(
             array(
                 'type'     => 'gettext',
                 'base_dir' => __DIR__ . '/../language',
                 'pattern'  => '%s.mo',
             ),
         ),
     ),

在控制器中:

$this->getServiceLocator()->get('translator')->setLocale($locale);
echo $c=$this->getServiceLocator()->get('translator')->translate('Book'); // Print(Danish): Bog

答案 2 :(得分:1)

您可以使用我的ZfTranslate控制器插件。

安装

composer require mikica/zf2-translate-plugin

您需要注册新模块。添加文件config / application.config.php:

'modules' => array(
    '...',
    'ZfTranslate'
),

控制器中的用法

<?php
$this->translate('translate word');
$this->translate('translate word', 'locale');

答案 3 :(得分:0)

AlexP回答是最好的方法。

但仍然是一个问题,为什么你的方式不起作用?

它应该工作。但它不是因为你在不同的命名空间,所以你在文件中使用不同的域。你做的那样:

namespace MyModule\Controller;

class MyController {

   public function someAction() {
       $this->getServiceLocator()->get('translator')->translate('my text',__NAMESPACE__,$myLocale);
   }

}

在你的`module.config.php'中,你可能正在使用这个命名空间:

namespace MyModule;

return array(
    //...
   'translator' => array(
       //...
    ),
);

请注意,在控制器__NAMESPACE__的示例中,等于MyModule\Controller。在配置文件中,__NAMESPACE__等于MyModule。您需要修复它,在两种情况下都传递相同的值。

换句话说,有几种方法可以解决这个问题,例如AlexP's。但是,当您调用它时,其中任何一个都需要具有转换器域('text_domain'键的值)等于translate方法的域参数(第二个参数)。

更快的解决方案是将$ domain参数更改为控制器文件中的字符串:

$this->getServiceLocator()->get('translator')->translate('my text','MyModule',$myLocale);

另一个解决方案应该是创建一个常量并在文件(控制器,视图和配置)中使用它。