Translator – ako to vlastne cele funguje?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Ďurika
Člen | 328
+
0
-

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

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.

  1. string na preklad
  2. prekladac checkne CACHE, ak najde preklad rovno ho vrati
  3. 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
+
0
-

chcem to koli optimalizacii, robit na DB 120 query namieso jedneho je zbytocne…

aku cache mas na mysli?

Nox
Člen | 378
+
0
-

Ty sis napsal translator co to tahá z DB? Pokud ano tak cache už přece zvládneš… pokud používáš normálně gettext tak ten přece bere z lokálního souboru

newPOPE
Člen | 648
+
0
-

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

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

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

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

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

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)