Sta?ení

Stáhnout GettextExtractor, revize 2, 16.2.2009
GettextExtractor vy?aduje PHP 5.2.2 a vy??í!

Features

Issues

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.

Poedit - nastavení parseru

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.

Poedit - novy katalog

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.

Poedit - cesty

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

Hodn? ?t?stí s lokalizací!