GettextExtractor v2 – chyba při překladu z šamblon

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
petas.ck
Člen | 12
+
0
-

Dobrý den,

předem se omlouvám možná za hloupý dotaz, ale už několik dní jsem zůstal viset na problému, při použití nástroje GettextExtractor v2, zveře()"jněného na tomto fóru panem Karlem Klímou, pro prohledávání souborů s textovými řetězci.

Můj problém nastává v okamžiku, kdy do šablony předám slovosled pro překlad, napíklad:

{_"This will be translated"}

V tuto chvíli mi laděnka vyhodí hlášku:

Call to undefined method Nette\Templating\FileTemplate::translate()

Konkrétní řádek, který laděnka označuje jako chybný, je právě v šambloně:

<?php echo Nette\Templating\Helpers::escapeHtml($template->translate("this will be translated"), ENT_NOQUOTES)

Texty v presenterech mi to najde a uloží do daného souboru. Podle některých vláken jsem zkoušel mazat temp a restartovat Apache. Bohužel ani jedno nepomohlo.

bootstrap soubor:

$ge = new NetteGettextExtractor(); // provede základní nastavení pro šablony apod.
$ge->setupForms()->setupDataGrid(); // provede nastavení pro formuláře a DataGrid
$ge->scan(APP_DIR); // prohledá všechny aplikační soubory
$ge->save(APP_DIR . '/locale/cs/LC_MESSAGES/messages.po'); // vytvoří Gettextový soubor editovatelný např v Poeditu

$ge = new GettextExtractor('extractor.log'); // průběh bude logován do souboru
$ge->removeAllFilters(); // zruší základní nastavení
$ge->setFilter('php', 'PHP'); // přiřadí PHPFilter příponě php
$ge->getFilter('PHP')->addFunction('translate')->addFunction('_'); // nastaví filtr PHP

V Souboru config.neon jsem nic nepřidávál.
Složku GettextExtractor, která byla ke stažení na výše uvedeném odkazu jsem nakopíroval do složky /libs. Předpokládám, že mi nejspíš něco chybí, co na stránce bylo považováno za samozřejmé, ale skutečně zatím nevím moc kudy do toho.

Předem moc děkuji všem za čas

bazo
Člen | 620
+
0
-

musis $template nastavit translator, $template->setTranslator()

petas.ck
Člen | 12
+
0
-

Hm…ok…Inspiroval jsem se tímto:

Nyní je chybová hláška při vytváření containeru:

Service 'run': The item 'factory' in array expects to be callable or stdClass or null, boolean given

conf.neon jsem změnil na toho:

common:
	parameters:
		langDir = %appDir%/locale
		lang = cs_CZ
	php:
		date.timezone: Europe/Prague
		# zlib.output_compression: yes

	nette:
		application:
			errorPresenter: Error

		database:
			dsn: 'mysql:host=localhost;dbname=test'
			user:
			password:

		session:
			expiration: 14 days


	services:
		authenticator: Authenticator
		routerFactory: RouterFactory
		router: @routerFactory::createRouter

		factory = "NetteTranslator\\Gettext::getTranslator"
		run = TRUE

	factories:

production < common:

development < common:

a v Base presenteru jsem přidal následující funkci:

protected function createTemplate($class = NULL)
{
    $template = parent::createTemplate();
    $template->setTranslator(\Nette\Environment::getService('Nette\ITranslator'));
    return $template;
}

Ikdyž podle dokumentace jsem objevil, že Nette\ITranslator by měl být Nette\Localization\ITranslator, nicméně zatim to laděnka nehlásí jako chybu.

iguana007
Člen | 970
+
0
-

Já GettextExtractor používám jako samostatný php skript a funguje mi to:

  • nakonfiguruji cesty, které má extractor prohledávat
  • spustím ho
  • vygenerovaný .pot naimportuji do POEditu (pokud je to první extrakce, tak by to měl být .po soubor – imho jsou snad stejné, jde tam jen o tu koncovku, aby to šlo otevřít správně v POEditu)
  • přeložím chybějící řetězce a uložím překladový katalog do složky s překlady

