Kdyby/Translation -vlastni loader

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

Zdravím,
napsal jsem si vlastní implementaci Symfony\Component\Translation\Loader\LoaderInterface,
která načítá texty z databáze.

Co mám zapsat do config.neon, aby ji Kdyby/Translation začal používat?

Díky.

class TextyLoader implements LoaderInterface
{

    public function load($resource, $locale, $domain = 'texty')
    {
		if (!($resource instanceof \App\Model\Repository\TextyRepository)) {
			throw new InvalidResourceException('This is not an \App\Model\Repository\TextyRepository.');
        }

		$messages = $resource->getMessages($locale);
		//$messages['homepage.helloName'] = 'Ahoj %name%';

        $catalogue = new MessageCatalogue($locale);
        $catalogue->add($messages, $domain);
        $catalogue->addResource($resource);

        return $catalogue;
    }

}

Editoval esorimer (8. 1. 2015 12:30)

Filip Procházka
Moderator | 4668
+
0
-
services:
	- {class: Moje\Implementace\Loaderu, tags: [translation.loader: formát]}

neon je nakonfigurovaný například takto

services:
	- {class: Kdyby\Translation\Loader\NeonFileLoader, tags: [translation.loader: neon]}
esorimer
Člen | 114
+
0
-

Zkusil jsem;

- {class: Kdyby\Translation\Loader\TextyLoader, tags: [translation.loader: 'texty']}

ale hodí to chybu Resource /home/petr/public_html/www.skimu.cz/nette/app/lang/texty.en.texty is not valid and cannot be loaded.

Jinak podle dokumentace mám v config.neon

translation:
    default: cs
    fallback: [cs_CZ, cs]

o řádce - {class: ..} jsem se nikde nedočetl :(

Filip Procházka
Moderator | 4668
+
0
-

To co ti radím je správně. Podívej se pořádně na tu výjimku co ti to vyhodilo. Pravděpodobně ji vyhazuje ten tvůj loader a znamená to že neumí správně načíst ten tvůj soubor.

esorimer
Člen | 114
+
0
-

Co přesně znamená tags: [translation.loader: neon] ?
Jinak já žádný takový soubor co popisuje ta výjimka nemám. Chci načítat data z databáze.Potřebuji, aby metoda load dostala jako první argument třídu App\Model\Repository\TextyRepository, která tahá překlady z databáze.

Editoval esorimer (12. 1. 2015 9:33)

esorimer
Člen | 114
+
0
-

Chyba se generuje v ../vendor/kdyby/translation/src/Kdyby/Translation/DI/TranslationExtension.php na řádce s $this->validateResource($format, $file->getPathname(), $m['locale'], $m['domain']);

Filip Procházka
Moderator | 4668
+
0
-

Pomocí toho tagu Kdyby/Translation tu službu najde a samo si ji zaregistruje jako loader pro daný typ souboru. Tedy tags: [translation.loader: neon] znamená „tahle služba je Kdyby/Translation loader pro soubory formátu neon“.


Chyba se generuje v tvém kódu, který je ve validate resource volán.

esorimer
Člen | 114
+
0
-

Tak jsem zjistil, že chyba jev tom, že validateResource() volá metodu TextyLoader::load() a za první argument dosadí textový řetězec (název toho neexistujícího souboru). Když jsem volání validateResource() v TranslationExtension::beforeCompile() zakomentoval a změnil následující řádku

<?php
$translator->addSetup('addResource', array($format, $file->getPathname(), $m['locale'], $m['domain']));
?>

na

<?php
$translator->addSetup('addResource', array($format, '@textyRepository', $m['locale'], $m['domain']));
?>

tak to funguje. Dá se stejného výsledku dosáhnout i bez zásahu do TranslationExtension.php?

Pro upřesnění: V config.neon mám ještě

services:
	textyRepository: App\Model\Repository\TextyRepository(@databaseFactory)

Editoval esorimer (12. 1. 2015 16:01)

Filip Procházka
Moderator | 4668
+
0
-

Snažíš se napsat databázový loader? Koukal jsem na to a bez zásahu do translatoru to v současnosti asi nepůjde. Každopádně to ničemu nevadí, upravíme to :)

Joa, trochu mě děsí název TextyLoader, co to je? To jakože načítáš překlady celých stránek do translatoru? To určitě nedělej. Translator je dělaný na překlady hlášek aplikace, ne obsahu.

esorimer
Člen | 114
+
0
-

Super :-) Neboj, používám to jen na překlad hlášek / krátkých popisků.

A když už budete v tom vylepšování, napsal jsem si taky vlastní implementaci MessageCatalogue() (resp. rozšířil stávající, ale to je jedno) a aby se použila, musel jsem v Kdyby/Translation/CatalogueFactory.php nahradit new MessageCatalogue($locale) za new MessageTextyCatalogue($locale)

Filip Procházka
Moderator | 4668
+
0
-

Bylo by fajn, kdybys otevřel issues (nebo klidně i pullrequesty) a napsal tam do nich jednotlivé úpravy co jsi provedl a proč. Pokud mi to bude dávat smysl, můžeme to dát do Kdyby :)

petr.jirous
Člen | 128
+
0
-

@FilipProcházka : Cau, podarilo se nejak vyresit to, aby sel udelat loader pro texty z db bez zasahu do TranslationExtension?

Filip Procházka
Moderator | 4668
+
0
-

@petr.jirous on je potřeba nějaký zásah?

petr.jirous
Člen | 128
+
0
-

@FilipProcházka

Snažíš se napsat databázový loader? Koukal jsem na to a bez zásahu do translatoru to v současnosti asi nepůjde. Každopádně to ničemu nevadí, upravíme to :)

Filip Procházka
Moderator | 4668
+
0
-

@petr.jirous a už mi řekneš jaký zásah? :)

petr.jirous
Člen | 128
+
0
-

@FilipProcházka : já si napsal loader, který dědí ArrayLoader a implementuje LoaderInterface. V metodě load vytvořím a naplním MessageCatalogue a v configu loader zaregistruji a dám mu tags: [‚translation.loader‘: ‚db‘]. Problém je v tom, že Translator hledá soubory .db (což já zrovna nepotřebuji). Máš prosím nějaký hint?
Díky moc
Petr

petr.jirous
Člen | 128
+
0
-

@FilipProcházka nemohl bys mě prosím trochu nakopnout ? ;)

Landsman
Člen | 152
+
0
-

petr.jirous napsal(a):

@FilipProcházka nemohl bys mě prosím trochu nakopnout ? ;)

Jak jsi to nakonec vyřešil? :)