Missing_translation v správach
- x5
- Člen | 28
Ahojte, v nette som začátečník tak potrebujem poradiť.Ak si niekto na mojom webe klikne na správy a ide písať novú správu a ak zadá ID užívatela akému ide správu písať také ktoré ešte na webe nieje zaregistrované napíše missing_translation miesto textu Užívatel s týmto ID neexistuje. Budem rád ak niekto poradí vysvetlí ako to opraviť.Ďakujem pekne.
//edit malo by to byt v MessagesPressenter?
Tam mam na ID tento kod:
$form->addText('id', '360')
->setValue($this->getParameter('id'))
->addRule(Form::FILLED, '362')
->addRule(Form::INTEGER, '361')
->getControlPrototype()
->addClass('large');
$t['360'] = 'ID užívateľa';
$t['361'] = 'ID musí byť číslo.';
$t['362'] = 'Nevyplnili ste ID užívateľa.';
A nejako tam zakomponovat?
$t['369'] = 'Užívateľ s ID';
$t['370'] = 'neexistuje.';
Editoval x5 (8. 12. 2015 23:02)
- David Matějka
- Moderator | 6445
Nette zadny retezec missing_translation
neobsahuje. pouzivas
nejake extension na preklady nebo..?
Jak zobrazujes to Uzivatel s tymto ID neexistuje.?
- David Matějka
- Moderator | 6445
Nepomuze, neni tam videt, odkud tu zpravu „Užívatel s týmto ID neexistuje“… ale s nejvetsi pravdepodobnosti to bude proste chyba v tvem kodu.
A opravdu mas pro preklady cisla? vzdy je to totalne neprehledny
- David Matějka
- Moderator | 6445
No predpokladam, ze mas nejakou vlastni implementaci translatoru a pokud
neexistuje preklad, tak vratis missing_translation. Tak si akorat zjisti jaka
hodnota a odkud se tam dostala. Pokud neumis debugovat (treba xdebugem), tak
bude nejlepsi namisto vraceni toho textu vyvolat vyjimku, treba jen
throw new \Exception
a tracy ti ukaze odkud to bylo zavolano a
s jakou hodnotou. dal uz si snad poradis sam..
- David Matějka
- Moderator | 6445
a co pouzivas za translator? si v projektu vyhledej retezec missing_translation a uvidis, odkud to je
- x5
- Člen | 28
Može to byť toto ono že to tam je takto zapísané?
return $form;
}
public function messageFormSubmitted(Form $form) {
$values = $form->getValues();
if ($this->getUser()->getId() == $values->id) {
$this->flashMessage('368', 'error');
} elseif ($this->authRepository->getUser($values->id) === FALSE) {
$this->flashMessage('369 ' . $values->id . ' 370', 'error');
} else {
$t['369'] = 'Užívateľ s ID';
$t['370'] = 'neexistuje.';
Neni chyba len v tom kóde vyššie a preto mi tam ten text neukazuje ale ukazuje missing?
- David Matějka
- Moderator | 6445
doposud si mi nerekl, co pouzivas za translator.
A jinak ano, je to tim '369 ' . $values->id . ' 370'
- David Matějka
- Moderator | 6445
takze mas vlastni translator..
A jeste, jak prekladas ty flash messages? mas prekrytou metodu flashMessage,
nebo az v sablone pri vypisovani pomoci {_$flash->message}
tedy
makrem _
?
no kdyz zavolas flashMessage s tema parametrama, tak ti do translate prijde
pouze retezec '369 123 370'
(kde 123 je to id), takze je jasne, ze
to nebude fungovat.
Mas dve moznosti, bud si tu zpravu prelozis rovnou v presenteru
->flashMessage($this->translator->translate(369) . $values->id . $this->translator->translate(370));
ale i tato zprava bude prohnana translatorem, takze budes muset asi vyhodit
to missing_translation
a vratit vstupni retezec, pokud neexistuje
preklad (takhle se to vetsinou resi)
druhou moznosti je predat misto retezce nejakou jinou strukturu, treba objekt nebo pole, se kterym si translator poradi.
Bezne byva v prekladovych tabulkach napriklad
$t['369'] = 'Uzivatel s id {id} nenalezen';
kde {id} je nejaky placeholder, ktery se nahradi parametrem predanym napriklad v presenteru.
Takze v tomto pripade by si treba zavolal z presenteru
$this->flashMessage(['message' => '369', 'parameters' => ['id' => $id]]);
a v translatoru si s tim poradis..
A nebo lepe, pouzij nejaky existujici reseni, treba kdyby/translation a nevymyslej kolo.
ale v kazdem pripade se zbav tech cisel a nahrad to retezci
- x5
- Člen | 28
David Matějka napsal(a):
takze mas vlastni translator..
A jeste, jak prekladas ty flash messages? mas prekrytou metodu flashMessage, nebo az v sablone pri vypisovani pomoci{_$flash->message}
tedy makrem_
?no kdyz zavolas flashMessage s tema parametrama, tak ti do translate prijde pouze retezec
'369 123 370'
(kde 123 je to id), takze je jasne, ze to nebude fungovat.Mas dve moznosti, bud si tu zpravu prelozis rovnou v presenteru
->flashMessage($this->translator->translate(369) . $values->id . $this->translator->translate(370));
ale i tato zprava bude prohnana translatorem, takze budes muset asi vyhodit to
missing_translation
a vratit vstupni retezec, pokud neexistuje preklad (takhle se to vetsinou resi)druhou moznosti je predat misto retezce nejakou jinou strukturu, treba objekt nebo pole, se kterym si translator poradi.
Bezne byva v prekladovych tabulkach napriklad
$t['369'] = 'Uzivatel s id {id} nenalezen';
kde {id} je nejaky placeholder, ktery se nahradi parametrem predanym napriklad v presenteru.
Takze v tomto pripade by si treba zavolal z presenteru
$this->flashMessage(['message' => '369', 'parameters' => ['id' => $id]]);
a v translatoru si s tim poradis..
A nebo lepe, pouzij nejaky existujici reseni, treba kdyby/translation a nevymyslej kolo.
ale v kazdem pripade se zbav tech cisel a nahrad to retezci
Takto som to skusal
->flashMessage($this->translator->translate(369) . $values->id . $this->translator->translate(370));
Lenže proste ono to bude ukazovať stále to isté tu posielam velkú časť kódu z messagespresenter:
$form = new Form;
$form->setTranslator($this->translator);
$form->getElementPrototype()->addClass('default');
$form->addText('id', '360')
->setValue($this->getParameter('id'))
->addRule(Form::FILLED, '362')
->addRule(Form::INTEGER, '361')
->getControlPrototype()
->addClass('large');
$form->addText('title', '363')
->addRule(Form::FILLED, '364')
->getControlPrototype()
->addClass('large');
$form->addTextArea('message', '365')
->addRule(Form::FILLED, '366')
->getControlPrototype()
->addClass('large');
$form->addSubmit('ok', '367');
$form->onSuccess[] = $this->messageFormSubmitted;
return $form;
}
public function messageFormSubmitted(Form $form) {
$values = $form->getValues();
if ($this->getUser()->getId() == $values->id) {
$this->flashMessage('368', 'error');
} elseif ($this->authRepository->getUser($values->id) === FALSE) {
$this->flashMessage('369 ' . $values->id . ' 370', 'error');
} else {
Toto je všetko ohladom toho.Buďto tam ten kód píšem zle alebo mi ho nechce ukázať skús ho tam pridať ty resp. čo to urobí potom.
- x5
- Člen | 28
Skúsil som obidve možnosti no buďto robím niekde chybu alebo neviem.Jediná zmena ktorá je že missing_translation mi píše na modro predtým na červeno, inak bez zmeny. :(
Ak z tohoto kodu:
$this->flashMessage('369 ' . $values->id . ' 370', 'error');
neham len:
$this->flashMessage('369 ' 'error');
Tak mi uz ukaze text ze uzivatel id a viac nic. Takze nejako upravit tento kod aby to ukazovalo?
Editoval x5 (9. 12. 2015 1:19)
- akadlec
- Člen | 1326
Tu chybu pořád nevidíš? Podle toho co píšeš máš překlady založenz na nějakých číslech:
$t['360'] = 'ID užívateľa';
$t['361'] = 'ID musí byť číslo.';
$t['362'] = 'Nevyplnili ste ID užívateľa.';
a v té tvé flash zprávě máš řetězec:
369 999 370
tudíž pro ten klíš ti to nic nenajde.
Z tvého posledního postu soudím, že překlad děláš asi až někde na úrovni šablony, proto ti neprojde ani řešení:
$this->flashMessage($this->translator->translate(369) . $values->id . $this->translator->translate(370));
protože to ti tam pošle přeložený řetězec tak jak chceš ale ty se jej pokusíš přeložit podruhé a pak máš to missing translation.
Takže buď si tam udělej nějaké vypínátko na překládání v renderovaní flash zprávy, nebo přepracuj koncepci translatoru a zkus použít něco vyzkoušeného a funkčního.
Jinak ještě si můžeš do toho tvého translatoru přidat kontrolu zda ten překládáný řetězec je číslo nebo text, když bude číslo tak jej přeložít a když text tak jej pošleš dál nepřeložený. To by mohl být takový malý fallback.