Gettext Extractor – zacatecnicke potize s Translatorem

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

Ahoj,

jsem zacatecnik a nejde mi preklad pomoci Translatoru z GettextExtractoru. Muzete mi prosim nekdo poradit, co delam spatne (prip. poslat mi link na nejaky kratky a nazorny howto-priklad na pouziti Gettext Extractoru a nasledne pouziti jeho Translatoru v sablone a ve formulari)? Myslel jsem, ze chyba asi bude v ceste ke slovniku (pri volani new Translator(...)), ale zkousel ji vsemozne prepsat a neuspel jsem.

sablona:

...
<body>
<h1>{$title}</h1>

{!_'something that should be translated'}

...
</body>
</html>

BasePresenter:

<?php
require_once('C:\xampp\htdocs\preklad01\app\components\GettextExtractor\Translator.php');

abstract class BasePresenter extends /*Nette\Application\*/Presenter {
  protected function beforeRender() {
    Environment::setVariable('lang', 'cs');
    $translator = new Translator(Environment::getVariable('lang'), APP_DIR . '/locale');    // od Karla Klimy
    $this->template->setTranslator($translator);
  }
}
?>

html v prohlizeci:

...
<body>
<h1>Translation</h1>

something that should be translated

...
</body>
</html>

moje adresarova struktura:

/app
  /components
    /GettextExtractor
      Translator.php
  /locale
    /cs
      /LC_MESSAGES
        /messages.po
  /presenters
    BasePresenter.php
    PrekladPresenter.php
  /templates
    @layout.phtml
jasir
Člen | 746
+
0
-

kozel: …

Co máš konkrétně za problém? Strukturu adresářů máš asi správně. Vyhodí to nějakou chybu?

Editoval jasir (17. 7. 2009 13:28)

kozel
Člen | 14
+
0
-

nehodi to zadnou chybu, stranka se zobrazi kompletne anglicky, jakoby se preklad vubec neprovedl

jasir
Člen | 746
+
0
-

kozel napsal(a):

nehodi to zadnou chybu, stranka se zobrazi kompletne anglicky, jakoby se preklad vubec neprovedl

Jestli používáš tento Translator, problém může být to, že nativní gettext() funkce neregistrují změnu *.mo souborů do restartu Apache (nějak si to Apache kešuje asi). Vyzkoušej alternativně translator od Romana Sklenáře, který tento problém nemá a je tedy pro vývoj vhodnější. Na produkci můžeš používat tento nativní translátor. Oba translátory by měli být 100% zaměnitelné.

Editoval jasir (17. 7. 2009 14:01)

kozel
Člen | 14
+
0
-

Aha. Bylo to tim. Dik moc. Apache jsem vypnul, zapnul a prelozilo se to. Na ostrym webu to asi jen tak udelat nepujde.. Takze tedy pouzivat jiny Translator, ok.

kozel
Člen | 14
+
0
-

Mam problem se zmenou jazyka – prikaz Environment::setVariable('lang', 'cs') mi nenastavi jazyk naporad. Po redirectu se nastavi vzdy na 'en'. Nevite prosim, kde muze byt zakopany pes?

BasePresenter

<?php
require_once('C:\xampp\htdocs\preklad01\app\components\GettextExtractor\Translator.php');

abstract class BasePresenter extends /*Nette\Application\*/Presenter {
  protected function beforeRender() {
    $translator = new Translator(Environment::getVariable('lang'), APP_DIR . '/locale');
    $this->template->setTranslator($translator);
  }
}
?>

zmena jazyka:

public function actionNastavitJazyk($jazyk) {
  Environment::setVariable('lang', $jazyk);
  $this->redirect('Homepage:default');
  }
jasir
Člen | 746
+
0
-

Environment si uchovává nastavené variables jen daný request.
Pro uložení informace o zvoleném jazyku je asi nejpříhodnější persistentní parametr presenteru (jazyk pak bude součástí URL všech odvozených prezenterů)

<?php
class BasePresenter extends Presenter {
	/** @persistent string */
	public $lang = 'cs'; //cs je defaultní hodnota

	protected function beforeRender() {
	    $translator = new Translator($this->lang, APP_DIR . '/locale');
	    $this->template->setTranslator($translator);
	}
}
?>
kozel
Člen | 14
+
0
-

Diky. Radeji bych ale byl, kdyby se tahle persistentni promenna do url nevkladala.

jasir
Člen | 746
+
0
-

Je to rozhodně nejčistší. Další možnost je session, ale když má uživatel otevřená dvě okna a v jednom si změní jazyk, v druhém se to změní taky.

ic
Člen | 430
+
0
-

jasir napsal(a):

