我正在使用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)
,这适用于我的所有应用程序,但只有在发送任何电子邮件时才会出错({{除外} 1}},在这个文件中,翻译工作得很好)。我收到的所有邮件都有英文主题(未翻译)和西班牙语内容(翻译)
答案 0 :(得分:0)
您必须将翻译程序传递给服务才能使用它。
因此,在service_manager
项下的module.config.php中,您可以使用工厂或初始化程序。
厂:
'service_manager' => array(
'factories' => array(
'YourNamespace\YourMailService' => function ($serviceManager) {
$mailService = new YourNamespace\YourMailService();
$mailService->setTranslator($serviceManager->get('translator'));
return $mailService;
},
)
),
您需要服务类中的setTranslator
方法!
Inititalizer:
'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'));