Contributte Translation, pouze načítání z databáze
- EmanuelNeu
- Člen | 6
Zdravím,
Mám dotaz ohledně implementace Contributte Translation…
potřeboval bych docílit chování, kdy translator nebude vůbec koukat do
složky lang a bude pouze načítat data z databáze.
Je vůbec možné tohoto chování docílit v této knihovně, nebo jaký
způsob řešení by jste zvolili?
Děkuji za rady.
Přeji hezký podvečer
Neumann E.
Editoval EmanuelNeu (12. 10. 18:47)
- EmanuelNeu
- Člen | 6
@nightfish Ano, děkuji, pracuji na tom.
EDIT, kod custom loaderu nechávám kdyby někdo potřeboval.
Dostal jsem to do funkčního stavu, ale opět to vyžaduje abych vytvořil prázdný soubor Lang/%domain%.%locale%.%loaderName%.
tak mě zajímá jestli je možné docílit:
- aby domain vůbec neexistoval, což by šlo vyřešit i globálním prefixem, který taky nevím jak nastavit…
- aby nemusela vůbec existovat složka Lang, která je teď víceméně prázdná.
config:
translation:
locales:
whitelist: [en, cs, sk, pl]
default: en
fallback: [en]
dirs:
- %appDir%/lang
returnOriginalMessage: true
localeResolvers:
- Contributte\Translation\LocalesResolvers\Session
loaders:
database: App\Core\TranslationLoader
loader:
use App\Repository\TranslatorRepository;
use Contributte\Translation\Exceptions\InvalidArgument;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\Translation\Loader\ArrayLoader;
use Symfony\Component\Translation\Loader\LoaderInterface;
use Symfony\Component\Translation\MessageCatalogue;
class TranslationLoader extends ArrayLoader implements LoaderInterface
{
/**
* @param TranslatorRepository $translatorRepository
*/
public function __construct(
private readonly TranslatorRepository $translatorRepository,
){}
/**
* @param mixed $resource
* @param string $locale
* @param string $domain
* @return MessageCatalogue
* @throws InvalidArgument
*/
public function load(mixed $resource, string $locale, string $domain = 'messages'): MessageCatalogue
{
if (!\is_string($resource)) {
throw new InvalidArgument('Parameter resource must be string.');
}
if (!\is_readable($resource)) {
throw new InvalidArgument('Something wrong with resource file "' . $resource . '".');
}
$catalogue = parent::load($this->getMessages($locale), $locale, $domain);
$catalogue->addResource(new FileResource($resource));
return $catalogue;
}
/**
* @param string $locale
* @return array
*/
protected function getMessages(string $locale): array
{
$translations = $this->translatorRepository->getTranslations($locale);
$messages = [];
foreach ($translations as $translation) {
$messages[$translation->getMessageId()] = $translation->getmessage();
}
return $messages;
}
}
Editoval EmanuelNeu (13. 10. 0:35)