Vanessa: Sprachdatei, Variablen auf isset überrüfen, nachträglich ohne in den Code gross einzugreifen

Ich habe ein kleine Problem.

Ich habe für jede Seite ein Sprachdatei hinterlegt die folgendermaßen eingebunden wird.

include 'language/'.$language.'/lang_seite.php';	

(in der Variable $language ist die jeweilige Sprache die ich anbiete) So sind also zum Beispiel für die Seite seite.php folgende Sprachdateien hinterlegt.


language/de/lang_seite.php
language/en/lang_seite.php
language/ru/lang_seite.php

in den Sprachdateien selber sind alle Variablen hinterlegt Beispiel:

$_lang['city'] ='Stadt';
$_lang['street'] ='Strasse';

auf der Seite selber werden sie dann so ausgegben:

echo '<label> '$_lang['city'].'</label>';

Bis hier her funktioniert alles gut. Doch im laufe der Jahre sind die Sprachdatei immer wieder erweitert worden. in den deutschen sind alle da, doch bei den weiteren Sprachen kann es sein, das die ein oder andere einmal fehlt. Jetzt kommt meine Idee. Wenn eine Sprachvariable fehlt, sollte automatisch die variable aus dem deutschen Verzeichnis eingeblendet werden.

Also

echo '<label> '$_lang['city'].'</label>';

Wenn nicht vorhanden, dann keine Fehlermeldung sondern automatisch die deutsche Variable. Ich könne jede Variable gegen

if(isset(...)) {}
else
{}

