derossba: mehrfach verwendete Texte ändern

Hallo zusammen,
ich würde gerne die Sprache einer Webseite über javascript abändern ohne mehrere Seiten in verschiedenen Sprachen zu erstellen.
Bei Einzeltexten funktioniert das auch sehr gut, aber ich habe auch Texte die ich mehrmals verwende und es muss doch einen einfachen Weg geben um diese Texte alle auf einmal zu verändern.

Ich bin totaler Anfänger und habe folgendes versucht:

function changeLanguage() {
// get language from a dropdown
  var language_select = document.getElementById("v_selectLanguage");
  var language = parseInt(language_select[language_select.selectedIndex].value);

// get all <label> Elements with name "t_days"
  var label_t_days = document.getElementsByName("t_days");

// 0 = DE
  if (language == 0) {
    label_t_days[1].data = "Tage"
    label_t_days[2].innerHTML = "Tage"
    label_t_days[3].firstChild.nodeValue = "Tage"
    label_t_days[4].value = "Tage"
  }
// 1 = EN
  else if (language == 1) {
    label_t_days[1].data = "days"
    label_t_days[2].innerHTML = "days"
    label_t_days[3].firstChild.nodeValue = "days"
    label_t_days[4].value = "days"
  }
}
// keine der hier versuchten Methoden funktioniert

....

<label name="t_days">Tage</label>  //kommt mehrmals vor

Alles was ich oben versucht habe hat nicht funktioniert, was ist falsch und wie könnte es gehen?

Danke

  1. Hi,

    ich würde gerne die Sprache einer Webseite über javascript abändern ohne mehrere Seiten in verschiedenen Sprachen zu erstellen.

    warum das?

    Bei Einzeltexten funktioniert das auch sehr gut, aber ich habe auch Texte die ich mehrmals verwende und es muss doch einen einfachen Weg geben um diese Texte alle auf einmal zu verändern.

    Ja. Wenn du schon den Ansatz mit Javascript versuchst, freunde dich mal mit Schleifen an. Die klassische for-Schleife hilft dir wahrscheinlich am besten.

    // get all <label> Elements with name "t_days"
      var label_t_days = document.getElementsByName("t_days");

    Der Kommentar ist nicht ganz korrekt: Diese Anweisung liefert dir eine Collection (sozusagen ein Array) aller Elemente mit dem Namen "t_days", egal ob es label, input, h1 oder form sind. Die spannende Frage ist nur: Darf das label-Element überhaupt ein name-Attribut haben? Nein, darf es nicht (ich wollte die DTD verlinken, bekomme aber einen 403er, also nehme ich eine beliebige Sekundärquelle, die ich gefunden habe).

    Wozu sollte das label-Element auch ein name-Attribut brauchen, wenn man es bestimmungsgemäß nutzt?

    if (language == 0) {
        label_t_days[1].data = "Tage"
        label_t_days[2].innerHTML = "Tage"
        label_t_days[3].firstChild.nodeValue = "Tage"
        label_t_days[4].value = "Tage"
      }

    Dass Arrayindices normalerweise ab 0 zählen, ist dir nicht bewusst?
    Und was bezweckst du mit den unterschiedlichen Zugriffsmethoden?

    else if (language == 1)

    Eine switch/case-Struktur wäre vielleicht eleganter.

    // keine der hier versuchten Methoden funktioniert

    Das könnte im ersten Moment schon daran liegen, dass getElementsByName() ein leeres Array liefert, weil die Browser das nicht erlaubte name-Attribut im label-Element ignorieren.

    Alles was ich oben versucht habe hat nicht funktioniert, was ist falsch und wie könnte es gehen?

    Ich empfehle dir trotz aller Bemühungen, separate Seiten für jede Sprache zu erstellen. Dann machst du die Funktion auch nicht von Javascript abhängig.

    So long,
     Martin

    --
    Wenn man sieht, was der liebe Gott auf der Erde so alles zulässt, hat man das Gefühl, er experimentiert immer noch.
      (Sir Peter Ustinov, Charakterdarsteller, 2004 verstorben)
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hi,

      else if (language == 1)

      Eine switch/case-Struktur wäre vielleicht eleganter.

      Oder ein array  tage = { "Tage", "days", "jours", "dies" }
      mit Zugriff tage[language]

      Bei mehreren Ersetzungstexten dann gerne auch als verschachteltes Array:

      texte["tage"][language]

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
      1. @@MudGuard:

        nuqneH

        Eine switch/case-Struktur wäre vielleicht eleganter.

        Oder ein array […]

        ACK.

        […] tage = { "Tage", "days", "jours", "dies" }
        mit Zugriff tage[language]

        NAK. Von  den geschweiften statt eckiger Klammern mal abgesehen, ich würde die Sprache nicht als Zahl codieren, sondern die Kürzel verwenden. Also nicht Zugriff mit tage[0], sondern mit tage['de']. Dann darf später auch mal eine Sprache wieder wegfallen.

        Bei mehreren Ersetzungstexten dann gerne auch als verschachteltes Array:
        texte["tage"][language]

        Das Array ist wohl andersrum besser organisiert: texte[language]["tage"]. Dann hat ein Übersetzer alles in seiner Sprache zusammen und muss sich nicht durch alles durchwühlen. Es ist ja eher unwahrscheinlich, dass ein Übersetzer alle Sprachen bearbeitet.

        Qapla'

        --
        Gut sein ist edel. Andere lehren, gut zu sein, ist noch edler. Und einfacher.
        (Mark Twain)
  2. Alles was ich oben versucht habe hat nicht funktioniert, was ist falsch und wie könnte es gehen?

    Wenn es falsch ist, dann könnte in der Fehlerkonsole des Browsers der Fehler stehen. Hast du da mal nachgeschaut?

    Struppi.