Autor Zpráva
Martin Joneš
Profil
Dobrý den. Při zvolení jazyka mám nastavené, aby se v prohlížeči vytvořil cookie. Pokud cookie není, nastaví se defaultni jazyk user agenta (prohlížeče) -> pokud jazyk není podporován, použije se angličtina. Jenže. Jazyk se volí pomocí GET (query parametr v URL) pokud načtu stránku třeba example.com/example a zobrazí se mi v angličtině, mezi tím přejdu na jinou URL na stejné doméně, tam změním jazyk na češtinu a půjdu zpátky na example.com/example, Tak se mi načte HTML cachenuté v prohlížeči. Takže lang attribut v <html> tagu je "en" ale cookie je již nastavený na češtinu. Pokud nedám F5, tak se dokument nestáhne ze serveru, ale z paměti cache. Mám otázku, zda můžu použít tento kód(používají-li se jiné postupy), popřípadě jaké by mohly být nedostatky... (Jiný způsob, pokud je toto hloupý nápad z mé strany. Kdyby uživatel například změnil cookie ručně, vytvořil by se mi nekonečný reload loop)
function getCookie(cn) {
var name = cn+"=";
var allCookie = decodeURIComponent(document.cookie).split(';');
var cval = [];
for(var i=0; i < allCookie.length; i++) {
if (allCookie[i].trim().indexOf(name) == 0){
cval = allCookie[i].trim().split("=");
}}
return (cval.length > 0) ? cval[1] : "";
}

if(getCookie("hl") != document.documentElement.lang) {
reload();
}
Keeehi
Profil
Martin Joneš:
Pokud nedám F5, tak se dokument nestáhne ze serveru, ale z paměti cache.
To ale taky znamená, že tam bude i text v původním jazyku. Takže jazyk stránky bude odpovídat atributu lang tagu html. Takže vše je vlastně v pořádku.

Pokud chceš vynutit znovunačtení bez toho, aby to šlo jen z keše, stačít přidat parametr true.
location.reload(true);
Martin Joneš
Profil
Keeehi:
Pokud vím, tak parametr true zapříčiní stažení JavaScriptů, CSS a obrázků.(Což není můj cíl, jelikož ta stránka je dost velká) Já mám problém s tím, že když navštívím stránku před změnou jazyka, jazyk změním jinde a pak se vrátím na původní stránku, která byla v původním jazyce, tak se mi ukáže ta stejná. Ta cachenutá v prohlížeči. Bez změny jazyka. Jazyk a atribut Lang mi mění PHP. Jde mi o to, jestli mám uživatele v tom nechat a on si sám poradí tím, že vytvoří nový požadavek pro zobrazení stránky v tom jeho jazyce, či refreshne stránku, nebo kontrolovat ten cookie, jestli odpovídá lang attributu. Protože jedno URL může sdílet jiný obsah (článek v jiném jazyku) tak prohlížeč nenapadne, že si po přepsání mého jazykového cookie má znovu stáhnout HTML dokument, že v něm mohou být změny.
Můžeš si to zkusit. Jdi na test.jonesova.cz -> pak si přejdi na nějaký článek třeba v archivu, pak na jiný článek v archivu, tam si změn jazyk na angličtinu a vrať se zpátky přes odkazy na stránce na ten první článek. Nebude v tom tvým zvoleným jazyce, dokud nezmačkneš F5
Keeehi
Profil
Pokud chceš vynechat keš u HTML a zachovat ji u obrázků atp. Tak by teoreticky mělo úplně stačit správně nastavit hlavičky. Pro html kešování úplně zakázat a obrázkům a ostatním nastavit dlouhou dobu. Případně (ale to spíš jen jako krajní řešení) by šlo nový obsah dotáhnout AJAXem a jen ho na stránce vyměnit.

