Kdyby/Translation nefunguje přepnutí jazyka

petrhanz
Člen | 6
+
0
-

Zdravím, dostal jsem za úkol připravit podporu více jazyků v existujícím projektu, který je napsaný v Nette 2.4. Podařilo se mi zprovoznit Kdyby/Translation až na jeden malý detail. Stále mám nastavený jazyk aj i když mám v url en. Routu mám upravenou podle dokumentace. Mám i soubory se slovníky a nehází to žádnou chybu jen se jazyk nepřepne. Poradí někdo prosím?

adioverride
Člen | 26
+
0
-

Ahoj,
asi by to chtělo trošku „vidět pod pokličku“. Když zašleš ukázku jak to implementuješ tak ti je někdo schopen poradit.

A. :)

petrhanz
Člen | 6
+
0
-

Ukázka implementace

1. router

$router[] = new Route('[<locale=cs cs|en>/]<presenter>/<action>', "Homepage:default");

2. config.neon

extensions:
	translation: Kdyby\Translation\DI\TranslationExtension
translation:
	default: cs
	fallback: [cs_CZ, cs]

Slovníky mám vytvořené. Jazyk chci přepnout v url adrese. V Tracy překlad vidím, ale i když dám parametr cs zůstává v Tracy en a bere se anglický slovník. Jak z toho prosím ven? Potřebuji aby se při parametru en vzal anglický slovník a při cs český. Čeština by měla být i výchozí.

Editoval petrhanz (9. 3. 2023 14:32)

petrhanz
Člen | 6
+
0
-

Pepino napsal(a):

@petrhanz https://github.com/…/en/index.md#… četls?

Btw: https://forum.nette.org/…v-tomto-foru#…

Díky za tip. Bohužel jsem šel přesně podle návodu ale slovník mi to nechce vzít jiný než anglický.

Pepino
Člen | 239
+
+1
-

@petrhanz ukaž jak to máš v BasePresenteru nebo co používáš. Asi ti tam někde chybí $this->translator->setLocale($this->locale);

Ozzrel
Generous Backer | 50
+
+1
-

Mě to nefungovalo bez whitelistu

translation:
	locales:
		whitelist: [en, cs]
		default: cs
		fallback: [cs]
petrhanz
Člen | 6
+
0
-

Pepino napsal(a):

@petrhanz ukaž jak to máš v BasePresenteru nebo co používáš. Asi ti tam někde chybí $this->translator->setLocale($this->locale);

Tak to bude v tom.
BasePresenter

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
    /** @persistent */
    public $locale;

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

    public function __connstruct() {
		$this->translator->setLocale($this->locale);

    }
}

a HomepagePresenter

	public function construct()
	{
		parent::construct();
	}

Myslel jsem si že v BasePresenteru nastavím a ostatní presentery podědí. Ale očividně ne. Když to vložím do HomepagePresenter tak to funguje. Zatím to zkouším na prázdném projektu.

Pepino
Člen | 239
+
+2
-

@petrhanz nenastavuj to v constructoru ale ve startupu. Tj hoď do BasePresenteru:

protected function startup() {
	parent::startup();
	$this->translator->setLocale($this->locale);
}
petrhanz
Člen | 6
+
0
-

Pepino napsal(a):

@petrhanz nenastavuj to v constructoru ale ve startupu. Tj hoď do BasePresenteru:

protected function startup() {
	parent::startup();
	$this->translator->setLocale($this->locale);
}

Díky už to funguje.

ViPEr*CZ*
Člen | 809
+
0
-

__connstruct … mozna v kodu byli take 2× n ?

public function construct()
{
parent::construct();
}

tohle take neni validni… asi taky jen zdejsi preklep?

Editoval ViPEr*CZ* (10. 3. 2023 15:00)