$value) { if (is_array ($value)) { strip_magic_quotes_gpc ($var[$key]); } else { $var[$key] = stripslashes ($value); } } } strip_magic_quotes_gpc ($_REQUEST); } /** * Zgriff auf Übersezungen \n * Abfragen, ändern und hinzufügen von Übersetzungen zu Texten die vom cms angezeigt werden \n * \n * Alle vom cms ausgegebenen Texte zu Bedienelementen oder Beschreibungen sollen von dieser Klasse behandelt werden * * \author Claus Muus * \date 27/03/07 */ class I18n implements ArrayAccess { const STATUS_PRESET = 0; const STATUS_EDITED = 1; const STATUS_ERASED = 2; const STATUS_CHECKED = 4; const DEFAULT_LC = 'en'; private $section; ///< Aktive Sektion private $language; ///< Aktive Sprache private static $cache; ///< Cache für übersetzungen /** * Initialesiert das Objekt \n * * \param section Bereich des cms zu dem die Texte gehören * \param language Sprache in der die Übersetzungen ausgegeben werden sollen */ public function __construct ($section, $language="") { $this->section = Database::escape ($section); $this->language = Database::escape ($language); } /** * Prüft ob eine Übersetzung existiert \n * Bsp.: if ($i18n['text']) * * \param text Text der Übersetzung werden soll * * \return true wenn die Übersetzung existiert, sonst false */ public function offsetExists ($text) { $text = Database::escape ($text); $db = new Database (); if ($db->query ("SELECT id FROM {prefix}i18n WHERE language='{$this->language}' AND section='{$this->section}' AND name='$text' AND status!='".I18n::STATUS_ERASED."'")) { return true; } return false; } /** * Liest die Übersetzung zum text \n * Bsp.: $text = $i18n['text'] * * \param text Text der übersetzt werden soll * * \return Übersetzung des textes */ public function offsetGet ($text) { $language = Database::escape (($this->language) ? $this->language : self::lc ()); $db = new Database (); if ($text && $db->query ("SELECT value FROM {prefix}i18n WHERE language='$language' AND section='{$this->section}' AND name='$text' AND status!='".I18n::STATUS_ERASED."'")) { return $db['value']; } return ""; } /** * Setzt den Wert einer Übersetzung \n * Bsp.: $i18n['text'] = "text" * * \param text Text der übersetzt werden soll * \param value Übersetzung des Textes * * \return bei Erfolg die ID Übersetzung, sonst 0 */ public function offsetSet ($text, $value) { return $this->set ($text, $value); } /** * Löscht eine Übersetzung * Bsp.: unset ($i18n['text']) * * \param text Text der gelöscht werden soll */ public function offsetUnset ($text) { $this->del ($text); } /** * Verwendeter Länder Code * * \return Länder Code der eingestellt wurde */ public static function lc () { Base::session_init (); if (empty ($_SESSION['cms']['i18n']['lc'])) { $db = new Database ("", null, true); $lc = isset ($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? Database::escape (substr (strtolower ($_SERVER['HTTP_ACCEPT_LANGUAGE']), 0, 2)) : ""; if ($db->err || !$db->query ("SELECT id FROM {prefix}i18n WHERE language='$lc' AND status!='".I18n::STATUS_ERASED."' LIMIT 1")) { $lc = self::DEFAULT_LC; } Base::session_open (); $_SESSION['cms']['i18n']['lc'] = $lc; Base::session_close (); } return User::get ("language", $_SESSION['cms']['i18n']['lc']); } /** * Liefert die Übersetzung zu einem gegebenem Text * * \param section Bereich des cms zu dem die Texte gehören * \param text Text der übersetzt werden soll * \param defaultvalue Text der zurückgegeben werden soll wenn noch keine Übersezung existiert. Default ist der original Text * \param language Sprache in der die Übersetzungen ausgegeben werden sollen * * \return Übersetzung des textes */ public static function tr ($section, $text, $defaultvalue="", $language="") { if (!isset(self::$cache[$section])) { self::$cache[$section] = array(); $section = Database::escape ($section); $db = new Database ("", null, true); if (!$db->err && $db->query ("SELECT language, name, value FROM {prefix}i18n WHERE section='$section' AND status!='".I18n::STATUS_ERASED."'")) { foreach ($db as $row) { self::$cache[$section][$row['name']][$row['language']] = $row['value']; } } } $language = $language ? $language : self::lc (); $value = $defaultvalue ? $defaultvalue : $text; if (isset(self::$cache[$section])) { if (isset(self::$cache[$section][$text]) && $language == "none") { return $value; } else if (isset(self::$cache[$section][$text][$language])) { return self::$cache[$section][$text][$language]; } else if (isset(self::$cache[$section][$text][I18n::DEFAULT_LC])) { return self::$cache[$section][$text][I18n::DEFAULT_LC]; } } $i18n = new I18n ($section); $i18n->set ($text, $value); unset (self::$cache[$section]); return $value; } /** * Ersätzt alle in values enthaltenen Felder die in text vorkommen (in der Form [feldname]) durch deren Wert * * \param text Text der übersetzt werden soll * \param values Schlüssel-Wert Paare die ersetzt werden sollen * * \return Text mit ersätzten Platzhaltern */ public static function replace ($text, $values) { foreach ($values as $key => $value) { $text = preg_replace ("/\[$key\]/", $value, $text); } return $text; } /** * Liefert alle Parameter zum angegebenen Text. Ist text nicht angegeben so werden die Parameter zu allen Texten der aktuellen Section geliefert * * \param text Text der gesucht wird * \param alsoErased wenn true dann werden auch bereits gelöschte Texte geliefert * * \return Array mit Parameter zum Text. */ public function get ($text="", $alsoErased=false) { $text = Database::escape ($text); $alsoErased = Database::escape ($alsoErased); $language = Database::escape (($this->language) ? $this->language : self::lc ()); $db = new Database (); if ($db->query ("SELECT * FROM {prefix}i18n WHERE language='$language' AND section='{$this->section}' AND ('$text'='' OR name='$text') AND ('$alsoErased' OR status!='".I18n::STATUS_ERASED."')")) { if ($text) { return $db[0]; } else { return $db->result; } } return array (); } /** * Liefert alle Parameter zum angegebenen Text. Ist text nicht angegeben so werden die Parameter zu allen Texten der aktuellen Section geliefert. \n * Ist keine Übersetzung verfügbar, so werden die Parameter der Standartsprache genommen * * \param text Text der gesucht wird * * \return Array mit Parameter zum Text. */ public function getAll ($text="") { $text = Database::escape ($text); $language = Database::escape (($this->language) ? $this->language : self::lc ()); $db = new Database (); $values = array (); if ($db->query ("SELECT * FROM {prefix}i18n WHERE language='".I18n::DEFAULT_LC."' AND section='{$this->section}' AND ('$text'='' OR name='$text') AND status!='".I18n::STATUS_ERASED."' ORDER BY name")) { foreach ($db as $row) { $values[stripslashes ($row['name'])] = $row; } } if ($db->query ("SELECT * FROM {prefix}i18n WHERE language='$language' AND section='{$this->section}' AND ('$text'='' OR name='$text') AND status!='".I18n::STATUS_ERASED."' ORDER BY name")) { foreach ($db as $row) { $values[stripslashes ($row['name'])] = $row; } } if ($text && isset ($values[stripslashes ($text)])) { $values = $values[stripslashes ($text)]; } else { ksort ($values); } return $values; } /** * Liefert eine Liste aller verfügbaren Sectionen * * \return Ein Array mit allen verfügbaren Sectionen */ public static function getSections () { $db = new Database (); $sections = array (); if ($db->query ("SELECT DISTINCT section FROM {prefix}i18n WHERE status!='".I18n::STATUS_ERASED."' ORDER BY section")) { foreach ($db as $row) { $sections[] = $row['section']; } } return $sections; } /** * Liefert eine Liste aller verfügbaren Sprachen * * \return Ein Array mit allen verfügbaren Sprachen */ public static function getLanguages ($all=false) { $db = new Database (); $languages = array (); if ($all) { $languages[] = "none"; } if ($db->query ("SELECT DISTINCT language FROM {prefix}i18n WHERE status!='".I18n::STATUS_ERASED."' ORDER BY language")) { foreach ($db as $row) { $languages[] = $row['language']; } } return $languages; } /** * Setzt eine Übersetzung * * \param text Text der übersetzt werden soll * \param value Übersetzung des Textes * \param status Status der Übersetzungen (I18n::STATUS_PRESET, I18n::STATUS_EDITED, I18n::STATUS_CHECKED) * * \return bei Erfolg die ID der Übersetzung, sonst 0 */ public function set ($text, $value, $status=I18n::STATUS_PRESET) { $text = Database::escape ($text); $value = Database::escape ($value); $status = Base::is_int ($status) ? $status : I18n::STATUS_PRESET; $language = Database::escape ($this->language ? $this->language : I18n::DEFAULT_LC); $db = new Database (); if ($db->query ("SELECT id FROM {prefix}i18n WHERE language='$language' AND section='{$this->section}' AND name='$text'")) { $id = $db['id']; } else { $db->query ("INSERT INTO {prefix}i18n (language, section, name, value, status) VALUES ('$language', '{$this->section}', '$text', '', '".I18n::STATUS_ERASED."')"); $id = $db->rowid; } $history = new History ("i18n set"); $history->storeOld ($id, "i18n", false); $db->query ("UPDATE {prefix}i18n SET value='$value', status=".$status." WHERE id=$id"); $history->store ($id, "i18n", false); unset (self::$cache[$this->section]); return $id; } /** * Löscht eine Übersetzung * * \param text Text der gelöscht werden soll */ public function del ($text) { $text = Database::escape ($text); $db = new Database (); if ($db->query ("SELECT id FROM {prefix}i18n WHERE ('{$this->language}'='' OR language='{$this->language}') AND section='{$this->section}' AND name='$text'")) { foreach ($db->result as $row) { $id = $row['id']; $history = new History ("i18n delete"); $history->storeOld ($id, "i18n", false); $db->query ("UPDATE {prefix}i18n SET status='".I18n::STATUS_ERASED."' WHERE id=$id"); $history->store ($id, "i18n", false); unset (self::$cache[$this->section]); } } } } ?>