Protože jedno URL může sdílet jiný obsah (článek v jiném jazyku)
Na tuhle drobnost jsem úplně zapomněl. Mít na jedné url víc různého obsahu je prasárna. Což se ukazuje vlastně i na tomto případě. Pokud by měla každá jazyková mutace svojí url, tak jak by ji správně měla mít, vůbec by jsi neměl problém s kešováním.
Alphard
Profil
Martin Joneš:
Protože jedno URL může sdílet jiný obsah (článek v jiném jazyku)
Jiný způsob, pokud je toto hloupý nápad z mé strany
Já už to tady psal více lidem, jen tady jsem si původně nevšiml. Když to budeš mít takto, nejde záložkovat konkrétní verzi, nejde sdílet konkrétní verzi, vyhledávač nemůže odkázat na konkrétní verzi, jsou problémy s cachovaním, ani historie nemusí fungovat tak jak bych čekal. Doporučoval bych dát tu verzi do url.
Martin Joneš
Profil
Keeehi:
Chápu.. nejlepší by to bylo syntaxem URL example.com/en/example... Do toho se mi moc pouštět nechce. Teď mě taky napadlo nastavení hlaviček pomocí PHP...
"Cache-control: must-revalidate" taková hlavička by měla udělat práci, ne? :)


Alphard:
No... Nejspíš Google bude muset indexovat stránky s parametrem "?hl=en" -> Pokud vím, tak Google taky nepoužívá více URL pro svá fóra, API dokumentace a podobné. Nezkoušel jsem parametr odstranit, jestli by mi to hodilo 301 a vynutilo ten parametr, každopádně své vlastní stránky má Google s tímto parametrem indexované
Přímý příklad. support.google.com/webmasters/?hl=cs#topic=3309469 Po změně hl se jazyk změní. Po odstranění jazyk zůstává a parametr se v URL nevynucuje žádným rewrite pravidlem. Takže hádám, že to funguje asi na stejném principu. Uloží si jazykový cookie do prohlížeče.
Keeehi
Profil
example.com?hl=cs example.com?hl=cs a example.com. Jsou tři různé URL adresy. A tobě se povedlo vytvořit úplně tu nejhorší možnost. Na example.com máš měnící se obsah, který je ovšem duplicitní s obsahem prvních dvou URL.

Nezkoušel jsem parametr odstranit, jestli by mi to hodilo 301 a vynutilo ten parametr
Rozhodně by to bylo pro tebe správné řešení.

každopádně své vlastní stránky má Google s tímto parametrem indexované
Hlavně si prosím uvědom, že i ten parametr je součástí URL stránky. Vyhledávače berou adresu jako celek a nijak ji nerozdělují, nijak ji neanalyzují. example.com/cs/something
example.com/en/something jsou dvě rozdílné adresy. Stejně tak i example.com/something?hl=cs
example.com/something?hl=en jsou dvě rozdílné adresy a ne jedna s nějakými parametry.
Martin Joneš
Profil
Keeehi:
Já vím.. proto se snažím přijít, jaký způsob je nejpoužívanější a nejvhodnější... Děkuji za poznatky.
Jinak si jsem vědom, jak prohlížeče zpracovávají URL. Proto se taky používají na CSS linkách třeba soubor.css?v=3 a podobně, protože ten parametr vynutí znovu stáhnutí toho souboru.
Keeehi
Profil
Nejpoužívanější je example.com/cs/neco, example.com/en/something. Pak example.com/something vrací 404 protože neexistuje a example.com/ 302 přesměrovává na [pre]example.com/cs/ nebo [pre]example.com/en/.
Martin Joneš
Profil
Keeehi:
Četl jsem, že je dobré, aby i example.com/en/neco taky fungovalo, popřípadě dělalo 301 redirect, Protože si uživatel může myslet, že změněním jazyka v URL najde stránku v jiném jazyce.
Keeehi
Profil
Aby tam byl jen odkaz to ne ale přesměrování tam být může. Jde pak taky i o to, že při použití 301 by na takové URL už nikdy neměl být obsah. Pokud si nejsi jistý, zda v budoucnu by nechtěl někdo takovou URL použít, bylo by asi lepší přesměrovávat 302.
Martin Joneš
Profil
Keeehi:
Díky moc. Pro teď to asi vyřeším nastavením té hlavičky pro vynucenou validaci dokumentu a v google console nastavím hl parametr. Do budoucna to třeba přepíši dle výše zmiňovaných alternativ. Děkuji za poznatky. Rozhodně se hodí.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: