Položky selectboxů jsou automaticky překládány translátorem pokud je definován
- josef.sabl
- Člen | 153
„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)
- Filip Procházka
- Moderator | 4668
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
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
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
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
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
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
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
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
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ů'));
?>
- josef.sabl
- Člen | 153
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
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;
}