Je to rozhodně nejčistší. Další možnost je session, ale když má uživatel otevřená dvě okna a v jednom si změní jazyk, v druhém se to změní taky.

Zrovna u jazyka je tohle celkem vhodné chování ne?

vlki
Člen | 218
+
0
-

Neřekl bych. Třeba pokud jde o vyhledávače, tak ti zaindexují jen jeden jazyk. Protože bude jedna url pro všechny překlady jedné stránky.

ic
Člen | 430
+
0
-

vlki napsal(a):

Neřekl bych. Třeba pokud jde o vyhledávače, tak ti zaindexují jen jeden jazyk. Protože bude jedna url pro všechny překlady jedné stránky.

Pokud tam někde bude odkaz na přepnutí jazyka v layoutu (společný na všech přeložených stránkách), což je logické, na co by byl nedostupný překlad, tak budou zaindexovány všechny stránky se všemi jazyky, protože z každé jednotlivé stránky povedou odkazy právě přes to přepnutí na ostatní přeložené kusy. Poprvé musí jít překlad přes get, třeba ?lang=de, kde se ona session uloží, ukládat ji nějakým javascriptem nebo výběrovým seznamem (select-option) by samozřejmě taky šlo, ale právě z tohto důvodu že by to nezaindexovaly vyhledávače (googlebot údajně nějaké jednoduché javascriptové přepínače už zvládne) by to nebylo nejvhodnější.

Ondřej Mirtes
Člen | 1536
+
0
-

Já myslím, že zapracováním sessions a cookies do tohoto systému (a vynecháním jazyku v URL) vyhledávače akorát tak zmátneš. Jsem rozhodně pro <lang>/ na začátku routy, do cookies můžeš uložit třeba uživatelův preferovaný jazyk (pokdu se liší od toho, jaký má nastavený v prohlížeči).

David Grudl
Nette Core | 8082
+
0
-

ic napsal(a):

Pokud tam někde bude odkaz na přepnutí jazyka v layoutu (společný na všech přeložených stránkách), což je logické, na co by byl nedostupný překlad, tak budou zaindexovány všechny stránky se všemi jazyky…

Nebudou. Roboti ignorují cookies a tudíž nefunguje ani session.

ic
Člen | 430
+
0
-

David Grudl napsal(a):

ic napsal(a):

Pokud…

Nebudou. Roboti ignorují cookies a tudíž nefunguje ani session.

Obával jsem se že nebudu umět správně vyložit co mám na jazyku, ale myslel jsem to tak že pokud bude na každé stránce webu odkaz na přepnutí do jiných jazyků. Tento odkaz bude muset nejlépe metodou get vložit nějaký parametr který změní aktuální jazyk na zvolený. No a já mám takouvou představu že v tu dobu aplikace vygeneruje stránku podle onoho ?lang=neco a uloží tu cookie v příštím prokliknutí jakéhokoliv odkazu sice ?lang=neco zanikne a robot uvidí zase stránku v defaultním jazyce ale pokud ten odkaz na změnu stránky do různých jazyků bude všude tak tímto způsobem postupně zaindexuje všechny překlady.

Sice si o struktuře webu asi udělá nepravdivou představu ale tohle myslím ve výsledcích hledání nehraje žádnou roli nebo jo?

Takhle nějak jsem to původně myslel

Ondřej Mirtes
Člen | 1536
+
0
-

ic napsal(a):

David Grudl napsal(a):

ic napsal(a):

Pokud…

Nebudou. Roboti ignorují cookies a tudíž nefunguje ani session.

Obával jsem se že nebudu umět správně vyložit co mám na jazyku, ale myslel jsem to tak že pokud bude na každé stránce webu odkaz na přepnutí do jiných jazyků. Tento odkaz bude muset nejlépe metodou get vložit nějaký parametr který změní aktuální jazyk na zvolený. No a já mám takouvou představu že v tu dobu aplikace vygeneruje stránku podle onoho ?lang=neco a uloží tu cookie v příštím prokliknutí jakéhokoliv odkazu sice ?lang=neco zanikne a robot uvidí zase stránku v defaultním jazyce ale pokud ten odkaz na změnu stránky do různých jazyků bude všude tak tímto způsobem postupně zaindexuje všechny překlady.

Sice si o struktuře webu asi udělá nepravdivou představu ale tohle myslím ve výsledcích hledání nehraje žádnou roli nebo jo?

Takhle nějak jsem to původně myslel

Furt tam máš tu interakci s cookies, takže robot uvidí přepnutí z jazyka A do jazyka A.

ic
Člen | 430
+
0
-

LastHunter napsal(a):

