Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][JavaScript]Zmiana języka w URLu
Forum PHP.pl > Forum > Przedszkole
ZaXaZ
Ostatni temat jaki przeczytałem to ten:
http://forum.php.pl/index.php?showtopic=143153
A kilka już przeszukałem (wraz z sub-tematami) jednak nie znalazłem nic co spełni mój problem (bądź za słabo JS umiem bo nadal jestem w nauce podstaw).

Chce zmieniać język strony zależnie od wybranego:
  1. <select onchange="changeLang();">
  2. <option value="en" selected="selected">English</option>
  3. <option value="pl">Polish (Polski)</option>


Jednak nie wiem jak zrobić funkcję JS która by pobierała obecny adres,
i jeśli niema lang to doda domyślny czyli ?lang=en.
A jeśli jest to zamieni na wybrany, proszę o wskazówki (zastosuję switch).
trueblue
Chcesz aby podczas nawigacji po stronie cały czas trzymać w URL język?
Może lepiej przechować w ciastku lub sesji.
ZaXaZ
Cytat(trueblue @ 6.09.2014, 18:14:06 ) *
Chcesz aby podczas nawigacji po stronie cały czas trzymać w URL język?
Może lepiej przechować w ciastku lub sesji.


Z jednej strony oczywiscie ciastka lepsze ale z drugiej jak ktoś komuś poda link to będzie musiał(a) sam(a) zmienić..

Ewentualnie ciastka dodam kiedyś jak już bym bardziej umiał js itp, ale bardzo ważne żeby był parametr lang w linku tak jak wyżej opisałem.
trueblue
Rozumiem.

Ale w przypadku bez wersji językowej w URL możesz po prostu ustawiać język domyślny strony.
Ewentualnie rozwiązaniem jest badanie $_SERVER['HTTP_ACCEPT_LANGUAGE'] i wedle tego ustawianie języka, kiedy nie jest jawnie podany.
pedro84
Cytat(trueblue @ 6.09.2014, 18:14:06 ) *
Chcesz aby podczas nawigacji po stronie cały czas trzymać w URL język?

Ma to niebanalne znaczenie z punktu widzenia SEO i użyteczności.


Cytat(trueblue @ 6.09.2014, 18:30:15 ) *
Ale w przypadku bez wersji językowej w URL możesz po prostu ustawiać język domyślny strony.
Ewentualnie rozwiązaniem jest badanie $_SERVER['HTTP_ACCEPT_LANGUAGE'] i wedle tego ustawianie języka, kiedy nie jest jawnie podany.

Lepiej język domyślny niech będzie w URLu. Co w przypadku robotów indeksujących? Ma zaindeksować tylko jeden język?

@OP Ale dlaczego Ty sobie tego nie sprawdzisz po stronie backendu? To jest jakiś CMS czy coś własnego?
trueblue
Cytat(pedro84 @ 6.09.2014, 18:43:13 ) *
Ma to niebanalne znaczenie z punktu widzenia SEO i użyteczności.

Tak, ale nie w takiej postaci, tzn. parametru w URL.
Zalecane przez Google sposoby to: trzymanie podstron pod osobnymi domenami narodowymi, subdomeny językowe, albo trzymanie w ścieżce URL, np.: domena.pl/en/

No i rzecz ważna, meta language.

Cytat(pedro84 @ 6.09.2014, 18:43:13 ) *
Lepiej język domyślny niech będzie w URLu. Co w przypadku robotów indeksujących? Ma zaindeksować tylko jeden język?

I tak gdzieś na stronie, jak domniemam, będzie przełącznik języków.
pedro84
Cytat(trueblue @ 6.09.2014, 19:04:28 ) *
Tak, ale nie w takiej postaci, tzn. parametru w URL.
Zalecane przez Google sposoby to: trzymanie podstron pod osobnymi domenami narodowymi, subdomeny językowe, albo trzymanie w ścieżce URL, np.: domena.pl/en/

Te /en/ z URL to jest właśnie jego parametr i mnie właśnie o to chodziło. Ja nie mówiłem o $_GET (bo z tym Ci się to zapewne pomyliło).

Cytat(trueblue @ 6.09.2014, 19:04:28 ) *
I tak gdzieś na stronie, jak domniemam, będzie przełącznik języków.

A jak nie? I w dodatku zapomni ustawić link:
  1. <link rel="alternate" hreflang="en-US" href="http://domain.com/" />
