Kdyby/Translation -vlastni loader
- esorimer
- Člen | 114
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
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
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
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
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)
- Filip Procházka
- Moderator | 4668
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
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
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
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
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
@FilipProcházka : Cau, podarilo se nejak vyresit to, aby sel udelat loader pro texty z db bez zasahu do TranslationExtension?
- petr.jirous
- Člen | 128
@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 :)
- petr.jirous
- Člen | 128
@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