austauschen, aber das wäre eine Katastrophe, hat jemand vieleicht eine Idee wie ich diese, mein Problem komfortabel lösen kann?

  1. Tach!

    Wenn nicht vorhanden, dann keine Fehlermeldung sondern automatisch die deutsche Variable. Ich könne jede Variable gegen [...] austauschen, aber das wäre eine Katastrophe, hat jemand vieleicht eine Idee wie ich diese, mein Problem komfortabel lösen kann?

    Für wiederkehrende Operationen hat der Programmierergott die Funktionen erschaffen. Du könntest in deinem Fall die Variablenzugriffe durch einen Funktionsaufruf ersetzen und bist in der Funktion frei, beliebigen Code auszuführen.

    dedlfix.

  2. Hallo,

    Jetzt kommt meine Idee. Wenn eine Sprachvariable fehlt, sollte automatisch die variable aus dem deutschen Verzeichnis eingeblendet werden.

    Ich könne jede Variable gegen

    if(isset(...)) {}
    else
    {}
    

    austauschen, aber das wäre eine Katastrophe, hat jemand vieleicht eine Idee wie ich diese, mein Problem komfortabel lösen kann?

    den Vorschlag von dedlfix finde ich sehr elegant. Alternativ könnte ich noch vorschlagen, am Scriptanfang immer zwei includes zu notieren - erst für die deutsche Sprachdatei als Defaultbelegung, und dann für die eigentlich gewünschte. Dann werden alle Zuweisungen an $lang[] nochmal überschrieben - außer wenn sie in der spezifischen Sprachdatei fehlen.

    So long,
     Martin

    1. Tach!

      den Vorschlag von dedlfix finde ich sehr elegant.

      Das ist langfristig gesehen die bessere Lösung, weil man in der Funktion auch Fehlermeldungen ins Logfile schreiben kann, wenn ein Text fehlt.

      Alternativ könnte ich noch vorschlagen, am Scriptanfang immer zwei includes zu notieren - erst für die deutsche Sprachdatei als Defaultbelegung, und dann für die eigentlich gewünschte.

      Das hingegen ist die kurzfristig schnellere Variante, bei der so gut wie kein Änderungsaufwand entsteht.

      dedlfix.

  3. Hallo

    include 'language/'.$language.'/lang_seite.php';	
    

    Wie befüllst du die Variable $language?

    auf der Seite selber werden sie dann so ausgegben:

    echo '<label> '$_lang['city'].'</label>';
    

    Bitte nicht so. Auch wenn du glaubst, den Inhalt der Sprachdateien unter deiner Kontrolle zu haben, muss zum Sicherheitskonzept deiner Anwendung die kontextgerechte Maskierung der mit Code eingefügten Inhalte gehören.

    echo '<label> '. htmlspecialchars($_lang['city']) .'</label>';
    

    So wird ein Schuh draus.

    Bis hier her funktioniert alles gut. Doch im laufe der Jahre sind die Sprachdatei immer wieder erweitert worden. in den deutschen sind alle da, doch bei den weiteren Sprachen kann es sein, das die ein oder andere einmal fehlt. Jetzt kommt meine Idee. Wenn eine Sprachvariable fehlt, sollte automatisch die variable aus dem deutschen Verzeichnis eingeblendet werden.

    Ich habe das in einem kleinen Projekt so gelöst: Es wird immer eine Standardsprachdatei geladen. Das ist die, in der immer alle Textschnipsel vorhanden sind. Die liegen, wenn eingelesen, wie bei dir als PHP-Array vor. Wird vom Nutzer eine andere Sprache angefordert, wird die entsprechende Sprachdatei geladen und die in dieser Sprachdatei existierenden Array-Elemente überschreiben die aus der Standardsprachdatei. Jene Elemente, die in der als zweiter geladenen Datei nicht existieren, behalten so ihren Standardwert aus der ersten Sprachdatei.

    Tschö, Auge

    --
    Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
    Terry Pratchett, „Gevatter Tod“
    1. Hi,

      Ich habe das in einem kleinen Projekt so gelöst: Es wird immer eine Standardsprachdatei geladen. Das ist die, in der immer alle Textschnipsel vorhanden sind.

      hehe, zwei Dumme, ein Gedanke?

      Oder sagen wir lieber: Great minds think alike. ;-)

      Ciao,
       Martin

      1. Hallo

        hehe, zwei Dumme, ein Gedanke?

        Hehe, hab's gleich nach dem Absenden gesehen. Nur mal zur zeitlichen Einordnung, also, wie lange ich an meinem Posting herumgeprökelt habe. Als ich es zu schreiben begann, war noch nicht einmal dedlfix' Posting da.

        Oder sagen wir lieber: Great minds think alike. ;-)

        Hört sich zumindest hochtrabender an. :-)

        Tschö, Auge

        --
        Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
        Terry Pratchett, „Gevatter Tod“
        1. Hi,

          hehe, zwei Dumme, ein Gedanke?

          Hehe, hab's gleich nach dem Absenden gesehen. Nur mal zur zeitlichen Einordnung, also, wie lange ich an meinem Posting herumgeprökelt habe. Als ich es zu schreiben begann, war noch nicht einmal dedlfix' Posting da.

          ging mir genauso: Das war erst da, als ich zum ersten Mal die Vorschau bemüht habe. Daraufhin musste ich meinen Text nochmal etwas überarbeiten, weil ich seine Lösung eben doch für "sauberer" halte.

          Oder sagen wir lieber: Great minds think alike. ;-)

          Hört sich zumindest hochtrabender an. :-)

          Ich meine, das wäre sogar eine übliche englische Redensart, bin mir aber nicht sicher. Ich hab das mal so in einem Roman aufgeschnappt.

          Ciao,
           Martin

    2. @@Auge

      echo '<label> '. htmlspecialchars($_lang['city']) .'</label>';
      

      So wird ein Schuh draus.

      Ein Badelatschen.

      Ich halte es prinzipiell für besser, PHP in HTML zu schachteln, nicht andersrum.

      <label><?php echo htmlspecialchars($_lang['city']); ?></label>
      

      oder kurz

      <label><?= htmlspecialchars($_lang['city']) ?></label>
      

      LLAP 🖖

      --
      „Wir haben deinen numidischen Schreiber aufgegriffen, o Syndicus.“
      „Hat auf dem Forum herumgelungert …“
      (Wachen in Asterix 36: Der Papyrus des Cäsar)