Jörg Reinholz: Übersetzung für mehrere Sprachen

Beitrag lesen

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