Array.php

00001 <?php
00010 class Dsao_Translate_Adapter_Array extends Zend_Translate_Adapter_Array
00011 {
00015   protected $_localeList = null;
00016 
00024   protected function _lazyLoadTranslationData($idMessage, $locale)
00025   {
00026     // Falls Sprache nicht verfügbar
00027     if (!$this->isAvailable($locale))
00028     {
00029       // Auf eingestellte Sprache wechseln (die auf jeden Fall existiert, s.u.)
00030       $locale = $this->getLocale();
00031     }
00032 
00033     // Message-ID auseinander pfluecken
00034 
00035     // array, die ersten beiden Teile des Message-ID, die ggf. Aufschluss über
00036     // Modul und Controller geben sollen, deren Sprachdateien nachgeladen
00037     // werden müssen
00038     $arrayMessage = explode('_', $idMessage, 3);
00039 
00040     // Modul prüfen
00041 
00042     // Falls erster Teil übersetzt werden kann, ist die Sprachdatei des Moduls
00043     // bereits geladen und es bedarf keiner weiteren Untersuchungen
00044     if (!isset($this->_translate[$locale][$arrayMessage[0]]))
00045     {
00046       // string, Dateiname der Sprachdatei des Moduls
00047       $fileModule = BASE_DIR.'lang/'.$locale.'/'.$arrayMessage[0].'.php';
00048 
00049       // Versuchen, Datei einzubinden und bei Misserfolg abbrechen, da es
00050       // dann natürlich keinen Sinn macht, noch zu versuchen, die
00051       // Sprachdatei des Controllers zu laden
00052       if (!$this->_loadTranslationData($fileModule, $locale))
00053       {
00054         return false;
00055       }
00056       // Falls das gereicht hat, um die ID zu übersetzen, abbrechen
00057       else if (isset($this->_translate[$locale][$idMessage]))
00058       {
00059         return true;
00060       }
00061     }
00062 
00063     // Controller einbinden
00064 
00065     // Hier ergibt sich jetzt ein Problem, da wir nicht wirklich prüfen können,
00066     // ob die Sprachdatei des Controllers (sofern es überhaupt ein gültiger
00067     // Controller ist) schon eingebunden wurde.
00068     // Also einfach auf gut Glück versuchen, die beiden Dateien einzubinden
00069 
00070     // string, Dateinamen der Sprachdateien des Controllers (PHP/Template)
00071     $fileControllerPhp = BASE_DIR.'lang/'.$locale.'/php/'.$arrayMessage[0].
00072       '/'.$arrayMessage[1].'.php';
00073     $fileControllerTemplate = BASE_DIR.'lang/'.$locale.'/template/'.
00074     $arrayMessage[0].'/'.$arrayMessage[1].'.php';
00075 
00076 
00077     // Dateien einbinden
00078     $this->_loadTranslationData($fileControllerPhp, $locale);
00079     $this->_loadTranslationData($fileControllerTemplate, $locale);
00080 
00081 
00082     // Kann die ID nun übersetzt werden?
00083     return isset($this->_translate[$locale][$idMessage]);
00084   }
00085 
00098   protected function _loadTranslationData($data, $locale, array $options = array())
00099   {
00100     // Falls kein Array übergeben wurde, soll eine Datei geladen werden
00101     if (!is_array($data))
00102     {
00103         // Falls Datei vorhanden
00104         if (file_exists($data))
00105         {
00106             // Ausgabe verhindern und Datei einbinden, sofern sie nicht schon
00107             // eingebunden wurde
00108             ob_start();
00109             // Das ganze ist hier etwas unsauber und erklärungsbedürftig:
00110             // Wenn eine Datei übergeben wurde, müssen wir verhindern, dass
00111             // diese direkt an die u.g. Methode der Elternklasse übergeben
00112             // wird, da sonst ggf. eine Exception geworfen würde und Dateien
00113             // auch doppelt eingebunden werden können. Hier wird nun die Datei
00114             // erst eingebunden und dann der Array an addTranslation()
00115             // übergeben, damit die Übersetzungen ordnungsgemäß hinzugefügt
00116             // werden können
00117             return $this->addTranslation((array) include_once($data), $locale);
00118             ob_end_clean();
00119         }
00120         // Ansonsten leeren Array zurück geben
00121         else
00122         {
00123           return array();
00124         }
00125     }
00126 
00127     return parent::_loadTranslationData($data, $locale, $options);
00128   }
00129 
00137   public function _($idMessage, $locale = null)
00138   {
00139     // Ggf. Standardsprache benutzen
00140     if (null == $locale)
00141     {
00142       $locale = $this->_options['locale'];
00143     }
00144 
00145     // Falls ID nicht übersetzt, versuchen, diese nachzuladen
00146     if (!isset($this->_translate[$locale][$idMessage]))
00147     {
00148       // Versuchen, Übersetzung nach zu laden
00149       $this->_lazyLoadTranslationData($idMessage, $locale);
00150     }
00151 
00152     return parent::_($idMessage, $locale);
00153   }
00154 
00161   public function addLayoutTranslationData($layout)
00162   {
00163     // Absoluter Pfad zur Sprachdatei des Layouts
00164     $fileLayoutTranslation = BASE_DIR.'lang/'.
00165       $this->_options['locale'].'/layout/'.$layout.'.php';
00166 
00167     // Sprachdatei laden
00168     return $this->_loadTranslationData
00169       ($fileLayoutTranslation, $this->_options['locale']);
00170   }
00171 
00181   public function getList()
00182   {
00183     // Falls Liste noch nicht initialisiert wurde
00184     if (null === $this->_localeList)
00185     {
00186       // Liste erstellen
00187       $this->_localeList = array();
00188 
00189       // Verzeichnis mit Sprachen
00190       $directory = new DirectoryIterator(BASE_DIR.'lang/');
00191 
00192       // Dateien und Verzeichnisse durchgehen
00193       foreach ($directory as $file)
00194       {
00195         // Falls Element Verzeichnis, dessen Name eine Sprache darstellt,
00196         // zur Liste hinzufügen
00197         if (!$file->isDot()
00198             && $file->isDir()
00199             && Zend_Locale::isLocale($file->getFilename()))
00200         {
00201           $this->_localeList[] = $file->getFilename();
00202         }
00203       }
00204     }
00205 
00206     return $this->_localeList;
00207   }
00208 
00215   public function isAvailable($locale)
00216   {
00217     // Sofern bereits Übersetzungen der geforderten Sprache vorhanden sind,
00218     // true zurückgeben, ansonsten prüfen, ob Sprache geladen werden könnte
00219     return (parent::isAvailable($locale) ? true :
00220       in_array($locale, $this->getList()));
00221   }
00222 
00232   public function setLocale($locale)
00233   {
00234     // Falls Sprache nicht verfügbar ist, auf Standard setzen
00235     if (!$this->isAvailable($locale))
00236     {
00237       $locale = array_keys(Zend_Locale::getDefault());
00238       $locale = $locale[0];
00239     }
00240 
00241     parent::setLocale($locale);
00242   }
00243 }

Erzeugt am Fri Sep 18 19:04:11 2009 für DSA online - Morgendaemmerung von  doxygen 1.5.7.1