registrovanie vlastneho translatoru – nefunguje ani v sablonach
- xr
- Člen | 94
caute znovu.
prosim, registrovanie vlastneho translatoru sa mi nepodarilo.
v konfiguraku config.ini
mam
service.Nette-ITranslator.factory = \SimpleTranslator::getTranslator
service.Nette-ITranslator.run = TRUE
dalej mam v prezenteri akciu
public function actionDefault() {
$this->template->teststring1 = _('teeeeest');
$translator = \Nette\Environment::getService('Nette\ITranslator');
$this->template->teststring2 = $translator->translate('texzcxcxcvxcv');
}
pricom teststring1
sa neprelozi, ale
teststring2
ano – vypise sa spravne retazec,
ktory vracia metoda translate (takze predpokladam, ze registracia sluzby
samotnej funguje).
dalej mi nefunguje v sablone zapis {_'test2'}
–
skonci chybou
MemberAccessException
Call to undefined method Nette\Templates\Template::translate().
SimpleTranslator vyzera nasledovne
class SimpleTranslator implements Nette\ITranslator {
public function __construct( ) {
}
public static function getTranslator( $options = null ) {
return new static();
}
public function translate( $message, $count = 1 ) {
return '- test -';
}
}
cize prakticky nic nerobi, iba vracia nejaky retazec.
co robim zle? dik vopred
EDIT:
este doplnam, ze BasePresenter
obsahuje
protected function createTemplate() {
$template = parent::createTemplate();
$template->setTranslator(\Nette\Environment::getService('Nette\ITranslator'));
return $template;
}
Editoval xr (7. 2. 2011 0:25)
- JakubJarabica
- Gold Partner | 184
Pre zaregistrovanie translatoru do šablóny je potreba zavolať niečo takéto:
FrontModule/BasePresenter.php
<?php
protected function createTemplate() {
$template = parent::createTemplate();
$template->setTranslator(\Nette\Environment::getService('Nette\ITranslator'));
return $template;
}
?>
potom ti pôjde makro {_""}.
A v presenteri voláš globálnu funkciu _(), čo je alias za funkciu gettext. To nemá nič spoločné s tvojim translatorom. Nenechaj sa zmýliť makrom v šablónach, ktoré vyzerá podobne ako spomínaná funkcia, makro je len „obálkou“ nad Template::translate().
Edit: Všimol som si tvoj createTemplate, nepredefinuvávaš ho niekde?
Editoval JAM3SoN (7. 2. 2011 0:29)
- xr
- Člen | 94
dik moc.
takze som si spravil terz novy projekt, len s jednym final prezenterom a
jednou akciou, pricom mi
spominane chyby stale hadze, resp. nerobi, co by som potreboval.
ak spravne chapem, tak alias _('string')
sa mi nijako nepodari
dokopat k tomu, aby smeroval na metodu
SimpleTranslator->translate()
?
a dalej, nerozumiem tomu, preco nefunguje ten helper translate
v sablonach, aj napriek tomu, ze som zaregistroval sluzbu v nette aj pre
sablonu. a skontroloval som, ci niekde nieco nerobim divne a neprepisujem, ale
fakt v tomto novom projekte je dokopy 5 metod… takze ani niet kde. preco to
nejde teda?
niekto?
- baz
- Člen | 42
Ahoj,
pořád se peru se zprovozněním translatoru,
mám starší verzi nette (v0.9.5) a mám v adresáři models vytvořenou tuhle třídu :
<?php
class MyTranslator extends Object implements ITranslator
{
public function __construct( ) {
}
public static function getTranslator( $options = null ) {
return new static();
}
public function translate($message, $count = NULL) {
return 'preklad - ' . $message;
}
}
?>
v config ini mám :
<?php
.
.
.
; services
service.Nette-Security-IAuthenticator = UsersModel
service.Nette-ITranslator.factory = MyTranslator::getTranslator
service.Nette-ITranslator.run = TRUE
service.Nette-Loaders-RobotLoader.option.directory[] = %appDir%
service.Nette-Loaders-RobotLoader.option.directory[] = %libsDir%
service.Nette-Loaders-RobotLoader.run = TRUE
.
.
.
?>
Ale dostávám tuto chybu :
Cannot instantiate service ‚Nette\ITranslator‘, handler
‚MyTranslator::getTranslator‘ is not callable.
když dám pryč u definice služby „.factory“
pak dostanu tento error :
Invalid key ‚service.Nette-ITranslator.run‘ in section [common] in
‚C:\xampp\htdocs\lego-city/app/config.ini‘.
Poradí někdo, jak správně zaregistrovat službu, abych mohl v šabloně používat makro {_""} ?
Předem mockrát děkuju.
- xr
- Člen | 94
ja som problem so sablonami vyriesil pomocoou helpera asi takto:
{='text'|tr}
{='text2'|tr:tag}
.. nezabudni registrovat helper pre sablony (BasePresenter.php)
public function createTemplate() {
$template = parent::createTemplate();
$template->registerHelper('tr', function($message, $tag = null) {
return \Nette\Environment::getApplication()
->getPresenter()->tr($message, $tag);
});
return $template;
}
- baz
- Člen | 42
No mě se to nakonec také podařilo vyřešit a to následovně :
Třída zůstala jak je uvedeno v mém předchozím příspěvku.
config.ini jsem upravil takto –
<?php
service.Nette-ITranslator = MyTranslator::getTranslator
;service.Nette-ITranslator.run = TRUE
?>
(takže jsem zakomentoval run)
v base presenteru, který dědí všechny mé ostatní presentery je tohle:
<?php
protected function createTemplate() {
$template = parent::createTemplate();
$template->setTranslator(Environment::getService('Nette\ITranslator'));
return $template;
}
?>
Díky tomu můžu používat marko {_""}
a abych to dostal i do formulářů tak :
<?php
$form->setTranslator(Environment::getService('Nette\ITranslator'));
?>
(abych to měl u všech formulářů, tak ještě přemýšlím, že si vytvořím novou třídu AppFormTranslate, která bude dědit vše od rodiče a dodám tam tento příkaz (uvidíme jestli se mi podaří), tím bych to nemusel psát u každého formuláře.
Snad to někomu pomůže…