/** * 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; }