Sta?ení
Stáhnout GettextExtractor, revize 2, 16.2.2009
GettextExtractor vy?aduje PHP 5.2.2 a vy??í!
Features
- jediné gettextové ?e?ení s automatickým zpracováním mno?ného ?ísla (plurálu)
- podpora ?ablon v Nette Frameworku
- maximální konfigurovatelnost a roz?i?itelnost
Issues
- zatím nezpracovává parametrizované p?eklady (funkce vsprintf)
Instalace
Stáhn?te si GE a rozbalte ho do libovolného adresá?e. Bravo, hotovo.
Nastavení Poeditu
Stáhn?te si Poedit, nainstalujte ho, spus?te ho.
Klikn?te na Soubor -> Konfigurace. Vyberte zálo?ku Parsery a klikn?te na Nový. Polí?ka vypl?te podle vzoru ní?e.
Místo c:\server\php\php.exe napi?te va?í lokální cestu k PHP, místo c:\GettextExtractor\ge.exe napi?te cestu k souboru ge.php v adresá?i GettextExtractor.
Parametry %o a %F zachovejte, jinak to nebude fungovat :-)
Dále je t?eba vytvo?it gettextový soubor. Klikn?te na Soubory -> Nový katalog. Vypl?te základní informace o projektu.
Jako formu plurálu vlo?te pro ?e?tinu:
nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;
Posledním nutným úkonem je nastavení cest, v nich? se nacházejí soubory, ze kterých chcete extrahovat jazykové klí?e.
Tabulka vý?e po?ítá s takovýmhle adresá?ovým systémem, r?zné variace si m??ete lehce odvodit.
/application
/locale
/cs
/LC_MESSAGES
/messages.po <- ná? jazykový soubor
/presenters
DefaultPresenter.php
/templates
/sablona.phtml
Propojení s Nette
GE je s Nette Frameworkem defaultn? kompatibilní. Viz soubor ge.php.
$ge = new GettextExtractor();
$ge->filters['php'] = array('PHP');
$ge->filters['phtml'] = array('PHP', 'NetteCurlyBrackets');
Tento zápis nám ?íká, ?e pro soubory s koncovkou php se pou?ije filtr PHP, pro soubory s koncovkou phtml se pou?ijí filtry
PHP a NetteCurlyBrackets, který je navr?en pro zpracování CurlyBrackets syntaxe. Standardní konfigurace obsahuje inicializaci filtr?
pro získávání gettext klí?? z PHP funkcí translate a z Nette ?ablon z direktivy {!_"Translate ME"},
která je k p?ekladu speciáln? ur?ená.
Aby p?eklad v rámci Nette fungoval, musíme zaregistrovat helper, který nám bude ?et?zce p?ekládat.
Samotné Nette implicitn? podporu p?eklad? nepodporuje, proto si m??eme p?eklada? naprogramovat bu? sami, nebo pou?ijeme n?jakou hotovou knihovnu.
Vhodným ?e?ením je nap?íklad vyu?ití Zend_Translate z balíku Zend Framework.
Zend_Translate je na houby, neumí plurál. Nejd?ív si tedy vytvo?me p?eklada?. (Není nutné ho psát od základu, tento kód naleznete i v GE balíku, soubor Translator.php)
class Translator implements ITranslator
{
public $countRegexp = '#\%([0-9]+\$)*d#';
public $paramsRegexp = '#\%([0-9]+\$)*[fs]#';
/**
* Gets the Gettext ready
*
* @param string $locale
* @param string $directory
* @param string $domain
*/
public function __construct($locale, $directory, $domain = 'messages')
{
// gettext mandatory settings
putenv("LANG=$locale");
setlocale(LC_ALL, $locale);
// language pack path: $directory/$locale/LC_$domain/$domain.mo
// example: application/locale/cs/LC_MESSAGES/messages.mo
bindtextdomain($domain, $directory);
textdomain($domain);
bind_textdomain_codeset($domain, 'UTF-8');
}
/**
* Translates the given string.
* @param string message
* @param int count
* @return string
*/
public function translate($message, $count = NULL)
{
$pars = func_get_args();
if (!preg_match($this->countRegexp, $message)) {
// message is not in plural
$message = gettext($message);
} else {
// finds the position of the integer parameter
$split = preg_split($this->countRegexp, $message);
$n = preg_match($this->paramsRegexp, $split[0]);
if (!isset($pars[$n+1])) // parameter does not exists
throw new InvalidArgumentException('...');
$message = ngettext($message, $message, $pars[$n+1]);
}
if (count($pars)>1) {
array_shift($pars);
return vsprintf($message, $pars);
}
return $message;
}
}
Tento p?eklada? u? zbývá jen zaregistrovat jako helper pro ?ablony, m??eme to ud?lat nap?íklad tak, ?e si napí?eme základní presenter, ve kterém to specifikujeme:
abstract class BasePresenter extends Presenter
{
protected function beforeRender()
{
$this->template->registerFilter(
'Nette\Templates\CurlyBracketsFilter::invoke');
// Environment::setVariable('lang', 'cs');
$translator = new Translator(
Environment::getVariable('lang'), APP_DIR . '/locale');
$this->template->setTranslator($translator);
}
}
Aby v?e fungovalo, ka?dý presenter musí být potomkem tohoto na?eho základního presenteru. Nezapome?te taky zkontrolovat nastavení Environment::getVariable('lang');!
Filtry
GettextExtractor nativn? podporuje filtry pro ?isté PHP a Nette CurlyBrackets. Zárove? podporuje rozhraní pro jednoduché p?idání dal?ího filtru. V p?ípad?, ?e n?jaké naprogramujete, neváhejte mi je poslat (karelklima zaviná? gmail.com) a já je za?adím do distribuce.
U?ite?né odkazy
Kontakt
Karel Klíma email: karelklima@gmail.com icq: 252-664-446