Itranslator nefuguje v latte šabloně, jinde ano

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

Ahoj, potřeboval bych poradit s registrací ITranslatoru do projektu.
Napsal jsem si Object na translate, zaregistroval jej do projektu a výsledkem je, že kdekoliv funguje, ale v latte šabloně vždy skončím chybovým hlášením Call to undefined method FileTemplate::translate()

config.neon

services:
	ITranslator:
		factory: Translator::initialize

BasePresenter.php

protected function createTemplate( $class = NULL )
{
	$template = parent::createTemplate();
	$template->setTranslator( $this->getContext()->getService( 'ITranslator' ) );
	return $template;
}

DefaultPresenter

	//formular normalne prelozi
	$form->setTranslator( $this->presenter->getContext()->getService('ITranslator') );
	//tato funkce se také vykoná
	dump($this->template->translate("TEST"));

default.latte

/* toto ovšem skončí laděnkou */
<span>{_'TEST'}</span>
/**
laděnka:
MemberAccessException
Call to undefined method FileTemplate::translate()

<span><?php echo TemplateHelpers::escapeHtml($template->translate('TEST'), ENT_NOQUOTES) ?> </span>
*/

Zkoušel jsem jak funkci setTranslator, tak fci registerHelper (dle jineho vlakna) a ani jedna z možností nefuguje. Kde dělám chybu? Běžím na verzi: f38d86f released on 2011–08–24 (2.0-beta)
Díky

bazo
Člen | 620
+
0
-

service nie je ITranslator ale len translator

jazby
Člen | 44
+
0
-

bazo napsal(a):

service nie je ITranslator ale len translator

Však to je jen název služby jak si já zvolím, nebo se pletu ?
Každopádně nefuguje to i při přímém volání:

	$template->setTranslator( new Translator );

takže tady chyba pravděpodobně nebude

jazby
Člen | 44
+
0
-

Nikdo nic?

Jan Endel
Člen | 1016
+
0
-

a v Translator::initialize máš předpokládám jen něco ve smyslu:

public initialize()
{
	return new self;
}

?

voda
Člen | 561
+
0
-

Nahraj někam celou laděnku, třeba tam něco objevíme.

jazby
Člen | 44
+
0
-

pilec napsal(a):

a v Translator::initialize máš předpokládám jen něco ve smyslu:

public initialize()
{
	return new self;
}

?

Přesně tak. Každopádně našel jsem zdroj problémů. Translate funguje korektně v jakékoliv šabloně kromě componenty. V ní skončím laděnkou.

Laděnka

Jan Endel
Člen | 1016
+
0
-

A jak u komponenty renderuješ šablonun?

jazby
Člen | 44
+
0
-

Takže už si i odpovím sám. Mylně jsem si myslel, že service translatoru stačí zaregistrovat presenteru a budou to znát i komponenty. Jak koukám opak je pravdou. Nyní již funguje, akorát to musím registrovat i v akci render componenty. Díky za nakopnutí.

voda
Člen | 561
+
0
-

To jsi měl napsat rovnou že se jedná o komponentu. Translator nastavuješ akorát šablonám z presenteru, ale už ne komponentám. Podobně jako máš BasePresenter si udělej BaseControl jako předka svých komponent a u něj také přepiš metodu createTemplate, kde nastavíš translator.

jazby
Člen | 44
+
0
-

Už je to tak opraveno. Celý systém generují jen componenty, takže sem to hodil do nějaké template a nešlo to. Až teď me napadlo to zkusit i v sablone presenteru a ejhle :). Tak jsem zase moudřejší.