205
+ − 1
<?php
+ − 2
+ − 3
/*
+ − 4
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
536
+ − 5
* Version 1.1.4 (Caoineag alpha 4)
+ − 6
* Copyright (C) 2006-2008 Dan Fuhry
205
+ − 7
*
+ − 8
* This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
+ − 9
* as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+ − 10
*
+ − 11
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
+ − 12
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
+ − 13
*/
+ − 14
+ − 15
/**
+ − 16
* Language class - processes, stores, and retrieves language strings.
+ − 17
* @package Enano
+ − 18
* @subpackage Localization
+ − 19
* @copyright 2007 Dan Fuhry
+ − 20
* @license GNU General Public License
+ − 21
*/
+ − 22
+ − 23
class Language
+ − 24
{
+ − 25
+ − 26
/**
+ − 27
* The numerical ID of the loaded language.
+ − 28
* @var int
+ − 29
*/
+ − 30
+ − 31
var $lang_id;
+ − 32
+ − 33
/**
+ − 34
* The ISO-639-3 code for the loaded language. This should be grabbed directly from the database.
+ − 35
* @var string
+ − 36
*/
+ − 37
+ − 38
var $lang_code;
210
2b283402e4e4
Added language export to JSON page and localization for Javascript using $lang.get(). Localized AJAX login interface.
Dan
diff
changeset
+ − 39
2b283402e4e4
Added language export to JSON page and localization for Javascript using $lang.get(). Localized AJAX login interface.
Dan
diff
changeset
+ − 40
/**
2b283402e4e4
Added language export to JSON page and localization for Javascript using $lang.get(). Localized AJAX login interface.
Dan
diff
changeset
+ − 41
* Used to track when a language was last changed, to allow browsers to cache language data
2b283402e4e4
Added language export to JSON page and localization for Javascript using $lang.get(). Localized AJAX login interface.
Dan
diff
changeset
+ − 42
* @var int
2b283402e4e4
Added language export to JSON page and localization for Javascript using $lang.get(). Localized AJAX login interface.
Dan
diff
changeset
+ − 43
*/
2b283402e4e4
Added language export to JSON page and localization for Javascript using $lang.get(). Localized AJAX login interface.
Dan
diff
changeset
+ − 44
2b283402e4e4
Added language export to JSON page and localization for Javascript using $lang.get(). Localized AJAX login interface.
Dan
diff
changeset
+ − 45
var $lang_timestamp;
205
+ − 46
+ − 47
/**
+ − 48
* Will be an object that holds an instance of the class configured with the site's default language. Only instanciated when needed.
+ − 49
* @var object
+ − 50
*/
+ − 51
+ − 52
var $default;
+ − 53
+ − 54
/**
+ − 55
* The list of loaded strings.
+ − 56
* @var array
+ − 57
* @access private
+ − 58
*/
+ − 59
+ − 60
var $strings = array();
+ − 61
+ − 62
/**
504
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 63
* Switch for debug mode. If true, will show an asterisk after localized strings. This
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 64
* can be useful if you're localizing a component and need to see what's already done.
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 65
* @var bool
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 66
*/
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 67
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 68
var $debug = false;
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 69
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 70
/**
205
+ − 71
* Constructor.
+ − 72
* @param int|string Language ID or code to load.
+ − 73
*/
+ − 74
+ − 75
function __construct($lang)
+ − 76
{
+ − 77
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 78
+ − 79
if ( defined('IN_ENANO_INSTALL') )
+ − 80
{
+ − 81
// 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.
243
+ − 82
$this->lang_id = 1;
+ − 83
$this->lang_code = $lang;
205
+ − 84
return true;
+ − 85
}
+ − 86
if ( is_string($lang) )
+ − 87
{
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
diff
changeset
+ − 88
$sql_col = 'lang_code=\'' . $db->escape($lang) . '\'';
205
+ − 89
}
+ − 90
else if ( is_int($lang) )
+ − 91
{
+ − 92
$sql_col = 'lang_id=' . $lang . '';
+ − 93
}
+ − 94
else
+ − 95
{
+ − 96
$db->_die('lang.php - attempting to pass invalid value to constructor');
+ − 97
}
+ − 98
239
0f1b353570a7
Fix a comparison logic SQL error in lang.php; fix attempt to call mysql_real_escape_string() in install without a working DB connection
Dan
diff
changeset
+ − 99
$lang_default = ( $x = getConfig('default_language') ) ? intval($x) : '\'def\'';
372
5bd429428101
A number of scattered changes. Profiler added and only enabled in debug mode (currently on), but awfully useful for fixing performance in the future. Started work on Admin:LangManager
Dan
diff
changeset
+ − 100
5bd429428101
A number of scattered changes. Profiler added and only enabled in debug mode (currently on), but awfully useful for fixing performance in the future. Started work on Admin:LangManager
Dan
diff
changeset
+ − 101
$q = $db->sql_query("SELECT lang_id, lang_code, last_changed, ( lang_id = $lang_default ) AS is_default FROM " . table_prefix . "language WHERE $sql_col OR lang_id = $lang_default ORDER BY is_default ASC LIMIT 1;");
205
+ − 102
+ − 103
if ( !$q )
+ − 104
$db->_die('lang.php - main select query');
+ − 105
+ − 106
if ( $db->numrows() < 1 )
+ − 107
$db->_die('lang.php - There are no languages installed');
+ − 108
+ − 109
$row = $db->fetchrow();
+ − 110
+ − 111
$this->lang_id = intval( $row['lang_id'] );
+ − 112
$this->lang_code = $row['lang_code'];
210
2b283402e4e4
Added language export to JSON page and localization for Javascript using $lang.get(). Localized AJAX login interface.
Dan
diff
changeset
+ − 113
$this->lang_timestamp = $row['last_changed'];
205
+ − 114
}
+ − 115
+ − 116
/**
+ − 117
* Fetches language strings from the database, or a cache file if it's available.
+ − 118
* @param bool If true (default), allows the cache to be used.
+ − 119
*/
+ − 120
+ − 121
function fetch($allow_cache = true)
+ − 122
{
+ − 123
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 124
+ − 125
// Attempt to load the strings from a cache file
607
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 126
$loaded = false;
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 127
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 128
if ( $allow_cache )
205
+ − 129
{
607
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 130
// Load the cache manager
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 131
global $cache;
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 132
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 133
if ( $cached = $cache->fetch("lang_{$this->lang_id}") )
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 134
{
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 135
$this->merge($cached);
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 136
$loaded = true;
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 137
}
205
+ − 138
}
607
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 139
if ( !$loaded )
205
+ − 140
{
+ − 141
// No cache file - select and retrieve from the database
+ − 142
$q = $db->sql_unbuffered_query("SELECT string_category, string_name, string_content FROM " . table_prefix . "language_strings WHERE lang_id = {$this->lang_id};");
+ − 143
if ( !$q )
+ − 144
$db->_die('lang.php - selecting language string data');
+ − 145
if ( $row = $db->fetchrow() )
+ − 146
{
+ − 147
$strings = array();
+ − 148
do
+ − 149
{
+ − 150
$cat =& $row['string_category'];
371
dc6026376919
Improved compatibility with PostgreSQL and fixed a number of installer bugs; fixed missing "meta" category declaration in language files
Dan
diff
changeset
+ − 151
if ( !is_array(@$strings[$cat]) )
205
+ − 152
{
+ − 153
$strings[$cat] = array();
+ − 154
}
+ − 155
$strings[$cat][ $row['string_name'] ] = $row['string_content'];
+ − 156
}
+ − 157
while ( $row = $db->fetchrow() );
+ − 158
// all done fetching
+ − 159
$this->merge($strings);
607
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 160
$this->regen_caches(false);
205
+ − 161
}
+ − 162
else
+ − 163
{
241
c671f3bb8aed
Trying to get lang import to work in the installer; it's not working ATM - cache file is generated with lang_id = 0. Syncing to Nighthawk.
Dan
diff
changeset
+ − 164
if ( !defined('ENANO_ALLOW_LOAD_NOLANG') )
c671f3bb8aed
Trying to get lang import to work in the installer; it's not working ATM - cache file is generated with lang_id = 0. Syncing to Nighthawk.
Dan
diff
changeset
+ − 165
$db->_die('lang.php - No strings for language ' . $this->lang_code);
205
+ − 166
}
+ − 167
}
+ − 168
}
+ − 169
+ − 170
/**
+ − 171
* Loads a file from the disk cache (treated as PHP) and merges it into RAM.
+ − 172
* @param string File to load
+ − 173
*/
+ − 174
+ − 175
function load_cache_file($file)
+ − 176
{
+ − 177
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 178
+ − 179
if ( !file_exists($file) )
+ − 180
$db->_die('lang.php - requested cache file doesn\'t exist');
+ − 181
590
03a60844c7c5
Several optimization changes including getting rid of a few eval()s. Added placeholder functions for the theme manager, which should be working now
Dan
diff
changeset
+ − 182
@include($file);
03a60844c7c5
Several optimization changes including getting rid of a few eval()s. Added placeholder functions for the theme manager, which should be working now
Dan
diff
changeset
+ − 183
205
+ − 184
if ( !isset($lang_cache) || ( isset($lang_cache) && !is_array($lang_cache) ) )
+ − 185
$db->_die('lang.php - the cache file is invalid (didn\'t set $lang_cache as an array)');
+ − 186
+ − 187
$this->merge($lang_cache);
+ − 188
}
+ − 189
+ − 190
/**
243
+ − 191
* Loads a JSON language file and parses the strings into RAM. Will use the cache if possible, but stays far away from the database,
+ − 192
* which we assume doesn't exist yet.
+ − 193
*/
+ − 194
+ − 195
function load_file($file)
+ − 196
{
+ − 197
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 198
+ − 199
if ( !file_exists($file) )
348
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 200
{
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 201
if ( defined('IN_ENANO_INSTALL') )
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 202
{
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 203
die('lang.php - requested JSON file (' . htmlspecialchars($file) . ') doesn\'t exist');
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 204
}
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 205
else
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 206
{
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 207
$db->_die('lang.php - requested JSON file doesn\'t exist');
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 208
}
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 209
}
243
+ − 210
+ − 211
$contents = trim(@file_get_contents($file));
+ − 212
if ( empty($contents) )
+ − 213
$db->_die('lang.php - empty language file...');
+ − 214
+ − 215
// Trim off all text before and after the starting and ending braces
+ − 216
$contents = preg_replace('/^([^{]+)\{/', '{', $contents);
+ − 217
$contents = preg_replace('/\}([^}]+)$/', '}', $contents);
+ − 218
$contents = trim($contents);
+ − 219
+ − 220
if ( empty($contents) )
+ − 221
$db->_die('lang.php - no meat to the language file...');
+ − 222
+ − 223
$checksum = md5($contents);
+ − 224
if ( file_exists("./cache/lang_json_{$checksum}.php") )
+ − 225
{
+ − 226
$this->load_cache_file("./cache/lang_json_{$checksum}.php");
+ − 227
}
+ − 228
else
+ − 229
{
348
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 230
// Correct syntax to be nice to the json parser
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 231
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 232
// eliminate comments
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 233
$contents = preg_replace(array(
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 234
// eliminate single line comments in '// ...' form
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 235
'#^\s*//(.+)$#m',
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 236
// eliminate multi-line comments in '/* ... */' form, at start of string
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 237
'#^\s*/\*(.+)\*/#Us',
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 238
// eliminate multi-line comments in '/* ... */' form, at end of string
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 239
'#/\*(.+)\*/\s*$#Us'
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 240
), '', $contents);
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 241
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 242
$contents = preg_replace('/([,\{\[])([\s]*?)([a-z0-9_]+)([\s]*?):/', '\\1\\2"\\3" :', $contents);
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 243
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 244
try
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 245
{
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 246
$langdata = enano_json_decode($contents);
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 247
}
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 248
catch(Zend_Json_Exception $e)
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 249
{
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 250
$db->_die('lang.php - Exception caught by JSON parser</p><pre>' . htmlspecialchars(print_r($e, true)) . '</pre><p>');
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 251
exit;
87e08a6e4fec
Welcome to the new Enano installer. Much distance still to be covered but the basics are there.
Dan
diff
changeset
+ − 252
}
243
+ − 253
+ − 254
if ( !is_array($langdata) )
+ − 255
$db->_die('lang.php - invalid language file');
+ − 256
+ − 257
if ( !isset($langdata['categories']) || !isset($langdata['strings']) )
+ − 258
$db->_die('lang.php - language file does not contain the proper items');
+ − 259
+ − 260
$this->merge($langdata['strings']);
+ − 261
+ − 262
$lang_file = "./cache/lang_json_{$checksum}.php";
+ − 263
+ − 264
$handle = @fopen($lang_file, 'w');
+ − 265
if ( !$handle )
+ − 266
// Couldn't open the file. Silently fail and let the strings come from RAM.
+ − 267
return false;
+ − 268
+ − 269
// The file's open, that means we should be good.
+ − 270
fwrite($handle, '<?php
+ − 271
// This file was generated automatically by Enano. You should not edit this file because any changes you make
+ − 272
// to it will not be visible in the ACP and all changes will be lost upon any changes to strings in the admin panel.
+ − 273
+ − 274
$lang_cache = ');
+ − 275
+ − 276
$exported = $this->var_export_string($this->strings);
+ − 277
if ( empty($exported) )
+ − 278
// Ehh, that's not good
+ − 279
$db->_die('lang.php - load_file(): var_export_string() failed');
+ − 280
+ − 281
fwrite($handle, $exported . '; ?>');
+ − 282
+ − 283
// Clean up
+ − 284
unset($exported, $langdata);
+ − 285
+ − 286
// Done =)
+ − 287
fclose($handle);
+ − 288
}
+ − 289
}
+ − 290
+ − 291
/**
205
+ − 292
* Merges a standard language assoc array ($arr[cat][stringid]) with the master in RAM.
+ − 293
* @param array
+ − 294
*/
+ − 295
+ − 296
function merge($strings)
+ − 297
{
+ − 298
// This is stupidly simple.
+ − 299
foreach ( $strings as $cat_id => $contents )
+ − 300
{
243
+ − 301
if ( !isset($this->strings[$cat_id]) || ( isset($this->strings[$cat_id]) && !is_array($this->strings[$cat_id]) ) )
205
+ − 302
$this->strings[$cat_id] = array();
+ − 303
foreach ( $contents as $string_id => $string )
+ − 304
{
+ − 305
$this->strings[$cat_id][$string_id] = $string;
+ − 306
}
+ − 307
}
+ − 308
}
+ − 309
+ − 310
/**
+ − 311
* Imports a JSON-format language file into the database and merges with current strings.
+ − 312
* @param string Path to the JSON file to load
514
+ − 313
* @param bool Enable debugging output, makes the process over CLI more interesting
205
+ − 314
*/
+ − 315
514
+ − 316
function import($file, $debug = false)
205
+ − 317
{
+ − 318
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 319
+ − 320
if ( !file_exists($file) )
+ − 321
$db->_die('lang.php - can\'t import language file: string file doesn\'t exist');
+ − 322
241
c671f3bb8aed
Trying to get lang import to work in the installer; it's not working ATM - cache file is generated with lang_id = 0. Syncing to Nighthawk.
Dan
diff
changeset
+ − 323
if ( $this->lang_id == 0 )
c671f3bb8aed
Trying to get lang import to work in the installer; it's not working ATM - cache file is generated with lang_id = 0. Syncing to Nighthawk.
Dan
diff
changeset
+ − 324
$db->_die('lang.php - BUG: trying to perform import when $lang->lang_id == 0');
c671f3bb8aed
Trying to get lang import to work in the installer; it's not working ATM - cache file is generated with lang_id = 0. Syncing to Nighthawk.
Dan
diff
changeset
+ − 325
514
+ − 326
if ( $debug )
516
+ − 327
$br = ( isset($_SERVER['REQUEST_URI']) ) ? '<br />' : '';
+ − 328
+ − 329
if ( $debug )
+ − 330
echo "Importing file: $file$br\n Checking file...$br\n";
514
+ − 331
205
+ − 332
$contents = trim(@file_get_contents($file));
+ − 333
+ − 334
if ( empty($contents) )
+ − 335
$db->_die('lang.php - can\'t load the contents of the language file');
+ − 336
514
+ − 337
if ( $debug )
516
+ − 338
echo " Cleaning up JSON$br\n";
514
+ − 339
205
+ − 340
// Trim off all text before and after the starting and ending braces
+ − 341
$contents = preg_replace('/^([^{]+)\{/', '{', $contents);
+ − 342
$contents = preg_replace('/\}([^}]+)$/', '}', $contents);
+ − 343
334
c72b545f1304
More localization work. Resolved major issue with JSON parser not parsing files over ~50KB. Switched JSON parser to the one from the Zend Framework (BSD licensed). Forced to split enano.json into five different files.
Dan
diff
changeset
+ − 344
// Correct syntax to be nice to the json parser
372
5bd429428101
A number of scattered changes. Profiler added and only enabled in debug mode (currently on), but awfully useful for fixing performance in the future. Started work on Admin:LangManager
Dan
diff
changeset
+ − 345
$contents = enano_clean_json($contents);
334
c72b545f1304
More localization work. Resolved major issue with JSON parser not parsing files over ~50KB. Switched JSON parser to the one from the Zend Framework (BSD licensed). Forced to split enano.json into five different files.
Dan
diff
changeset
+ − 346
514
+ − 347
if ( $debug )
516
+ − 348
echo " Decoding JSON stream$br\n";
514
+ − 349
334
c72b545f1304
More localization work. Resolved major issue with JSON parser not parsing files over ~50KB. Switched JSON parser to the one from the Zend Framework (BSD licensed). Forced to split enano.json into five different files.
Dan
diff
changeset
+ − 350
try
c72b545f1304
More localization work. Resolved major issue with JSON parser not parsing files over ~50KB. Switched JSON parser to the one from the Zend Framework (BSD licensed). Forced to split enano.json into five different files.
Dan
diff
changeset
+ − 351
{
c72b545f1304
More localization work. Resolved major issue with JSON parser not parsing files over ~50KB. Switched JSON parser to the one from the Zend Framework (BSD licensed). Forced to split enano.json into five different files.
Dan
diff
changeset
+ − 352
$langdata = enano_json_decode($contents);
c72b545f1304
More localization work. Resolved major issue with JSON parser not parsing files over ~50KB. Switched JSON parser to the one from the Zend Framework (BSD licensed). Forced to split enano.json into five different files.
Dan
diff
changeset
+ − 353
}
c72b545f1304
More localization work. Resolved major issue with JSON parser not parsing files over ~50KB. Switched JSON parser to the one from the Zend Framework (BSD licensed). Forced to split enano.json into five different files.
Dan
diff
changeset
+ − 354
catch(Zend_Json_Exception $e)
c72b545f1304
More localization work. Resolved major issue with JSON parser not parsing files over ~50KB. Switched JSON parser to the one from the Zend Framework (BSD licensed). Forced to split enano.json into five different files.
Dan
diff
changeset
+ − 355
{
335
67bd3121a12e
Replaced TinyMCE 2.x with 3.0 beta 3. Supports everything but IE. Also rewrote the editor interface completely from the ground up.
Dan
diff
changeset
+ − 356
$db->_die('lang.php - Exception caught by JSON parser</p><pre>' . htmlspecialchars(print_r($e, true)) . '</pre><p>');
334
c72b545f1304
More localization work. Resolved major issue with JSON parser not parsing files over ~50KB. Switched JSON parser to the one from the Zend Framework (BSD licensed). Forced to split enano.json into five different files.
Dan
diff
changeset
+ − 357
exit;
c72b545f1304
More localization work. Resolved major issue with JSON parser not parsing files over ~50KB. Switched JSON parser to the one from the Zend Framework (BSD licensed). Forced to split enano.json into five different files.
Dan
diff
changeset
+ − 358
}
205
+ − 359
+ − 360
if ( !is_array($langdata) )
334
c72b545f1304
More localization work. Resolved major issue with JSON parser not parsing files over ~50KB. Switched JSON parser to the one from the Zend Framework (BSD licensed). Forced to split enano.json into five different files.
Dan
diff
changeset
+ − 361
{
c72b545f1304
More localization work. Resolved major issue with JSON parser not parsing files over ~50KB. Switched JSON parser to the one from the Zend Framework (BSD licensed). Forced to split enano.json into five different files.
Dan
diff
changeset
+ − 362
$db->_die('lang.php - invalid or non-well-formed language file');
c72b545f1304
More localization work. Resolved major issue with JSON parser not parsing files over ~50KB. Switched JSON parser to the one from the Zend Framework (BSD licensed). Forced to split enano.json into five different files.
Dan
diff
changeset
+ − 363
}
205
+ − 364
514
+ − 365
if ( $debug )
516
+ − 366
echo " Starting string import$br\n";
514
+ − 367
+ − 368
return $this->import_array($langdata, $debug);
504
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 369
}
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 370
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 371
/**
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 372
* Imports a JSON-format language file into the database and merges with current strings.
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 373
* @param string Path to plugin file
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 374
*/
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 375
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 376
function import_plugin($file)
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 377
{
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 378
global $db, $session, $paths, $template, $plugins; // Common objects
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 379
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 380
if ( !file_exists($file) )
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 381
$db->_die('lang.php - can\'t import language file: string file doesn\'t exist');
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 382
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 383
if ( $this->lang_id == 0 )
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 384
$db->_die('lang.php - BUG: trying to perform import when $lang->lang_id == 0');
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 385
507
586fd7d3202d
Fixed some stray version numbers (again!); added support for Diffie-Hellman logins in the normal login form (not AJAX) - even works in IE
Dan
diff
changeset
+ − 386
$block = pluginLoader::parse_plugin_blocks($file, 'language');
586fd7d3202d
Fixed some stray version numbers (again!); added support for Diffie-Hellman logins in the normal login form (not AJAX) - even works in IE
Dan
diff
changeset
+ − 387
if ( !is_array($block) )
586fd7d3202d
Fixed some stray version numbers (again!); added support for Diffie-Hellman logins in the normal login form (not AJAX) - even works in IE
Dan
diff
changeset
+ − 388
return false;
586fd7d3202d
Fixed some stray version numbers (again!); added support for Diffie-Hellman logins in the normal login form (not AJAX) - even works in IE
Dan
diff
changeset
+ − 389
if ( !isset($block[0]) )
586fd7d3202d
Fixed some stray version numbers (again!); added support for Diffie-Hellman logins in the normal login form (not AJAX) - even works in IE
Dan
diff
changeset
+ − 390
return false;
504
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 391
507
586fd7d3202d
Fixed some stray version numbers (again!); added support for Diffie-Hellman logins in the normal login form (not AJAX) - even works in IE
Dan
diff
changeset
+ − 392
$contents =& $block[0]['value'];
504
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 393
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 394
// Trim off all text before and after the starting and ending braces
519
94214ec0871c
Started work on the new plugin manager and associated management code. Very incomplete at this point and not usable.
Dan
diff
changeset
+ − 395
$contents = enano_trim_json($contents);
504
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 396
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 397
// Correct syntax to be nice to the json parser
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 398
$contents = enano_clean_json($contents);
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 399
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 400
try
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 401
{
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 402
$langdata = enano_json_decode($contents);
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 403
}
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 404
catch(Zend_Json_Exception $e)
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 405
{
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 406
$db->_die('lang.php - Exception caught by JSON parser</p><pre>' . htmlspecialchars(print_r($e, true)) . '</pre><p>');
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 407
exit;
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 408
}
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 409
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 410
if ( !is_array($langdata) )
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 411
{
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 412
$db->_die('lang.php - invalid or non-well-formed language file');
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 413
}
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 414
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 415
// Does the plugin support the current language?
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 416
if ( isset($langdata[$this->lang_code]) )
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 417
{
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 418
// Yes, import that
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 419
return $this->import_array($langdata[$this->lang_code]);
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 420
}
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 421
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 422
// Just import the first language we run across.
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 423
$supported_langs = array_keys($langdata);
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 424
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 425
if ( !isset($supported_langs[0]) )
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 426
{
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 427
$db->_die('lang.php - plugin has an invalid or corrupt language block');
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 428
}
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 429
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 430
$first_lang = $supported_langs[0];
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 431
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 432
return $this->import_array($langdata[$first_lang]);
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 433
}
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 434
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 435
/**
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 436
* Performs the actual import of string data.
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 437
* @param array Parsed JSON object, should be in the form of an array
514
+ − 438
* @param bool Enable debugging output
504
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 439
* @access private
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 440
*/
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 441
514
+ − 442
protected function import_array($langdata, $debug = false)
504
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 443
{
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 444
global $db, $session, $paths, $template, $plugins; // Common objects
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 445
205
+ − 446
if ( !isset($langdata['categories']) || !isset($langdata['strings']) )
+ − 447
$db->_die('lang.php - language file does not contain the proper items');
+ − 448
516
+ − 449
if ( $debug )
+ − 450
$br = ( isset($_SERVER['REQUEST_URI']) ) ? '<br />' : '';
+ − 451
205
+ − 452
$insert_list = array();
+ − 453
$delete_list = array();
+ − 454
+ − 455
foreach ( $langdata['categories'] as $category )
+ − 456
{
+ − 457
if ( isset($langdata['strings'][$category]) )
+ − 458
{
514
+ − 459
if ( $debug )
+ − 460
{
+ − 461
$desc = ( isset($langdata['strings']['meta'][$category]) ) ? $langdata['strings']['meta'][$category] : $this->get("meta_$category");
516
+ − 462
echo " Indexing category: $category ({$desc})$br\n";
514
+ − 463
}
205
+ − 464
foreach ( $langdata['strings'][$category] as $string_name => $string_value )
+ − 465
{
+ − 466
$string_name = $db->escape($string_name);
+ − 467
$string_value = $db->escape($string_value);
+ − 468
$category_name = $db->escape($category);
+ − 469
$insert_list[] = "({$this->lang_id}, '$category_name', '$string_name', '$string_value')";
+ − 470
$delete_list[] = "( lang_id = {$this->lang_id} AND string_category = '$category_name' AND string_name = '$string_name' )";
+ − 471
}
+ − 472
}
+ − 473
}
+ − 474
514
+ − 475
if ( $debug )
+ − 476
{
+ − 477
echo " Running deletion of old strings...";
+ − 478
$start = microtime_float();
+ − 479
}
205
+ − 480
$delete_list = implode(" OR\n ", $delete_list);
+ − 481
377
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 482
if ( !empty($delete_list) )
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 483
{
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 484
$sql = "DELETE FROM " . table_prefix . "language_strings WHERE $delete_list;";
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 485
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 486
// Free some memory
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 487
unset($delete_list);
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 488
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 489
// Run the query
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 490
$q = $db->sql_query($sql);
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 491
if ( !$q )
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 492
$db->_die('lang.php - couldn\'t kill off them old strings');
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 493
}
205
+ − 494
514
+ − 495
if ( $debug )
+ − 496
{
+ − 497
$time = round(microtime_float() - $start, 5);
516
+ − 498
echo "({$time}s)$br\n";
514
+ − 499
}
+ − 500
377
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 501
if ( !empty($insert_list) )
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 502
{
514
+ − 503
if ( $debug )
+ − 504
{
+ − 505
echo " Inserting strings...";
+ − 506
$start = microtime_float();
+ − 507
}
377
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 508
$insert_list = implode(",\n ", $insert_list);
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 509
$sql = "INSERT INTO " . table_prefix . "language_strings(lang_id, string_category, string_name, string_content) VALUES\n $insert_list;";
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 510
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 511
// Free some memory
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 512
unset($insert_list);
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 513
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 514
// Run the query
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 515
$q = $db->sql_query($sql);
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 516
if ( !$q )
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 517
$db->_die('lang.php - couldn\'t insert strings in import()');
514
+ − 518
+ − 519
if ( $debug )
+ − 520
{
+ − 521
$time = round(microtime_float() - $start, 5);
516
+ − 522
echo "({$time}s)$br\n";
514
+ − 523
}
377
bb3e6c3bd4f4
Removed stray debugging info from ACL editor success notification; added ability for guests to set language on URI (?lang=eng); added html_in_pages ACL type and separated from php_in_pages so HTML can be embedded but not PHP; rewote portions of the path manager to better abstract URL input; added Zend Framework into list of BSD-licensed libraries; localized some remaining strings; got the migration script working, but just barely; fixed display bug in Special:Contributions; localized Main Page button in admin panel
Dan
diff
changeset
+ − 524
}
205
+ − 525
+ − 526
// YAY! done!
+ − 527
// This will regenerate the cache file if possible.
514
+ − 528
if ( $debug )
516
+ − 529
echo " Regenerating cache file$br\n";
205
+ − 530
$this->regen_caches();
555
ac4c6a7f01d8
Added user preference for disabling visual effects in Javascript applets; added re-import button to installed plugins
Dan
diff
changeset
+ − 531
ac4c6a7f01d8
Added user preference for disabling visual effects in Javascript applets; added re-import button to installed plugins
Dan
diff
changeset
+ − 532
return true;
205
+ − 533
}
+ − 534
+ − 535
/**
+ − 536
* Refetches the strings and writes out the cache file.
+ − 537
*/
+ − 538
607
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 539
function regen_caches($refetch = true)
205
+ − 540
{
+ − 541
global $db, $session, $paths, $template, $plugins; // Common objects
+ − 542
+ − 543
// Refresh the strings in RAM to the latest copies in the DB
607
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 544
if ( $refetch )
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 545
$this->fetch(false);
205
+ − 546
607
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 547
// Load the cache manager
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 548
global $cache;
205
+ − 549
607
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 550
// Store it
935f3799b654
First stab at cache management backend. Everything seems to have been tested and working so far, but a number of things require a more specialized cache and can't go through the framework (e.g. user ranks which use references to map usernames to user IDs)
Dan
diff
changeset
+ − 551
$cache->store("lang_{$this->lang_id}", $this->strings, -1);
205
+ − 552
210
2b283402e4e4
Added language export to JSON page and localization for Javascript using $lang.get(). Localized AJAX login interface.
Dan
diff
changeset
+ − 553
// Update timestamp in database
2b283402e4e4
Added language export to JSON page and localization for Javascript using $lang.get(). Localized AJAX login interface.
Dan
diff
changeset
+ − 554
$q = $db->sql_query('UPDATE ' . table_prefix . 'language SET last_changed = ' . time() . ' WHERE lang_id = ' . $this->lang_id . ';');
2b283402e4e4
Added language export to JSON page and localization for Javascript using $lang.get(). Localized AJAX login interface.
Dan
diff
changeset
+ − 555
if ( !$q )
2b283402e4e4
Added language export to JSON page and localization for Javascript using $lang.get(). Localized AJAX login interface.
Dan
diff
changeset
+ − 556
$db->_die('lang.php - updating timestamp on language');
613
+ − 557
+ − 558
return true;
205
+ − 559
}
+ − 560
+ − 561
/**
+ − 562
* Calls var_export() on whatever, and returns the function's output.
+ − 563
* @param mixed Whatever you want var_exported. Usually an array.
+ − 564
* @return string
+ − 565
*/
+ − 566
590
03a60844c7c5
Several optimization changes including getting rid of a few eval()s. Added placeholder functions for the theme manager, which should be working now
Dan
diff
changeset
+ − 567
static function var_export_string($val)
205
+ − 568
{
+ − 569
ob_start();
+ − 570
var_export($val);
+ − 571
$contents = ob_get_contents();
+ − 572
ob_end_clean();
+ − 573
return $contents;
+ − 574
}
+ − 575
+ − 576
/**
+ − 577
* Fetches a language string from the cache in RAM. If it isn't there, it will call fetch() again and then try. If it still can't find it, it will ask for the string
+ − 578
* in the default language. If even then the string can't be found, this function will return what was passed to it.
+ − 579
*
+ − 580
* This will also templatize strings. If a string contains variables in the format %foo%, you may specify the second parameter as an associative array in the format
+ − 581
* of 'foo' => 'foo substitute'.
+ − 582
*
+ − 583
* @param string ID of the string to fetch. This will always be in the format of category_stringid.
+ − 584
* @param array Optional. Associative array of substitutions.
+ − 585
* @return string
+ − 586
*/
+ − 587
+ − 588
function get($string_id, $substitutions = false)
+ − 589
{
376
+ − 590
if ( !is_array($substitutions) )
+ − 591
$substitutions = array();
536
+ − 592
// if this isn't a valid language string ID, just return the string unprocessed.
+ − 593
if ( !preg_match('/^([a-z0-9]+)((_[a-z0-9]+)+)$/', $string_id) )
+ − 594
return $string_id;
376
+ − 595
return $this->substitute($this->get_uncensored($string_id), $substitutions);
+ − 596
}
+ − 597
+ − 598
/**
+ − 599
* The same as get(), but does not perform any substitution or filtering. Used in get() (of course) and in the admin panel, where
+ − 600
* strings are updated only if they were changed.
+ − 601
*
+ − 602
* @param string ID of the string to fetch. This will always be in the format of category_stringid.
+ − 603
* @param array Optional. Associative array of substitutions.
+ − 604
* @return string
+ − 605
*/
+ − 606
+ − 607
function get_uncensored($string_id, $substitutions = false)
+ − 608
{
205
+ − 609
// Extract the category and string ID
+ − 610
$category = substr($string_id, 0, ( strpos($string_id, '_') ));
+ − 611
$string_name = substr($string_id, ( strpos($string_id, '_') + 1 ));
+ − 612
$found = false;
+ − 613
if ( isset($this->strings[$category]) && isset($this->strings[$category][$string_name]) )
+ − 614
{
+ − 615
$found = true;
+ − 616
$string = $this->strings[$category][$string_name];
+ − 617
}
+ − 618
if ( !$found )
+ − 619
{
+ − 620
// Ehh, the string wasn't found. Rerun fetch() and try again.
536
+ − 621
// Or if it's the installer, no use in refetching, so just fail.
243
+ − 622
if ( defined('IN_ENANO_INSTALL') )
+ − 623
{
+ − 624
return $string_id;
+ − 625
}
205
+ − 626
$this->fetch();
593
4f9bec0d65c1
More optimization work. Moved special page init functions to common instead of common_post hook. Allowed paths to cache page metadata on filesystem. Phased out the redundancy in $paths->pages that paired a number with every urlname as foreach loops are allowed now (and have been for some time). Fixed missing includes for several functions. Rewrote str_replace_once to be a lot more efficient.
Dan
diff
changeset
+ − 627
profiler_log('Language(' . $this->lang_code . '): refetched due to missing string: ' . $string_id);
205
+ − 628
if ( isset($this->strings[$category]) && isset($this->strings[$category][$string_name]) )
+ − 629
{
+ − 630
$found = true;
+ − 631
$string = $this->strings[$category][$string_name];
+ − 632
}
+ − 633
if ( !$found )
+ − 634
{
+ − 635
// STILL not found. Check the default language.
+ − 636
$lang_default = ( $x = getConfig('default_language') ) ? intval($x) : $this->lang_id;
+ − 637
if ( $lang_default != $this->lang_id )
+ − 638
{
+ − 639
if ( !is_object($this->default) )
+ − 640
$this->default = new Language($lang_default);
376
+ − 641
return $this->default->get_uncensored($string_id);
205
+ − 642
}
+ − 643
}
+ − 644
}
+ − 645
if ( !$found )
+ − 646
{
+ − 647
// Alright, it's nowhere. Return the input, grumble grumble...
+ − 648
return $string_id;
+ − 649
}
+ − 650
// Found it!
376
+ − 651
return $string;
205
+ − 652
}
+ − 653
+ − 654
/**
+ − 655
* Processes substitutions.
+ − 656
* @param string
+ − 657
* @param array
+ − 658
* @return string
+ − 659
*/
+ − 660
+ − 661
function substitute($string, $subs)
+ − 662
{
+ − 663
preg_match_all('/%this\.([a-z0-9_]+)%/', $string, $matches);
+ − 664
if ( count($matches[0]) > 0 )
+ − 665
{
+ − 666
foreach ( $matches[1] as $i => $string_id )
+ − 667
{
+ − 668
$result = $this->get($string_id);
+ − 669
$string = str_replace($matches[0][$i], $result, $string);
+ − 670
}
+ − 671
}
209
+ − 672
preg_match_all('/%config\.([a-z0-9_]+)%/', $string, $matches);
+ − 673
if ( count($matches[0]) > 0 )
+ − 674
{
+ − 675
foreach ( $matches[1] as $i => $string_id )
+ − 676
{
+ − 677
$result = getConfig($string_id);
+ − 678
$string = str_replace($matches[0][$i], $result, $string);
+ − 679
}
+ − 680
}
205
+ − 681
foreach ( $subs as $key => $value )
+ − 682
{
209
+ − 683
$subs[$key] = strval($value);
+ − 684
$string = str_replace("%{$key}%", "{$subs[$key]}", $string);
205
+ − 685
}
504
bc8e0e9ee01d
Added support for embedding language data into plugins; updated all version numbers on plugin files
Dan
diff
changeset
+ − 686
return ( $this->debug ) ? "$string*" : $string;
205
+ − 687
}
+ − 688
+ − 689
} // class Language
+ − 690
+ − 691
?>