Translator – ako to vlastne cele funguje?
- David Ďurika
- Člen | 328
Zdravim,
vytvoril som si vlastny translator podla https://doc.nette.org/…on/templates#…
vsetko slape jak ma :)
ako som spravne pochopil tak to preklada vyrazy okamzite, cize: ak najde napr. v sablone {_'pes'} tak to hned prelozi… chcel by som si spravit taky prekladac kt. by si taketo preklady len zozbieral a potom jednym query by z BD vytiahol preklady kt. potrebuje.
ako by sa to dalo vyriesit? dakujem
- newPOPE
- Člen | 648
A naco by to bolo dobre, resp. co od toho ocakavas?
Domnievam sa, ze ako hovoris ked potrebujes preklad tak sa zavola ::translate(…) a vrati preklad. Keby ti len vytiahol z DB co by vratil? resp. jednym query to asi nepojde… skor by som to riesil takymto postupom.
- string na preklad
- prekladac checkne CACHE, ak najde preklad rovno ho vrati
- ak nenajde v cache, loadne preklad z DB, ulozi do cache a vrati
toť moj návrh, ini asi budu mat nieco ine :-)
- David Ďurika
- Člen | 328
chcem to koli optimalizacii, robit na DB 120 query namieso jedneho je zbytocne…
aku cache mas na mysli?
- newPOPE
- Člen | 648
Myslel som https://doc.nette.org/cs/caching
to ci do cache uz narves pole zo vsetkymi prekladmi alebo kazdy preklad pod jednym klucom uz je na tebe.
TO ze spustis 120q na DB sa moze stat ked mas pri jednom zobrazeni 120 prekladov, ale stane sa to len 1× potom to uz ide z cache. Ked ich nechces spustat tolko tak spust jeden co vytiahne z DB preklady a ulozi do cache ;-)
Ja pouzivam napr. *.ini subory, tahat realtime z DB sa mi nepaci presno kvoli tym queries. pokial to napr chces prekladat pomocou administracie tak by som to riesil tak ako som pisal…
- Ot@s
- Backer | 476
achtan napsal(a):
ako by sa to dalo vyriesit? dakujem
Já to řeším tak, že mám v translatoru private proměnnou (pole) se
slovníkem $dict=null
. Při prvním požadavku o překlad testuju
obsah slovníku empty($this->dict)
. Pokud je null, tak ho
jednorázově naplním jedním SQL dotazem. Další volání translatoru už si
sahá do naplněného $this->dict
. Neoptimalizuji situaci,
jestli potřebuju 1/2 slovníku, nebo celý.
Editoval Ot@s (4. 8. 2011 13:54)
- David Ďurika
- Člen | 328
Tieto riesenia su dobre skor pre male weby kde oprtimalizacia rychlosti nieje na prvom mieste,
ale mi mame web kde je cca 2000 prelkadov, v 14tich jazykoch
- Ot@s
- Backer | 476
achtan napsal(a):
Tieto riesenia su dobre skor pre male weby kde oprtimalizacia rychlosti nieje na prvom mieste,
ale mi mame web kde je cca 2000 prelkadov, v 14tich jazykoch
Z hlediska SQL serveru je SELECT nad 28000 řádky s 1 podmínkou
where lang='sk'
optimálnější, než
where lang='sk' AND dict IN ('fraze1','fraze2',...,'fraze89')
.
Obecně ja na zvážení jestli režie optimalizace bude menší, něž
„zbytečně“ naplněná RAM…
Bylo by nutné nějak ohackovat nette, resp. latte filtr, abys trikem dopředu zjistil, které překlady budeš potřebovat. Celé bez problému si to neumím představit.
Spíše si do DB v pomocné tabulce ukládej, ve kterých souborech (či ID řádků v db) se dané překlady nacházejí a pak vybírej jen ty překlady, které se váží k právě zobrazovanému dokumentu (k „vytipování“ by se dal využít „první průchod“ translátoru, resp. prvotní načtení stránky). Těžko asi něco dál řešit, když neznáme souvislosti/detaily.
Editoval Ot@s (4. 8. 2011 14:20)
- David Ďurika
- Člen | 328
a este mam jednu otazku: ako vlastne zistujete ze do akeho jazyka mate
prekladat, a ako je co cele prepojene s DI a Translatorom… ?
dakujem
- frosty22
- Člen | 373
Zjištění jazyka, do jakého se má překládat? Mno asi tradičně vlaječky na stránce a persistentní parametr v BasePresenteru.
<?php
abstract class BasePresenter extends Presenter {
/**
* @persistent
*/
public $lang = "cs"; // vychozi jazyk
....
}
?>
A pokud bys chtěl výchozí jazyk detekovat podle prohlížeče, tak třebas v boostrapu z kontajneru vytáhni HttpRequest a tam se jukni na šikovně schovanou metodu „detectLanguage“, o které snad nikde není zmínka tady, ale nějak jsem na ní narazil :)
https://api.nette.org/…est.php.html#337
A přepínání v latte
<a href="{plink this, lang => "en"}">Énglicky</a>
<a href="{plink this, lang => "jp"}">Japonsky</a>
<a href="{plink this, lang => "kr"}">Křovácky</a>
Editoval frosty22 (8. 8. 2011 23:12)