Jak zmieniać język na stronie za pomocą JavaScript?

Witam!

Mam taki problem.

Posiadam podstronę http://robots.mjstudios.tk , która jest w dwóch językach -po polsku i po angielsku.

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:

  1. Stworzyć kod JS, który będzie automatycznie wczytywał zawartość katalogu “pl” , zostawiając adres robots.mjstudios.tk

  2. Stworzyć ciasteczko, które będzie zapisywać wybrany język na zawsze, a zmieniać go , gdy użytkownik zmieni go na stronie…

Pozdrawiam,

Hookz

Jak chcesz to zrobić, jak wersję polską masz w folderze /pl a nie w głównym? Musisz zamienić zawartość folderu głównego / z folderem /pl

Za mało wiemy o kodzie strony, żeby podać konkretne rozwiązanie - w czym napisany jest ten serwis (PHP, Python, itp.)?

W skrypcie (na serwerze - nie w JS) mógłbyś rozpoznawać używaną wersję językową i dynamicznie generować zawartość strony.

Sama strona jest zrobiona w HTML5 z użyciem CSS3.

Nie chodzi mi o zmienianie zawartości katalogów, tylko wczytywaniu. Jeśli potrzeba wszystko przenieść do katalogu głównego, to przeniosę…

W takim razie jakiego skryptu bym potrzebował?

Aha. Strona polska to tylko plik index.html. Później planuję rozwinąć , ale będę już używał katalogów. Chodzi tylko o stronę językową…

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).

O ciasteczkach możesz poczytać tutaj:

http://www.doman.art.pl/kursjs/kurs/cookie.html

http://www.kursy.czestochowaonline.pl/javascript_tutorial/content/cookie.html

Jak wstawiać kod w JS do dokumentu HTML nasz tutaj opisany:

http://webmade.org/kursy-online/zagniezdzanie-javascript-html-kurs-javascript.php

Dziękuję.

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:

Nazwę funkcji jak i jej argument możesz nazywać dowolnie (oczywiście bez polskich ogonków).W nazwie ciasteczka nie używaj znaków specjalnych - albo jak musisz, to “przepuść” ją przez funkcję escape()* (przy tworzeniu ciasteczka - a przy jego odczycie - unescape()*).* - przykłady na stronach www piszą o takich funkcjach, a ja u siebie używam funkcji encodeURIComponent() oraz decodeURIComponent() i wydaje mi się, że one są właściwsze.A teraz odczyt ciasteczka - musisz to robić na początku po wczytaniu głównej strony serwisu, bo ona będzie ewentualnie przekierowywała użytkownika na wybraną wersję językową. Do odczytu ciasteczka warto już napisać sobie osobną funkcję, 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 teraz w dokumencie głównym robisz wstawkę w JavaScripcie

i oczywiście gdzieś też masz wstawiony pozostały kod JavaScript (o którym napisałem powyżej) - może być wstawiony w tej samem sekcji.Jakby to nie zadziałało (bo nie testowałem tego przykładu i piszę kod z “pamięci”), to zmień

if (language) window.location.href=language;

na

if (language) window.location.href="http://mjstudios.tk/"+language;

lub

if (language) window.location.href="http://"+language+".mjstudios.tk/";

bo Ty tak sobie sam zrobiłeś takie przekierowanie (i bardzo dobrze).

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:

[code]function changeLanguage(language) { document.cookie=‘JezykSerwisu=’+language; return true; }

Dziękuję :wink: Nie znam się na cookies i bardzo dziękuję za pomoc :wink:

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…

Pozdrawiam,

Hookz

Poprawiłem i już nie wyświetla się “goły tekst”.

Jednak teraz przeglądarka nie interpretuje tego kodu- zamiast zapisać mój wybór (pl) i przekierowywać tam stronę główną, nadal ją pokazuje…

Dodałem też CDATA’ę, ale to nic nie daje…

Znalazłem jeszcze ważny błąd w kodzie, zamiast:

windows.onload=function()

powinno być

window.onload=function()

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”.

Dziękuję :wink:

Czyli mam zrobić cos podobnego, tylko, że na podstronie?

EDIT:

Kiedy dodałem ten kod do podstrony, to strona robots.mjstudios.tk/pl “dziczeje” i ciągle się odświeża…:frowning:

EDIT2:

Strona już się ciągle nie odświeża, ale automatycznie zmienia język z polskiego na angielski i odwrotnie…

  1. cieszę się, że zadziałało.

  2. 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. :stuck_out_tongue: (ale tutaj nie warto tego wklejać, bo zaciemni tylko treść).

EDIT: A możesz wywalić te wpisy z CDATA (początkowy i końcowy)?

Tylko w sumie na co komu mój Tracking Code do Google Analytics? :stuck_out_tongue:

Jak to “wywalić” z CDATA?

W sensie usunąć znacznik CDATA, czy co zrobić…?

No tak, usuń te wiersze:

//<br />
<br />
//

Jeszcze jedno pytanko- jak ustawić ciasteczno na coś w stylu “non expire”?

Bo po wyjściu (zakończeniu sesji) ustawienia z ciasteczka usuwają się i trzeba wybierać od nowa…

Ale wtedy przydałaby się ta możliwość zmiany języka domyślnego…:wink:

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:

  1. Ustalamy jakąś odległą datę i wpisujemy ją “ręcznie” jako zwykły tekst (ale w odpowiednim formacie daty JS!)

  2. 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;

}

Pablo,

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ć.