lokalizace v Latte bez nette
- LuděkJ
- Člen | 2
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
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
@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);
});