GettextTranslator
Gettextový překladač pro lokalizaci podporující parametrizované překlady a plurály.
| Verze | 0.4 |
| Download | GettextTranslator.php |
| Autor | Roman Sklenář |
| Licence | New BSD license |
Instalace
Není potřeba žádných rozšíření v prostředí PHP, soubor překladu
je čten a parsován binárně, je proto vhodný především pro vývojové
prostředí, neboť odpodá nutnost při každé změně .mo
souboru s překlady restartovat web server. Stačí pouze načíst třídu Nette\Object a rozhraní Nette\ITranslator ať
už manuálně nebo za pomocí autoloadingu.
Jako formu plurálu pro češtinu ve vašich gettext souborech
použijte následující tvar:
nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4 ? 1 :
2);
Příklad použití
Vytvoření instance:
$translator = new GettextTranslator('locale.mo');
K získání překladů on-the-fly:
$translator = new GettextTranslator('locale.cs.mo', 'cs'); // druhý parametr je volitelný
echo $translator->translate("Dog"); // Pes
echo $translator->translate("Dog", 2); // Psi
echo $translator->translate("There is %d unread comment in thread %s.", $number, 'Changelog');
// zjištění locale (volitelné)
echo $translator->locale;
Lokalizace formuláře:
$translator = new GettextTranslator('form.cs.mo', 'cs');
$form = new Form;
$form->setTranslator($translator);
Lokalizace řetězců v šabloně:
{? $template->setTranslator(new GettextTranslator('template.cs.mo'))}
{_'Hello! Welcome to our page!'}
{_'There is %d unread comment in thread %s.', $number, 'Changelog'}
{_'In thread %2$s is %1$d unread comment.', $number, 'Changelog'}
Díky tomu, že překladač nepoužívá nativní podporu Gettextu v PHP, není doporučen pro produkční nasazení. Pokud se ho přesto rozhodnete nasadit, doporučuji alespoň použít Nette\Caching a celý objekt kešovat.

fak | 26. 4. 2011, 10:02 | comment
Chtěl bych upozornit, že pokud použijete druhý parametr metody translate jinak než množství pro plural, tak musíte upravit GettextTranslator na řádce cca 57:
if ($count === NULL) $count = 1;
Například translate(‚Vaše jméno: %s‘,$jmeno); to totiž úplně rozhodí. a můžete dostávat šťavnaté exceptions jako The signal receiver component ‚MyForm‘ is not found.
vyřešil jsem to zatím kontrolou jestli je count int.