Zprovoznění NetteTranslator
Návod pro jednoduché a rychlé přidání do Nette 2.0 (2012–04–02).
- Vynechá jakoukoliv manipulaci s .po/.mo soubory.
- Množné číslo přidává automaticky (žádné Undefined offset: 1).
- Umožňuje měnit jazyk.
- Zdrojové soubory (git)
- Vlákno na fóru k původní verzi – podrobnější použití a řešení problémů
Instalace
Zdrojové soubory (stáhnout v
.zip) můžeme umístit například do
libs\NetteTranslator.
config.neon
- nastavíme defaultní jazyk
- přidáme službu
translatora jeho továrničku - přidáme soubor (či více), se kterými budem pracovat
- registrujeme panel
common:
parameters:
lang: cs
services:
translator:
factory: NetteTranslator\Gettext::getTranslator
setup:
- addFile(%appDir%/lang, front)
- NetteTranslator\Panel::register
BasePresenter.php
Aneb jak změnit jazyk:
/** @persistent */
public $lang = "en"; // umožní změnu přes adresu
public function createTemplate($class = NULL)
{
$template = parent::createTemplate($class);
// pokud není nastaven, použijeme defaultní z configu
if(!isset($this->lang)) {
$this->lang = $this->context->parameters["lang"];
}
$this->context->translator->setLang($this->lang); // nastavíme jazyk
$template->setTranslator($this->context->translator);
return $template;
}
Použití
V šablonách
Defaultně je nastavené určení množného čísla pro české tvary (1 kus, 2–4 kusy, 5+/0 kusů), proto nemusíte sahat do .po/.mo souborů či využívat Poedit (viz git). Lze ho tedy rovnou používat.
{_"Login"}
{_"piece", $number} <!-- množné číslo, následující formy nastavíme sami -->
1 kus <!-- $number = 1; -->
2 kusy <!-- $number = 2; -->
5 kusů <!-- $number = 5; -->
U formuláře
protected function createComponentMyForm()
{
$form = new Form;
// ...
$form->setTranslator($this->context->translator);
}
FlashMessage
// BasePresenter
public function flashMessage($message, $type = "info")
{
if($this->context->hasService("translator")) {
$message = $this->getContext()->translator->translate($message);
}
return parent::flashMessage($message, $type);
}
Comments 
Phalanx | 19. 2. 2012, 13:20 | comment
Doplňuji: Do BasePresenter.php stačí přidat:
// deklarace funkce flash message musí být stejná jako v souboru Nette\Application\UI\Control.php
public function flashMessage($message, $type = ‚info‘) {
if( $this->context->translator ) $message = $this->context->translator->translate($message); parent::flashMessage($message, $type); }
a flash zprávy se již zobrazují v panelu a mohou se přeložit
Schmutzka | 7. 3. 2012, 1:55 | comment
Dobrý nápad, díky. Doplněno! :)
Nox | 12. 3. 2012, 16:40 | comment
Jak na případ, kdy chceme do flash zprávy nějaké argumenty (%s, %n)? Něco jako flashRawMessage(), která nebude překládat? Nebo radši argument do flash message? Anebo něco jako flashMessageArgs($message, $type, $args…) … to se ale bude zase komplikovat tím, že jsou argumenty pro plurál a pro doplnění, hmmm
Schmutzka | 16. 3. 2012, 20:06 | comment
To by nebylo špatné prodiskutovat na fóru. Pak odkaž na nějaký příklad a můžu přidat.
raketoplan2005 | 20. 3. 2012, 16:44 | question
Přeložím tímto i dynamické menu, které se mi dotahuje z databáze?
seberm | 29. 3. 2012, 0:33 | bug
Urcite se generují .PO soubory ve správném formátu? Lokalize (KDE) mi je odmíta otevřít..
Phalanx | 19. 2. 2012, 13:02 | comment
Bylo by vhodné sem zrovna doplnit jak překládat flash zprávy.