Položky selectboxů jsou automaticky překládány translátorem pokud je definován

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

„Položky selectboxů jsou automaticky překládány translátorem pokud je definován“.

Kdo tohle proboha vymyslel? Co je to za nesmysl? Ve formuláři vybírám například ze seznamu uživatelů aplikace, ke kterým chci přiřadit nějaký objekt, proč by měl někdo překládat jména uživatelů?

Obsahem selectboxu jsou dle mého názoru v 90% data a ne řetězce aplikace a data se snad nepřekládají.

Editoval josef.sabl (22. 11. 2012 17:10)

h4kuna
Backer | 740
+
0
-

Tak zkus nepoužívat ITranslator a mrkni na tento překladač Překládání bych řekl že je v pořádku, protože pokud slova ve slovníku nejsou tak se nepřeloží.

cabadaj
Člen | 8
+
0
-

Osobně mi taky přijde divné, že se překládají i položky selectboxu. Lze sice vypnout translátor na konkrétním prvku, ale pak se vypne i pro label, error hlášky atd. Zrovna u selectboxu by bylo pěkné mít možnost vypnout translátor pro položky selectboxu.

Filip Procházka
Moderator | 4668
+
0
-

Je to naprosto v pořádku. Tvůj translator musí umět vrátit vstupní text, pokud nenajde odpovídající překlad.

cabadaj
Člen | 8
+
0
-

A co když si chci v translátoru logovat, pokud nebyl nalezen překlad. To je vhodné, k odhalování zapomenutých překladů. Pak se ale položky ze seletboxu budou logovat neustále. Co mám tedy udělat pro to, abych se mi položky v selectboxu nepřekládaly. Chápu, že to je ojedinělý případ a nemá cenu to drátovat do Nette. Ale jak na to?

h4kuna
Backer | 740
+
0
-

cabadaj napsal(a):

A co když si chci v translátoru logovat, pokud nebyl nalezen překlad. To je vhodné, k odhalování zapomenutých překladů. Pak se ale položky ze seletboxu budou logovat neustále. Co mám tedy udělat pro to, abych se mi položky v selectboxu nepřekládaly. Chápu, že to je ojedinělý případ a nemá cenu to drátovat do Nette. Ale jak na to?

Tohle mi řeší gettext, respektivě Poedit, ukáže ti řetězce co nejsou přeložené. Jinak bych to řešil asi unikátním polem (každý řetězec jen jednou a jednou upozornit) v session, aby vyexpirovala po zavření prohlížeče.

Nox
Člen | 378
+
+1
-

HosipLan napsal(a):
Je to naprosto v pořádku. Tvůj translator musí umět vrátit vstupní text, pokud nenajde odpovídající překlad.

Jenže tenhle přístup selže v opačným případě… Nelze předpokládat, že se nikdy v datech neobjeví text shodný s nějakým stringem v aplikaci (a najednou místo produktu „active“ budeš mít „aktivní“). Souhlas s OP, i když si nejsem zatím jistý ideálním řešením (např. jestli defaultně ano nebo ne).

Ot@s
Backer | 476
+
0
-

cabadaj napsal(a):

A co když si chci v translátoru logovat, pokud nebyl nalezen překlad. To je vhodné, k odhalování zapomenutých překladů. Pak se ale položky ze seletboxu budou logovat neustále. Co mám tedy udělat pro to, abych se mi položky v selectboxu nepřekládaly. Chápu, že to je ojedinělý případ a nemá cenu to drátovat do Nette. Ale jak na to?

Ojediněný případ nejsi. To výchozí chování překladu u selectboxu mě taky nevyhovuje. Udělal jsem to tak, že mám vlastní instaci selectboxu, který mám pod kontrolou (label/desc automatický překlad, data pouze na vyžádání).

pawouk
Člen | 172
+
0
-

Rozhodně nesouhlasím s tím že v selectboxu jsou v 90% data. Mám spustu selecboxu a jsem velice rád že se mi překládají. Já to řešíém tak že před každý řetězec který chci pželoži přidám tr_, tedy například tr_user se přeloží na uživatel. Je to naprost bezproblémové i s logováním. Rozhodně není dobrý nápad odstranit překládání u selectboxu, ale pokud to někomu opravdu vadí, není nic jednodužšího než si podědit a upravit renderer a zrušit překlad u selectboxu třeba takto:

$form->addSelect(...)->setOption('translator', 'disable')

To by se mohlo i zanést do Nette.

josef.sabl
Člen | 153
+
0
-

pawouk napsal(a):

