Пример #1
0
 /**
  * Writes a locale file
  * 
  * @param string $language The language code (fr, en, ...)
  * @param array  $locales  The locales
  * @param string $label    A code to istinguish different locales listes
  * 
  * @return void
  */
 static function writeLocaleFile($language, $locales = null, $label = null)
 {
     global $version;
     if (!$locales) {
         $localeFiles = array_merge(glob("./locales/{$language}/*.php"), glob("./modules/*/locales/{$language}.php"), glob("./mobile/modules/*/locales/{$language}.php"));
         foreach ($localeFiles as $localeFile) {
             if (basename($localeFile) != "meta.php") {
                 include $localeFile;
             }
         }
     }
     $path = self::getLocaleFilePath($language, $label);
     if ($fp = fopen($path, 'w')) {
         $locales = CMbString::filterEmpty($locales);
         // TODO: change the invalid keys (with accents) of the locales to simplify this
         $keys = array_map('utf8_encode', array_keys($locales));
         $values = array_map('utf8_encode', array_values($locales));
         foreach ($values as &$_value) {
             $_value = CMbString::unslash($_value);
         }
         $compress = false;
         if ($compress) {
             $delim = "/([\\.-])/";
             $arr = new stdClass();
             foreach ($keys as $_pos => $_key) {
                 $parts = preg_split($delim, $_key, -1, PREG_SPLIT_DELIM_CAPTURE);
                 $_arr = $arr;
                 $last_key = count($parts) - 1;
                 foreach ($parts as $i => $_token) {
                     $last = $i == $last_key;
                     if ($_token === "") {
                         $_token = '_$_';
                     }
                     if ($last) {
                         $_arr->{$_token} = (object) array('$' => $values[$_pos]);
                         break;
                     } elseif (!isset($_arr->{$_token})) {
                         $_arr->{$_token} = new stdClass();
                     }
                     $_arr = $_arr->{$_token};
                 }
                 //unset($_arr);
             }
             self::clearLocalesKeys($arr);
             $json = $arr;
         } else {
             $json = array_combine($keys, $values);
         }
         $script = '//' . $version['build'] . "\nwindow.locales=" . json_encode($json) . ";";
         fwrite($fp, $script);
         fclose($fp);
     }
 }
 * @license    GNU General Public License, see http://www.gnu.org/licenses/gpl.html
 * @version    $Revision$
 */
global $version;
CCanDo::checkEdit();
/////////// Locales
foreach (glob("locales/*", GLOB_ONLYDIR) as $localeDir) {
    $localeName = basename($localeDir);
    $locales = array();
    $localeFiles = CAppUI::getLocaleFilesPaths($localeName);
    foreach ($localeFiles as $localeFile) {
        if (basename($localeFile) != "meta.php") {
            include $localeFile;
        }
    }
    $locales = CMbString::filterEmpty($locales);
    foreach ($locales as &$_locale) {
        $_locale = CMbString::unslash($_locale);
    }
    $path = "./tmp/locales-{$localeName}.js";
    if (!is_file($path)) {
        CAppUI::stepAjax("Locales-javascript-cache-none", UI_MSG_OK, $localeName);
        continue;
    }
    $fp = fopen($path, 'r');
    preg_match('#^//(\\d+)#', fgets($fp), $v);
    if ($v[1] < $version['build']) {
        CAppUI::stepAjax("Locales-javascript-cache-ko", UI_MSG_WARNING, $localeName);
        fclose($fp);
        continue;
    }
Пример #3
0
 /**
  * Load locales from cache or build the cache
  *
  * @return void
  */
 public static function loadLocales()
 {
     $lang = CAppUI::pref("LOCALE", "fr");
     self::$lang = $lang;
     $shared_name = "locales-{$lang}";
     $locales_prefixes = SHM::get("{$shared_name}-" . self::LOCALES_PREFIX);
     // Load from shared memory if possible
     if ($locales_prefixes) {
         return;
     }
     $mutex = new CMbFileMutex("locales-build");
     $mutex->acquire(5);
     $locales_prefixes = SHM::get("{$shared_name}-" . self::LOCALES_PREFIX);
     // Load from shared memory if possible
     if ($locales_prefixes) {
         $mutex->release();
         return;
     }
     $locales = array();
     foreach (self::getLocaleFilesPaths($lang) as $_path) {
         include_once $_path;
     }
     $locales = CMbString::filterEmpty($locales);
     foreach ($locales as &$_locale) {
         $_locale = CMbString::unslash($_locale);
     }
     unset($_locale);
     // Load overwritten locales if the table exists
     $overwrite = new CTranslationOverwrite();
     if ($overwrite->isInstalled()) {
         $locales = $overwrite->transformLocales($locales, $lang);
     }
     // Prefix = everything before "." and "-"
     $by_prefix = array();
     $hashes = array();
     foreach ($locales as $_key => $_value) {
         /** @var string $_prefix */
         /** @var string $_rest */
         /** @var string $_prefix_raw */
         list($_prefix, $_rest, $_prefix_raw) = self::splitLocale($_key);
         if (!isset($by_prefix[$_prefix])) {
             $hashes[$_prefix] = $_prefix_raw;
             $by_prefix[$_prefix] = array();
         }
         $by_prefix[$_prefix][$_rest] = $_value;
     }
     foreach ($by_prefix as $_prefix => $_locales) {
         self::$locales[$_prefix] = $_locales;
         self::$locales_loaded[$_prefix] = true;
         SHM::put("{$shared_name}-{$_prefix}", $_locales);
     }
     SHM::put("{$shared_name}-" . self::LOCALES_PREFIX, $hashes);
     $mutex->release();
 }