Překládání Helperů
- maarlin
- Člen | 207
Narazil jsem asi na poslední problém s překlady, jinak to má Nette
relativně dobře udělané…
Jak nejlépe dělat překlady Helperů?
Je mi jasné, že v samotných jednotlivých Helperech musí být zápisy řetězců alá _(‚řetězec k přeložení‘), ale to mi maximálně pomůže v tom, že to pocí GettextExtractoru dostanu do překladového *.po(t) souboru. Když chci pak překládat v samotných šalonách, nastává (z mého pohledu) problém:
{_$article['time']|timeAgoInWords}
se přeloží do šablony jako
<?php echo NTemplateHelpers::escapeHtml(
$template->timeAgoInWords(
$template->translate($article['time'])
)
) ?>
Což znamená, že NTemplate
si překladem určí prioritu –
nejdříve vstup přeloží a pak předá Helperu, přičemž já to logicky
potřebuji obráceně…
Napadá vás jiná možnost, než u každého volání helperu předávat ještě aktuální jazyk a řešit ještě znova překlad v každém Helperu, popř. napsat si to do šablony bez Latte filtru?
Editoval maarlin (18. 2. 2010 9:08)
- maarlin
- Člen | 207
norbe napsal(a):
Nejsem si 100% jistý, protože jsem to ještě nepotřeboval, ale mělo by fungovat tohle:
{_$article['time']|timeAgoInWords|translate}
Ano, to by teoreticky šlo, pokud by v tom, co vrátí Helper nebyly právě různé proměnné části (např. u timeAgoInWords ty počty dnů, minut, měsíců atp.) resp. je asi nesmysl psát překlad pro každou minutu, den, hodinu atd…
Čili tím jsem si uvědomil, že je to asi potřeba překládat ještě
před výstupem Helperu, resp. někde v helperu přímo… tedy volat
v Helperu něco jako
NTemplate::translate(_('výraz k přeložení'))
resp. aby to
pochopil GettextExtractor (proto podtržítko) a zároveň aby to rovnou helper
vracel přeložené…
Editoval maarlin (18. 2. 2010 10:06)
- maarlin
- Člen | 207
Zde je moje konečné řešení, kdyby to někdo potřeboval:
class Helpers {
private static function translate($text)
{
$lang = NEnvironment::getVariable('lang');
$translator = new Translator($lang);
return $translator->translate($text);
}
public static function timeAgoInWords($time)
{
// ...
if ($delta == 0) return self::translate(_('za okamžik'));
// ...
}
Faktem je, že udělat skutečně multijazyčný web v Nette dalo trochu více zabrat, než jsem očekával, ale asi se to o moc lépe usnadnit nedá…
- Překlad samotných templatů presenterů – nastavení v BasePresenteru
$this->template->setTranslator();
- Překlad komponent – Přetížení Control vlastním BaseControl:
class BaseControl extends Control {
public function createTemplate()
{
$template = parent::createTemplate();
$template->setTranslator(new Translator());
return $template;
}
- Překlad helperů – viz výše
Editoval maarlin (19. 2. 2010 10:16)