registrovanie vlastneho translatoru – nefunguje ani v sablonach

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

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

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

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?

iguana007
Člen | 970
+
0
-

Napadá mě, jestli se ti to nehádá s Gettextem, protože ten má fci _() registrovanou pro sebe, zkusil bych gettext na serveru vypnout a uvidíš, jestli to pomůže.

baz
Člen | 42
+
0
-

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

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

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…