Beispiel #1
0
 /**
  * returns list of all available translations
  * 
  * NOTE available are those, having a Tinebase translation
  * 
  * @return array list of all available translation
  *
  * @todo add test
  */
 public static function getAvailableTranslations()
 {
     $availableTranslations = array();
     // look for po files in Tinebase
     $officialTranslationsDir = dirname(__FILE__) . '/translations';
     foreach (scandir($officialTranslationsDir) as $poFile) {
         list($localestring, $suffix) = explode('.', $poFile);
         if ($suffix == 'po') {
             $availableTranslations[$localestring] = array('path' => "{$officialTranslationsDir}/{$poFile}");
         }
     }
     // lookup/merge custom translations
     if (Tinebase_Config::isReady() === TRUE) {
         $customTranslationsDir = Tinebase_Config::getInstance()->translations;
         if ($customTranslationsDir) {
             foreach ((array) scandir($customTranslationsDir) as $dir) {
                 $poFile = "{$customTranslationsDir}/{$dir}/Tinebase/translations/{$dir}.po";
                 if (is_readable($poFile)) {
                     $availableTranslations[$dir] = array('path' => $poFile);
                 }
             }
         }
     }
     // compute information
     foreach ($availableTranslations as $localestring => $info) {
         if (!Zend_Locale::isLocale($localestring, TRUE, FALSE)) {
             $logger = Tinebase_Core::getLogger();
             if ($logger) {
                 $logger->WARN(__METHOD__ . '::' . __LINE__ . " {$localestring} is not supported, removing translation form list");
             }
             unset($availableTranslations[$localestring]);
             continue;
         }
         // fetch header grep for X-Poedit-Language, X-Poedit-Country
         $fh = fopen($info['path'], 'r');
         $header = fread($fh, 1024);
         fclose($fh);
         preg_match('/X-Tine20-Language: (.+)(?:\\\\n?)(?:"?)/', $header, $language);
         preg_match('/X-Tine20-Country: (.+)(?:\\\\n?)(?:"?)/', $header, $region);
         $locale = new Zend_Locale($localestring);
         $availableTranslations[$localestring]['locale'] = $localestring;
         $availableTranslations[$localestring]['language'] = isset($language[1]) ? $language[1] : Zend_Locale::getTranslation($locale->getLanguage(), 'language', $locale);
         $availableTranslations[$localestring]['region'] = isset($region[1]) ? $region[1] : Zend_Locale::getTranslation($locale->getRegion(), 'country', $locale);
     }
     ksort($availableTranslations);
     return $availableTranslations;
 }
 /**
  * returns list of all available translations
  * 
  * NOTE available are those, having a Tinebase translation
  * 
  * @return array list of all available translation
  *
  * @todo add test
  */
 public static function getAvailableTranslations($appName = 'Tinebase')
 {
     $availableTranslations = array();
     // look for po files in Tinebase
     $officialTranslationsDir = dirname(__FILE__) . "/../{$appName}/translations";
     foreach (scandir($officialTranslationsDir) as $poFile) {
         list($localestring, $suffix) = explode('.', $poFile);
         if ($suffix == 'po') {
             $availableTranslations[$localestring] = array('path' => "{$officialTranslationsDir}/{$poFile}");
         }
     }
     // lookup/merge custom translations
     if (Tinebase_Config::isReady() === TRUE) {
         $logger = Tinebase_Core::getLogger();
         $customTranslationsDir = Tinebase_Config::getInstance()->translations;
         if ($customTranslationsDir) {
             foreach ((array) @scandir($customTranslationsDir) as $dir) {
                 $poFile = "{$customTranslationsDir}/{$dir}/{$appName}/translations/{$dir}.po";
                 if (is_readable($poFile)) {
                     $availableTranslations[$dir] = array('path' => $poFile);
                 }
             }
         }
     } else {
         $logger = null;
     }
     $filesToWatch = array();
     // compute information
     foreach ($availableTranslations as $localestring => $info) {
         if (!Zend_Locale::isLocale($localestring, TRUE, FALSE)) {
             if ($logger) {
                 $logger->WARN(__METHOD__ . '::' . __LINE__ . " {$localestring} is not supported, removing translation form list");
             }
             unset($availableTranslations[$localestring]);
             continue;
         }
         $filesToWatch[] = $info['path'];
     }
     if (Tinebase_Config::isReady()) {
         $cache = new Zend_Cache_Frontend_File(array('master_files' => $filesToWatch));
         $cache->setBackend(Tinebase_Core::get(Tinebase_Core::CACHE)->getBackend());
     } else {
         $cache = null;
     }
     if ($cache) {
         $cacheId = Tinebase_Helper::convertCacheId(__FUNCTION__ . $appName . sha1(serialize($filesToWatch)));
         $cache = new Zend_Cache_Frontend_File(array('master_files' => $filesToWatch));
         $cache->setBackend(Tinebase_Core::get(Tinebase_Core::CACHE)->getBackend());
         if ($cachedTranslations = $cache->load($cacheId)) {
             $cachedTranslations = unserialize($cachedTranslations);
             if ($cachedTranslations !== null) {
                 return $cachedTranslations;
             }
         }
     }
     // compute information
     foreach ($availableTranslations as $localestring => $info) {
         // fetch header grep for X-Poedit-Language, X-Poedit-Country
         $fh = fopen($info['path'], 'r');
         $header = fread($fh, 1024);
         fclose($fh);
         preg_match('/X-Tine20-Language: (.+)(?:\\\\n?)(?:"?)/', $header, $language);
         preg_match('/X-Tine20-Country: (.+)(?:\\\\n?)(?:"?)/', $header, $region);
         $locale = new Zend_Locale($localestring);
         $availableTranslations[$localestring]['locale'] = $localestring;
         $availableTranslations[$localestring]['language'] = isset($language[1]) ? $language[1] : Zend_Locale::getTranslation($locale->getLanguage(), 'language', $locale);
         $availableTranslations[$localestring]['region'] = isset($region[1]) ? $region[1] : Zend_Locale::getTranslation($locale->getRegion(), 'country', $locale);
     }
     ksort($availableTranslations);
     if ($cache) {
         $cache->save(serialize($availableTranslations), $cacheId, array(), 86400);
     }
     return $availableTranslations;
 }