Kdyby/Translation – Invoking filters on Template object is deprecated

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
TomasG
Člen | 23
+
0
-

Zdravím,

začal jsem na novém projetu používat Kdyby/Translation, ale když chci použít překlad v šabloně, např. {_core.rightnav.myaccount}

Tak mi laděnka vyhodí chybu ‚Undefined variable: template‘ na řádku

<?php echo Latte\Runtime\Filters::escapeHtml($template->translate("core.rightnav.myaccount"), ENT_NOQUOTES) ?>

Tak jsem si v beforeRender předal do šablony $template
$template->template = $template;

Ale laděnka vyhodí:
User Deprecated
Invoking filters on Template object is deprecated, use getLatte()->invokeFilter().

Používá Translation metodu která je v posledním Nette (2.3.7) deprecated, nebo je chyba v mé implementaci?

Azathoth
Člen | 495
+
0
-

Ukaž base presenter.

TomasG
Člen | 23
+
0
-

BasePresenter:

<?php

namespace CubeModule\CoreModule\Presenters;

use Nette;
use Nette\Utils\Html;
use Nette\Utils\ArrayHash;
use Nette\Utils\Strings;


/**
 * Base presenter for all administration presenters.
 */
abstract class BasePresenter extends Nette\Application\UI\Presenter
{

    /** @const array Administration themes */
    const THEMES = ['blue' => 'Blue', 'red' => 'Red', 'green' => 'Green', 'dark' => 'Dark'];

    /** @const array Administration langs */
    const LANGS = ['cs' => 'Čeština', 'en' => 'English'];

    const DEFAULT_THEME = 'blue';
    const DEFAULT_LANG = 'cs';


    /** @var  ArrayHash */
    protected $settings;

    /** @var \CubeModule\CoreModule\Model\UserSettingsService @inject */
    public $settingsService;

    /** @var \Kdyby\Translation\Translator @inject */
    public $translator;


    protected function startup()
    {
        parent::startup();


		// část tohoto přemístím do checkRequirements + autorizace.
        $is_sign = strrpos($this->getPresenter()->getName(), 'Sign') === false ? false : true;

        $action_out = strrpos($this->getAction(), 'out') === 0 ? true : false;

        if (!$is_sign && !$this->user->isLoggedIn())
        {
            $this->redirect('Sign:in');
        }
        else if ($is_sign && !$action_out && $this->user->isLoggedIn())
        {
            $this->redirect('Homepage:');
        }
        else if (!$is_sign)
        {
            $this->settings = ArrayHash::from(
                $this->settingsService->getUserSettings(
                    $this->user->id));

            $this->translator->setLocale(
                (array_key_exists($this->settings->lang, self::LANGS)) ? $this->settings->lang : self::DEFAULT_LANG);

        }

    }



    public function checkRequirements($element)
    {

        parent::checkRequirements($element);

        $this->getUser()->getStorage()->setNamespace('cube');

    }





    public function beforeRender()
    {

        parent::beforeRender();


        if(!$this->user->isLoggedIn())
        {
            $this->setLayout('sign.layout');
        }
        else
        {

            $template = $this->template;

            ///$template->template = $template;

            $template->theme = (in_array($this->settings->theme, self::THEMES)) ? $this->settings->theme : self::DEFAULT_THEME;

            $presenterName = explode(':', Strings::lower($this->name));
            $presenterName = array_reverse($presenterName);
            $action = $this->action;

            // set title and description tags - $presenterName[1] is modul's name (e.g. 'core'),
            // $presenterName[0] is presenter's name (e.g. 'homepage')
            $template->title = $this->translator->translate("$presenterName[1].$presenterName[0].title.$action");
            $template->description = $this->translator->translate("$presenterName[1].$presenterName[0].description.$action");

        }

    }

Translations normálně v presenterech fungují, jen v šablonách ne.

TomasG
Člen | 23
+
0
-

ok, takže jsem to vyřešil tak, že jsem přepsal makro translate na:

	public function macroTranslate(MacroNode $node, PhpWriter $writer)
	{
		if ($node->closing) {
			return $writer->write('echo %modify($template->getLatte()->invokeFilter("translate",[ob_get_clean()]))');

		} elseif ($node->isEmpty = ($node->args !== '')) {
			if ($this->containsOnlyOneWord($node)) {
				return $writer->write('echo %modify($template->getLatte()->invokeFilter("translate",[%node.word]))');

			} else {
				return $writer->write('echo %modify($template->getLatte()->invokeFilter("translate",[%node.word, %node.args]))');
			}

		} else {
			return 'ob_start()';
		}
	}