Tim Tepaße: Variablen je nach Text auswählen -> Objekt

Beitrag lesen

Hallo,

Nun möchte ich je nachdem welches Element ich im eigentlichem Dokument angeklickt habe die Arrays danach auswählen.

Meine Variante wäre ein einfaches Objekt, da diese in JavaScript fast gleich der Datenstruktur Hash/Dictionary sind:

~~~javascript var states = {
    "en" : new Array("englische Inhalte"),
    "de" : new Array("deutsche Inhalte"),
    "es" : new Array("spanische Inhalte")
  };

  
Zugriff dann einfach mittels `states.en`{:.language-javascript} oder `states["en"]`{:.language-javascript}. Das ist im wesentlichen diesselbe Variante wie [Siechfreds](https://forum.selfhtml.org/?t=157658&m=1025768), nur dass hier nicht das globale Objekt window das Host-Objekt ist sondern ein definiertes Objekt.  
  
Du schriebst, dass Du pro Land zwei Arrays hast. Dasselbe Prinzip, nur einen Hauch verschachtelter:  
  
  ~~~javascript
var states = {  
    "en" : {  
      "int" : ["englisches", "externes", "Array"],  
      "ext" : ["englisches", "internes", "Array"]  
    },  
    "de" : {  
      "int" : [ ... ],  
      "ext" : [ ... ]  
    }  
  };

Zugriff dann über states.["en"].int oder states["en"]["int"]. Einfach, weil man auf Objekte auch in Array-Zugriffs-Notation zugreifen kann und somit Variablen zur Adressierung nutzen kann. Das Schema kannst Du auch zum dynamischen Aufbauen der Baumstruktur nutzen, wenn Du das Ganze über mehre Dateien verteilst:

states[langtag].int = new Array("blablabla");

Vorrausgesetzt, das ganze ist sequenziell notiert und die Variable states ist als Objekt initialisiert kannst Du somit das Aufbauen der Datenstruktur dynamisch erledigen lassen.

...

Ein Idee noch zum Zugriff: Im Web stolpert man immer wieder über definierte Language tags, die nicht nur "de" sind, sondern auch "de-DE" oder gar "de-DE-1910-x-tim". Jeder weitere Sub-Tag (getrennt durch "-") wird nach rechts gelesen immer spezifischer. Solltest Du mit Language tags mit Sub-Tags rechnen müssen und spezielle Arrays dafür haben, wäre es vielleicht eine gute Idee, erst nach den Arrays spezifischerer Language tags zu suchen und bei Nichtfinden dann nach etwas weniger spezifischeren Language tags zu suchen. Das könntest Du dann in einer Funktion kapseln, ungefähr so, wie in diesem nur halbwegs getestetem Code:

~~~javascript function language (tag) {

/* Die Arrays hier mal in der Funktion versteckt */
    var states = { "de" : ["...", "..."] };

/* Liefert für einen Tag "de-De" den weniger spezifischen Tag "de" zurück /
    function reduce_tag (tag) {
      var smaller = tag.slice(0, tag.lastIndexOf("-"));
      /
Sonderbehandlung für den private use subtag */
      if (smaller.substr(smaller.lastIndexOf("-") + 1) == "x") {
        return reduce_tag(smaller);
      };
      return smaller;
    };

/* Wenn vorhanden, sind wir glücklich. */
    if (states[tag]) {
      return states[tag];
    };

/* Ansonsten reduzieren wir bis zum ersten  */
    while (!states[tag] && tag != "") {
      tag = reduce_tag(tag);
    };

/* Egal, was rauskommt, irgendwann muss ein Ergebnis oder undefined
       zurück gegeben werden. */
    return states[tag];
  };

  
(Verbesserungsfähig, natürlich)  
  
  
Tim