?
Jeśli różne wersje językowa mają korzystać z tej samej domeny, to zdecydowanie lepiej jest trzymać język w URLu niż jakieś dziwne wynalazki jakie zaproponowałeś wink.gif
trueblue
Cytat(pedro84 @ 6.09.2014, 19:17:56 ) *
Te /en/ z URL to jest właśnie jego parametr i mnie właśnie o to chodziło. Ja nie mówiłem o $_GET (bo z tym Ci się to zapewne pomyliło).

Nie pomyliło mi się. Przykład kolegi ZaXaZ'a dotyczy parametru w query string. (Gwoli ścisłości /en/ również może się znaleźć w $_GET)

Cytat(pedro84 @ 6.09.2014, 19:17:56 ) *
A jak nie?

Nie za bardzo wyobrażam sobie taką sytuację.
Jakby wtedy wyglądała budowa wewnętrznych linków, zawsze z domyślnym językiem w URL? Jak się wtedy dostać na stronę z innym językiem, tylko z linków propagowanych poza stroną?

Cytat(pedro84 @ 6.09.2014, 19:17:56 ) *
Jeśli różne wersje językowa mają korzystać z tej samej domeny, to zdecydowanie lepiej jest trzymać język w URLu niż jakieś dziwne wynalazki jakie zaproponowałeś wink.gif

Proponuję Ci się zapoznać z wytycznymi Google:
https://support.google.com/webmasters/answer/182192?hl=en#1
pedro84


Cytat(trueblue @ 6.09.2014, 19:29:40 ) *
Nie pomyliło mi się. Przykład kolegi ZaXaZ'a dotyczy parametru w query string. (Gwoli ścisłości /en/ również może się znaleźć w $_GET)

Tylko, że ja nie o tym mówiłem (a przy okazji źle się wyraziłem). Nie parametr, tylko katalog w URLu, segment, part, whatever smile.gif

Cytat(trueblue @ 6.09.2014, 19:29:40 ) *
Nie za bardzo wyobrażam sobie taką sytuację.
Jakby wtedy wyglądała budowa wewnętrznych linków, zawsze z domyślnym językiem w URL? Jak się wtedy dostać na stronę z innym językiem, tylko z linków propagowanych poza stroną?

Nie wiem, to w ogóle jest abstrakcja.

Cytat(trueblue @ 6.09.2014, 19:29:40 ) *
Proponuję Ci się zapoznać z wytycznymi Google:
https://support.google.com/webmasters/answer/182192?hl=en#1

Ja to doskonale znam, a wszystko zaczęło się od Twojej głupotki:
Cytat(trueblue @ 6.09.2014, 18:14:06 ) *
Chcesz aby podczas nawigacji po stronie cały czas trzymać w URL język?
Może lepiej przechować w ciastku lub sesji.

A zastosowanie /en/ jest o wiele lepsze niż te Twoje sesne niż ciastko w przypadku tej samej domeny (jeśli nie chce z jakichś powodów subdomen osobnych - ja np. osobiście wolę trzymać język jako katalog w url: /en/, /it/, /de/).
Janusz1200
Może nie na temat, a może się przyda: ja obsługuję 2 języki tak, że mam zarejestrowane 2 domeny, aplikacja przygotowuje treść w zależności od SERVER_NAME korzystając z translatora Zend.

Czasem nazwa domeny nie jest uniwersalna i może Niemcy nie chcą mieć /cars/de?
pedro84
Cytat(Janusz1200 @ 6.09.2014, 20:05:58 ) *
Czasem nazwa domeny nie jest uniwersalna i może Niemcy nie chcą mieć /cars/de?

Dwie domeny są ok, ale czasem problematyczne. Ja w ogóle jestem za tłumaczeniem slugów, czyli nie:
Kod
/en/cars
/pl/cars

tylko
Kod
/en/cars
/pl/samochody
trueblue
Cytat(pedro84 @ 6.09.2014, 20:03:43 ) *
a wszystko zaczęło się od Twojej głupotki

Przyznam, że chodziło mi o sytuację, kiedy wchodzimy na stronę "bez języka", choć w tym przypadku i tak nie ma sensu ustawienie domyślnego w ciastku.
Ale jakby nie było, ta moja wypowiedź nie jest zbyt mądra.
pedro84
Cytat(trueblue @ 6.09.2014, 20:21:06 ) *
Ale jakby nie było, ta moja wypowiedź nie jest zbyt mądra.

Tak jak moje użycie parametr zamiast katalog, part smile.gif
Janusz1200
@Pedro, co to jest slug?

