Definice lokalizace aplikace

Marek Znojil
Člen | 76
+
0
-

Ahoj,

chtěl bych vědět Váš názor, zda je můj přístup k definici lokalizace aplikace správný.

Mám servis Translator, v konstuktoru si injectnu repositář jazyků (Whitelist, abych věděl, který mohu použít.) a pak defaultní i aktuální jazyk dle ISO kódu.

Dále v něm kontroluji sušenku lang, dle které vrátím výsledný jazyk.

Je toto správná cesta?

Dočetl jsem se, že bych mohl definici jazyka provádět ještě pomocí persitentního parametru, který bych hádám předal v BasePresenteru translatoru metodou setLang() například.

Díky za názory a rady.

M.

Editoval Marek Znojil (9. 2. 2020 10:07)

Gappa
Nette Blogger | 199
+
+1
-

Chápu to správně, že pak mají obsahy v různých jazycích stejné URL?

Pokud ano, pak je to určitě špatně – to se nebude líbit jak vyhledávačům, tak lidem, kterým někdo pošle odkaz.

Rozdílný obsah by měl mít unikátní URL – ať to bude (sub)doménou, cestou za lomítkem, nebo GET parametrem. Pak se to dá okořenit třeba právě tou cookie nebo http hlavičkou, aby uživatel byl přesměrován na jeho preferovanou jazykovou verzi.

Ale není třeba to celé vymýšlet sám :)

Marek Znojil
Člen | 76
+
0
-

Gappa napsal(a):

Chápu to správně, že pak mají obsahy v různých jazycích stejné URL?

Pokud ano, pak je to určitě špatně – to se nebude líbit jak vyhledávačům, tak lidem, kterým někdo pošle odkaz.

Rozdílný obsah by měl mít unikátní URL – ať to bude (sub)doménou, cestou za lomítkem, nebo GET parametrem. Pak se to dá okořenit třeba právě tou cookie nebo http hlavičkou, aby uživatel byl přesměrován na jeho preferovanou jazykovou verzi.

Ale není třeba to celé vymýšlet sám :)

Ahoj,

já jsem si to představoval tak, že budu mít jednoduchou třídu s implementací Nette\Localization\ITranslator, kterou bych si pak dále injectoval právě do routeru, ostatních servisů kvůli názvům či url produktů například, apod..

Chtěl jem se právě pouze zeptat na to, zda je v pořádku když bych to neřešil persitentním parametrem, ale pouze přes sušenku, jestli to mohu definova inhed v konstruktoru.

V opačném případě při použití nějakého parametru zase tou metodou, kterou bych volal v basePresenteru.

M.

Kamil Valenta
Člen | 762
+
0
-

Pokud se z URL „dělá“ presenter a action, měl by id jazyka dodat router (právě dle URL, která je pro každou mutaci unikátní), to si hodíš do persistentního parametru, čímž se tě správě vygenerují všechny „plinky“.
Moc tady nikde prostor pro cookies nevidím.

Marek Znojil
Člen | 76
+
0
-

kamil_v napsal(a):

Pokud se z URL „dělá“ presenter a action, měl by id jazyka dodat router (právě dle URL, která je pro každou mutaci unikátní), to si hodíš do persistentního parametru, čímž se tě správě vygenerují všechny „plinky“.
Moc tady nikde prostor pro cookies nevidím.

Ahoj,

nu, mohou být i způsoby definice třeba pomocí formuláře.

Pokud je jazyk z formuláře na whitelistu, tak se uloží do cookie.

To co jsem popisoval, mohou být dva různé způsoby definice jazyka. Na některém projektu použiji tuto a na druhém zase tu jinou.

šlo mi spíže o názor na provedení, zda jsem správně pochopil tu definici uvnitř translatoru, protože bych jej chtěl dále injectovat do ostatních tříd v modelu, právě kvůli mutacím z DB.

M.

Kamil Valenta
Člen | 762
+
+1
-

Nerozumím, co jsou způsoby definice třeba pomocí formuláře.
Chceš na přepnutí mutace formulář se selectem, který obsahuje dostupné jazyky? Pak po jeho submitu musíš udělat redirect na URL konkrétní mutace. Jinak budeš zápasit s rozdílným obsahem na jedné URL…

Marek Znojil
Člen | 76
+
0
-

kamil_v napsal(a):

Nerozumím, co jsou způsoby definice třeba pomocí formuláře.
Chceš na přepnutí mutace formulář se selectem, který obsahuje dostupné jazyky? Pak po jeho submitu musíš udělat redirect na URL konkrétní mutace. Jinak budeš zápasit s rozdílným obsahem na jedné URL…

Rozumím,

budu to provádět pomocí url jak navrhuješ, přijde mi to elegantnější. V cookies si budu pamatovat pouze zvolení a použiji to na přesměrování, jak to má vlastně i web Nette když nebude ‚parametr‘ lang zvolen.

