0251 / 590 837 15
info@a-coding-project.de
;

Übersetzung der Datenbankeinträge (CMS)

Da ich jetzt wieder einen neuen Testserver hab kann es mit ContentLion weitergehen 😉 Und zwar haben wir unsere englische Übersetzung noch nicht vollständig umgesetzt. Der Hauptpunkt dabei sind die Datenbankeinträge. Hier könnte man theoretisch eine Lang-Spalte anlegen und sich immer die Einträge ziehen, die der aktuellen Sprache entsprechen.

Ich habe mich für einen anderen Weg entschieden. Wie ihr alle wisst, können wir in den Templates über das Lang-Tag auf Übersetzungen zurückgreifen. So zum Beispiel {LANG:PAGE}. Diese Tags möchte ich in der Datenbank verwenden und ich gehe noch weiter und übersetze diese bereits in der MySQL-Klasse!

Da wir die Zeilen als Objekte zurückgeben, müssen wir alle Eigenschaften durchlaugen und nach LANG-Tags durchsuchen. Diese Funktion habe ich in die Language-Klasse eingebaut, weil man somit später auch Objekte außerhalb der Datenbank leicht übersetzten kann. Hierfür musste auch ich meine PHP-Kenntnisse ein wenig erarbeiten. Vorab schonmal der neuen Funktion replaceLanguageTokensByObject der Klasse /system/classes/language.php:

    public function replaceLanguageTokensByObject($obj){
      foreach($obj as $key => $value) {
        preg_match_all("/{LANG:(.+)}/", $value, $tokens, PREG_SET_ORDER);
        foreach($tokens as $token){
          $translation = $GLOBALS['language']->getString($token[1]);
          $obj->{$key} = str_ireplace($token[0],$translation,$obj->{$key});
        }
      }
      return $obj;
    }

Zunächst einmal kann man die Eigenschaften mit einer ganz normalen foreach-Schleife durchlaufen. $key ist der Name der Eigenschaft und $value logischerweise der Wert. mit den geschweiften Klammern können wir die Eigenschaft über einen String abfragen. Der Rest ist bereits aus anderen Teilen der Language-Klasse bekannt.

In der Datenbankklasse habe ich diese Funktionalität in den derzeit benötigten Abfragen eingebaut. Später muss noch ReadField folgen. Außerdem muss es auch möglich sein, Ausnamen zu definieren, aber das machen wir erst, wenn es wirklich benötigt wird. Hier ist der neue Code der Klasse /system/classes/mysql.php:

<?PHP
  class MySQL extends DataBase{
    private $connection;

    public function Execute($sql){
      return $this->connection->query(str_replace("{'dbprefix'}",$this->Prefix,$sql));
    } 

    public function GetTables(){
      $res =  $this->connection->query("SHOW TABLES");
      while($row = $res->fetch_row()){
        $tables[] = $row[0];
      }
      sort($tables);
      return $tables;
    }

    public function GetColumns($table){
      $mysqlres = $this->Execute("SHOW COLUMNS FROM ".$table);
      while($row = $mysqlres->fetch_object()){
        $res[] = $row;
      }
      return $res;
    }

    public function ReadField($sql){
      $res = $this->Execute($sql);
      $row = $res->fetch_row();
      return $row[0];
    }

    public function ReadRow($sql){
      $res = $this->Execute($sql);
      return $GLOBALS['language']->replaceLanguageTokensByObject($res->fetch_object());
    }

    public function ReadRows($sql){
      $res = array();
      $mysqlRes = $this->Execute($sql);
      while($row = $mysqlRes->fetch_object()){
        $row = $GLOBALS['language']->replaceLanguageTokensByObject($row);
        $res[] = $row;
      }
      return $res;
    }

    public function InsertID(){
      return $this->connection->insert_id;
    }

    public function EscapeString($text){
      return $this->connection->real_escape_string($text);
    }

    public function Connect(){
      $this->connection = new mysqli($this->Host,$this->User,$this->Password,$this->Name);
    }

    public function Disconnect(){
      $this->connection->close();
    }
  }
?>

Ich bin dann heute die Komplette Datenbank durchgegangen und habe alles übersetzt. Bereits bestehende Übersetzungen mussten leicht verändert werden. Da so gut wie alle MySQL- und SQLite Datenbankeinträge geändert wurden, solltet ihr das komplette System neu installieren. Ich werde kein Update bereitstellen, aber ihr könnt alternativ auch die Einzelnen änderungen in Revision 62 und 63 abarbeiten.