Problém s NetteTranslator
- oskarmaniak
- Člen | 29
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
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
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
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
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
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