Elérhető nyelv kiválasztó

A többnyelvű honlapokon szinte mindig van egy ilyen kis zászlócskás nyelvválasztó az oldalon. Ha grafikailag rendben is vannak, egy probléma gyakori: nem elérhetőek.. Úgyértem: vagy a képeknek nincs alt attribútuma (nesze neked Lynx és társai), vagy pedig mivel csak képek vannak egymás mellé pakolva a kódban, a szemantika kifogásolható. készítettem egy megoldást, amivel szerintem ez elég jól kiküszöbölhető.

Na lássuk:

Először is oldjuk meg az egészet úgy, mintha egy normális select-et készítenénk:

1
2
3
4
5
6
7
8
<form id="SelectLanguage" name="SelectLanguage" action="index.php" method="post">
<select id="language" name="language">
<option value="hu" xml:lang="hu-hu" selected="selected">Magyar</option>
<option value="en" xml:lang="en-uk">English</option>
<option value="de" xml:lang="de-de">Deutsch</option>
</select>
<input type="submit" id="submit" name="submit" xml:lang="en-uk" value="Change language"/>
</form>

Elemezzük csak egy kicsit a kódot: a SelectLanguage nevű formot használjuk terveink megvalósítására, amely postolni fogyja magát az index.php-nak. A lényeg a language id-jü select. Minden egyes option értéke az adott nyelv kódja, bár még másra is fogjuk használni. Az xml:lang-nál megadtam a nyelvet, hogy a felolvasó lehetőleg jól olvassa fel.
Most egy kis css, hogy js nélkül is kinézzen valahogy:

1
2
3
4
5
form#SelectLanguage {
        margin: 0;
	padding: 0;
	display: inline;
}

Ezzel el is intéztük a formunkat. Jöhet az érdekesebb rész, persze hogy javascriptben. Kezdjük egy segédfüggvénnyel, amivel eseménykezelőt fogunk majd készíteni:

1
2
3
4
5
6
7
8
9
10
11
function addEventHandler(obj, eventType, handler) {
  if (obj.addEventListener) {
    obj.addEventListener(eventType, handler, true);
    return true;
  } else if (obj.attachEvent) {
    var r = obj.attachEvent("on"+eventType, handler);
    return r;
  } else {
    return false;
  }
}

A képekből álló választóhoz nyilván kell pár zászlócska. Ezeket Google-lal találtam és a tárhelyemre felraktam:

  • http://kris7topherx.extra.hu/accessiblelangsel/hu.gif
  • http://kris7topherx.extra.hu/accessiblelangsel/en.gif
  • http://kris7topherx.extra.hu/accessiblelangsel/de.gif

Azt a megoldást választottam, hogy JS-sel generálom le a képeket, szigorúan DOM-mal:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function SelectLanguageInit() {
  form = document.getElementById("SelectLanguage");
  // form elrejtése
  form.language.style.display = "none";
  form.submit.style.display = "none";
  // egy tároló elem
  container = document.createElement("SPAN");
  form.appendChild(container);
  for (i = 0; i <= form.language.options.length - 1; i++) {
    // új kép
		img = document.createElement("IMG");
		img.src = form.language.options[i].value + ".gif";
		img.title = form.language.options[i].innerHTML;
		img.alt = form.language.options[i].innerHTML;
		if (form.language.options[i].selected) {
		  // ha kiválasztott, jelöljük
			img.className = "current";
    } else {
		  // ha nem, kattinthatóvá tesszük
			addEventHandler(img, "click", SelectLanguageClick);
    }
		container.appendChild(img);
  }
}

A kattintás kezelő pedig így néz ki:

1
2
3
4
5
6
7
8
9
10
11
12
function SelectLanguageClick() {
  form = document.getElementById("SelectLanguage");
	// megkeressük, hogy melyik
	for (i = 0; i <= form.language.options.length - 1; i++) {
		if (this.src.indexOf(form.language.options[i].value + ".gif") > -1) {
		  // és mehet az űrlap
			form.language.selectedIndex = i;
		  form.submit.click();
		  break;
    }
  }
}

Formázzuk meg egy kicsit CSS-szel is. Nem fűznék hozzá sok magyarázatot, azthiszem hogy érthető:

1
2
3
4
5
6
7
8
9
10
11
12
13
form#selectLanguage img {
  padding: 0 2px 0 2px;
  cursor: pointer;
}
 
form#selectLanguage img:hover {
  background-color: #ddf;
}
 
form#selectLanguage img.current {
  background-color: #ccc;
  cursor: default;
}

Természetesen az Internet Explorer itt sem válik be. A gombokra kattintást nem érzékeli, mert az eseménykezelőt appendChild-del beszúrt objektumokra DOM-mal nem fogadja el. Ahhoz, hogy működjön, még két plusz függvény is kell. Nem szép, de hatékony:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function SelectLanguageInitIE() {
  form = document.getElementById("SelectLanguage");
  form.language.style.display = "none";
  form.submit.style.display = "none";
  container = document.createElement("SPAN");
  form.appendChild(container);
  for (i = 0; i <= form.language.options.length - 1; i++) {
    img = "<img src=\"";
    img += form.language.options[i].value + ".gif";
    img += "\" alt=\"";
    img += form.language.options[i].innerHTML;
		if (form.language.options[i].selected) {
		  img += "\" class=\"current\"";
		} else {
		  img += "\" onClick=\"SelectLanguageClickIE(" + i + ")\"";
    }
		img += " />";
		container.innerHTML += img; 
		img = document.createElement("IMG");
  }
}
 
function SelectLanguageClickIE(i) {
  form = document.getElementById("SelectLanguage");
  form.language.selectedIndex = i;
  form.submit.click();
}

Most már csak Firefox-szal az egyik, IE-vel a másik megoldást kell megetetnünk:

1
2
if (document.all) { addEventHandler(window, "load", SelectLanguageInitIE); }
else { addEventHandler(window, "load", SelectLanguageInit); }

És violá! Elméletileg még működnie is kéne. Ha ki akarod próbálni élesben, feldobtam a tárhelyemre ide, a kódot meg csatoltam a cikkhez.

Remélem élveztétek ez a jó hosszú tutort :)

1 hozzászólás

  1. őő.. bocsi de gyenge vagyok a programozásban :/ megkérdezhetném hogy ez miből veszi majd ki a nyelvfájlokat??

HOZZÁSZÓLOK A CIKKHEZ

Kérjük, írja be véleményét!
írja be ide nevét