Odkud dostanu aktuální jazk aplikace

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

potřebuji se dozvědět jaký jazyk má uživatel zvolen abych mu pak mohl vypsat něco ve smyslu – používáte tenhle a máte na výběr z těchto dalších.

enumag
Člen | 2118
+
0
-

Netýká se Nette. Framework na to pokud vím nic neposkytuje, hledej jinde.

Tomáš Votruba
Moderator | 1114
+
0
-

Možná poskytuje. Zkus detectLanguage(), metodu v HttpRequest

enumag
Člen | 2118
+
0
-

Tak to se omlouvám, šikovná metoda. Díky! ;-)

tivvit
Člen | 36
+
0
-

Používám tenhle překladač https://forum.nette.org/…lation-panel detectLanguage()se vytáhne z hlaviček já jsem řešil když už si jazyk zvolil, nebo mu ho pomocí tohodle aplikace zvolila. Napadlo mi jestli neresim úplnou kravinu jestli to nebude normálně v $_GET['lang']. Pravděpodobně jsem ten dotaz špatně zfimuloval ten jazyk už mám v URL.

enumag
Člen | 2118
+
0
-

Jak bych si to představoval: Jazyk by měl být perzistentní parametr v BasePresenteru. V metodě startup zjistíš zda náhodou nemá hodnotu NULL, pokud ano, použiješ detekci a hodnotu nastavíš. Poté pomocí nějakého setteru předáš tento jazyk translatoru.

vvoody
Člen | 910
+
0
-

Myslím že tivvit sa sekol práve tu:

enumag napsal(a):

V metodě startup zjistíš zda náhodou nemá hodnotu NULL…

$this->getParameter('lang'); // this == presenter
Tomáš Votruba
Moderator | 1114
+
0
-

@tivvit: Když jsem si to téma přečetl podruhé, hned mi došlo, že jsem si to zarámoval úplně blbě :D.

Druhý pokus: detekci je vhodné dělat v BasePresenteru, viz návod na Nette Translator, aneb to co píše enumag v konkrétním kódu

tivvit
Člen | 36
+
0
-

Díky za odpovědi. Potřeboval jsem hlavně toto

$this->getParameter('lang');

respektive tohle:

$template->language = $this->lang;

je prasárna to volat v basePresenteru v create Template, když to potřebuju na každé stánce (kde jinde by to případně mělo být)?

public function createTemplate($class = NULL)
{
	$template = parent::createTemplate($class);

	if (!isset($this->lang)) {
	    $this->lang = $this->httpRequest->detectLanguage($this->langs);
	    $this->redirect('this', array('lang' => $this->lang));
	}

	// pokud není nastaven, použijeme defaultní z configu
	if (!isset($this->lang)) {
	    $this->lang = $this->context->parameters["lang"];
	    $this->redirect('this', array('lang' => $this->lang));
	}

	$this->translator->setLang($this->lang); // nastavíme jazyk

	$template->setTranslator($this->translator);

	$template->language = $this->lang;

	return $template;
}

Nakonec jsem rozchodil i ten httpRequest.

enumag
Člen | 2118
+
0
-

Jak už jsem psal, ta část ošetření perzistentního parametru s detekcí a případným přesměrováním by měla být ve startup. Nastavení template bych subjektivně dal do beforeRender ale createTemplate je asi též ok.

tivvit
Člen | 36
+
0
-

pokud udělám v basePresenteru

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

	if (!isset($this->lang)) {
	    $this->lang = $this->httpRequest->detectLanguage($this->langs);
	    $this->redirect('this', array('lang' => $this->lang));
	}

	// pokud není nastaven, použijeme defaultní z configu
	if (!isset($this->lang)) {
	    $this->lang = $this->context->parameters["lang"];
	    $this->redirect('this', array('lang' => $this->lang));
	}
    }

dostanu tuhle chybu
Access level to RegisterPresenter::startup() must be public (as in class BasePresenter)
IMHO je problém že basePresenter už žádný parent nemá, ale bez nej to taky hází chybu, takže to bude spíš klávesnice-židle

pokud udělám

public function beforeRender() {
	$template->language = $this->lang;
    }

což by mi taky dávalo větší smysl než v createTemplate
dostanu
Undefined variable: language

ještě jeden dotaz

public function injectTranslator(NetteTranslator\Gettext $translator)

kdy se tohle volá? Nikde jsem k tomu nenašel žádnou teorii

Tabetha
Člen | 140
+
0
-

mám dojem že ten RegisterPresenter máš startup jako protected … daj ho ako public

Editoval Tabetha (8. 2. 2013 17:59)

enumag
Člen | 2118
+
0
-

áách jo…

  1. Metoda startup má být protected, ne public – což jsi z té chyby mohl vyčíst.
  2. V metodě beforeRender má místo $template být $this->getTemplate().
  3. Inject metody automaticky volá DIC, kde je k tomu dokumentace nevím…
tivvit
Člen | 36
+
0
-

@tabetha podle toho co píše enumag je to právě naopak musím ho změnit na protected a má pravdu
@enumag moc díky za rady už je vše ok, a omlouvám se za dotazy blbě se to hledá když zatím nemám nadhled

enumag
Člen | 2118
+
0
-

@tabetha, @tivvit: Důvod pro to protected je, že už základní Presenter v Nette metodu startup má protected. Volat ji zvenčí nedává smysl takže není důvod mít ji public (byť to jazyk umožňuje).

@tivvit: Omlouvám se, trochu mne dráždí když někdo neumí číst chyby… Jinak mnoho věcí najdeš v API dokumentaci, obecně když něco nefunguje, první věc co dělám je studium API, případně i zdrojového kódu.Uvědomíš si tím věci které by ti sebelepší dokumentace stejně neřekla. Jo jinak zde je dokumentace k tomu inject (chápu žes ji nenašel – taky bych ji nenašel kdybych nevěděl co hledám).