Vanessa: arry vergleichen und fehlende Werte anzeigen

Ich hatte ja das Problem mit dem einbinden von Sprachdateien. Ich habe mich für die Lösung

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

entschieden, wo ich erst die deutsche dann die weitere Sprachdatei über die andere lege. Klappt perfekt.

Aber nun will ich die fehlenden Sprachvariablen mir anzeigen lassen.

wenn in der deutschen (MASTER)

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

steht und in der Englischen

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

und wie hier z.B. die $_lang['county'] fehlt.

sollte mir das Ergebnis dann $_lang['county']

anzeigen.

$result = array_diff($de, $en);

echo'<pre>';
print_r($result);
echo'</pre>';

Ich glaube mein Ansatz ist nicht richtig, weil ich muss irgendwie nur den ersten Bereich vergleichen, nicht den zweiten. Praktisch

$_lang['city'] = $_lang['city']

$_lang['county'] = FEHLT

Vieleicht hat ja wieder wer so einen SUPER TIPP,

Danke jedenfalls für eure Mühe und Hilfe

Vanessa

  1. Tach!

    $result = array_diff($de, $en);
    

    Ich glaube mein Ansatz ist nicht richtig, weil ich muss irgendwie nur den ersten Bereich vergleichen, nicht den zweiten.

    Du möchtest, genauer gesagt, die Keys vergleichen. Die Werte sind ja sowieso meist unterschiedlich und nicht als Vergleichskriterium geeignet.

    dedlfix.

    1. PERFEKT, es funktioniert.

      $result = array_diff_key($de, $en);
      

      kann ich auch die doppelten KEYS irgendwie ermitteln

      1. Tach!

        kann ich auch die doppelten KEYS irgendwie ermitteln

        Doppelte Keys, in dem Sinne dass sie in beiden Arrays vorhanden sind? Das nennt sich auf Englisch Intersection. Funktionen mit ähnlichem Namen findest du bei den Array-Funktionen im PHP-Handbuch.

        dedlfix.

        1. Ja, ichh ab sowas schon gefunden, aber das wirkt sich immer auf den gesamten Inhalt aus, nicht nur auf die KEYs

          array_intersect_key($de, $en));
          

          es sollen nur die doppeltes Key angezeigt werden

          1. Tach!

            Ja, ichh ab sowas schon gefunden, aber das wirkt sich immer auf den gesamten Inhalt aus, nicht nur auf die KEYs

            array_intersect_key($de, $en));

            es sollen nur die doppeltes Key angezeigt werden

            Die Funktion ist schon die richtige. Wenn du von dem Ergebnis nur die Keys willst, dann bietet sich beispielsweise die Funktion array_keys() an. Oder du iterierst über das Ergebnis, nimmst nur den Key und lässt den Wert unbeachtet.

            dedlfix.

  2. Moin!

    Du hast das ungünstig gelöst. Die "masterprache" brauchst Du gar nicht anlegen.

    function translate($s, $lang="deutsch", $errorIfNotFound='config') {
        # schneller Rückweg wenn deutsch
        if ('deutsch' == $lang) {
          return $s;
        }
    ### Konfiguration ####
        if (! defined ('translationsDir') {
           define ('translationsDir', '/var/www/lib/translations/');
        }
    
        if ('config' !== $errorIfNotFound) {
          define ('errorIfNotFound', $errorIfNotFound)
        } else {
          # Eine von diesen Reaktionen auf Fehler auswählen:
          define ('errorIfNotFound', false);
          #define ('errorIfNotFound', E_USER_ERROR);
          #define ('errorIfNotFound', E_USER_NOTICE);
       }
    ### / Konfiguration ####
    
        if (! is_file (translationsDir.$lang) {
            if ( false !== errorIfNotFound )  {
              trigger_error ('Die Datei ' . translationsDir.$lang . ' gibt es nicht!' ,errorIfNotFound);
            } else {
                return $s;
            }
        } elseif (! is_readable (translationsDir.$lang) {
            if ( false !== errorIfNotFound )  {
              trigger_error ('Die Datei ' . translationsDir.$lang . ' ist nicht lesbar (Rechte?)' ,errorIfNotFound);
            } else {
                return $s;
            }
        }
        require_once(translationsDir.$lang); # triggert immer einen Error
    
        # Ab hier existiert der Hash mit $_lang['string'] ='übersetzung'
    
        if (! isset ($_lang[$s]) {
           if ( false !== errorIfNotFound )  {
              trigger_error ('Die Übersetzung für "' . $s . '" ist in der Datei ' . translationsDir.$lang . ' nicht angelegt.' ,errorIfNotFound);
           } else {
                return $s;
           }
        } 
        return $_lang[$s];
    }
    

    /var/www/lib/translations/englisch existiere, sei lesbar und enthalte:

    <?php
    # ...
    $_lang['Stadt'] ='city'; 
    $_lang['Straße'] ='street';
    # ...
    ?>
    

    dann wird

    translate("Stadt", $lang="englisch")
    

    "city" zurückgeben.

    translate("Strasse", $lang="englisch", false)
    

    gibt immer "Strasse" zurück, weil zwar "Straße" aber nicht "Strasse" nicht existiert und im Fehlerfall kein Fehler getriggert werden soll.

    Ist errorIfNotFound als E_USER_ERROR konfiguriert, dann bricht das Programm ab, ist es als E_USER_NOTICE konfiguriert, dann bekommt man wie beim Beispiel mit false einfach keine Übersetzung sondern den nicht übersetzten deutschen String und dazu aber eine Notiz im Errror-Log.

    Jörg Reinholz

    1. Moin!

      So. Hier das Testskript ohne Syntaxfehler:

      <?php
      error_reporting(E_ALL);
      
      echo translate('Stadt', 'englisch'), '<br>';
      echo translate('Strasse', 'englisch'), '<br>';
      echo translate('Strasse', 'englisch', E_USER_NOTICE), '<br>';
      echo translate('Strasse', 'englisch', E_USER_ERROR), '<br>';
      
      
      function translate($s, $lang="deutsch", $errorIfNotFound='config') {
          # schneller Rückweg wenn deutsch
          if ('deutsch' == $lang) {
            return $s;
          }
      ### Konfiguration ####
          if (! defined ('translationsDir') ) {
             define ('translationsDir', '/var/www/lib/translations/');
          }
      
          if ('config' !== $errorIfNotFound) {
            define ('errorIfNotFound', $errorIfNotFound);
          } else {
            # Eine von diesen Reaktionen auf Fehler auswählen:
            define ('errorIfNotFound', false);
            #define ('errorIfNotFound', E_USER_ERROR);
            #define ('errorIfNotFound', E_USER_NOTICE);
         }
      ### / Konfiguration ####
      
          if (! is_file (translationsDir.$lang) ) {
              if ( false !== errorIfNotFound )  {
                trigger_error ('Die Datei ' . translationsDir.$lang . ' gibt es nicht!' ,errorIfNotFound);
              } else {
                  return $s;
              }
          } elseif (! is_readable (translationsDir.$lang) ) {
              if ( false !== errorIfNotFound )  {
                trigger_error ('Die Datei ' . translationsDir.$lang . ' ist nicht lesbar (Rechte?)' ,errorIfNotFound);
              } else {
                  return $s;
              }
          }
          require_once(translationsDir.$lang); # triggert immer einen Error
      
          # Ab hier existiert der Hash mit $_lang['string'] ='übersetzung'
      
          if (! isset ($_lang[$s]) ) {
             if ( false !== errorIfNotFound )  {
                trigger_error ('Die Übersetzung für "' . $s . '" ist in der Datei ' . translationsDir.$lang . ' nicht angelegt.' ,errorIfNotFound);
             } else {
                  return $s;
             }
          }
      
          if ('config' !== $errorIfNotFound) {
            define ('errorIfNotFound', $errorIfNotFound);
          } else {
            # Eine von diesen Reaktionen auf Fehler auswählen:
            define ('errorIfNotFound', false);
            #define ('errorIfNotFound', E_USER_ERROR);
            #define ('errorIfNotFound', E_USER_NOTICE);
         }
      ### / Konfiguration ####
      
          if (! is_file (translationsDir.$lang) ) {
              if ( false !== errorIfNotFound )  {
                trigger_error ('Die Datei ' . translationsDir.$lang . ' gibt es nicht!' ,errorIfNotFound);
              } else {
                  return $s;
              }
          } elseif (! is_readable (translationsDir.$lang) ) {
              if ( false !== errorIfNotFound )  {
                trigger_error ('Die Datei ' . translationsDir.$lang . ' ist nicht lesbar (Rechte?)' ,errorIfNotFound);
              } else {
                  return $s;
              }
          }
          require_once(translationsDir.$lang); # triggert immer einen Error
      
          # Ab hier existiert der Hash mit $_lang['string'] ='übersetzung'
      
          if (! isset ($_lang[$s]) ) {
             if ( false !== errorIfNotFound )  {
                trigger_error ('Die Übersetzung für "' . $s . '" ist in der Datei ' . translationsDir.$lang . ' nicht angelegt.' ,errorIfNotFound);
             } else {
                  return $s;
             }
          }
          return $_lang[$s];
      }
      

      Jörg Reinholz

      1. Moin!

        Mist. Da war jetzt einiges durcheinender gekommen.

        <?php
        # Tests:
        #/*
        error_reporting(E_ALL);
        
        echo 'Stadt deutsch  ', translate('Stadt', 'deutsch'), '<br>';
        echo 'Stadt englisch ' ,translate('Stadt', 'englisch'), '<br>';
        echo 'Stadt französisch E_USER_NOTICE ' ,translate('Stadt', 'französisch', E_USER_NOTICE), '<br>';
        echo 'Strasse englisch ', translate('Strasse', 'englisch'), '<br>';
        echo 'Strasse englisch E_USER_NOTICE ', translate('Strasse', 'englisch', E_USER_NOTICE), '<br>';
        echo 'Strasse englisch E_USER_ERROR ', translate('Strasse', 'englisch', E_USER_ERROR), '<br>';
        echo 'WIRD NICHT MEHR AUSGEGEBEN...';
        #*/
        
        function translate($s, $lang="deutsch", $errorIfNotFound='config') {
            # schneller Rückweg wenn deutsch
            if ('deutsch' == $lang) {
              return $s;
            }
        ### Konfiguration ####
            if (! defined ('translationsDir') ) {
               define ('translationsDir', './');
            }
        
        
            if ('config' == $errorIfNotFound ) {
              # Eine von diesen Reaktionen auf Fehler auswählen:
              $errorIfNotFound=false;
              #$errorIfNotFound=E_USER_ERROR;
              #$errorIfNotFound=E_USER_NOTICE;
           }
        ### / Konfiguration ####
        
            if (! is_file (translationsDir.$lang) ) {
                if ( false !== $errorIfNotFound )  {
                  trigger_error ('Die Datei ' . translationsDir.$lang . ' gibt es nicht!' ,$errorIfNotFound);
                  return $s;
                }
            } elseif (! is_readable (translationsDir.$lang) ) {
                if ( false !== $errorIfNotFound )  {
                  trigger_error ('Die Datei ' . translationsDir.$lang . ' ist nicht lesbar (Rechte?)' ,$errorIfNotFound);
                  return $s;
                }
            }
            require_once(translationsDir.$lang); # triggert immer einen Error
        
            # Ab hier existiert der Hash mit $_lang['string'] ='übersetzung'
        
            if (! isset ($_lang[$s]) ) {
               if ( false !== $errorIfNotFound )  {
                  trigger_error ('Die Übersetzung für "' . $s . '" ist in der Datei ' . translationsDir.$lang . ' nicht angelegt.' ,$errorIfNotFound);
               }
               return $s;
            }
        
            return $_lang[$s];
        }
        

        Test

        Jörg Reinholz

        1. Moin!

          Nach dem ganzen Rumgemurkse habe ich mal eine einigermaßen performante Lösung auch für mehrere Sprachen beim selben Aufruf (für gemischte Dokumente) gebaut.

          <?php
          ## file: translate.php
          # Tests:
          #/*
          error_reporting(E_ALL);
          ini_set('display_errors', '1');
          echo 'Stadt deutsch :   ', translate('Stadt', 'deutsch'), '<hr>';
          echo 'Stadt englisch :   ' ,translate('Stadt', 'englisch'), '<hr>';
          echo 'Foo Bar englisch :   ' ,translate('Foo Bar', 'englisch'), '<hr>';
          echo 'Stadt französisch E_USER_NOTICE:   ' ,translate('Stadt', 'französisch', E_USER_NOTICE), '<hr>';
          echo 'Straße englisch :   ', translate('Straße', 'englisch'), '<hr>';
          echo 'Strasse englisch :   ', translate('Strasse', 'englisch'), '<hr>';
          echo 'Strasse englisch E_USER_NOTICE :  ', translate('Strasse', 'englisch', E_USER_NOTICE), '<hr>';
          echo 'Strasse englisch E_USER_ERROR :   ', translate('Strasse', 'englisch', E_USER_ERROR), '<hr>';
          echo 'WIRD NICHT MEHR AUSGEGEBEN...';
          #*/
          
          function translate($s, $lang="deutsch", $errorIfNotFound='config') {
              # schneller Rückweg wenn deutsch
              if ('deutsch' == $lang) {
                return $s;
              }
          ### Konfiguration ####
              if (! defined ('translationsDir') ) {
                 define ('translationsDir', './');
              }
          
          
              if ('config' == $errorIfNotFound ) {
                # Eine von diesen Reaktionen auf Fehler auswählen:
                $errorIfNotFound=false;
                #$errorIfNotFound=E_USER_ERROR;
                #$errorIfNotFound=E_USER_NOTICE;
             }
          ### / Konfiguration ####
          
              if (! is_file (translationsDir.$lang) ) {
                  if ( false !== $errorIfNotFound )  {
                    trigger_error ('Die Datei ' . translationsDir.$lang . ' gibt es nicht!' ,$errorIfNotFound);
                    return $s;
                  }
              } elseif (! is_readable (translationsDir.$lang) ) {
                  if ( false !== $errorIfNotFound )  {
                    trigger_error ('Die Datei ' . translationsDir.$lang . ' ist nicht lesbar (Rechte?)' ,$errorIfNotFound);
                    return $s;
                  }
              }
              static $arTranslations;
              if (! isset($arTranslations[$lang]) ) {
                  require_once (translationsDir.$lang);
                  $arTranslations[$lang]=$a;
                  unset($a); #frisst nur noch Speicher ...
              }
              # Ab hier existiert vielleicht der Hash mit $arTranslations[$lang][$s] = 'übersetzung'
          
              if (! isset ($arTranslations[$lang][$s]) ) {
                 if ( false !== $errorIfNotFound )  {
                    trigger_error ('Die Übersetzung für "' . $s . '" ist in der Datei ' . translationsDir.$lang . ' nicht angelegt.' ,$errorIfNotFound);
                 }
                 return $s;
              }
          
              return $arTranslations[$lang][$s];
          }
          
          <?php
          ## file: französisch 
          $a['Stadt']='ville';
          $a['Straße']='rue';
          
          <?php
          ## file: englisch
          $a['Stadt']='city';
          $a['Straße']='street';
          $a['Foo Bar']='foo bar baz';
          

          Und so sieht das aus

          Jörg Reinholz

          1. Aloha ;)

            Immer wenn ich solche Perlen von fertigen Codeschnipseln von dir sehe muss ich daran denken, dass ich, wenn ich mal Zeit habe, irgendwo einen Artikel oder sowas aufmachen wollte, in dem die gesammelt und zentral für die Nachwelt zementiert werden.

            Tja, leider schon länger nur ein ToDo.

            Grüße,

            RIDER

            --
            Camping_RIDER a.k.a. Riders Flame a.k.a. Janosch Zoller Erreichbar manchmal im Self-TS (ts.selfhtml.org) oder sonst - wenn online - auf dem eigenen TeamSpeak-Server (fritz.campingrider.de) oder unter: # Facebook # Twitter # Steam # YouTube # Self-Wiki # ch:? rl:| br:> n4:? ie:% mo:| va:) js:) de:> zu:) fl:( ss:| ls:[