Změna kontextu překladu při include
- mishak
- Člen | 94
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
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
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
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
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)
- mishak
- Člen | 94
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);
}
}