diff -r c671f3bb8aed -r a7d0f2711df1 includes/lang.php --- a/includes/lang.php Tue Nov 06 16:22:43 2007 -0500 +++ b/includes/lang.php Wed Nov 07 00:34:22 2007 -0500 @@ -71,8 +71,8 @@ if ( defined('IN_ENANO_INSTALL') ) { // special case for the Enano installer: it will load its own strings from a JSON file and just use this API for fetching and templatizing them. - $this->lang_id = LANG_DEFAULT; - $this->lang_code = 'neutral'; + $this->lang_id = 1; + $this->lang_code = $lang; return true; } if ( is_string($lang) ) @@ -186,6 +186,77 @@ } /** + * Loads a JSON language file and parses the strings into RAM. Will use the cache if possible, but stays far away from the database, + * which we assume doesn't exist yet. + */ + + function load_file($file) + { + global $db, $session, $paths, $template, $plugins; // Common objects + + if ( !file_exists($file) ) + $db->_die('lang.php - requested JSON file doesn\'t exist'); + + $contents = trim(@file_get_contents($file)); + if ( empty($contents) ) + $db->_die('lang.php - empty language file...'); + + // Trim off all text before and after the starting and ending braces + $contents = preg_replace('/^([^{]+)\{/', '{', $contents); + $contents = preg_replace('/\}([^}]+)$/', '}', $contents); + $contents = trim($contents); + + if ( empty($contents) ) + $db->_die('lang.php - no meat to the language file...'); + + $checksum = md5($contents); + if ( file_exists("./cache/lang_json_{$checksum}.php") ) + { + $this->load_cache_file("./cache/lang_json_{$checksum}.php"); + } + else + { + $json = new Services_JSON(SERVICES_JSON_LOOSE_TYPE); + $langdata = $json->decode($contents); + + if ( !is_array($langdata) ) + $db->_die('lang.php - invalid language file'); + + if ( !isset($langdata['categories']) || !isset($langdata['strings']) ) + $db->_die('lang.php - language file does not contain the proper items'); + + $this->merge($langdata['strings']); + + $lang_file = "./cache/lang_json_{$checksum}.php"; + + $handle = @fopen($lang_file, 'w'); + if ( !$handle ) + // Couldn't open the file. Silently fail and let the strings come from RAM. + return false; + + // The file's open, that means we should be good. + fwrite($handle, 'var_export_string($this->strings); + if ( empty($exported) ) + // Ehh, that's not good + $db->_die('lang.php - load_file(): var_export_string() failed'); + + fwrite($handle, $exported . '; ?>'); + + // Clean up + unset($exported, $langdata); + + // Done =) + fclose($handle); + } + } + + /** * Merges a standard language assoc array ($arr[cat][stringid]) with the master in RAM. * @param array */ @@ -195,7 +266,7 @@ // This is stupidly simple. foreach ( $strings as $cat_id => $contents ) { - if ( !is_array($this->strings[$cat_id]) ) + if ( !isset($this->strings[$cat_id]) || ( isset($this->strings[$cat_id]) && !is_array($this->strings[$cat_id]) ) ) $this->strings[$cat_id] = array(); foreach ( $contents as $string_id => $string ) { @@ -364,6 +435,10 @@ if ( !$found ) { // Ehh, the string wasn't found. Rerun fetch() and try again. + if ( defined('IN_ENANO_INSTALL') ) + { + return $string_id; + } $this->fetch(); if ( isset($this->strings[$category]) && isset($this->strings[$category][$string_name]) ) { @@ -428,7 +503,7 @@ $subs[$key] = strval($value); $string = str_replace("%{$key}%", "{$subs[$key]}", $string); } - return "L $string"; + return "{$string}*"; } } // class Language