Zde je ukázka mého spouštěcího skriptu:

error_reporting(E_ALL);
define('BASE_DIR', dirname(__FILE__));
define('APP_DIR', BASE_DIR . '/app/FrontModule');
require BASE_DIR . '/../../GettextExtractor_v2/NetteGettextExtractor.php';
$ge = new NetteGettextExtractor(); // provede základní nastavení pro šablony apod.
$ge->setupForms()->setupDataGrid(); // provede nastavení pro formuláře a DataGrid
$ge->scan(APP_DIR); // prohledá všechny aplikační soubory
$ge->save(APP_DIR . '/locale/frontend.sk.pot'); // vytvoří Gettextový soubor editovatelný např v Poeditu
iguana007
Člen | 970
+
0
-

Když tak čtu vlákno znova, tak mám trošku pocit, že by si rád GettextExtractor používal na něco jiného, než k čemu je určen. Tj. GettextExtractor slouží na extrakci textů ze zdrojových souborů aplikace (formuláře, šablony atd.) a jejich následný překlad např. v POEditu (samostatný software na překlady katalogů – http://www.poedit.net/).

Kdežto na to, aby tyto texty byly následně přeloženy musíš použít jiný z doplňků:
https://componette.org/search/?…
nebo
https://github.com/…ettext-latte (využívá nativní gettext)

petas.ck
Člen | 12
+
0
-

Ano, to snad chápu. Jenom jsem měl za to, že o pár příspěvků výš, psal kolega, že je potřeba přidat šabloně translator, pomocí

setTranslator();

Z toho jsem tedy usoudil, že pokud potřebuji vytáhnout texty z šablony se zápisem:

{_"Text"}

případně

$Translator->translate("text")

je potřeba k tomu napsat překladač. Něco podobného jsem se také dočetl zde. Je to reálné nebo to celé špatně chápu?
Děkuji.

iguana007
Člen | 970
+
0
-

Já si myslím, že kolega bazo to napoprvé pochopil stejně jako já – on ti radil dobře (vzhledem k tebou uvedené chybě), jenže jeho rada se netýká Extractoru, ale Translatoru.

Taky mi nebylo napoprvé jasné, proč řešíš bootstrap apod. u Extractoru, protože žádná vazba mezi Extractorem a samotnou Nette aplikací není třeba. Extractor je v podstatě jen jakýsi „robot“, který prochroustá tvoje zdrojáky a vytahá z nich všechny překlady.

Když si potom spustíš svou aplikaci a ta na tebe vyplivne původně zmíněný error:
Call to undefined method Nette\Templating\FileTemplate::translate()
tak to neznamená, že nemáš špatně nakonfigurovaný Extractor, ale že ti chybí v aplikaci definice/konfigurace Translatoru.

Tj. ta část, kde nastavuješ translator šabloně je ukázaná zde u úpravy BasePresenteru: https://componette.org/search/?… Když budeš následovat ten návod u toho addonu, tak by ti měly začít chodit i ty překlady v Nette aplikaci.

petas.ck
Člen | 12
+
0
-

Jo takhle. Tak v tom případě už mi to dává smysl. Omlouvám se, za menší zmatek s Translatorem. Celý problém začal tím, že mi extractor nevytáhnul veškeré texty. Konkrétně z šablon latte. To už se tu určitě také řešilo, ale myslel jsem, že právě na syntaxi

{_"xxx"}

je potřeba něco, aby mi to tutu syntaxi přeložilo, nebo-li aby ji Gettext Extractor viděl a uložil jako ostatní gettext řetězce. V tom případě budu muset řešit problém Gettext Extractor a Latte soubory.

petas.ck
Člen | 12
+
0
-

Tak již vše funguje, jak má. Děkuji moc za pomoc a věnovaný čas.