lokalizace v Latte bez nette

LuděkJ
Člen | 2
+
0
-

Používám pouze Latte (bez nette). Chci lokalizovat web, ale z dokumentace mi není vůbec jasné jak toho docílit.
Dle https://latte.nette.org/cs/tags#… jsem vložil:

$latte->addFilter('translate', new MyTranslator);

netuším ale co má vracet třída MyTranslator.

Na foru jsem našel, že lze použít

$latte->setTranslator(new Translator());

zde mám ale problém s Fatal error: Uncaught LogicException: Call to undefined method Latte\Engine::setTranslator().

Používám nejnovější latte 2.4.8.
Můžete mě nasměrovat na část dokumentace kde by bylo popsáno jak lokalizace řešit?

Zdeno1981
Člen | 115
+
0
-

Ahoj @LuděkJ

mělo by to jít takto, vytvoříš si třídu Translator

namespace App;
use Nette;

class Translator implements Nette\Localization\ITranslator
{
	/**
	 * @var array
	 */
	public $message;

	/**
	 * @param array $message
	 * @param int $count
	 */
	public function translate($message, $count = null)
	{
		return isset($this->message[$message]) ? $this->message[$message] : $message;
	}

}

vytvoříš pole s překladem

private $messages = [
		'welcome' => 'Vítej..',
		'hello'   => 'Ahoj'
	];

V latte si přidáš filtr

$translator = new \App\Translator;
$translator->message = $this->messages;
$latte->addFilter('translate', $translator === null ? null : [$translator, 'translate']);

V šabloně překlad vypíšeš takto

{_'welcome'}

Edit: ten interface ITranslator nebudeš možná potřebovat

Editoval Zdeno1981 (20. 12. 2018 22:00)

Milo
Nette Core | 1283
+
+2
-

@LuděkJ S tím filtrem to děláš dobře. Jen filter musí být callable. Buď si na svém translatoru nadefinuj metodu __invoke():

class MyTranslator
{
    public function __invoke($message, ...$args)
    {
        var_dump($message);
        var_dump($args);
    }
}

anebo předej jako filtr třeba closure a v něm volej metodu, jakou chceš:

$translator = new MyTranslator;
$latte->addFilter('translate', function ($message) use ($translator) {
	$translator->translate($message);
});
LuděkJ
Člen | 2
+
0
-

Díky oběma za rady. Použil jsem řešení od @Milo :)