Generalnie jest tak, że strona główna ma ustawiony język angielski, a klikając na flagę polski można przejść do języka polskiego, który jest w katalogu “pl”.
A teraz chciałbym zrobić dwie rzeczy:
Stworzyć kod JS, który będzie automatycznie wczytywał zawartość katalogu “pl” , zostawiając adres robots.mjstudios.tk
Stworzyć ciasteczko, które będzie zapisywać wybrany język na zawsze, a zmieniać go , gdy użytkownik zmieni go na stronie…
Jeśli wszystko robisz w czystym kodzie HTML, to znaczy, że nie używasz żadnego języka skryptowego po stronie serwera, a to powoduje, że masz statyczne dane i ścieżki (linki).
Sugeruję zatem zastosować względne odnośniki w swoich stronach HTML i rozdzielić wersje językowe na osobne podfoldery - tak jak być może jest teraz (lub możesz też mieć foldery /pl oraz /en dla obu wersji językowych - osobiście byłbym za tym rozwiązaniem z powodu “symetrii”).
Obsługę języka musisz zaimplementować w JavaScripcie i to on powinien ustawiać ciasteczko z bieżącą wersją językową, które to ciasteczko powinieneś na starcie (w JS) odczytać i ewentualnie zrobić przekierowanie na inną podstronę (gdy jest inny język niż domyślnie wczytany - język czyli podfolder).
Tylko mam jeszcze pytania- muszę zrobić funkcję odczytującą ciasteczko? Czy mogę ustawić ciasteczko tak, by ustawiało wartość domyślną po kliknięciu na link obrazkowy?
Bo chciałbym zastosować to samo na stronie http://www.mjstudios.tk i myślę, że to będzie ten sam mechanizm…
No tak - ciasteczko samo się nie stworzy, a musisz to robić w konkretnym momencie - jak użytkownik zechce zmienić język serwisu (klikając na stosownym linku). Praktycznie - musisz podczepić zdarzenie click (onclick) na linku, np. tak:
function getCookie(name)
{
if (document.cookie)
{
var cookies=document.cookie.split("; ");
for (i=0;i
{
var cookieName=cookies[i].split("=")[0];
var cookieValue=cookies[i].split("=")[1];
if (cookieName==name) return unescape(cookieValue);
}
}
return null;
}
i analogicznie to samo dla języka angielskiego (tylko że u Ciebie jest używane "int" a nie "en"), a funkcja changeLanguage() jest napisana przez Ciebie i służy to zmiany języka (link sam to zrobi - przekieruje użytkownika tam gdzie trzeba) oraz ustawienia ciasteczka (najważniejsza sprawa) - np. tak napisana:
Dziękuję Nie znam się na cookies i bardzo dziękuję za pomoc
Niestety…
Po wpisaniu kodu wyświetla się tekst:
“function changeLanguage(language) { document.cookie=‘JezykSerwisu=’+language; return true; } function getCookie(name) { if (document.cookie) { var cookies=document.cookie.split(”; "); for (i=0;i windows.onload=function() { var language=getCookie(“JezykSerwisu”); if (language) window.location.href=“http://mjstudios.tk/”+language; } ", tak , jakby nie został przetworzony…
bez “s” w wyrazie window (coś jak Psikutas bez “s” w Killerze). Mój błąd, z rozpędu pisałem i nie zauważyłem.
Popraw i zobacz czy zadziała.
P.S. Zwróciłem uwagę na pewien aspekt: jak już wybierzesz język, to potem już nie masz możliwości jego zmiany - nawet przejście do strony głównej przekieruje Cię (jak ciasteczko zadziała) na tę wcześniej wybraną. Oczywiście usunięcie ciasteczka (w przeglądarce) pomoże, ale zwykły użytkownik będzie miał problem - warto zatem mieć gdzieś na stronie (i wszystkich podstronach), np. u góry z prawej strony opcję zmiany języka (link jak na początku, ale już dyskretny, bez tych flag). Np. po wybraniu języka polskiego miałbyś napis “Change to English”, a jak masz po angielsku, to napis “Zmień na polski”.
to sprawdzenie ciasteczka (funkcja podpięta do window.onload ) powinna być uruchamiana tylko na głównej stronie, a Ty ją masz wszędzie, stąd zapewne to przełączanie. Na podstronach, tam gdzie masz te “małe” linki do zmiany języka, to dajesz tylko ten fragment kodu JavaScript związany z zapisem ciasteczka, ale już nie z jego odczytem. Czyli nie wstawiasz wtedy poniższej części:
window.onload=function()
{
var language=getCookie(“JezykSerwisu”);
if (language) window.location.href=language;
}
cała reszta jest. Ewentualnie możesz dawać (na podstronach) link do strony głównej, gdzie ponownie jest wybór wersji językowej (choć mnie się to mniej podoba, bo wracasz do początku, zamiast być na tej samej podstronie, a tylko przełączyć język), ale w tym przypadku musisz pamiętać o skasowaniu ciasteczka (lub ustawieniu jakiejś neutralnej wartości, co jest o wiele prostsze), bo strona główna go odczyta i Cię przekieruje (co jest bez sensu). W przypadku neutralnej wartości musisz jeszcze zmodyfikować kawałek kodu:
window.onload=function()
{
var language=getCookie("JezykSerwisu");
if (language) window.location.href=language;
}
na
window.onload=function()
{
var language=getCookie("JezykSerwisu");
if (language && language!="0") window.location.href=language;
}
ten kod oczywiście będziesz miał tylko na stronie głównej, wartość neutralna to “0” (zero), ale możesz wybrać cokolwiek. Pamiętaj też, żeby dodać właściwą akcję na kliknięcie na taki link (analogicznie jak przy wyborze języka):
Wybierz język/Change language[/code]
P.S. To “dziczenie” Twojej strony (przełączanie z “pl” na “en”) może też być wynikiem błędu w kodzie podstrony (zgaduję, bo nie mam dostępu do wszystkiego).
W powyższym kodzie masz (w JavaScript) funkcję getCookie (), która jest tu zbędna (potrzebna jest tylko na stronie głównej do odczytu ciasteczka), ale jeszcze nie wiem, dlaczego nie działa jak trzeba ustawianie ciasteczka (muszę przetestować to na spokojnie).
P.S. Mając linka i dostęp do strony www i tak widzę, co tam jest wpisane. (ale tutaj nie warto tego wklejać, bo zaciemni tylko treść).
EDIT: A możesz wywalić te wpisy z CDATA (początkowy i końcowy)?
Aby ciasteczko było “trwałe”, czyli nie znikało po zamknięciu sesji (przeglądarki), trzeba mu ustawić datę ważności (wygaszenia). Bez tej daty ciasteczko działa jak powyżej.
Są dwie szkoły ustawiania takiej daty:
Ustalamy jakąś odległą datę i wpisujemy ją “ręcznie” jako zwykły tekst (ale w odpowiednim formacie daty JS!)
W momencie ustawiania ciasteczka pobieramy aktualną datę i do niej dodajemy np. 5-10-20 lat - i przez taki czas ciasteczko będzie ważne (to wystarczy).
Problemem w JS jest data większa niż 2038 rok, bo czas jest liczony liczbą milisekund od 1 stycznia 1970 roku i trzymany w 32-bitowej reprezentacji, która ma ograniczenie do 2038 roku właśnie. Ale może do tego czasu coś się wydarzy, że to się zmieni/poprawi? Na razie nie próbowałbym ustawiać czasu wygaśnięcia przekraczającego ten rok.
EDIT: podobno ten “problem” jest już dawno usunięty z przeglądarek internetowych (sam tego jednak nie przetestowałem).
Rozwiązanie 2 wbudowane do funkcii changeLanguage wygląda tak:
function changeLanguage(language)
{
var data=new Date();
data.setDate(data.getDate() + 3650); // ważność 10 lat
document.cookie='JezykSerwisu='+language + "; expires="+data.toUTCString();
return true;
}
Usunąłem CDATA’ę, ale wciąż - kiedy klikam na zmianę języka - nie chce mi się zmienić na stronie głównej.
Co mam zrobić, żeby zmieniała się też “zawartość” ciasteczka na stronie głównej? Bo tak po kliknięciu na link do “pl” nie zmienia się i po wejściu na stronę główną wciąż wyświetla się jedynie katalog pl/en …
Być może jest co nie tak z przekierowaniami (bo chyba masz je włączone?). Jutro (w niedzielę) zajrzę na spokojnie do Twojego kodu i postaram się namierzyć błąd.
– Dodane 25.11.2012 (N) 17:43 –
Chyba znalazłem powód tego “wariowania” strony - błąd leży w tym, że Ty dla strony angielskojęzycznej raz używasz sufiksu “int”, a raz “en” (mówię o linkach do odpowiedniej strony oraz o parametrze funkcji changeLanguage (przy onclick). Przejrzyj swój kod i uporządkuj te sufiksy i może już będzie dobrze?
Kolejny błąd polega na dwóch różnych funkcjach ustawiających ciasteczko - ta ze strony głównej ustawia ciasteczko jako trwałe (na 10 lat), natomiast ta znajdująca się w podfolderach “językowych” ustawia ciasteczko do końca sesji. To powoduje, że to pierwsze ciasteczko jest trwalsze i to drugie jego nie nadpisuje. Szczegóły możesz zobaczyć tutaj: http://support.mozilla.org/pl/kb/usuwanie-ciasteczek (usuwanie ciasteczek pojedynczych witryn).
Kolejny błąd, jak się okazało po przyjrzeniu ciasteczkom, polega na różnych ścieżkach każdego z nich, dlatego należy zmodyfikować funkcję changeLanguage ustawiającą ciasteczko na następującą:
function changeLanguage(language)
{
var data=new Date();
data.setDate(data.getDate() + 3650); // ważność 10 lat
document.cookie='JezykSerwisu='+language + "'; path=/; expires="+data.toUTCString();
return true;
}
Sugeruję wydzielić funkcje JavaScript do osobnego pliku (np. function.js) i importować ten plik w nagłówku strony HTML. Wtedy masz lepszą kontrolę nad tymi funkcjami i nie musisz się martwić tym, gdzie one są wykorzystywane (na jakich stronach HTML), jeśli trzeba będzie jakaś zmodyfikować.