Kdyby\Translation a ukládání do Cache

chemikus
Člen | 47
+
0
-

Ahoj,
narazil jsem na drobný „problém“, který mi komplikuje trochu život. Již delší dobu používám Kdyby\Translation, ale dnes jsem si stáhl přes composer nejnovější verzi Nette a tohoto pluginu. Zprovoznil jsem ho tak, jako vždy (a dle návodu v dokumentaci):

config.neon

extensions:
	translation: Kdyby\Translation\DI\TranslationExtension

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

RouterFactory.php

<?php
public static function createRouter(): RouteList {
	$router = new RouteList;
	$router->addRoute('[<locale=cs cs|en>/]<presenter>/<action>', "Dashboard:default");
	return $router;
}
?>

BasePresenter.php

<?php
abstract class BasePresenter extends Nette\Application\UI\Presenter {

	/** @persistent */
	public $locale;

	/** @var \Kdyby\Translation\Translator @inject */
	public $translator;

	...
}
?>

Můj text.cs_CZ.neon soubor vypadá následovně:

login:
	signInText: "Pro přístup do administrace musíte být přihlášen."

Při prvním načtení se mi neon soubor načte a v prohlížeči se mi zobrazí přeložený text – tedy to funguje tak, jak očekávám.

Problém ale nastane, když v .neon souboru změním hodnotu singInText na cokoli jiného. Translator si vezme hodnotu, kterou si dříve uložil do cache a v prohlížeči se mi zobrazí původní (=starý =špatný) text. To stejné, když do .neon souboru přidám další řádek s novým překladem. Tento nový řádek vůbec není reflektován a v prohlížeči se mi to vůbec nepřeloží.

Proto se ptám, co dělám špatně? Dá se nějak vypnout ukládání cache, když jsem na localhostu – vyvýjím aplikaci?

V dokumentaci jsem našel, že můžu kešování vypnout příkazem v config souboru. Přidal jsem tedy následující:

cacheStorage:
		factory: Nette\Caching\Storages\DevNullStorage

Ale to nevyřešilo vůbec nic (dost možná jsem taky špatně pochopil tuto možnost a vyzkoušel jsem ji zbytečně).

Můžete mi prosím někdo poradit, co mám udělat, aby se mi vždy načetla aktuální verzie mého překladového .neon souboru? Docela se mi to hodí, když postupně buduji aplikaci :-)

Předem všem děkuji za pomoc.

Víťa

Marek Bartoš
Nette Blogger | 682
+
0
-

Není patrné, zda konfiguruješ v sekci services službu cacheStorage a její klíč factory, nebo zda jde o extension pod jménem cacheStorage a její konfiguraci.

Ve výchozím nastavení nette/bootstrap je CacheExtension pod klíčem cache a storage v CacheExtension je v podklíčí storage, takže bys měl konfigurovat services > cache > storage > factory

https://github.com/…igurator.php#L33
https://github.com/…xtension.php#L46

Též bys měl místo DevNullStorage raději použít MemoryStorage. Často narazíš na kód, který bez cache nefunguje vůbec nebo je strašně pomalý, cache existující v rámci jednoho requestu tento problém řeší.

Editoval Mabar (9. 1. 2020 15:47)

chemikus
Člen | 47
+
0
-

Ahoj,
tak když jsem upravil ten config dle tvého postupu (tzn. následovně):

services:
	cache:
		storage:
			factory: Nette\Caching\Storages\MemoryStorage
	generalManager: App\Model\General
	userManager: App\Model\User
	imagesManager: App\Model\Images
	emailManager: App\Model\Email
	- App\Forms\FormFactory
	- App\Forms\LogInFormFactory
	router: App\Router\RouterFactory::createRouter

Tak mi to bohužel vyhodí chybu.

Nette\DI\InvalidConfigurationException
Unexpected option 'services › cache › storage'.

Takže předpokládám, že tím to asi nebude. Když jsem to vrátil zpět na:

services:
	cacheStorage:
			factory: Nette\Caching\Storages\MemoryStorage

tak mi aplikace už běží v pohodě, ale pořád se mi vytváří cache soubor toho *.neon souboru s překlady – tak opět jakékoli změny v souboru se neprojevují u mě na localhostu :(

Marek Bartoš
Nette Blogger | 682
+
0
-

Pardon, je to cache.storage, v jedné úrovni :'D

Ten config co jsi napsal vytvořil novou službu, proto ti to nejede.

Editoval Mabar (10. 1. 2020 10:43)

chemikus
Člen | 47
+
0
-

Mabar napsal(a):

Pardon, je to cache.storage, v jedné úrovni :'D

Ten config co jsi napsal vytvořil novou službu, proto ti to nejede.

services:
	cache.storage:
			factory: Nette\Caching\Storages\MemoryStorage

No, už jsem z toho dost zmatený :-) Ale ani tohle nevyřešilo problém, že si ten translator udělá vlastní cache a pak už nový *.neon soubor nenačte :(

U předchozí verze (cca před půl rokem, když jsem něco dělal), si to ale vždy bralo z toho souboru – takže asi nějaký update v plug-inu …

Marek Bartoš
Nette Blogger | 682
+
0
-

Tahle možnost mě nenapadla. translation > cache. Extension má samostatně cache a ani by-default nebere tu globální.

https://github.com/…xtension.php#L109

chemikus
Člen | 47
+
+1
-

Mabar napsal(a):

Tahle možnost mě nenapadla. translation > cache. Extension má samostatně cache a ani by-default nebere tu globální.

https://github.com/…xtension.php#L109

Díky, že jsi poslal ten kousek kódu … trklo mě, že vlastně můžu zapnout „debugger“ mode …

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

A vše funguje tak jak má …

Díky moc!

Shampoo
Člen | 38
+
0
-

Je nějaká možnost, jak zákázat cache?
Ukládám si překlady do DB a kdyby vytváří temp/cache/_Kdyby%5CTranslation%5CTranslator a v něm PHP soubor.
Aby se mi projevily změny na frontendu, tak msuím smazat ručně tento soubor…