当我在zf2中发送电子邮件时,翻译不起作用

时间:2014-07-25 13:27:40

标签: php email zend-framework2 zend-translate

我正在使用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}},在这个文件中,翻译工作得很好)。我收到的所有邮件都有英文主题(未翻译)和西班牙语内容(翻译)

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'));