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í!