Mám tedy v modelu třídu Translator, která má injectnutý langRepository, zvolený jazyk dále budu předávat touto třídou napříč aplikací, componenty, apod..

Je v pořádku, že ji například použiji i ve fasádách? Hádám, že do repozitářů už toto moc nepatří?

M.

Kamil Valenta
Člen | 762
+
+2
-

Stále nechápu, proč si to pamatovat v cookies, když to router pozná z URL. IMHO je to jen zdroj problémů, co když hodnota v cookies bude jiná než rozpoznaná z URL?

A v DB vrstvě to asi taky potřebuješ, ne? Abys mohl joinovat patřičné mutace.

Marek Znojil
Člen | 76
+
0
-

kamil_v napsal(a):

Stále nechápu, proč si to pamatovat v cookies, když to router pozná z URL. IMHO je to jen zdroj problémů, co když hodnota v cookies bude jiná než rozpoznaná z URL?

Ahoj,

tak pamatovat si to v cookie třeba z důvodu, že když je výchozí jazyk cs, ale poslední používaný jazyk byl en, aby to při zadání adresy example.com/ přesměrovalo na example.com/en, či toto nemám vůbec řešit?

A v DB vrstvě to asi taky potřebuješ, ne? Abys mohl joinovat patřičné mutace.

Ano, ale nevěděl jsem, zda je správný přístup to použít i v repozitářích, myslel jsem, že toto patří spíže jen do fasád.

M.

Kamil Valenta
Člen | 762
+
+1
-

Marek Znojil napsal(a):

Ahoj,

tak pamatovat si to v cookie třeba z důvodu, že když je výchozí jazyk cs, ale poslední používaný jazyk byl en, aby to při zadání adresy example.com/ přesměrovalo na example.com/en, či toto nemám vůbec řešit?

Aha, jo, to už beru, že je argument, proč to v cookie držet. Ale asi bych to neřešil. Jak bys ho chtěl redirectnout? Možná 302, možná 303…

Ano, ale nevěděl jsem, zda je správný přístup to použít i v repozitářích, myslel jsem, že toto patří spíže jen do fasád.

To už netuším, používám jiný přístup, psal jsem to jen obecně.

Marek Znojil
Člen | 76
+
0
-

kamil_v napsal(a):

Marek Znojil napsal(a):

Ahoj,

tak pamatovat si to v cookie třeba z důvodu, že když je výchozí jazyk cs, ale poslední používaný jazyk byl en, aby to při zadání adresy example.com/ přesměrovalo na example.com/en, či toto nemám vůbec řešit?

Aha, jo, to už beru, že je argument, proč to v cookie držet. Ale asi bych to neřešil. Jak bys ho chtěl redirectnout? Možná 302, možná 303…

Mno, koukám, že to bude asi více ošemetné než jsem si představoval, ale dle všeho ta 302 bude ideální.
Třeba z:
example.com/contacts musím udělat example.com/en/contacts vezmu-li v potaz fakt, že bude tento jazyk rozdílný od výchozího.

Ano, ale nevěděl jsem, zda je správný přístup to použít i v repozitářích, myslel jsem, že toto patří spíže jen do fasád.

To už netuším, používám jiný přístup, psal jsem to jen obecně.

Mohl bych poprosit o nasměrování či ukázku?

Toto mě právě také zajímá, abych se přiznal na tuto problematiku jsem chtěl založit další vlákno. :D

Zajímá mě přístup ostatních.

Děkuji,

M.

Kamil Valenta
Člen | 762
+
+1
-

Ta vlákna už tu jsou, ve smyslu Doctrine vs. NetteDatabase atp.
Já používám ActiveRow, protože se mi zdá mnohem efektivnější na výpočetní čas.
Doctrine z mého pohledu upřednostňuje pohodlí programátora za cenu vyšší časové a paměťové náročnosti.
Navíc Doctrine entity pokrývají jen „základní“ práci v DB, složitější věci se stejně musí dělat oklikou (zde nechávám volné pole pro vlastní omyl, nejsem v Doctrine kovaný, ale myslím, že to tak opravdu je).

Marek Znojil
Člen | 76
+
0
-

Napadla nějaká metoda v základním repozitáři, která by se používala v ostatních metodách repozitářů pro hledání záznamů v nich:

// categoryRepository
public function findCategories(){
	$ts = $this->database->table('category');
    $this->findTableTranslations($ts, ':category_translation', ['name', 'url']);
    return $ts->order('category.path')
      ->fetchAll();
}

// baseRepository
public function findTableTranslations($ts, $tableName, $cols): void{
    $ts->select( // etc..
}

Ale hádám, že to je celkem prasárna.. :/

M.

Editoval Marek Znojil (11. 2. 2020 12:12)

Marek Znojil
Člen | 76
+
0
-

Nemá ještě někdo s touto problematikou zkušenosti? :/

Popřípadě, jak ji řešíte?

M.