Překlady statických hodnot které se používájí ve formuláři
- Danny
- Člen | 146
Zdravím,
rád bych zeptal jak se řeší překlady hodnot, které běžně obsahuje
formulář. Mám administraci která je pouze v CZ, ale do databáze sou
ukládají vždy 2 záznamy s lokalizaci ‚cs‘ a ‚en‘
Příklad mám formulář který obsahuje 2× textarea pro oba jazyky a selectbox Pohlaví – jehož hodnoty jsou „Muž“ a „Žena“, zpracuji a uložím do DB.
Tedy budu mít 2 záznamy v DB
ID sex content language
1 Muž obsah cs
2 Muž obsah_en en
Někde na FE vypisuju hodnoty pohlaví, text „Pohlaví“ bez problému přeložím přes kdyby translator jako
$this->translator->translate('profile_sex');
natvrdo v kódu přes klíč(profile_sex), který je uložený v databázi a podle locale a toho klíče najdu konkrétní název. Ale jak přeložím tu hodnotu z databáze „Muž“ ? Budu muset přes nějaký externí slovník hledat tohle slovo a ručně přeložit? Protože nemám žádný klíč podle kterého hledat překlad atd.
Nebo ten překlad zajistit ještě před uložením do databáze(což mi přijde logičtější), ale zase bych to musel řešit nějakým slovníkem.
Řeší se takové věci vůbec nebo se to ponechává nepřeložené?
Děkuji moc za informace! :)
- Pavel Kravčík
- Člen | 1196
Je to relativně otravné to dělat pro 50 selectů. Dobrá cesta také je
rozšířit si select o nějakou metodu typu
setTranslableOptions()
, která to udělá sama dle nějaké
konvence. Např. module.presenter.form.input
.
- Čamo
- Člen | 798
$model->repository->findSexForSelect();
alebo ma teraz napadlo dat do baseRepository:
$repository->getTranslatedPairs( $pairs, $domain )
{
foreach( $pairs as $key => $value ) $pairs[$key] = $this->translator->translate( $domain . '.' . $value );
return $pairs;
}
Najlepšie by bolo keby sa dal selectu predať ďalší parameter $domain a $translator a on by na základe týchto parametrov urobil preklad. Čo by asi nemal byť problém. A to je asi to čo napísal Pavel Kravčínk :) Tieto veci ako prepisovanie jadra nemám rád pretože sú nikdy neni zdokumentované.
Editoval Čamo (17. 8. 2018 8:42)
- Pavel Kravčík
- Člen | 1196
@CZechBoY: Ten druhý parametr je tam zbytečný. To pole už znáš:
//extend select
public function getControl()
{
if($this->translatableOptions)
{
foreach($this->getItems()...){}
}
}
- CZechBoY
- Člen | 3608
@PavelKravčík Já bych právě tu metodu setItems vůbec nepoužil, používal bych jen tu metodu setTranslatableOptions/Items, ta metoda by klidně interně mohla zavolat setItems a vzniklo by něco takovýho:
$this->addMultiSelect('name')
->setTranslatableItems('domain.path.%s', ['M', 'F']);
a implementace
public function setTranslatableItems(string $domainPath, array $items)
{
$translatedItems = [];
foreach ($items as $itemValue) {
$translatedItems[$itemValue] = sprintf($domainPath, $itemValue);
}
$this->setItems($translatedItems);
return $this;
}
- Pavel Kravčík
- Člen | 1196
@CZechBoY: Jasně. Měli jsme hotovou aplikaci, takže tohle by bylo
zbytečně více psaní. Items je tedy všude ve třetím parametru a
jednoduší je to brát z $this->getItems()
.
- Čamo
- Člen | 798
Len pripomeniem, že pole pre select môže byť aj dvojrozmerné aby sa nezabudlo https://doc.nette.org/…rms/controls#…