Contributte Translation, pouze načítání z databáze

EmanuelNeu
Člen | 6
+
0
-

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)

nightfish
Člen | 517
+
0
-

@EmanuelNeu Předpokládám, že by mohlo fungovat napsat si a zaregistrovat vlastní implementaci Symfony\Component\Translation\Loader\LoaderInterface, která bude překlady načítat rovnou z databáze.

EmanuelNeu
Člen | 6
+
0
-

@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:

  1. aby domain vůbec neexistoval, což by šlo vyřešit i globálním prefixem, který taky nevím jak nastavit…
  2. 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)