2014-07-25 6 views
0

zend framework 2의 메일 링 라이브러리를 사용하고 있으며 번역기 기능을 사용하고 있습니다. 그러나 번역은 템플릿 .phtml 내에서만 작동하며 전자 메일을 보내려는 서비스 기능에서는 작동하지 않습니다 (예 : 전자 메일 제목 번역).zf2에서 전자 메일을 보낼 때 번역이 작동하지 않습니다.

$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을 제외하고,이 파일 안에는 번역사가 잘 작동합니다). 받은 모든 메일은 영어 (번역되지 않음)로 된 주제와 스페인어로 된 내용 (번역본)

답변

0

번역기를 사용하려면 서비스에 전달해야합니다.

따라서 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이 필요합니다!

Inititalizer : 당신이 할 수있는 두 경우 모두

class YourMailService implements TranslatorAwareInterface 
{ 
    protected $translator; 

    public function setTranslator(Translator $translator) 
    { 
     $this->translator = $translator; 
    } 
} 

:

namespace YourNamespace; 

use Zend\Mvc\I18n\Translator; 

interface TranslatorAwareInterface 
{ 
    public function setTranslator(Translator $translator); 
} 

그리고 서비스가 해당 인터페이스를 구현해야 : 당신이 인터페이스 TranslatorAwareInterface 필요 이니셜 라이저와

'service_manager' => array(
    'initializers' => array(
     function ($instance, $sm) 
     { 
      if ($instance instanceof \YourNamespace\TranslatorAwareInterface) { 
       $instance->setTranslator($sm->get('translator')); 
      } 
     } 
    ), 
), 

다음과 같이 번역기를 사용하십시오 :

$message->setSubject($this->translator->translate('Recover your password')); 
+0

감사합니다. 시도해 보겠습니다. 의견을 보내 드리겠습니다. – Cesar

+0

도움을 주셔서 감사합니다. 저는 메일 서비스를 사용자 정의하고 서비스 관리자의 초기화 프로그램에서 변환기 인스턴스를 서비스로 설정할 수 있습니다. 이제 제 경우에 대한 해결책을 찾았습니다. 전자 메일을 보낼 코드가있는 서비스에서 번역기 개체 $ translator = $ this-> getDependency ('translator') 만 있습니다. ServiceFactory에서 $ serviceLocator-> get ('translator')를 사용하여 번역기에 대한 종속성을 추가했습니다. 이제는 $ translator-> translate ('text')를 사용하여 내 서비스의 텍스트를 번역 할 수 있습니다. – Cesar

관련 문제