Překlady statických hodnot které se používájí ve formuláři

Danny
Člen | 146
+
0
-

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! :)

Čamo
Člen | 786
+
+1
-

Do databázy ukladáš nejakú konštantu ako napr. M/W (man/woman) a keď to vykresľuješ do selectu, alebo do šablony tak zavoláš

$this->translator->translate( "domain.path.$row->sex" );

Takže do selectu musíš poslať pole kde kľúče sú tie konštanty a values sú ich preklady.

Pavel Kravčík
Člen | 1180
+
0
-

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 | 786
+
0
-
$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)

CZechBoY
Člen | 3608
+
0
-

@Čamo vsak si je zdokumentuj :D
Ja bych si udelal metodu setTranslatableOptions(string $domain, array $items) a volal ji takto

setTranslatableOptions('domain.path.%s', ['M', 'F']);
Pavel Kravčík
Člen | 1180
+
0
-

@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
+
0
-

@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 | 1180
+
0
-

@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 | 786
+
0
-

Len pripomeniem, že pole pre select môže byť aj dvojrozmerné aby sa nezabudlo https://doc.nette.org/…rms/controls#…

Danny
Člen | 146
+
0
-

Díky moc za užitečné rady, pomohlo! :-)