我使用的是来自zend Framework 2的邮件库,也使用的是翻译器功能。但是翻译只能在模板.phtml中使用,而不能在发送电子邮件的服务功能中使用,例如翻译电子邮件的主题时。这是我的服务函数内部的代码,用于发送电子邮件:
$mailFactory = $this->getDependency('mail');
$viewModel = new ViewModel(array(
'variable' => $x
));
$viewModel->setTemplate('template.phtml');
$message = $mailFactory->prepareMessage($viewModel);
$message->getHeaders()
->addHeaderLine('MIME-Version', '1.0')
->addHeaderLine('Content-type', 'text/html; charset=UTF-8');
$message->setSubject($this->translate('Recover your password'));
$message->setEncoding("UTF-8");
$message->addTo($email, $fullname);
$transport = $mailFactory->getTransport();
return $transport->send($message);
该函数$this->translate('...')
调用一个调用以下代码的类:return $this->translator->translate($text)
,这在我的所有应用程序中均能正常工作,但仅在我发送任何电子邮件时才起作用(除了template.phtml
,该文件中的,翻译器正常工作)。我收到的所有邮件,主题均为英语(未翻译),内容为西班牙语(翻译)
您必须将翻译器传递给服务才能使用它。
因此,在key.module.config.php下,service_manager
您可以使用工厂或初始化程序来实现。
工厂:
'service_manager' => array(
'factories' => array(
'YourNamespace\YourMailService' => function ($serviceManager) {
$mailService = new YourNamespace\YourMailService();
$mailService->setTranslator($serviceManager->get('translator'));
return $mailService;
},
)
),
您需要setTranslator
在服务类中使用该方法!
初始化剂:
'service_manager' => array(
'initializers' => array(
function ($instance, $sm)
{
if ($instance instanceof \YourNamespace\TranslatorAwareInterface) {
$instance->setTranslator($sm->get('translator'));
}
}
),
),
使用初始化程序,您需要接口TranslatorAwareInterface
:
namespace YourNamespace;
use Zend\Mvc\I18n\Translator;
interface TranslatorAwareInterface
{
public function setTranslator(Translator $translator);
}
您的服务需要实现该接口:
class YourMailService implements TranslatorAwareInterface
{
protected $translator;
public function setTranslator(Translator $translator)
{
$this->translator = $translator;
}
}
在这两种情况下,您都可以像这样使用翻译器:
$message->setSubject($this->translator->translate('Recover your password'));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句