我试图通过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更改为另一种语言,但仍未进行翻译。
答案 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);
另一个解决方案应该是创建一个常量并在文件(控制器,视图和配置)中使用它。