Problém s NetteTranslator

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

Zdravím,
zprovoznil jsem (částečně) NetteTranslator podle návodu https://componette.org/search/?…

Překlad formulářů a textů z šablony funguje naprosto spolehlivě. Problém je ale s překladem FlashMessage, ten se sice přeloží ale jenom pro jazyk jaký je defaultně nastaven v configu. Pokud z měním jazyk přes menu nebo mám pro uživatele definovaný příznak, tak hláška se furt překládá na základě výchozího jazyka z kofigurace a i přesto že formuláře a šablona se zobrazuje přeloženě.

U druhého problému se mi nedaří překládat z modelu Authenticator.php

<?php
	public function authenticate(array $credentials)
	{
		list($username, $password) = $credentials;
                $row = $this->userRepository->getTable()->where(array(
                    'login' => $username
                ))->fetch();

		if (!$row) {
			throw new \Nette\Security\AuthenticationException('Chybné jméno.', self::IDENTITY_NOT_FOUND);
		}

		if ($row->password !== $this->calculateHash($password, $row->password)) {
			throw new \Nette\Security\AuthenticationException('Chybné heslo.', self::INVALID_CREDENTIAL);
		}

		unset($row->password);
		return new \Nette\Security\Identity($row->id, NULL, $row->toArray());
	}
?>

Neporadil by někdo jak nastavit aby se mi překládaly hlášky odtud když vše mám nastavené podle návodu? Děkuji Mockrát

castamir
Člen | 629
+
0
-

ad 1) ověřím

ad 2) V Authenticator.php žádný překlad nevidím, jen vyhození několika výjimek v česky psanou chybou, ale výjimky nejsou defaultně překládané – proč by taky obecně mělý být? Jsou to informace hlavně pro vývojáře, ne pro uživatele. Pokud ale chceš vypsat informaci o tom, že uživatel zadal špatné údaje, pak zkus použít přihlašování ze Sandboxu a překlad zavolat až v SignPresenteru.

	// SignPresenter
	try {
		$this->getUser()->login($values->username, $values->password);
	} catch (Nette\Security\AuthenticationException $e) {
		$message = $this->translator->translate($e->getMessage());
		$form->addError($message);
		return;
	}

Edit:

Vlož sem prosím kódy k prvnímu bodu.

Editoval castamir (29. 3. 2013 10:40)

oskarmaniak
Člen | 29
+
0
-

Děkuji za rychlou a ochotnou reakci.

Dle již zmiňovaného návodu jsem do BasePresenter.php vložil

<?php
// BasePresenter

public function flashMessage($message, $type = "info")
{
    $message = $this->translator->translate($message);
    return parent::flashMessage($message, $type);
}
?>

Pak například v logovacím formuláři SignPresenter.php

<?php
public function signInFormSubmitted($form)
	{
		$values = $form->getValues();

		if ($values->remember) {
			$this->getUser()->setExpiration('+ 14 days', FALSE);
		}/* else {
			$this->getUser()->setExpiration('+ 20 minutes', TRUE);
		}*/

		try {
			$this->getUser()->login($values->username, $values->password);
                        $this->flashMessage('Login successful', 'success');
                        $this->lang = $this->getUser()->getIdentity()->lang;
                         $this->redirect('Homepage:');
		} catch (Nette\Security\AuthenticationException $e) {
			$form->setTranslator($this->translator);
			$form->addError($e->getMessage()); // TODO: nejakou obecnejsi chybovou hlasku
			return;
		}
?>

Je to součást toho kódu k druhému příkladu. Takže tento flash se přeloží ale jen na jazyk který je nastaven jako výchozí v config.neon.

<?php
$this->flashMessage('Login successful', 'success');
?>

I když jsem si udělat PO soubory abych to měl pro všechny jazyky (kdyby například překladač v laděnce to jen nedokázal zaznamenat) ani v tomto případě nebyli použity ty překlady jen ten pro výchozí jazyk.

Také to samé dělá i na ostatní flashe třeba i při logoutu.

Ohledně druhého bodu děkuji za rychlou reakci, předělám tedy systém způsobu přihlašování. Neměli by tedy být hlášky pro renderování brány z „model(ů)“ ale až pak Presenteru. Děkuji

castamir
Člen | 629
+
0
-

Kdes přišel na tohle?

$form->setTranslator($this->translator);
$form->addError($e->getMessage());

Psal jsem, abys použil

$message = $this->translator->translate($e->getMessage());

A tady je ona chyba z bodu 1:

$this->flashMessage('Login successful', 'success'); // flash msg ve starem jazyce
$this->lang = $this->getUser()->getIdentity()->lang; // nastaveni noveho jazyka ALE bez propagace do translatoru

Pokud chceš načíst jazyk podle uživatelského nastavení, pak bys měl tu změnu propagovat i do translatoru viz metoda createTemplate v ukázkovém kódu.

Zároveň by v try-catch měl být jen kód, který skutečně vyhazuje výjimku.

try {
    $this->getUser()->login($values->username, $values->password);
} catch (Nette\Security\AuthenticationException $e) {
    $message = $this->translator->translate($e->getMessage());
    $form->addError($message); // nebo lépe nějakou vlastní chybovou hlášku
    return;
}

$this->lang = $this->getUser()->getIdentity()->lang;
	$this->translator->setLang($this->lang); // toto je nové
$this->flashMessage('Login successful', 'success'); // flash msg až po změně jazyka
$this->redirect('Homepage:');

Editoval castamir (29. 3. 2013 12:09)

Filip Procházka
Moderator | 4668
+
0
-

Tohle nastavuj už při vytváření formuláře.

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

Errory a popisky prvků se ti pak budou překládat samy.

oskarmaniak
Člen | 29
+
0
-

Děkuji Castmir a Filip Procházka.

Po pár hodinách co jsem nad tím bádal jsem snad konečně pochopil ty návaznosti a zprovoznil to dle svých představ a vše funguje jak má. Děkuji za Vaše rady a nakopnutí správným směrem.

Hezký víkend a svátky