Změna kontextu překladu při include

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

Ahoj, předem děkuju za podnětné komentáře.

Nette framework nepoužívám, jen šablony a rozhraní pro překlady.

Mám třídu co se stará o překlad, přiřazuju ji při vytvoření šablony. Překlad pro přehlednost používá csv a stejnou struktůru jako šablony. Potřeboval bych oznámení kdy se vkládá šablona nejlíp včetně cesty (a načíst další překlad atd.). Půjde to bez zásahu do kódu nette?

Řešením je před a za vložením bloku v šabloně dát např. <?php $translator->down('filename') ?> a pak <?php $translator->up() ?> ale tomu se chci vyhnout.

Proč to potřebuju:
Přehlednost – každá šabona má vlastní soubor s překladem

Překrývání (zespod nahoru) – v podšabloně nemusím psát prefixy k řetězcům pokud chci přeložit stejný řetězec jinak. A při vkládání stejné šablony do jiných šablon nemusím znovu definovat překlad a počítat s možností přepání překladu.

Trochu návyk z Magenta (tam se překládá podle designu a modulu, prakticky ale taky potřebuje rozlišovat)

BTW Nechci debatovat, proč chci toto řešení, mě vyhovuje na základě vlastních zkušeností s udržováním a úpravami.
Taky technické uložení překladů atp. netřeba diskutovat.

Prostě jestli jde sledovat vkládání šablon bez zásahu do Nette.

Editoval mishak (5. 1. 2011 21:11)

Filip Procházka
Moderator | 4668
+
0
-

můžeš nám prosím vysvětlit proč to potřebuješ? a ideálně přiložit i ukázku jak by jsi si představoval, aby se to volalo a co by to mělo dělat? Určitě pak najdeme řešení rychleji :)

mishak
Člen | 94
+
0
-

HosipLan napsal(a):

můžeš nám prosím vysvětlit proč to potřebuješ? a ideálně přiložit i ukázku jak by jsi si představoval, aby se to volalo a co by to mělo dělat? Určitě pak najdeme řešení rychleji :)

Právě explicitně by se to nemělo volat, překlad dostane signal od Nette že se vložila šablona a načte postupně všechny překlady v cestě šablony.

/cz_CZ/hlavni.csv
/cz_CZ/hlavni/hlavicka.csv
/cz_CZ/hlavni/paticka.csv

/template/hlavni.phtml
/template/hlavni/hlavicka.phtml
/template/hlavni/paticka.phtml

Dejme to mu ze v hlavni.phtml vlozim hlavicka.phtml chci pak sloucit preklady hlavni.csv < hlavni.hlavicka.csv a ten pouzit.

Napadlo mě podle kontextu zjistit soubor s šablonou ale to patří do kategorie Zastřelit na místě.

Editoval mishak (5. 1. 2011 21:21)

Filip Procházka
Moderator | 4668
+
0
-

Tohle snadno neuděláš, musel bys přepisovat makro include a extends, nebo hackovat funkci Nette\Templates\LatteMacros::includeTemplate, ideální by asi bylo kdyby tam měla callback.

Pro tebe by asi mělo být nejsnažší přepsat ty makra, aby se ti posílaly někam ty šablony, pokud nějaké vkládáš.

Každopádně si myslím, že tohle je celkově špatné řešení :)

Když už, tak bych to viděl na nějaké chytré makro

{st $string}

(smart translate), kterému bych předával jméno šablony.

echo $template->escape(Transtor::getInstance()->translate($template, $string));

a třídu bych pak pojal zhruba takto

class Translator
{
	private static $instance;

	public static function getInstance()
	{
		if(!self::$instance) {
			self::$instance = new static();
		}

		return self::$instance;
	}


	private function getPreklady($file)
	{
		// načtení souboru co potřebuji
		return $preklady;
	}


	public function translate(Nette\Template\ITemplate $template, $string)
	{
		$preklady = $this->getPreklady($template->file);
		return $preklady[$string];
	}
}
mishak
Člen | 94
+
0
-

Trochu hack ale nejmíň kódu

class Template extends NTemplate
{

    public function setTranslator(ITranslator $translator = NULL)
    {
        parent::setTranslator($translator);
        $this->hackTranslator = $translator;
    }

    public function translate()
    {
        $this->hackTranslator->setTemplate($this);
        $args = func_get_args();
        return $this->__call('translate', $args);
    }
}

Ups zapomněl sem vrátit hodnotu :)

Editoval mishak (7. 1. 2011 16:15)

Filip Procházka
Moderator | 4668
+
0
-

ani ne, myslím, že je to vcelku dobré řešení :)

mishak
Člen | 94
+
0
-

Finální verze – bez chyb a chybových hlášek

class Template extends NTemplate
{

    protected $hackTranslator = null;
    public function setTranslator(ITranslator $translator = NULL)
    {
        parent::setTranslator($translator);
        $this->hackTranslator = $translator;
        return $this;
    }

    public function translate()
    {
        if (isset($this->hackTranslator)) {
            $this->hackTranslator->setTemplate($this);
        }
        $args = func_get_args();
        return $this->__call('translate', $args);
    }
}