lokalizace v Latte bez nette

před 9 měsíci

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/macros#… 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?

před 9 měsíci

Zdeno1981
Člen | 84
+
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)

před 9 měsíci

Milo
Nette Core | 1149
+
+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);
});

před 9 měsíci

LuděkJ
Člen | 2
+
0
-

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