Rozhodně nesouhlasím s tím že v selectboxu jsou v 90% data. Mám spustu selecboxu a jsem velice rád že se mi překládají. Já to řešíém tak že před každý řetězec který chci pželoži přidám tr_, tedy například tr_user se přeloží na uživatel. Je to naprost bezproblémové i s logováním. Rozhodně není dobrý nápad odstranit překládání u selectboxu, ale pokud to někomu opravdu vadí, není nic jednodužšího než si podědit a upravit renderer a zrušit překlad u selectboxu třeba takto:

$form->addSelect(...)->setOption('translator', 'disable')

To by se mohlo i zanést do Nette.

Ok, tak 90% mých selectboxů prostě data obsahuje :) Ale i kdyby to bylo 1%, tak je špatně, že to jedno procento prostě v Nette jako takovém nevyřešíš a musíš zkoumat, dědit a přepisovat. Já už naštěstí renderer poděděný měl, tak to byla docela drobnost, ale kdybych musel kvůli tomuto dva dny studovat, jak to funguje a pak si to přeprogramovávat, no to bych pánové asi na Nette zanevřel.

josef.sabl
Člen | 153
+
0
-

Ot@s napsal(a):

cabadaj napsal(a):

A co když si chci v translátoru logovat, pokud nebyl nalezen překlad. To je vhodné, k odhalování zapomenutých překladů. Pak se ale položky ze seletboxu budou logovat neustále. Co mám tedy udělat pro to, abych se mi položky v selectboxu nepřekládaly. Chápu, že to je ojedinělý případ a nemá cenu to drátovat do Nette. Ale jak na to?

Ojediněný případ nejsi. To výchozí chování překladu u selectboxu mě taky nevyhovuje. Udělal jsem to tak, že mám vlastní instaci selectboxu, který mám pod kontrolou (label/desc automatický překlad, data pouze na vyžádání).

Také se hlásím k tomuto případu.

Navíc argument „je to sice blbě, ale proč to řešíš, vždyť se ti to nikde neprojeví“ mi zrovna k takové věci, jako je framework, moc nevoní.

josef.sabl
Člen | 153
+
0
-

Nox napsal(a):

HosipLan napsal(a):
Je to naprosto v pořádku. Tvůj translator musí umět vrátit vstupní text, pokud nenajde odpovídající překlad.

Jenže tenhle přístup selže v opačným případě… Nelze předpokládat, že se nikdy v datech neobjeví text shodný s nějakým stringem v aplikaci (a najednou místo produktu „active“ budeš mít „aktivní“). Souhlas s OP, i když si nejsem zatím jistý ideálním řešením (např. jestli defaultně ano nebo ne).

Myslím, že nikde nic by nemělo magicky něco překládat (navíc ještě tak sporně a neintuitivně) a mělo by to být transparentní. Tzn. form by dle mého názoru vůbec žádný translator neměl mít a o vše by se měl postarat programátor.

<?php

$form->addTextArea('noteText', _('poznámka'));
   ->setOption('description', _('max. 160 znaků'));

?>
bene
Člen | 82
+
0
-
$form->setTranslator($translator);
$form->addText('name', 'Automaticky prelozeno');
$form->addSelect('users', $translator->translate('Manualne prelozeno'), $items)
	->setTranslator(null);
josef.sabl
Člen | 153
+
0
-

bene napsal(a):

$form->setTranslator($translator);
$form->addText('name', 'Automaticky prelozeno');
$form->addSelect('users', $translator->translate('Manualne prelozeno'), $items)
	->setTranslator(null);

A jak to dopadne s chybovou hláškou nad takovým selectem?

bene
Člen | 82
+
0
-

josef.sabl napsal(a):

A jak to dopadne s chybovou hláškou nad takovým selectem?

Nevím, jestli rozumím otázce. Každopádně pokud chceš přidávat ->addRule, tak to si otestuj (níže je výpis s třídy Rules, podle kterého to vypadadá, že si to translator bere z formuláře a ne z Control, což považuji za zvláštní) a podle toho budeš muset přeložit hlášku manuálně nebo se ti to přeloží automaticky dle nastaveného translátoru ve formuláři..

	public static function formatMessage($rule, $withValue)
	{
		$message = $rule->message;
		if ($message instanceof Nette\Utils\Html) {
			return $message;
		}
		if (!isset($message)) { // report missing message by notice
			$message = static::$defaultMessages[$rule->operation];
		}
		if ($translator = $rule->control->getForm()->getTranslator()) {
			$message = $translator->translate($message, is_int($rule->arg) ? $rule->arg : NULL);
		}
		$message = vsprintf(preg_replace('#%(name|label|value)#', '%$0', $message), (array) $rule->arg);
		$message = str_replace('%name', $rule->control->getName(), $message);
		$message = str_replace('%label', $rule->control->translate($rule->control->caption), $message);
		if ($withValue && strpos($message, '%value') !== FALSE) {
			$message = str_replace('%value', $rule->control->getValue(), $message);
		}
		return $message;
	}