LogicException Filter ‚translate‘ is not defined v mailu

- Petr Parolek
 - Člen | 458
 
Ahoj, postupuju podle doc https://doc.nette.org/cs/mail#… , ale řve na mě, že nezná filtr pro překlady LogicException Filter ‚translate‘ is not defined, did you mean ‚truncate‘?. Používám https://github.com/…/translation . Kde je prosím zrada?
Ukázku kodu: https://github.com/…tte-mail-bug
Tracy log: https://github.com/…bug/issues/1

- David Grudl
 - Nette Core | 8285
 
(Jen poznámka: docku každý den měním, takže nemusí tam dnes být co tam bylo ještě včera).
Musíš přidat filtr. Viz třeba https://doc.nette.org/…on/templates#…

- Petr Parolek
 - Člen | 458
 
@DavidGrudl díky za pomoc
<?php
declare(strict_types=1);
namespace App\Presenters;
use Latte\Engine;
use Nette\Localization\ITranslator;
use Nette\Mail\IMailer;
use Nette\Mail\Message;
final class HomepagePresenter extends BasePresenter
{
    /**
     * @var IMailer
     * @inject
     */
    public $mailer;
    /**
     * @var ITranslator
     * @inject
     */
    public $translator;
	public function renderDefault(): void
	{
        $latte = new Engine();
        $latte->addFilter('translate', [$this->translator, 'translate']);
        $params = [
            'orderId' => 123,
        ];
        $mail = new Message();
        $mail->setFrom('Franta <franta@example.com>')
            ->addTo('petr@example.com')
            ->setHtmlBody(
                $latte->renderToString(__DIR__ . '/templates/email.latte', $params)
            );
        bdump($mail);
        //$this->mailer->send($mail);
    }
}
email.latte
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Test</title>
</head>
<body>
<p>
    {var $text = 'mail.greating'}
    {$text|translate} {* funguje *}
    {_mail.greating} {* nefunguje *}
</p>
</body>
</html>
Jde kod ještě vylepšit, aby fungovalo oboje? Nebo bude stačit funkční
pouze přes |translate. Nebylo by ještě lepší, aby se
translator do latte v mailu registroval sám, jak to dělá šablona
z presenteru? Potom pošlu PR do doc.

- Petr Parolek
 - Člen | 458
 
Vyřešeno přes https://doc.nette.org/cs/mail#… nefunkční https://doc.nette.org/cs/mail#… . Bylo by fajn tento poznatek zapracovat do doc.
Editoval ppar (4. 8. 2020 13:56)

- Petr Parolek
 - Člen | 458
 
Zapomněl jsem tu ještě poslat finální plně funkční řešení:
<?php
declare(strict_types=1);
namespace App\Services;
use Nette\Application\LinkGenerator;
use Nette\Application\UI\ITemplate;
use Nette\Application\UI\ITemplateFactory;
use Nette\Localization\ITranslator;
use Nette\Mail\IMailer;
use Nette\Mail\Message;
use PPIS\Settings\Entities\Settings;
use PPIS\Settings\Repositories\SettingsRepository;
class EmailSender
{
	/**
	 * @var LinkGenerator
	 */
	private $linkGenerator;
	/**
	 * @var IMailer
	 */
	private $mailer;
	/**
	 * @var ITemplateFactory
	 */
	private $templateFactory;
	/**
	 * @var ITranslator
	 */
	private $translator;
	public function __construct(LinkGenerator $linkGenerator, IMailer $mailer, ITemplateFactory $templateFactory, ITranslator $translator)
	{
		$this->linkGenerator = $linkGenerator;
		$this->mailer = $mailer;
		$this->templateFactory = $templateFactory;
		$this->translator = $translator;
	}
	public function send(): void
	{
		$params = [
			'orderId' => 123,
		];
		$template = $this->createMailTemplate();
		$html = $template->renderToString(__DIR__ . '/../templates/email.latte', $params);
		$mail = new Message();
		$mail->setFrom('Franta <franta@example.com>')
			->addTo('petr@example.com')
			->setHtmlBody($html);
		$this->mailer->send($mail);
	}
	private function createMailTemplate(): ITemplate
	{
		$template = $this->templateFactory->createTemplate();
		$template->getLatte()->addProvider('uiControl', $this->linkGenerator);
		return $template;
	}
}
					Editoval ppar (4. 8. 2020 15:45)