Gettext Extractor – zacatecnicke potize s Translatorem
- kozel
- Člen | 14
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
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
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
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);
}
}
?>
- ic
- Člen | 430
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
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 | 8228
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
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
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
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
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
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
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
aneco.pripona/akce?lang=de
není stejné jakoneco.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
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
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ě.