Překládání Helperů

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

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)

norbe
Backer | 408
+
0
-

Nejsem si 100% jistý, protože jsem to ještě nepotřeboval, ale mělo by fungovat tohle:

{_$article['time']|timeAgoInWords|translate}
maarlin
Člen | 207
+
0
-

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
+
0
-

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á…

  1. Překlad samotných templatů presenterů – nastavení v BasePresenteru

$this->template->setTranslator();

  1. 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;
    }
  1. Překlad helperů – viz výše

Editoval maarlin (19. 2. 2010 10:16)