[addon gettext-translator] Translator

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

Diskuse ke stránce Translator


Ahoj… vyzkousel jsem tento translator, ale konci mi to temahle noticama a preklad se neprovede

Notice: Undefined offset: 2 in C:\xampp\htdocs\skel\libs\Extras\Translator\translator.php on line 208
Notice: Undefined offset: 2 in C:\xampp\htdocs\skel\libs\Extras\Translator\translator.php on line 217

do metody getTranslation radek 208 se posle int(2)

lokalizaci zkousim takze prekladam jenom jednu vetu a .po, .mo soubory mam :-( co delam zase spatne? :-(

iskuda
Člen | 5
+
0
-

Musím říct, že mě to dělá přesně to samé. Neví někdo co s tím?

zaxeeq
Člen | 17
+
0
-

Imho voláte Translator::translate() s parametrem $count u něčeho co nemá plurál

rokerkony
Člen | 122
+
0
-

no to si nejsem uplne jisty…
jenom na zkousku jsem pouzil skeleton a „hello word“ prelozil na „ahoj světe“.
tady je moje aplikace
porad to dela stejnou chybu
co je tam spatne :-(

edit:
vsiml jsem si ze mam v poeditu nastaveny spatne plural… moje chyba :-(

nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2; // ze stranek http://charlie.cz/gettext-extractor/
nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4 ? 1 : 2); // toto uz funguje

hapruje tam jedna zavorka… :-/ chjoooo

Editoval rokerkony (30. 6. 2009 9:54)

romansklenar
Člen | 655
+
0
-

Je to v dokumentaci zvýrazněno.

U PHP záleží na správném ozávorkování toho ternálního výrazu udávající tvar plurálu, viz tato simulace:

$n = 1;

$plural = ($n==1) ? 0 : ($n>=2 && $n<=4 ? 1 : 2);
echo $plural; // 0 - chtěný výsledek

$plural = ($n==1) ? 0 : ($n>=2 && $n<=4) ? 1 : 2;
echo $plural; // 2 - nechtěný výsledek

Překladač od Karla Klímy využívá nativní gettextový driver z PHP a tomu ten tvar problémy nedělá.

jasir
Člen | 746
+
0
-

V současnosti se na fóru a tady vyskytují dvě třídy s názvem Translator řešící překlad přes *.mo *.po soubory a gettext.

Jeden využívá nativní php funkce gettext, tento tvůj si parsuje *.mo soubory sám.
Nestálo by tedy za to tento translator přejmenovat například na GettextTranslator( a ten druhý na NativeGettextTranslator)? Šlo by je pak snadno zaměňovat, protože tento se hodí na vývoj a ten druhý zase na produkci?

romansklenar
Člen | 655
+
0
-

Budiž se tak stalo. Možná by stálo za to, oba dva sjednotit pod jeden a dát uživateli možnost výběru či automaticky detekovat, který se má použít. Jen jestli to není ale zbytečné zesložitění.

jasir
Člen | 746
+
0
-

romansklenar napsal(a):

Budiž se tak stalo. Možná by stálo za to, oba dva sjednotit pod jeden a dát uživateli možnost výběru či automaticky detekovat, který se má použít. Jen jestli to není ale zbytečné zesložitění.

Prima, díky. Možná by se to dalo řešit jen přes Config, nějak jako

[production]
service.Translator = NativeGettextTranslator

[development]
service.Translator = GettextTranslator

a pak:

<?php
$this->translator = Environment::getServiceLocator()->getService('Translator')
?>

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

ic
Člen | 430
+
0
-

Podařilo se mi to rozjet, je to super, ale mé řešení není úplně elegantní… proto bych potřeboval osvětlit ještě nějaké drobnosti.

Dělal jsem to asi takto:
router na jazyky mám asi stejný jako tady: <lang (cs|en)>/<presenter>/<action>/<id>
v BasePresenter-u mám toto:

public $lang = 'en';

	protected function beforeRender()
	{

		if($this->getParam('lang')) {
			$this->lang = $this->getParam('lang');
		}

		$translator = new GettextTranslator(APP_DIR.'/locale/'.$this->lang.'/LC_MESSAGES/messages.mo', $this->lang);
		$this->template->setTranslator($translator);

	}

takže .mo soubory s překlady jsou v app/locale/cs/LC_MESSAGES/messages.mo a app/locale/en/LC_MESSAGES/messages.mo

to je to co se mi nezamlouvá… že musím mít překladový soubor (pro en) ve kterém žádné překlady nejsou.

Ondřej Mirtes
Člen | 1536
+
0
-

Ahoj, snažím se zprovoznit tento Translator a vyhazuje mi ty notice uvedené výše a také parse error na řádku s eval.

Parse error: parse error in D:\Webs\www\Baywatch\app\classes\GettextTranslator.php(59) : eval()'d code on line 1

Notice: Undefined variable: plural in D:\Webs\www\Baywatch\app\classes\GettextTranslator.php on line 60

Notice: Undefined index: in D:\Webs\www\Baywatch\app\classes\GettextTranslator.php on line 208

Notice: Undefined index: in D:\Webs\www\Baywatch\app\classes\GettextTranslator.php on line 217

Bude to německo-anglický web, takže jsem zaimprovizoval a vymyslel následující tvar pro formu plurálů:

nplurals=2; plural=(n==1 ? 0 : 1)

Ale neběží mi to :( Kde je chyba? Co sem mám ještě postnout? Díky.


EDIT: Tak mi zafungovalo toto:

nplurals=2; plural=(n==1) ? 0 : 1;

Editoval LastHunter (24. 8. 2009 14:02)

dotTwelve
Člen | 167
+
0
-

Mám vytvořený binární soubor překladu, kde originál je EN a překlad CS. Můj dotaz zní, jak vytvořím soubor překladu, kde originál bude CS a překlad EN.

Nějak nechápu, proč musím mít dva soubory na jeden překlad.

Ondřej Mirtes
Člen | 1536
+
0
-

Originál je ten, který máš zadrátován v šablonách a ostatních zdrojácích. Originál je zkrátka jen jeden :))

Pokud máš např. v šablonách zadrátovanou jen třeba nějakou pseudo-angličtinu bez plurálů, tak vytvoř soubor s překlady „angličtina“ → lepší angličtina…

dotTwelve
Člen | 167
+
0
-

Už to mám. Super. Holt mám EN → EN a EN → CS.

Ještě mám dotaz, „zádratovanou“ mám defaultně angličtinu co se týká názvosloví presenterů aj. a potřebuju abych měl přeloženy i názvy v adresním řádku, jako je to například zde na fóru.

Příklad: /cs/dokumentace → /en/documentation

Ondřej Mirtes
Člen | 1536
+
0
-

K tomu slouží tato konstrukce (musí se uvést před samotnou definicí rout!):

Route::setStyleProperty('presenter', Route::FILTER_TABLE, array(
    'prihlasit-se' => 'Login',
    'registrace' => 'Registration',
    'nastaveni' => 'Settings',
));

Více i tom a i nějaké další fíčury najdeš v tomto threadu.

dotTwelve
Člen | 167
+
0
-

Tak jsem použil překladový slovník a funguje bezvadně až na to, že jsem musel upravit routy, jelikož úplně v rootu webu mi to psalo, že není routa.

<?php
$router[] = new Route('cs/<presenter #cs-presenter>/<action>/<name>', array(
        'lang' => 'cs',
        'presenter' => 'Default',
        'action' => 'default',
        'name' => NULL
));

$router[] = new Route('en/<presenter #en-presenter>/<action>/<name>', array(
        'lang' => 'en',
        'presenter' => 'Default',
        'action' => 'default',
        'name' => NULL
));
?>

upraveno na:

<?php
$router[] = new Route('<lang (cs)>/<presenter #cs-presenter>/<action>/<name>', array(
        'lang' => $defaultLang,
        'presenter' => 'Default',
        'action' => 'default',
        'name' => NULL
));

$router[] = new Route('<lang (en)>/<presenter #en-presenter>/<action>/<name>', array(
        'lang' => $defaultLang,
        'presenter' => 'Default',
        'action' => 'default',
        'name' => NULL
));
?>

A moje otázka zní: Nelze tyto dvě routy nacpat do nějaké jedné standardizované?

ClaryAldringen
Člen | 5
+
0
-

Zdravím,
chci se zeptat jaký překladač použít v produkčním nasazení. Byl tu zmíněn NativeGettextTranslator ale nikde jsem k němu nic nenašel, takže je to pro mě jakýsi duch. Ideální by byl nějaký konkrétní příklad použití.

redhead
Člen | 1313
+
0
-

Hlásím nekompatibilitu s nightly build. Ovšem nevím jesli je to bug v Nette nebo v GettextTranslatoru:

Pokud mám nějaké labely u formuláře, tak nette volá:

//FormControl.php (278)
public function translate($s, $count = NULL)		// <---- PROBLEM JE TADY V NULL
{
	$translator = $this->getTranslator();
	return $translator === NULL ? $s : $translator->translate($s, $count);
}

Translator má pak hlavičku metody translate:

public function translate($s, $count = 1) { ...

Pokud tedy nette pošle null, $count bude také null a ve výsledku skončí parse chybou.

Fix v Translatoru:

public function translate($message, $count = NULL)
{
	if($count === NULL)
        	$count = 1;
	// ... //
}
Patrik Votoček
Člen | 2221
+
0
-

už to bylo dávno opraveno viz: https://github.com/…t-translator

redhead
Člen | 1313
+
0
-

to je sice hezký, že je to na githubu, ale v doplňcích je stále verze 0.3 (ani odkaz na github tam neni)

Patrik Votoček
Člen | 2221
+
0
-

poprosil jsem romana aby to aktualizoval…

VeN
Člen | 46
+
0
-

Ahoj, mám dotaz na použití translatoru a nenašel jsem žádný příspěvek, který by se problematice věnoval. Mám následující volání:

echo sprintf($translator->translate('Article %s has no comment from user %s.'), $article->title, $user->name);

Současný translator na tom vyhoří. Řešil jste někdo následující problém? IMHO by bylo dobré změnit rozhraní metody translate, nebo alespoň nepoužívat volání vsprintf způsobem, kterým se používá. Co si o tom myslíte?

UPDATE: Tak ještě jinak. Nechal jsem se zmást vlastní nadstavbou nad voláním translatoru, která nepředávala parametry. Translator to pobere, ale může se asi zachovat špatně, protože očekává, že parametrem $count je číslo, což je IMHO ne vždy potřeba. Občas mam jen větu, do které chci vsadit více parametrů nezávisle na plurálu.

Editoval VeN (30. 4. 2010 14:53)