Ja mam tak (aplikację piszę po, powiedzmy smile.gif, angielsku, a klient widzi ją po hiszpańsku albo portugalsku, zależnie od domeny:

<h2><?php echo $this->translate('Our recommendation for your project');?></h2>

Z tym /cars/de, to chodziło mi o adres strony, żeby Niemiec nie pisał:

http://best_cars/de

tylko

http://wunder_autos/

a Anglik:

http://best_cars/

Nie widzę żadnych problemów z 2 domenami [google chyba też nie, ale mogę się mylić], daj nam tylko wielu klientów...
pedro84
Cytat(Janusz1200 @ 6.09.2014, 20:30:26 ) *
@Pedro, co to jest slug?

http://en.wikipedia.org/wiki/Semantic_URL

Cytat(Janusz1200 @ 6.09.2014, 20:30:26 ) *
Ja mam tak (aplikację piszę po, powiedzmy smile.gif, angielsku, a klient widzi ją po hiszpańsku albo portugalsku, zależnie od domeny:

<h2><?php echo $this->translate('Our recommendation for your project');?></h2>

Z tym /cars/de, to chodziło mi o adres strony, żeby Niemiec nie pisał:

http://best_cars/de

tylko

http://wunder_autos/

a Anglik:

http://best_cars/

Nie widzę żadnych problemów z 2 domenami [google chyba też nie, ale mogę się mylić], daj nam tylko wielu klientów...

Dwie domeny mogą być problematyczne w kwestii orgainzacji (domeny, certifikaty - wszystko jest zdublowane) - tylko tyle.
Janusz1200
@Pedro, thx
ZaXaZ
Cytat(pedro84)
Ale dlaczego Ty sobie tego nie sprawdzisz po stronie backendu? To jest jakiś CMS czy coś własnego?

Będzie ale chce zredukować obciążenie servera jak tylko się da.
Czyli co sie da w JS reszta jak sie nieda lub niema ktos js to w <noscript>
Strona da się krótko opisać:
(60% strony... Według mnie) to bedzie strona główna zawierająca newsy z gry dla której chce napisać stronę fanowską, reszta to będzie opis itemów, EQ i potworów i jakieś urozmaicenie typu shotbox. Bardzo bym chciał rankingi graczy ale chyba ciężko o API a jak ktoś taki jak ja ma konkurować z kilkoma stronami fanowskimi i to z różnych krajów to (...)
nic więcej mi się nie chce. Ani nie mam pomysłu, i nie wiem jak daleko podołam, to co wymieniłem dam radę.
Ps. Fajnie jakby ktoś miał pomysł do tej strony bazując na wymienionych informacjach czego być może brak wink.gif.

Ważne: strona będzie na darmowym serverze, nawet jakby było mnie stać (a mnie nie stać) to nie ma co chyba inwestować w projekty na których tylko się wypromuje a nic nie zarobie poza cennym doświadczeniem przy tworzeniu strony.

Cytat(trueblue)
Zalecane przez Google sposoby to: trzymanie podstron pod osobnymi domenami narodowymi, subdomeny językowe, albo trzymanie w ścieżce URL, np.: domena.pl/en/

No i rzecz ważna, meta language.
(...)
I tak gdzieś na stronie, jak domniemam, będzie przełącznik języków.

Strona będzie domyślnie odpalana w języku angielskim tak samo z meta-tagiem,
choć ja piszę w html 5 i robię poprostu '<html lang="en">' mam nadzieję że to znaczy to samo co tagi meta.

Na stronie będzie możliwość zmiany sposobem tym co pokazałem na samej górze, przez co otworzyłem ten temat.
Nie mam kompletnie "takiego większego" doswiadczenia w stronach internetowych więc nie wiem co zrobić ale to co opisałem chyba dobre będzie.

A folderów nie będzie raczej tak jak "google zaleca" będzie poprostu index.php i katalog /lang/ zawierający odpowiednie tłumaczenia do najczęściej używanych rzeczy typu "menu", "kontakt" itd większe teksty będą w bazie.

-----
Konutnuując pytanie, kod JS do zmiany języka z strony którą się inspiruje wygląda tak:
[JAVASCRIPT] pobierz, plaintext
  1. function ChangeLanguage()
  2. {
  3. var m_Lan = document.getElementById('Language').value;
  4. var params = {};
  5. try {
  6. params = GetParameter();
  7. }catch(Exception){
  8. params = {};
  9. }
  10. var paramstring = "";
  11. for(var key in params)
  12. {
  13. if(key != "section" && key != "lan" && key != "markup") paramstring += "&"+key+"="+params[key];
  14. }
  15. window.location = g_WebRoot + '?section=' + g_Section + '&lan=' + m_Lan + '&markup=' + g_Markup + paramstring;
  16. }
[JAVASCRIPT] pobierz, plaintext

I html
  1. <select id="Language" onchange="ChangeLanguage();" >
  2. <option class="SelectItem" value="en" selected="selected" >English</option>
  3. <option class="SelectItem" value="de" >Deutsch</option>
  4. <option class="SelectItem" value="ms" >Melayu</option>
  5. <option class="SelectItem" value="pt" >Portugu?s</option>

Tylko jeszcze nie doszedlem w nauce do window.location ani petli z jakims "in" wiec pytam sie forum bo moze da sie jakos banalniej po stronie przegladarki.
Pomijam już te wyjątki try-catch, w tym kodzie wogole ich nie rozumiem ale to pewnie kwestia kilku rodzialow kursu do przodu.
trueblue
W kodzie brakuje jeszcze funkcji GetParameter.

Jeśli potrzebujesz wyłuskać i zmienić jeden parametr, to chyba tak będzie prościej:
  1. <select id="Language" onchange="ChangeLanguage(this.value);" >
  2. <option class="SelectItem" value="en" selected="selected" >English</option>
  3. <option class="SelectItem" value="de" >Deutsch</option>
  4. <option class="SelectItem" value="ms" >Melayu</option>
  5. <option class="SelectItem" value="pt" >Portugu?s</option>
  6. function ChangeLanguage(lang){
  7. var url=window.location.href;
  8. var regex=new RegExp("[\\?&]lang=([^&#]*)");
  9. var results=regex.exec(url);
  10. if(results!=null){
  11. var url=url.split('lang='+results[1])
  12. window.location = url[0]+'lang='+lang+url[1];
  13. }
  14. else
  15. window.location = url+(url.indexOf('?')>-1?'&':'?')+'lang='+lang;
  16. }

Nie jest to doskonałe rozwiązanie, bo np. przy braku lang w URL nie uwzględnia możliwości istnienia hashu (#), ale wydaje mi się, że w Twoim przypadku sprawdzi się bez problemów.
ZaXaZ
Cytat(trueblue @ 7.09.2014, 08:51:19 ) *
W kodzie brakuje jeszcze funkcji GetParameter.

Jeśli potrzebujesz wyłuskać i zmienić jeden parametr, to chyba tak będzie prościej:
  1. <select id="Language" onchange="ChangeLanguage(this.value);" >
  2. <option class="SelectItem" value="en" selected="selected" >English</option>
  3. <option class="SelectItem" value="de" >Deutsch</option>
  4. <option class="SelectItem" value="ms" >Melayu</option>
  5. <option class="SelectItem" value="pt" >Portugu?s</option>
  6. function ChangeLanguage(lang){
  7. var url=window.location.href;
  8. var regex=new RegExp("[\\?&]lang=([^&#]*)");
  9. var results=regex.exec(url);
  10. if(results!=null){
  11. var url=url.split('lang='+results[1])
  12. window.location = url[0]+'lang='+lang+url[1];
  13. }
  14. else
  15. window.location = url+(url.indexOf('?')>-1?'&':'?')+'lang='+lang;
  16. }

Nie jest to doskonałe rozwiązanie, bo np. przy braku lang w URL nie uwzględnia możliwości istnienia hashu (#), ale wydaje mi się, że w Twoim przypadku sprawdzi się bez problemów.

Dzięki, działa.
A jak zrobić żeby zmieniło jeszcze docelowy <option> na wybrany sam pokominuje jako praktyki.
Poducze się jeszcze do końca JS i spróbuje na podstawie twojego + tamtego kodu napisać jedna funkcje,
Co bym przyokazji obalił problem z #.

a tamta funkcja wyglada tak:
[JAVASCRIPT] pobierz, plaintext
  1. function GetParameter()
  2. {
  3. var address = window.location+"";
  4. address = address.split("?");
  5. var parameter = address[1].split("&");
  6.  
  7. var l_param = {};
  8. for(i=0; i<parameter.length; i++)
  9. {
  10. parasplit = parameter[i].split("=");
  11. l_param[parasplit[0]] = parasplit[1];
  12. }
  13.  
  14. return l_param;
  15. }
[JAVASCRIPT] pobierz, plaintext


A jak można przechować ?lang=xx lub &lang=xx przechodząc pod inny odnośnik na naszej stronie?
trueblue
Powinieneś to robić po stronie PHP, tzn. generować odpowiednie linki uwzględniając zawartość $_GET['lang'] lub jej brak.
Zresztą podobnie można postąpić z wybranym językiem w liście (wdrukować "selected" na podstawie powyższej zmiennej).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.