GettextExtractor v2 – chyba při překladu z šamblon
- petas.ck
- Člen | 12
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
- petas.ck
- Člen | 12
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
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
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
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
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
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.