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
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?
- TomasG
- Člen | 23
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
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()';
}
}