Furt tam máš tu interakci s cookies, takže robot uvidí přepnutí z jazyka A do jazyka A.

Ale právě to konstrukce toho přepínání (pokud je alespoň trochu rozumná) jim musí zobrazit stránku v jiném jazyce… protože při tom přepnutí (prokliknutí odkazu) chceme aby se ta samá stránka vypsala v jiném jazyce (mimo uložení cookie) a je zbytečné aby se jen uložila cookie v dalším kroku zase načetl její obsah… tak to myslím… udělám podmínku že pokud je adresa z GET tak při uložení cookie ji nebudu znova načítat protože o tom v jakém jazyce uživatel (nebo jiná neživá entita) stránku chce už vím.

nAS
Člen | 277
+
0
-

Rozumím ti, jak to myslíš, ale celý ten návrh je špatně. Řekne ti to každý odborník na SEO (vyhledávače v tom boudou mít guláš, protože na jednom stejném URL najdou 2 různé stránky), nebo použitelnost (uživatel pošle někomu odkaz e-mailem a ten uvidí jinou stránku). A takových problémů se najde spousta.

Mé doporučení tedy zní: rozhodně přenášej jazyk v URL.

ic
Člen | 430
+
0
-

nAS napsal(a):

Rozumím ti, jak to myslíš, ale celý ten návrh je špatně. Řekne ti to každý odborník na SEO (vyhledávače v tom boudou mít guláš, protože na jednom stejném URL najdou 2 různé stránky), nebo použitelnost (uživatel pošle někomu odkaz e-mailem a ten uvidí jinou stránku). A takových problémů se najde spousta.

Mé doporučení tedy zní: rozhodně přenášej jazyk v URL.

No jsem moc rád že mi někdo rozumí XD.

Rozhodně nejsem zastánce tohoto řešení (předávání jazyka přes session) jak jsem to formuloval zde: lol

Chtěl jsem jen říct že ono řešení předávání jazyka přes session nebrání vyhledavačům zaindexovat všechny jazykové mutace stránky.

A dokonce je ani nebudou na jednom url 2 stejné stránky protože třeba německé stránky budou mít všechny původní adresou stránky plus ?lang=de a neco.pripona/akce?lang=de není stejné jako neco.pripona/akce

Editoval ic (9. 9. 2009 17:24)

nAS
Člen | 277
+
0
-

ic napsal(a):

Chtěl jsem jen říct že ono řešení předávání jazyka přes session nebrání vyhledavačům zaindexovat všechny jazykové mutace stránky.

A dokonce je ani nebudou na jednom url 2 stejné stránky protože třeba německé stránky budou mít všechny původní adresou stránky plus ?lang=de a neco.pripona/akce?lang=de není stejné jako neco.pripona/akce

To je pravda, ale každopádně budou mít vyhledávače guláš ve struktuře webu, bude se špatně přenášet PageRank atd.

Takže bych to uzavřel s tím, že to vážně není dobrý nápad. :)

kozel
Člen | 14
+
0
-

jasir napsal(a):

kozel napsal(a):

nehodi to zadnou chybu, stranka se zobrazi kompletne anglicky, jakoby se preklad vubec neprovedl

Jestli používáš tento Translator, problém může být to, že nativní gettext() funkce neregistrují změnu *.mo souborů do restartu Apache (nějak si to Apache kešuje asi). Vyzkoušej alternativně translator od Romana Sklenáře, který tento problém nemá a je tedy pro vývoj vhodnější. Na produkci můžeš používat tento nativní translátor. Oba translátory by měli být 100% zaměnitelné.

Ty translatory se mi nezdaji 100% zamenitelne..

Translator od Karla Klimy:
Po restartu Apache na localu (Vista, XAMPP, PHP 5.2.9) funguje vsechno tak, jak ma, ale na ostrem serveru (Linux, PHP 5.2.5) se po restartu nic nedeje – neprelozi se vubec nic, vsechno je v puvodnim jazyce.

Translator od Romana Sklenare:
Mam dojem, ze preklada jen texty z sablon, texty z .php nepreklada. Na localu jede stejne jako na produkci.

Jeste bych uvedl, ze ve zdrojacich jsou vsude ceske texty a Translator preklada (resp. by mel prekladat) z cestiny do anglictiny.

romansklenar
Člen | 655
+
0
-

kozel napsal(a):
Translator od Romana Sklenare:
Mam dojem, ze preklada jen texty z sablon, texty z .php nepreklada. Na localu jede stejne jako na produkci.

Funkce _() volá automaticky nativní gettextový překladač, takže pokud máš na mysli toto, tak ti to ani překládat nemůže. Formulářům se translator musí nastavit explicitně.