2004-04-04 11:26:29 +00:00
|
|
|
|
<?php
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
/**
|
2010-08-20 20:39:04 +00:00
|
|
|
|
* Internationalisation code
|
WARNING: HUGE COMMIT
Doxygen documentation update:
* Changed alls @addtogroup to @ingroup. @addtogroup adds the comment to the group description, but doesn't add the file, class, function, ... to the group like @ingroup does. See for example http://svn.wikimedia.org/doc/group__SpecialPage.html where it's impossible to see related files, classes, ... that should belong to that group.
* Added @file to file description, it seems that it should be explicitely decalred for file descriptions, otherwise doxygen will think that the comment document the first class, variabled, function, ... that is in that file.
* Removed some empty comments
* Removed some ?>
Added following groups:
* ExternalStorage
* JobQueue
* MaintenanceLanguage
One more thing: there are still a lot of warnings when generating the doc.
2008-05-20 17:13:28 +00:00
|
|
|
|
*
|
|
|
|
|
|
* @file
|
|
|
|
|
|
* @ingroup Language
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
*/
|
|
|
|
|
|
|
2010-08-20 20:39:04 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @defgroup Language Language
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( !defined( 'MEDIAWIKI' ) ) {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
echo "This file is part of MediaWiki, it is not a valid entry point.\n";
|
|
|
|
|
|
exit( 1 );
|
|
|
|
|
|
}
|
2004-08-06 21:19:24 +00:00
|
|
|
|
|
2004-06-11 04:50:29 +00:00
|
|
|
|
# Read language names
|
2007-09-11 15:22:53 +00:00
|
|
|
|
global $wgLanguageNames;
|
2010-04-08 20:19:03 +00:00
|
|
|
|
require_once( dirname( __FILE__ ) . '/Names.php' );
|
2003-04-14 23:10:40 +00:00
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
global $wgInputEncoding, $wgOutputEncoding;
|
2003-04-14 23:10:40 +00:00
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* These are always UTF-8, they exist only for backwards compatibility
|
|
|
|
|
|
*/
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$wgInputEncoding = 'UTF-8';
|
|
|
|
|
|
$wgOutputEncoding = 'UTF-8';
|
2003-04-14 23:10:40 +00:00
|
|
|
|
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( function_exists( 'mb_strtoupper' ) ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
mb_internal_encoding( 'UTF-8' );
|
2006-01-22 00:49:58 +00:00
|
|
|
|
}
|
2003-04-14 23:10:40 +00:00
|
|
|
|
|
WARNING: HUGE COMMIT
Doxygen documentation update:
* Changed alls @addtogroup to @ingroup. @addtogroup adds the comment to the group description, but doesn't add the file, class, function, ... to the group like @ingroup does. See for example http://svn.wikimedia.org/doc/group__SpecialPage.html where it's impossible to see related files, classes, ... that should belong to that group.
* Added @file to file description, it seems that it should be explicitely decalred for file descriptions, otherwise doxygen will think that the comment document the first class, variabled, function, ... that is in that file.
* Removed some empty comments
* Removed some ?>
Added following groups:
* ExternalStorage
* JobQueue
* MaintenanceLanguage
One more thing: there are still a lot of warnings when generating the doc.
2008-05-20 17:13:28 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* a fake language converter
|
|
|
|
|
|
*
|
|
|
|
|
|
* @ingroup Language
|
|
|
|
|
|
*/
|
2006-07-26 07:15:39 +00:00
|
|
|
|
class FakeConverter {
|
2006-05-11 22:40:38 +00:00
|
|
|
|
var $mLang;
|
2010-04-08 20:19:03 +00:00
|
|
|
|
function FakeConverter( $langobj ) { $this->mLang = $langobj; }
|
|
|
|
|
|
function autoConvertToAllVariants( $text ) { return $text; }
|
2010-04-10 13:38:50 +00:00
|
|
|
|
function convert( $t ) { return $t; }
|
|
|
|
|
|
function convertTitle( $t ) { return $t->getPrefixedText(); }
|
2005-07-06 07:53:51 +00:00
|
|
|
|
function getVariants() { return array( $this->mLang->getCode() ); }
|
2010-01-08 08:22:19 +00:00
|
|
|
|
function getPreferredVariant() { return $this->mLang->getCode(); }
|
2010-01-15 19:14:23 +00:00
|
|
|
|
function getConvRuleTitle() { return false; }
|
2010-07-29 09:43:18 +00:00
|
|
|
|
function findVariantLink( &$l, &$n, $ignoreOtherCond = false ) { }
|
2010-04-08 20:19:03 +00:00
|
|
|
|
function getExtraHashOptions() { return ''; }
|
|
|
|
|
|
function getParsedTitle() { return ''; }
|
|
|
|
|
|
function markNoConversion( $text, $noParse = false ) { return $text; }
|
|
|
|
|
|
function convertCategoryKey( $key ) { return $key; }
|
|
|
|
|
|
function convertLinkToAllVariants( $text ) { return array( $this->mLang->getCode() => $text ); }
|
|
|
|
|
|
function armourMath( $text ) { return $text; }
|
2005-04-15 14:12:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
WARNING: HUGE COMMIT
Doxygen documentation update:
* Changed alls @addtogroup to @ingroup. @addtogroup adds the comment to the group description, but doesn't add the file, class, function, ... to the group like @ingroup does. See for example http://svn.wikimedia.org/doc/group__SpecialPage.html where it's impossible to see related files, classes, ... that should belong to that group.
* Added @file to file description, it seems that it should be explicitely decalred for file descriptions, otherwise doxygen will think that the comment document the first class, variabled, function, ... that is in that file.
* Removed some empty comments
* Removed some ?>
Added following groups:
* ExternalStorage
* JobQueue
* MaintenanceLanguage
One more thing: there are still a lot of warnings when generating the doc.
2008-05-20 17:13:28 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Internationalisation code
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @ingroup Language
|
WARNING: HUGE COMMIT
Doxygen documentation update:
* Changed alls @addtogroup to @ingroup. @addtogroup adds the comment to the group description, but doesn't add the file, class, function, ... to the group like @ingroup does. See for example http://svn.wikimedia.org/doc/group__SpecialPage.html where it's impossible to see related files, classes, ... that should belong to that group.
* Added @file to file description, it seems that it should be explicitely decalred for file descriptions, otherwise doxygen will think that the comment document the first class, variabled, function, ... that is in that file.
* Removed some empty comments
* Removed some ?>
Added following groups:
* ExternalStorage
* JobQueue
* MaintenanceLanguage
One more thing: there are still a lot of warnings when generating the doc.
2008-05-20 17:13:28 +00:00
|
|
|
|
*/
|
2003-04-14 23:10:40 +00:00
|
|
|
|
class Language {
|
2009-01-29 08:59:53 +00:00
|
|
|
|
var $mConverter, $mVariants, $mCode, $mLoaded = false;
|
2007-09-04 02:48:34 +00:00
|
|
|
|
var $mMagicExtensions = array(), $mMagicHookDone = false;
|
2006-07-26 07:15:39 +00:00
|
|
|
|
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
var $mNamespaceIds, $namespaceNames, $namespaceAliases;
|
|
|
|
|
|
var $dateFormatStrings = array();
|
|
|
|
|
|
var $mExtendedSpecialPageAliases;
|
2006-07-26 07:15:39 +00:00
|
|
|
|
|
2010-01-04 08:28:50 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* ReplacementArray object caches
|
|
|
|
|
|
*/
|
|
|
|
|
|
var $transformData = array();
|
|
|
|
|
|
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
static public $dataCache;
|
2008-11-11 23:26:07 +00:00
|
|
|
|
static public $mLangObjCache = array();
|
2006-07-26 07:15:39 +00:00
|
|
|
|
|
|
|
|
|
|
static public $mWeekdayMsgs = array(
|
|
|
|
|
|
'sunday', 'monday', 'tuesday', 'wednesday', 'thursday',
|
|
|
|
|
|
'friday', 'saturday'
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
static public $mWeekdayAbbrevMsgs = array(
|
|
|
|
|
|
'sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
static public $mMonthMsgs = array(
|
|
|
|
|
|
'january', 'february', 'march', 'april', 'may_long', 'june',
|
|
|
|
|
|
'july', 'august', 'september', 'october', 'november',
|
|
|
|
|
|
'december'
|
|
|
|
|
|
);
|
|
|
|
|
|
static public $mMonthGenMsgs = array(
|
|
|
|
|
|
'january-gen', 'february-gen', 'march-gen', 'april-gen', 'may-gen', 'june-gen',
|
|
|
|
|
|
'july-gen', 'august-gen', 'september-gen', 'october-gen', 'november-gen',
|
|
|
|
|
|
'december-gen'
|
|
|
|
|
|
);
|
|
|
|
|
|
static public $mMonthAbbrevMsgs = array(
|
|
|
|
|
|
'jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug',
|
|
|
|
|
|
'sep', 'oct', 'nov', 'dec'
|
|
|
|
|
|
);
|
|
|
|
|
|
|
2007-11-13 04:05:13 +00:00
|
|
|
|
static public $mIranianCalendarMonthMsgs = array(
|
|
|
|
|
|
'iranian-calendar-m1', 'iranian-calendar-m2', 'iranian-calendar-m3',
|
|
|
|
|
|
'iranian-calendar-m4', 'iranian-calendar-m5', 'iranian-calendar-m6',
|
|
|
|
|
|
'iranian-calendar-m7', 'iranian-calendar-m8', 'iranian-calendar-m9',
|
|
|
|
|
|
'iranian-calendar-m10', 'iranian-calendar-m11', 'iranian-calendar-m12'
|
|
|
|
|
|
);
|
|
|
|
|
|
|
2007-11-13 17:17:07 +00:00
|
|
|
|
static public $mHebrewCalendarMonthMsgs = array(
|
|
|
|
|
|
'hebrew-calendar-m1', 'hebrew-calendar-m2', 'hebrew-calendar-m3',
|
|
|
|
|
|
'hebrew-calendar-m4', 'hebrew-calendar-m5', 'hebrew-calendar-m6',
|
|
|
|
|
|
'hebrew-calendar-m7', 'hebrew-calendar-m8', 'hebrew-calendar-m9',
|
|
|
|
|
|
'hebrew-calendar-m10', 'hebrew-calendar-m11', 'hebrew-calendar-m12',
|
|
|
|
|
|
'hebrew-calendar-m6a', 'hebrew-calendar-m6b'
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
static public $mHebrewCalendarMonthGenMsgs = array(
|
|
|
|
|
|
'hebrew-calendar-m1-gen', 'hebrew-calendar-m2-gen', 'hebrew-calendar-m3-gen',
|
|
|
|
|
|
'hebrew-calendar-m4-gen', 'hebrew-calendar-m5-gen', 'hebrew-calendar-m6-gen',
|
|
|
|
|
|
'hebrew-calendar-m7-gen', 'hebrew-calendar-m8-gen', 'hebrew-calendar-m9-gen',
|
|
|
|
|
|
'hebrew-calendar-m10-gen', 'hebrew-calendar-m11-gen', 'hebrew-calendar-m12-gen',
|
|
|
|
|
|
'hebrew-calendar-m6a-gen', 'hebrew-calendar-m6b-gen'
|
|
|
|
|
|
);
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2008-06-19 14:46:50 +00:00
|
|
|
|
static public $mHijriCalendarMonthMsgs = array(
|
|
|
|
|
|
'hijri-calendar-m1', 'hijri-calendar-m2', 'hijri-calendar-m3',
|
|
|
|
|
|
'hijri-calendar-m4', 'hijri-calendar-m5', 'hijri-calendar-m6',
|
|
|
|
|
|
'hijri-calendar-m7', 'hijri-calendar-m8', 'hijri-calendar-m9',
|
|
|
|
|
|
'hijri-calendar-m10', 'hijri-calendar-m11', 'hijri-calendar-m12'
|
|
|
|
|
|
);
|
2007-11-13 17:17:07 +00:00
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
/**
|
2008-11-12 00:11:10 +00:00
|
|
|
|
* Get a cached language object for a given language code
|
2006-07-26 07:15:39 +00:00
|
|
|
|
*/
|
|
|
|
|
|
static function factory( $code ) {
|
2008-11-12 00:11:10 +00:00
|
|
|
|
if ( !isset( self::$mLangObjCache[$code] ) ) {
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( count( self::$mLangObjCache ) > 10 ) {
|
2008-11-25 19:38:22 +00:00
|
|
|
|
// Don't keep a billion objects around, that's stupid.
|
|
|
|
|
|
self::$mLangObjCache = array();
|
|
|
|
|
|
}
|
2008-11-12 00:11:10 +00:00
|
|
|
|
self::$mLangObjCache[$code] = self::newFromCode( $code );
|
2008-11-11 23:26:07 +00:00
|
|
|
|
}
|
2008-11-12 00:11:10 +00:00
|
|
|
|
return self::$mLangObjCache[$code];
|
|
|
|
|
|
}
|
2008-11-11 23:26:07 +00:00
|
|
|
|
|
2008-11-12 00:11:10 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Create a language object for a given language code
|
|
|
|
|
|
*/
|
|
|
|
|
|
protected static function newFromCode( $code ) {
|
|
|
|
|
|
global $IP;
|
|
|
|
|
|
static $recursionLevel = 0;
|
2006-07-26 07:15:39 +00:00
|
|
|
|
if ( $code == 'en' ) {
|
|
|
|
|
|
$class = 'Language';
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$class = 'Language' . str_replace( '-', '_', ucfirst( $code ) );
|
|
|
|
|
|
// Preload base classes to work around APC/PHP5 bug
|
2006-10-04 01:39:28 +00:00
|
|
|
|
if ( file_exists( "$IP/languages/classes/$class.deps.php" ) ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
include_once( "$IP/languages/classes/$class.deps.php" );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
2006-10-04 01:39:28 +00:00
|
|
|
|
if ( file_exists( "$IP/languages/classes/$class.php" ) ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
include_once( "$IP/languages/classes/$class.php" );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2006-08-02 17:31:01 +00:00
|
|
|
|
if ( $recursionLevel > 5 ) {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
throw new MWException( "Language fallback loop detected when creating class $class\n" );
|
2010-01-11 04:23:41 +00:00
|
|
|
|
}
|
2006-07-26 07:15:39 +00:00
|
|
|
|
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( !class_exists( $class ) ) {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
$fallback = Language::getFallbackFor( $code );
|
|
|
|
|
|
++$recursionLevel;
|
2008-11-12 00:11:10 +00:00
|
|
|
|
$lang = Language::newFromCode( $fallback );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
--$recursionLevel;
|
|
|
|
|
|
$lang->setCode( $code );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$lang = new $class;
|
|
|
|
|
|
}
|
|
|
|
|
|
return $lang;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2009-07-03 06:55:30 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Get the LocalisationCache instance
|
|
|
|
|
|
*/
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
public static function getLocalisationCache() {
|
|
|
|
|
|
if ( is_null( self::$dataCache ) ) {
|
|
|
|
|
|
global $wgLocalisationCacheConf;
|
|
|
|
|
|
$class = $wgLocalisationCacheConf['class'];
|
|
|
|
|
|
self::$dataCache = new $class( $wgLocalisationCacheConf );
|
|
|
|
|
|
}
|
|
|
|
|
|
return self::$dataCache;
|
2009-07-03 06:55:30 +00:00
|
|
|
|
}
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
|
2006-06-24 18:48:58 +00:00
|
|
|
|
function __construct() {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$this->mConverter = new FakeConverter( $this );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
// Set the code to the name of the descendant
|
|
|
|
|
|
if ( get_class( $this ) == 'Language' ) {
|
|
|
|
|
|
$this->mCode = 'en';
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$this->mCode = str_replace( '_', '-', strtolower( substr( get_class( $this ), 8 ) ) );
|
|
|
|
|
|
}
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
self::getLocalisationCache();
|
2004-02-01 22:00:06 +00:00
|
|
|
|
}
|
2005-07-03 07:15:53 +00:00
|
|
|
|
|
2008-08-26 14:37:15 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Reduce memory usage
|
|
|
|
|
|
*/
|
|
|
|
|
|
function __destruct() {
|
|
|
|
|
|
foreach ( $this as $name => $value ) {
|
|
|
|
|
|
unset( $this->$name );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
/**
|
2006-07-26 07:15:39 +00:00
|
|
|
|
* Hook which will be called if this is the content language.
|
|
|
|
|
|
* Descendants can use this to register hook functions or modify globals
|
|
|
|
|
|
*/
|
2010-07-29 09:43:18 +00:00
|
|
|
|
function initContLang() { }
|
2006-07-26 07:15:39 +00:00
|
|
|
|
|
|
|
|
|
|
/**
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @deprecated Use User::getDefaultOptions()
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
* @return array
|
|
|
|
|
|
*/
|
|
|
|
|
|
function getDefaultUserOptions() {
|
2008-05-21 18:18:58 +00:00
|
|
|
|
wfDeprecated( __METHOD__ );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
return User::getDefaultOptions();
|
2004-02-29 08:51:15 +00:00
|
|
|
|
}
|
2005-07-03 07:15:53 +00:00
|
|
|
|
|
2007-01-20 15:31:32 +00:00
|
|
|
|
function getFallbackLanguageCode() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
if ( $this->mCode === 'en' ) {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'fallback' );
|
|
|
|
|
|
}
|
2007-01-20 15:31:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Exports $wgBookstoreListEn
|
|
|
|
|
|
* @return array
|
|
|
|
|
|
*/
|
|
|
|
|
|
function getBookstoreList() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'bookstoreList' );
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
2005-07-03 07:15:53 +00:00
|
|
|
|
|
2005-04-07 19:05:42 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @return array
|
|
|
|
|
|
*/
|
2003-04-14 23:10:40 +00:00
|
|
|
|
function getNamespaces() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
if ( is_null( $this->namespaceNames ) ) {
|
2010-08-21 08:05:16 +00:00
|
|
|
|
global $wgMetaNamespace, $wgMetaNamespaceTalk, $wgExtraNamespaces;
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
$this->namespaceNames = self::$dataCache->getItem( $this->mCode, 'namespaceNames' );
|
2010-08-20 10:25:10 +00:00
|
|
|
|
$validNamespaces = MWNamespace::getCanonicalNamespaces();
|
|
|
|
|
|
|
2010-08-21 08:05:16 +00:00
|
|
|
|
$this->namespaceNames = $wgExtraNamespaces + $this->namespaceNames + $validNamespaces;
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
|
|
|
|
|
|
$this->namespaceNames[NS_PROJECT] = $wgMetaNamespace;
|
|
|
|
|
|
if ( $wgMetaNamespaceTalk ) {
|
|
|
|
|
|
$this->namespaceNames[NS_PROJECT_TALK] = $wgMetaNamespaceTalk;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$talk = $this->namespaceNames[NS_PROJECT_TALK];
|
|
|
|
|
|
$this->namespaceNames[NS_PROJECT_TALK] =
|
|
|
|
|
|
$this->fixVariableInNamespace( $talk );
|
|
|
|
|
|
}
|
2010-08-20 05:32:24 +00:00
|
|
|
|
|
|
|
|
|
|
# Sometimes a language will be localised but not actually exist on this wiki.
|
|
|
|
|
|
foreach( $this->namespaceNames as $key => $text ) {
|
2010-08-20 10:25:10 +00:00
|
|
|
|
if ( !isset( $validNamespaces[$key] ) ) {
|
|
|
|
|
|
unset( $this->namespaceNames[$key] );
|
|
|
|
|
|
}
|
2010-08-20 05:32:24 +00:00
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
# The above mixing may leave namespaces out of canonical order.
|
|
|
|
|
|
# Re-order by namespace ID number...
|
|
|
|
|
|
ksort( $this->namespaceNames );
|
|
|
|
|
|
}
|
2006-07-26 07:15:39 +00:00
|
|
|
|
return $this->namespaceNames;
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
2005-05-03 12:27:30 +00:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* A convenience function that returns the same thing as
|
|
|
|
|
|
* getNamespaces() except with the array values changed to ' '
|
|
|
|
|
|
* where it found '_', useful for producing output to be displayed
|
|
|
|
|
|
* e.g. in <select> forms.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return array
|
|
|
|
|
|
*/
|
|
|
|
|
|
function getFormattedNamespaces() {
|
|
|
|
|
|
$ns = $this->getNamespaces();
|
2010-07-29 09:43:18 +00:00
|
|
|
|
foreach ( $ns as $k => $v ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$ns[$k] = strtr( $v, '_', ' ' );
|
2005-05-03 12:27:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
return $ns;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Get a namespace value by key
|
|
|
|
|
|
* <code>
|
|
|
|
|
|
* $mw_ns = $wgContLang->getNsText( NS_MEDIAWIKI );
|
|
|
|
|
|
* echo $mw_ns; // prints 'MediaWiki'
|
|
|
|
|
|
* </code>
|
|
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $index Int: the array key of the namespace to return
|
2005-06-18 04:06:54 +00:00
|
|
|
|
* @return mixed, string if the namespace value exists, otherwise false
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
*/
|
2003-04-14 23:10:40 +00:00
|
|
|
|
function getNsText( $index ) {
|
2005-06-18 04:06:54 +00:00
|
|
|
|
$ns = $this->getNamespaces();
|
|
|
|
|
|
return isset( $ns[$index] ) ? $ns[$index] : false;
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
2005-07-03 07:15:53 +00:00
|
|
|
|
|
2005-05-03 12:27:30 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* A convenience function that returns the same thing as
|
|
|
|
|
|
* getNsText() except with '_' changed to ' ', useful for
|
|
|
|
|
|
* producing output.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return array
|
|
|
|
|
|
*/
|
|
|
|
|
|
function getFormattedNsText( $index ) {
|
|
|
|
|
|
$ns = $this->getNsText( $index );
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return strtr( $ns, '_', ' ' );
|
2005-05-03 12:27:30 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
/**
|
2007-04-19 18:47:04 +00:00
|
|
|
|
* Get a namespace key by value, case insensitive.
|
|
|
|
|
|
* Only matches namespace names for the current language, not the
|
|
|
|
|
|
* canonical ones defined in Namespace.php.
|
|
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $text String
|
2007-04-19 18:47:04 +00:00
|
|
|
|
* @return mixed An integer if $text is a valid value otherwise false
|
|
|
|
|
|
*/
|
|
|
|
|
|
function getLocalNsIndex( $text ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$lctext = $this->lc( $text );
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
$ids = $this->getNamespaceIds();
|
|
|
|
|
|
return isset( $ids[$lctext] ) ? $ids[$lctext] : false;
|
2007-04-19 18:47:04 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
function getNamespaceAliases() {
|
|
|
|
|
|
if ( is_null( $this->namespaceAliases ) ) {
|
|
|
|
|
|
$aliases = self::$dataCache->getItem( $this->mCode, 'namespaceAliases' );
|
|
|
|
|
|
if ( !$aliases ) {
|
|
|
|
|
|
$aliases = array();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
foreach ( $aliases as $name => $index ) {
|
|
|
|
|
|
if ( $index === NS_PROJECT_TALK ) {
|
|
|
|
|
|
unset( $aliases[$name] );
|
|
|
|
|
|
$name = $this->fixVariableInNamespace( $name );
|
|
|
|
|
|
$aliases[$name] = $index;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
$this->namespaceAliases = $aliases;
|
|
|
|
|
|
}
|
|
|
|
|
|
return $this->namespaceAliases;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function getNamespaceIds() {
|
|
|
|
|
|
if ( is_null( $this->mNamespaceIds ) ) {
|
|
|
|
|
|
global $wgNamespaceAliases;
|
|
|
|
|
|
# Put namespace names and aliases into a hashtable.
|
2010-01-11 04:23:41 +00:00
|
|
|
|
# If this is too slow, then we should arrange it so that it is done
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
# before caching. The catch is that at pre-cache time, the above
|
|
|
|
|
|
# class-specific fixup hasn't been done.
|
|
|
|
|
|
$this->mNamespaceIds = array();
|
|
|
|
|
|
foreach ( $this->getNamespaces() as $index => $name ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$this->mNamespaceIds[$this->lc( $name )] = $index;
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
foreach ( $this->getNamespaceAliases() as $name => $index ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$this->mNamespaceIds[$this->lc( $name )] = $index;
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
if ( $wgNamespaceAliases ) {
|
|
|
|
|
|
foreach ( $wgNamespaceAliases as $name => $index ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$this->mNamespaceIds[$this->lc( $name )] = $index;
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return $this->mNamespaceIds;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2007-04-19 18:47:04 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Get a namespace key by value, case insensitive. Canonical namespace
|
|
|
|
|
|
* names override custom ones defined for the current language.
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $text String
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
* @return mixed An integer if $text is a valid value otherwise false
|
|
|
|
|
|
*/
|
2003-04-14 23:10:40 +00:00
|
|
|
|
function getNsIndex( $text ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$lctext = $this->lc( $text );
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
if ( ( $ns = MWNamespace::getCanonicalIndex( $lctext ) ) !== null ) {
|
|
|
|
|
|
return $ns;
|
|
|
|
|
|
}
|
|
|
|
|
|
$ids = $this->getNamespaceIds();
|
|
|
|
|
|
return isset( $ids[$lctext] ) ? $ids[$lctext] : false;
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
/**
|
2005-07-03 07:15:53 +00:00
|
|
|
|
* short names for language variants used for language conversion links.
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $code String
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
2004-12-24 02:47:38 +00:00
|
|
|
|
function getVariantname( $code ) {
|
2006-08-06 18:32:12 +00:00
|
|
|
|
return $this->getMessageFromDB( "variantname-$code" );
|
2004-12-24 02:47:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2003-04-14 23:10:40 +00:00
|
|
|
|
function specialPage( $name ) {
|
2006-10-30 06:25:31 +00:00
|
|
|
|
$aliases = $this->getSpecialPageAliases();
|
|
|
|
|
|
if ( isset( $aliases[$name][0] ) ) {
|
|
|
|
|
|
$name = $aliases[$name][0];
|
|
|
|
|
|
}
|
2008-12-25 18:00:26 +00:00
|
|
|
|
return $this->getNsText( NS_SPECIAL ) . ':' . $name;
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function getQuickbarSettings() {
|
2007-02-22 11:28:05 +00:00
|
|
|
|
return array(
|
|
|
|
|
|
$this->getMessage( 'qbsettings-none' ),
|
|
|
|
|
|
$this->getMessage( 'qbsettings-fixedleft' ),
|
|
|
|
|
|
$this->getMessage( 'qbsettings-fixedright' ),
|
|
|
|
|
|
$this->getMessage( 'qbsettings-floatingleft' ),
|
|
|
|
|
|
$this->getMessage( 'qbsettings-floatingright' )
|
|
|
|
|
|
);
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function getMathNames() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'mathNames' );
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
2004-07-08 15:40:27 +00:00
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
function getDatePreferences() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'datePreferences' );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2003-07-01 12:56:55 +00:00
|
|
|
|
function getDateFormats() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'dateFormats' );
|
2003-07-01 12:56:55 +00:00
|
|
|
|
}
|
2003-04-14 23:10:40 +00:00
|
|
|
|
|
2006-08-10 08:00:53 +00:00
|
|
|
|
function getDefaultDateFormat() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
$df = self::$dataCache->getItem( $this->mCode, 'defaultDateFormat' );
|
|
|
|
|
|
if ( $df === 'dmy or mdy' ) {
|
|
|
|
|
|
global $wgAmericanDates;
|
|
|
|
|
|
return $wgAmericanDates ? 'mdy' : 'dmy';
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return $df;
|
|
|
|
|
|
}
|
2006-08-10 08:00:53 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
function getDatePreferenceMigrationMap() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'datePreferenceMigrationMap' );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2008-07-04 10:34:41 +00:00
|
|
|
|
function getImageFile( $image ) {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getSubitem( $this->mCode, 'imageFiles', $image );
|
2008-07-04 10:34:41 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
function getDefaultUserOptionOverrides() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'defaultUserOptionOverrides' );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function getExtraUserToggles() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'extraUserToggles' );
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
2004-07-08 15:40:27 +00:00
|
|
|
|
|
2004-04-09 08:27:00 +00:00
|
|
|
|
function getUserToggle( $tog ) {
|
2006-08-06 18:32:12 +00:00
|
|
|
|
return $this->getMessageFromDB( "tog-$tog" );
|
2004-04-09 08:27:00 +00:00
|
|
|
|
}
|
2003-04-14 23:10:40 +00:00
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Get language names, indexed by code.
|
|
|
|
|
|
* If $customisedOnly is true, only returns codes with a messages file
|
|
|
|
|
|
*/
|
2006-12-16 22:03:49 +00:00
|
|
|
|
public static function getLanguageNames( $customisedOnly = false ) {
|
2007-12-06 16:49:48 +00:00
|
|
|
|
global $wgLanguageNames, $wgExtraLanguageNames;
|
|
|
|
|
|
$allNames = $wgExtraLanguageNames + $wgLanguageNames;
|
2006-07-26 07:15:39 +00:00
|
|
|
|
if ( !$customisedOnly ) {
|
2007-12-06 16:49:48 +00:00
|
|
|
|
return $allNames;
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
global $IP;
|
|
|
|
|
|
$names = array();
|
2007-08-08 23:08:54 +00:00
|
|
|
|
$dir = opendir( "$IP/languages/messages" );
|
2010-07-29 09:43:18 +00:00
|
|
|
|
while ( false !== ( $file = readdir( $dir ) ) ) {
|
2010-01-06 10:20:38 +00:00
|
|
|
|
$code = self::getCodeFromFileName( $file, 'Messages' );
|
|
|
|
|
|
if ( $code && isset( $allNames[$code] ) ) {
|
|
|
|
|
|
$names[$code] = $allNames[$code];
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2007-08-08 23:08:54 +00:00
|
|
|
|
closedir( $dir );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
return $names;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2008-09-30 19:03:22 +00:00
|
|
|
|
* Get a message from the MediaWiki namespace.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param $msg String: message name
|
|
|
|
|
|
* @return string
|
2006-07-26 07:15:39 +00:00
|
|
|
|
*/
|
|
|
|
|
|
function getMessageFromDB( $msg ) {
|
2008-09-30 19:03:22 +00:00
|
|
|
|
return wfMsgExt( $msg, array( 'parsemag', 'language' => $this ) );
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2009-01-17 08:56:27 +00:00
|
|
|
|
function getLanguageName( $code ) {
|
2007-12-06 16:49:48 +00:00
|
|
|
|
$names = self::getLanguageNames();
|
|
|
|
|
|
if ( !array_key_exists( $code, $names ) ) {
|
2005-06-27 02:20:50 +00:00
|
|
|
|
return '';
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
2009-01-17 08:56:27 +00:00
|
|
|
|
return $names[$code];
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2004-11-21 07:36:46 +00:00
|
|
|
|
function getMonthName( $key ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return $this->getMessageFromDB( self::$mMonthMsgs[$key - 1] );
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
2004-07-08 15:40:27 +00:00
|
|
|
|
|
2004-11-21 07:36:46 +00:00
|
|
|
|
function getMonthNameGen( $key ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return $this->getMessageFromDB( self::$mMonthGenMsgs[$key - 1] );
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2004-11-21 07:36:46 +00:00
|
|
|
|
function getMonthAbbreviation( $key ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return $this->getMessageFromDB( self::$mMonthAbbrevMsgs[$key - 1] );
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2004-11-21 07:36:46 +00:00
|
|
|
|
function getWeekdayName( $key ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return $this->getMessageFromDB( self::$mWeekdayMsgs[$key - 1] );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function getWeekdayAbbreviation( $key ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return $this->getMessageFromDB( self::$mWeekdayAbbrevMsgs[$key - 1] );
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2007-11-13 04:05:13 +00:00
|
|
|
|
function getIranianCalendarMonthName( $key ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return $this->getMessageFromDB( self::$mIranianCalendarMonthMsgs[$key - 1] );
|
2007-11-13 04:05:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2007-11-13 17:17:07 +00:00
|
|
|
|
function getHebrewCalendarMonthName( $key ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return $this->getMessageFromDB( self::$mHebrewCalendarMonthMsgs[$key - 1] );
|
2007-11-13 17:17:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function getHebrewCalendarMonthNameGen( $key ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return $this->getMessageFromDB( self::$mHebrewCalendarMonthGenMsgs[$key - 1] );
|
2007-11-13 17:17:07 +00:00
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2008-06-19 14:46:50 +00:00
|
|
|
|
function getHijriCalendarMonthName( $key ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return $this->getMessageFromDB( self::$mHijriCalendarMonthMsgs[$key - 1] );
|
2008-06-19 14:46:50 +00:00
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2005-04-04 22:58:18 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Used by date() and time() to adjust the time output.
|
2008-05-21 18:18:58 +00:00
|
|
|
|
*
|
|
|
|
|
|
* @param $ts Int the time in date('YmdHis') format
|
|
|
|
|
|
* @param $tz Mixed: adjust the time by this amount (default false, mean we
|
|
|
|
|
|
* get user timecorrection setting)
|
2005-04-04 22:58:18 +00:00
|
|
|
|
* @return int
|
|
|
|
|
|
*/
|
2004-12-18 03:47:11 +00:00
|
|
|
|
function userAdjust( $ts, $tz = false ) {
|
2007-03-27 19:39:37 +00:00
|
|
|
|
global $wgUser, $wgLocalTZoffset;
|
2004-07-08 15:40:27 +00:00
|
|
|
|
|
2008-12-22 21:55:09 +00:00
|
|
|
|
if ( $tz === false ) {
|
2005-04-01 11:09:47 +00:00
|
|
|
|
$tz = $wgUser->getOption( 'timecorrection' );
|
2004-12-18 03:47:11 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2008-12-22 21:55:09 +00:00
|
|
|
|
$data = explode( '|', $tz, 3 );
|
2006-04-19 17:57:15 +00:00
|
|
|
|
|
2008-12-22 21:55:09 +00:00
|
|
|
|
if ( $data[0] == 'ZoneInfo' ) {
|
|
|
|
|
|
if ( function_exists( 'timezone_open' ) && @timezone_open( $data[2] ) !== false ) {
|
|
|
|
|
|
$date = date_create( $ts, timezone_open( 'UTC' ) );
|
|
|
|
|
|
date_timezone_set( $date, timezone_open( $data[2] ) );
|
|
|
|
|
|
$date = date_format( $date, 'YmdHis' );
|
|
|
|
|
|
return $date;
|
2006-04-30 12:20:20 +00:00
|
|
|
|
}
|
2008-12-22 21:55:09 +00:00
|
|
|
|
# Unrecognized timezone, default to 'Offset' with the stored offset.
|
|
|
|
|
|
$data[0] = 'Offset';
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$minDiff = 0;
|
|
|
|
|
|
if ( $data[0] == 'System' || $tz == '' ) {
|
2010-07-29 09:43:18 +00:00
|
|
|
|
# Global offset in minutes.
|
|
|
|
|
|
if ( isset( $wgLocalTZoffset ) ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$minDiff = $wgLocalTZoffset;
|
|
|
|
|
|
}
|
2008-12-22 21:55:09 +00:00
|
|
|
|
} else if ( $data[0] == 'Offset' ) {
|
|
|
|
|
|
$minDiff = intval( $data[1] );
|
2004-01-26 02:55:07 +00:00
|
|
|
|
} else {
|
2008-12-22 21:55:09 +00:00
|
|
|
|
$data = explode( ':', $tz );
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( count( $data ) == 2 ) {
|
2008-12-22 21:55:09 +00:00
|
|
|
|
$data[0] = intval( $data[0] );
|
|
|
|
|
|
$data[1] = intval( $data[1] );
|
|
|
|
|
|
$minDiff = abs( $data[0] ) * 60 + $data[1];
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( $data[0] < 0 ) {
|
|
|
|
|
|
$minDiff = -$minDiff;
|
|
|
|
|
|
}
|
2008-12-22 21:55:09 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
$minDiff = intval( $data[0] ) * 60;
|
|
|
|
|
|
}
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
2006-04-19 17:57:15 +00:00
|
|
|
|
|
|
|
|
|
|
# No difference ? Return time unchanged
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( 0 == $minDiff ) {
|
|
|
|
|
|
return $ts;
|
|
|
|
|
|
}
|
2004-01-26 02:55:07 +00:00
|
|
|
|
|
2007-06-20 22:25:39 +00:00
|
|
|
|
wfSuppressWarnings(); // E_STRICT system time bitching
|
2008-12-22 21:55:09 +00:00
|
|
|
|
# Generate an adjusted date; take advantage of the fact that mktime
|
2010-01-11 04:23:41 +00:00
|
|
|
|
# will normalize out-of-range values so we don't have to split $minDiff
|
2008-12-22 21:55:09 +00:00
|
|
|
|
# into hours and minutes.
|
2004-07-08 15:40:27 +00:00
|
|
|
|
$t = mktime( (
|
2010-07-29 09:43:18 +00:00
|
|
|
|
(int)substr( $ts, 8, 2 ) ), # Hours
|
2004-01-26 02:55:07 +00:00
|
|
|
|
(int)substr( $ts, 10, 2 ) + $minDiff, # Minutes
|
|
|
|
|
|
(int)substr( $ts, 12, 2 ), # Seconds
|
|
|
|
|
|
(int)substr( $ts, 4, 2 ), # Month
|
|
|
|
|
|
(int)substr( $ts, 6, 2 ), # Day
|
2010-07-29 09:43:18 +00:00
|
|
|
|
(int)substr( $ts, 0, 4 ) ); # Year
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2007-06-20 20:33:44 +00:00
|
|
|
|
$date = date( 'YmdHis', $t );
|
2007-06-20 22:25:39 +00:00
|
|
|
|
wfRestoreWarnings();
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2007-06-20 20:33:44 +00:00
|
|
|
|
return $date;
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
2005-07-03 07:15:53 +00:00
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* This is a workalike of PHP's date() function, but with better
|
2010-01-11 04:23:41 +00:00
|
|
|
|
* internationalisation, a reduced set of format characters, and a better
|
2006-07-26 07:15:39 +00:00
|
|
|
|
* escaping format.
|
|
|
|
|
|
*
|
2010-01-11 04:23:41 +00:00
|
|
|
|
* Supported format characters are dDjlNwzWFmMntLoYyaAgGhHiscrU. See the
|
2008-12-30 22:51:05 +00:00
|
|
|
|
* PHP manual for definitions. "o" format character is supported since
|
|
|
|
|
|
* PHP 5.1.0, previous versions return literal o.
|
|
|
|
|
|
* There are a number of extensions, which start with "x":
|
2006-07-26 07:15:39 +00:00
|
|
|
|
*
|
|
|
|
|
|
* xn Do not translate digits of the next numeric format character
|
2006-09-25 05:59:00 +00:00
|
|
|
|
* xN Toggle raw digit (xn) flag, stays set until explicitly unset
|
2006-07-26 07:15:39 +00:00
|
|
|
|
* xr Use roman numerals for the next numeric format character
|
2007-11-13 17:17:07 +00:00
|
|
|
|
* xh Use hebrew numerals for the next numeric format character
|
2006-07-26 07:15:39 +00:00
|
|
|
|
* xx Literal x
|
|
|
|
|
|
* xg Genitive month name
|
|
|
|
|
|
*
|
2007-11-13 04:05:13 +00:00
|
|
|
|
* xij j (day number) in Iranian calendar
|
|
|
|
|
|
* xiF F (month name) in Iranian calendar
|
|
|
|
|
|
* xin n (month number) in Iranian calendar
|
|
|
|
|
|
* xiY Y (full year) in Iranian calendar
|
|
|
|
|
|
*
|
2007-11-13 17:17:07 +00:00
|
|
|
|
* xjj j (day number) in Hebrew calendar
|
|
|
|
|
|
* xjF F (month name) in Hebrew calendar
|
2007-12-15 14:35:15 +00:00
|
|
|
|
* xjt t (days in month) in Hebrew calendar
|
2007-11-13 17:17:07 +00:00
|
|
|
|
* xjx xg (genitive month name) in Hebrew calendar
|
|
|
|
|
|
* xjn n (month number) in Hebrew calendar
|
|
|
|
|
|
* xjY Y (full year) in Hebrew calendar
|
|
|
|
|
|
*
|
2008-12-30 22:51:05 +00:00
|
|
|
|
* xmj j (day number) in Hijri calendar
|
|
|
|
|
|
* xmF F (month name) in Hijri calendar
|
|
|
|
|
|
* xmn n (month number) in Hijri calendar
|
|
|
|
|
|
* xmY Y (full year) in Hijri calendar
|
2008-06-19 14:46:50 +00:00
|
|
|
|
*
|
2007-12-06 20:14:36 +00:00
|
|
|
|
* xkY Y (full year) in Thai solar calendar. Months and days are
|
|
|
|
|
|
* identical to the Gregorian calendar
|
2009-05-20 01:53:39 +00:00
|
|
|
|
* xoY Y (full year) in Minguo calendar or Juche year.
|
|
|
|
|
|
* Months and days are identical to the
|
|
|
|
|
|
* Gregorian calendar
|
|
|
|
|
|
* xtY Y (full year) in Japanese nengo. Months and days are
|
2009-05-19 16:38:21 +00:00
|
|
|
|
* identical to the Gregorian calendar
|
2007-12-06 20:14:36 +00:00
|
|
|
|
*
|
2006-07-26 07:15:39 +00:00
|
|
|
|
* Characters enclosed in double quotes will be considered literal (with
|
|
|
|
|
|
* the quotes themselves removed). Unmatched quotes will be considered
|
|
|
|
|
|
* literal quotes. Example:
|
|
|
|
|
|
*
|
|
|
|
|
|
* "The month is" F => The month is January
|
|
|
|
|
|
* i's" => 20'11"
|
|
|
|
|
|
*
|
|
|
|
|
|
* Backslash escaping is also supported.
|
2007-06-15 19:07:15 +00:00
|
|
|
|
*
|
|
|
|
|
|
* Input timestamp is assumed to be pre-normalized to the desired local
|
|
|
|
|
|
* time zone, if any.
|
2010-01-11 04:23:41 +00:00
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $format String
|
|
|
|
|
|
* @param $ts String: 14-character timestamp
|
2006-07-26 07:15:39 +00:00
|
|
|
|
* YYYYMMDDHHMMSS
|
|
|
|
|
|
* 01234567890123
|
2008-12-30 22:51:05 +00:00
|
|
|
|
* @todo emulation of "o" format character for PHP pre 5.1.0
|
|
|
|
|
|
* @todo handling of "o" format character for Iranian, Hebrew, Hijri & Thai?
|
2006-07-26 07:15:39 +00:00
|
|
|
|
*/
|
|
|
|
|
|
function sprintfDate( $format, $ts ) {
|
|
|
|
|
|
$s = '';
|
|
|
|
|
|
$raw = false;
|
|
|
|
|
|
$roman = false;
|
2007-11-13 17:17:07 +00:00
|
|
|
|
$hebrewNum = false;
|
2006-09-25 05:59:00 +00:00
|
|
|
|
$unix = false;
|
|
|
|
|
|
$rawToggle = false;
|
2007-11-13 04:05:13 +00:00
|
|
|
|
$iranian = false;
|
2007-11-13 17:17:07 +00:00
|
|
|
|
$hebrew = false;
|
2008-06-19 14:46:50 +00:00
|
|
|
|
$hijri = false;
|
2007-12-06 20:14:36 +00:00
|
|
|
|
$thai = false;
|
2009-05-19 16:38:21 +00:00
|
|
|
|
$minguo = false;
|
2009-05-20 01:53:39 +00:00
|
|
|
|
$tenno = false;
|
2006-07-26 07:15:39 +00:00
|
|
|
|
for ( $p = 0; $p < strlen( $format ); $p++ ) {
|
|
|
|
|
|
$num = false;
|
|
|
|
|
|
$code = $format[$p];
|
|
|
|
|
|
if ( $code == 'x' && $p < strlen( $format ) - 1 ) {
|
|
|
|
|
|
$code .= $format[++$p];
|
|
|
|
|
|
}
|
2007-11-13 04:05:13 +00:00
|
|
|
|
|
2009-05-20 01:53:39 +00:00
|
|
|
|
if ( ( $code === 'xi' || $code == 'xj' || $code == 'xk' || $code == 'xm' || $code == 'xo' || $code == 'xt' ) && $p < strlen( $format ) - 1 ) {
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$code .= $format[++$p];
|
|
|
|
|
|
}
|
2007-11-13 04:05:13 +00:00
|
|
|
|
|
2008-06-19 16:14:48 +00:00
|
|
|
|
switch ( $code ) {
|
|
|
|
|
|
case 'xx':
|
|
|
|
|
|
$s .= 'x';
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xn':
|
|
|
|
|
|
$raw = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xN':
|
|
|
|
|
|
$rawToggle = !$rawToggle;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xr':
|
|
|
|
|
|
$roman = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xh':
|
|
|
|
|
|
$hebrewNum = true;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xg':
|
|
|
|
|
|
$s .= $this->getMonthNameGen( substr( $ts, 4, 2 ) );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xjx':
|
|
|
|
|
|
if ( !$hebrew ) $hebrew = self::tsToHebrew( $ts );
|
|
|
|
|
|
$s .= $this->getHebrewCalendarMonthNameGen( $hebrew[1] );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'd':
|
|
|
|
|
|
$num = substr( $ts, 6, 2 );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'D':
|
|
|
|
|
|
if ( !$unix ) $unix = wfTimestamp( TS_UNIX, $ts );
|
|
|
|
|
|
$s .= $this->getWeekdayAbbreviation( gmdate( 'w', $unix ) + 1 );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'j':
|
|
|
|
|
|
$num = intval( substr( $ts, 6, 2 ) );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xij':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$iranian ) {
|
|
|
|
|
|
$iranian = self::tsToIranian( $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = $iranian[2];
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xmj':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$hijri ) {
|
|
|
|
|
|
$hijri = self::tsToHijri( $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = $hijri[2];
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xjj':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$hebrew ) {
|
|
|
|
|
|
$hebrew = self::tsToHebrew( $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = $hebrew[2];
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'l':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$unix ) {
|
|
|
|
|
|
$unix = wfTimestamp( TS_UNIX, $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$s .= $this->getWeekdayName( gmdate( 'w', $unix ) + 1 );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'N':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$unix ) {
|
|
|
|
|
|
$unix = wfTimestamp( TS_UNIX, $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$w = gmdate( 'w', $unix );
|
|
|
|
|
|
$num = $w ? $w : 7;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'w':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$unix ) {
|
|
|
|
|
|
$unix = wfTimestamp( TS_UNIX, $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = gmdate( 'w', $unix );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'z':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$unix ) {
|
|
|
|
|
|
$unix = wfTimestamp( TS_UNIX, $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = gmdate( 'z', $unix );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'W':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$unix ) {
|
|
|
|
|
|
$unix = wfTimestamp( TS_UNIX, $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = gmdate( 'W', $unix );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'F':
|
|
|
|
|
|
$s .= $this->getMonthName( substr( $ts, 4, 2 ) );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xiF':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$iranian ) {
|
|
|
|
|
|
$iranian = self::tsToIranian( $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$s .= $this->getIranianCalendarMonthName( $iranian[1] );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xmF':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$hijri ) {
|
|
|
|
|
|
$hijri = self::tsToHijri( $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$s .= $this->getHijriCalendarMonthName( $hijri[1] );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xjF':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$hebrew ) {
|
|
|
|
|
|
$hebrew = self::tsToHebrew( $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$s .= $this->getHebrewCalendarMonthName( $hebrew[1] );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'm':
|
|
|
|
|
|
$num = substr( $ts, 4, 2 );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'M':
|
|
|
|
|
|
$s .= $this->getMonthAbbreviation( substr( $ts, 4, 2 ) );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'n':
|
|
|
|
|
|
$num = intval( substr( $ts, 4, 2 ) );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xin':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$iranian ) {
|
|
|
|
|
|
$iranian = self::tsToIranian( $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = $iranian[1];
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xmn':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$hijri ) {
|
|
|
|
|
|
$hijri = self::tsToHijri ( $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = $hijri[1];
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xjn':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$hebrew ) {
|
|
|
|
|
|
$hebrew = self::tsToHebrew( $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = $hebrew[1];
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 't':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$unix ) {
|
|
|
|
|
|
$unix = wfTimestamp( TS_UNIX, $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = gmdate( 't', $unix );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xjt':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$hebrew ) {
|
|
|
|
|
|
$hebrew = self::tsToHebrew( $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = $hebrew[3];
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'L':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$unix ) {
|
|
|
|
|
|
$unix = wfTimestamp( TS_UNIX, $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = gmdate( 'L', $unix );
|
|
|
|
|
|
break;
|
2008-12-30 22:51:05 +00:00
|
|
|
|
# 'o' is supported since PHP 5.1.0
|
|
|
|
|
|
# return literal if not supported
|
|
|
|
|
|
# TODO: emulation for pre 5.1.0 versions
|
|
|
|
|
|
case 'o':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$unix ) {
|
|
|
|
|
|
$unix = wfTimestamp( TS_UNIX, $ts );
|
|
|
|
|
|
}
|
|
|
|
|
|
if ( version_compare( PHP_VERSION, '5.1.0' ) === 1 ) {
|
2008-12-30 22:51:05 +00:00
|
|
|
|
$num = date( 'o', $unix );
|
2010-04-08 20:19:03 +00:00
|
|
|
|
} else {
|
2008-12-30 22:51:05 +00:00
|
|
|
|
$s .= 'o';
|
2010-04-08 20:19:03 +00:00
|
|
|
|
}
|
2008-12-30 22:51:05 +00:00
|
|
|
|
break;
|
2008-06-19 16:14:48 +00:00
|
|
|
|
case 'Y':
|
|
|
|
|
|
$num = substr( $ts, 0, 4 );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xiY':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$iranian ) {
|
|
|
|
|
|
$iranian = self::tsToIranian( $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = $iranian[0];
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xmY':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$hijri ) {
|
|
|
|
|
|
$hijri = self::tsToHijri( $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = $hijri[0];
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xjY':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$hebrew ) {
|
|
|
|
|
|
$hebrew = self::tsToHebrew( $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = $hebrew[0];
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'xkY':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$thai ) {
|
|
|
|
|
|
$thai = self::tsToYear( $ts, 'thai' );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = $thai[0];
|
|
|
|
|
|
break;
|
2009-05-19 16:38:21 +00:00
|
|
|
|
case 'xoY':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$minguo ) {
|
|
|
|
|
|
$minguo = self::tsToYear( $ts, 'minguo' );
|
|
|
|
|
|
}
|
2009-05-19 16:38:21 +00:00
|
|
|
|
$num = $minguo[0];
|
|
|
|
|
|
break;
|
2009-05-20 01:53:39 +00:00
|
|
|
|
case 'xtY':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$tenno ) {
|
|
|
|
|
|
$tenno = self::tsToYear( $ts, 'tenno' );
|
|
|
|
|
|
}
|
2009-05-20 01:53:39 +00:00
|
|
|
|
$num = $tenno[0];
|
|
|
|
|
|
break;
|
2008-06-19 16:14:48 +00:00
|
|
|
|
case 'y':
|
|
|
|
|
|
$num = substr( $ts, 2, 2 );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'a':
|
|
|
|
|
|
$s .= intval( substr( $ts, 8, 2 ) ) < 12 ? 'am' : 'pm';
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'A':
|
|
|
|
|
|
$s .= intval( substr( $ts, 8, 2 ) ) < 12 ? 'AM' : 'PM';
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'g':
|
|
|
|
|
|
$h = substr( $ts, 8, 2 );
|
|
|
|
|
|
$num = $h % 12 ? $h % 12 : 12;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'G':
|
|
|
|
|
|
$num = intval( substr( $ts, 8, 2 ) );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'h':
|
|
|
|
|
|
$h = substr( $ts, 8, 2 );
|
|
|
|
|
|
$num = sprintf( '%02d', $h % 12 ? $h % 12 : 12 );
|
2010-01-11 04:23:41 +00:00
|
|
|
|
break;
|
2008-06-19 16:14:48 +00:00
|
|
|
|
case 'H':
|
|
|
|
|
|
$num = substr( $ts, 8, 2 );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'i':
|
|
|
|
|
|
$num = substr( $ts, 10, 2 );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 's':
|
|
|
|
|
|
$num = substr( $ts, 12, 2 );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'c':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$unix ) {
|
|
|
|
|
|
$unix = wfTimestamp( TS_UNIX, $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$s .= gmdate( 'c', $unix );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'r':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$unix ) {
|
|
|
|
|
|
$unix = wfTimestamp( TS_UNIX, $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$s .= gmdate( 'r', $unix );
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'U':
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$unix ) {
|
|
|
|
|
|
$unix = wfTimestamp( TS_UNIX, $ts );
|
|
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = $unix;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case '\\':
|
|
|
|
|
|
# Backslash escaping
|
|
|
|
|
|
if ( $p < strlen( $format ) - 1 ) {
|
|
|
|
|
|
$s .= $format[++$p];
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$s .= '\\';
|
|
|
|
|
|
}
|
|
|
|
|
|
break;
|
|
|
|
|
|
case '"':
|
|
|
|
|
|
# Quoted literal
|
|
|
|
|
|
if ( $p < strlen( $format ) - 1 ) {
|
|
|
|
|
|
$endQuote = strpos( $format, '"', $p + 1 );
|
|
|
|
|
|
if ( $endQuote === false ) {
|
|
|
|
|
|
# No terminating quote, assume literal "
|
2008-06-19 15:18:48 +00:00
|
|
|
|
$s .= '"';
|
2008-06-19 16:14:48 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
$s .= substr( $format, $p + 1, $endQuote - $p - 1 );
|
|
|
|
|
|
$p = $endQuote;
|
2008-06-19 15:18:48 +00:00
|
|
|
|
}
|
2006-07-26 07:15:39 +00:00
|
|
|
|
} else {
|
2008-06-19 16:14:48 +00:00
|
|
|
|
# Quote at end of string, assume literal "
|
|
|
|
|
|
$s .= '"';
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
$s .= $format[$p];
|
|
|
|
|
|
}
|
|
|
|
|
|
if ( $num !== false ) {
|
|
|
|
|
|
if ( $rawToggle || $raw ) {
|
|
|
|
|
|
$s .= $num;
|
|
|
|
|
|
$raw = false;
|
|
|
|
|
|
} elseif ( $roman ) {
|
|
|
|
|
|
$s .= self::romanNumeral( $num );
|
|
|
|
|
|
$roman = false;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
} elseif ( $hebrewNum ) {
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$s .= self::hebrewNumeral( $num );
|
|
|
|
|
|
$hebrewNum = false;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$s .= $this->formatNum( $num, true );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
2008-06-19 16:14:48 +00:00
|
|
|
|
$num = false;
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return $s;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2007-11-13 04:05:13 +00:00
|
|
|
|
private static $GREG_DAYS = array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
|
|
|
|
|
|
private static $IRANIAN_DAYS = array( 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29 );
|
|
|
|
|
|
/**
|
2010-01-11 04:23:41 +00:00
|
|
|
|
* Algorithm by Roozbeh Pournader and Mohammad Toossi to convert
|
2007-11-13 04:05:13 +00:00
|
|
|
|
* Gregorian dates to Iranian dates. Originally written in C, it
|
|
|
|
|
|
* is released under the terms of GNU Lesser General Public
|
|
|
|
|
|
* License. Conversion to PHP was performed by Niklas Laxström.
|
2010-01-11 04:23:41 +00:00
|
|
|
|
*
|
2007-11-13 04:05:13 +00:00
|
|
|
|
* Link: http://www.farsiweb.info/jalali/jalali.c
|
|
|
|
|
|
*/
|
|
|
|
|
|
private static function tsToIranian( $ts ) {
|
|
|
|
|
|
$gy = substr( $ts, 0, 4 ) -1600;
|
|
|
|
|
|
$gm = substr( $ts, 4, 2 ) -1;
|
|
|
|
|
|
$gd = substr( $ts, 6, 2 ) -1;
|
|
|
|
|
|
|
|
|
|
|
|
# Days passed from the beginning (including leap years)
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$gDayNo = 365 * $gy
|
|
|
|
|
|
+ floor( ( $gy + 3 ) / 4 )
|
|
|
|
|
|
- floor( ( $gy + 99 ) / 100 )
|
|
|
|
|
|
+ floor( ( $gy + 399 ) / 400 );
|
2007-11-13 04:05:13 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Add days of the past months of this year
|
2010-07-29 09:43:18 +00:00
|
|
|
|
for ( $i = 0; $i < $gm; $i++ ) {
|
2007-11-13 04:05:13 +00:00
|
|
|
|
$gDayNo += self::$GREG_DAYS[$i];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Leap years
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $gm > 1 && ( ( $gy % 4 === 0 && $gy % 100 !== 0 || ( $gy % 400 == 0 ) ) ) ) {
|
2007-11-13 04:05:13 +00:00
|
|
|
|
$gDayNo++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Days passed in current month
|
|
|
|
|
|
$gDayNo += $gd;
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2007-11-13 04:05:13 +00:00
|
|
|
|
$jDayNo = $gDayNo - 79;
|
|
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$jNp = floor( $jDayNo / 12053 );
|
2007-11-13 04:05:13 +00:00
|
|
|
|
$jDayNo %= 12053;
|
|
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$jy = 979 + 33 * $jNp + 4 * floor( $jDayNo / 1461 );
|
2007-11-13 04:05:13 +00:00
|
|
|
|
$jDayNo %= 1461;
|
|
|
|
|
|
|
|
|
|
|
|
if ( $jDayNo >= 366 ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$jy += floor( ( $jDayNo - 1 ) / 365 );
|
|
|
|
|
|
$jDayNo = floor( ( $jDayNo - 1 ) % 365 );
|
2007-11-13 04:05:13 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for ( $i = 0; $i < 11 && $jDayNo >= self::$IRANIAN_DAYS[$i]; $i++ ) {
|
|
|
|
|
|
$jDayNo -= self::$IRANIAN_DAYS[$i];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$jm = $i + 1;
|
|
|
|
|
|
$jd = $jDayNo + 1;
|
2007-11-13 04:05:13 +00:00
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return array( $jy, $jm, $jd );
|
2007-11-13 04:05:13 +00:00
|
|
|
|
}
|
2010-04-08 20:19:03 +00:00
|
|
|
|
|
2008-06-19 14:46:50 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Converting Gregorian dates to Hijri dates.
|
|
|
|
|
|
*
|
|
|
|
|
|
* Based on a PHP-Nuke block by Sharjeel which is released under GNU/GPL license
|
|
|
|
|
|
*
|
|
|
|
|
|
* @link http://phpnuke.org/modules.php?name=News&file=article&sid=8234&mode=thread&order=0&thold=0
|
|
|
|
|
|
*/
|
2010-04-08 20:19:03 +00:00
|
|
|
|
private static function tsToHijri( $ts ) {
|
2008-06-19 14:46:50 +00:00
|
|
|
|
$year = substr( $ts, 0, 4 );
|
|
|
|
|
|
$month = substr( $ts, 4, 2 );
|
|
|
|
|
|
$day = substr( $ts, 6, 2 );
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2008-06-19 14:46:50 +00:00
|
|
|
|
$zyr = $year;
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$zd = $day;
|
|
|
|
|
|
$zm = $month;
|
|
|
|
|
|
$zy = $zyr;
|
|
|
|
|
|
|
|
|
|
|
|
if (
|
|
|
|
|
|
( $zy > 1582 ) || ( ( $zy == 1582 ) && ( $zm > 10 ) ) ||
|
|
|
|
|
|
( ( $zy == 1582 ) && ( $zm == 10 ) && ( $zd > 14 ) )
|
|
|
|
|
|
)
|
|
|
|
|
|
{
|
|
|
|
|
|
$zjd = (int)( ( 1461 * ( $zy + 4800 + (int)( ( $zm - 14 ) / 12 ) ) ) / 4 ) +
|
|
|
|
|
|
(int)( ( 367 * ( $zm - 2 - 12 * ( (int)( ( $zm - 14 ) / 12 ) ) ) ) / 12 ) -
|
|
|
|
|
|
(int)( ( 3 * (int)( ( ( $zy + 4900 + (int)( ( $zm - 14 ) / 12 ) ) / 100 ) ) ) / 4 ) +
|
|
|
|
|
|
$zd - 32075;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$zjd = 367 * $zy - (int)( ( 7 * ( $zy + 5001 + (int)( ( $zm - 9 ) / 7 ) ) ) / 4 ) +
|
|
|
|
|
|
(int)( ( 275 * $zm ) / 9 ) + $zd + 1729777;
|
|
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2010-07-29 09:43:18 +00:00
|
|
|
|
$zl = $zjd -1948440 + 10632;
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$zn = (int)( ( $zl - 1 ) / 10631 );
|
|
|
|
|
|
$zl = $zl - 10631 * $zn + 354;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
$zj = ( (int)( ( 10985 - $zl ) / 5316 ) ) * ( (int)( ( 50 * $zl ) / 17719 ) ) + ( (int)( $zl / 5670 ) ) * ( (int)( ( 43 * $zl ) / 15238 ) );
|
|
|
|
|
|
$zl = $zl - ( (int)( ( 30 - $zj ) / 15 ) ) * ( (int)( ( 17719 * $zj ) / 50 ) ) - ( (int)( $zj / 16 ) ) * ( (int)( ( 15238 * $zj ) / 43 ) ) + 29;
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$zm = (int)( ( 24 * $zl ) / 709 );
|
|
|
|
|
|
$zd = $zl - (int)( ( 709 * $zm ) / 24 );
|
|
|
|
|
|
$zy = 30 * $zn + $zj - 30;
|
2008-06-19 14:46:50 +00:00
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return array( $zy, $zm, $zd );
|
2008-06-19 14:46:50 +00:00
|
|
|
|
}
|
2007-11-13 04:05:13 +00:00
|
|
|
|
|
2007-11-13 17:17:07 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Converting Gregorian dates to Hebrew dates.
|
|
|
|
|
|
*
|
|
|
|
|
|
* Based on a JavaScript code by Abu Mami and Yisrael Hersch
|
|
|
|
|
|
* (abu-mami@kaluach.net, http://www.kaluach.net), who permitted
|
|
|
|
|
|
* to translate the relevant functions into PHP and release them under
|
|
|
|
|
|
* GNU GPL.
|
2008-08-04 00:53:13 +00:00
|
|
|
|
*
|
2008-08-06 20:06:22 +00:00
|
|
|
|
* The months are counted from Tishrei = 1. In a leap year, Adar I is 13
|
|
|
|
|
|
* and Adar II is 14. In a non-leap year, Adar is 6.
|
2007-11-13 17:17:07 +00:00
|
|
|
|
*/
|
|
|
|
|
|
private static function tsToHebrew( $ts ) {
|
|
|
|
|
|
# Parse date
|
|
|
|
|
|
$year = substr( $ts, 0, 4 );
|
|
|
|
|
|
$month = substr( $ts, 4, 2 );
|
|
|
|
|
|
$day = substr( $ts, 6, 2 );
|
|
|
|
|
|
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# Calculate Hebrew year
|
|
|
|
|
|
$hebrewYear = $year + 3760;
|
|
|
|
|
|
|
|
|
|
|
|
# Month number when September = 1, August = 12
|
|
|
|
|
|
$month += 4;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $month > 12 ) {
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# Next year
|
|
|
|
|
|
$month -= 12;
|
|
|
|
|
|
$year++;
|
|
|
|
|
|
$hebrewYear++;
|
2007-11-13 17:17:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# Calculate day of year from 1 September
|
|
|
|
|
|
$dayOfYear = $day;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
for ( $i = 1; $i < $month; $i++ ) {
|
|
|
|
|
|
if ( $i == 6 ) {
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# February
|
|
|
|
|
|
$dayOfYear += 28;
|
|
|
|
|
|
# Check if the year is leap
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $year % 400 == 0 || ( $year % 4 == 0 && $year % 100 > 0 ) ) {
|
2007-12-20 15:59:39 +00:00
|
|
|
|
$dayOfYear++;
|
|
|
|
|
|
}
|
2010-07-29 09:43:18 +00:00
|
|
|
|
} elseif ( $i == 8 || $i == 10 || $i == 1 || $i == 3 ) {
|
2007-12-20 15:59:39 +00:00
|
|
|
|
$dayOfYear += 30;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$dayOfYear += 31;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Calculate the start of the Hebrew year
|
|
|
|
|
|
$start = self::hebrewYearStart( $hebrewYear );
|
|
|
|
|
|
|
|
|
|
|
|
# Calculate next year's start
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $dayOfYear <= $start ) {
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# Day is before the start of the year - it is the previous year
|
|
|
|
|
|
# Next year's start
|
|
|
|
|
|
$nextStart = $start;
|
|
|
|
|
|
# Previous year
|
|
|
|
|
|
$year--;
|
|
|
|
|
|
$hebrewYear--;
|
|
|
|
|
|
# Add days since previous year's 1 September
|
2007-12-15 14:35:15 +00:00
|
|
|
|
$dayOfYear += 365;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( ( $year % 400 == 0 ) || ( $year % 100 != 0 && $year % 4 == 0 ) ) {
|
2007-11-13 17:17:07 +00:00
|
|
|
|
# Leap year
|
2007-12-15 14:35:15 +00:00
|
|
|
|
$dayOfYear++;
|
2007-11-13 17:17:07 +00:00
|
|
|
|
}
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# Start of the new (previous) year
|
|
|
|
|
|
$start = self::hebrewYearStart( $hebrewYear );
|
2007-11-13 17:17:07 +00:00
|
|
|
|
} else {
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# Next year's start
|
|
|
|
|
|
$nextStart = self::hebrewYearStart( $hebrewYear + 1 );
|
2007-11-13 17:17:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# Calculate Hebrew day of year
|
|
|
|
|
|
$hebrewDayOfYear = $dayOfYear - $start;
|
|
|
|
|
|
|
|
|
|
|
|
# Difference between year's days
|
|
|
|
|
|
$diff = $nextStart - $start;
|
|
|
|
|
|
# Add 12 (or 13 for leap years) days to ignore the difference between
|
|
|
|
|
|
# Hebrew and Gregorian year (353 at least vs. 365/6) - now the
|
|
|
|
|
|
# difference is only about the year type
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( ( $year % 400 == 0 ) || ( $year % 100 != 0 && $year % 4 == 0 ) ) {
|
2007-12-20 15:59:39 +00:00
|
|
|
|
$diff += 13;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$diff += 12;
|
2007-11-13 17:17:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# Check the year pattern, and is leap year
|
2007-12-15 14:35:15 +00:00
|
|
|
|
# 0 means an incomplete year, 1 means a regular year, 2 means a complete year
|
|
|
|
|
|
# This is mod 30, to work on both leap years (which add 30 days of Adar I)
|
|
|
|
|
|
# and non-leap years
|
2007-12-20 15:59:39 +00:00
|
|
|
|
$yearPattern = $diff % 30;
|
|
|
|
|
|
# Check if leap year
|
|
|
|
|
|
$isLeap = $diff >= 30;
|
2007-12-15 14:35:15 +00:00
|
|
|
|
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# Calculate day in the month from number of day in the Hebrew year
|
2007-12-15 14:35:15 +00:00
|
|
|
|
# Don't check Adar - if the day is not in Adar, we will stop before;
|
|
|
|
|
|
# if it is in Adar, we will use it to check if it is Adar I or Adar II
|
2007-12-20 15:59:39 +00:00
|
|
|
|
$hebrewDay = $hebrewDayOfYear;
|
|
|
|
|
|
$hebrewMonth = 1;
|
|
|
|
|
|
$days = 0;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
while ( $hebrewMonth <= 12 ) {
|
2007-11-13 17:17:07 +00:00
|
|
|
|
# Calculate days in this month
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $isLeap && $hebrewMonth == 6 ) {
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# Adar in a leap year
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $isLeap ) {
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# Leap year - has Adar I, with 30 days, and Adar II, with 29 days
|
|
|
|
|
|
$days = 30;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $hebrewDay <= $days ) {
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# Day in Adar I
|
|
|
|
|
|
$hebrewMonth = 13;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
# Subtract the days of Adar I
|
|
|
|
|
|
$hebrewDay -= $days;
|
|
|
|
|
|
# Try Adar II
|
|
|
|
|
|
$days = 29;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $hebrewDay <= $days ) {
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# Day in Adar II
|
|
|
|
|
|
$hebrewMonth = 14;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2010-07-29 09:43:18 +00:00
|
|
|
|
} elseif ( $hebrewMonth == 2 && $yearPattern == 2 ) {
|
2007-11-13 17:17:07 +00:00
|
|
|
|
# Cheshvan in a complete year (otherwise as the rule below)
|
|
|
|
|
|
$days = 30;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
} elseif ( $hebrewMonth == 3 && $yearPattern == 0 ) {
|
2007-11-13 17:17:07 +00:00
|
|
|
|
# Kislev in an incomplete year (otherwise as the rule below)
|
|
|
|
|
|
$days = 29;
|
|
|
|
|
|
} else {
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# Odd months have 30 days, even have 29
|
|
|
|
|
|
$days = 30 - ( $hebrewMonth - 1 ) % 2;
|
2007-11-13 17:17:07 +00:00
|
|
|
|
}
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $hebrewDay <= $days ) {
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# In the current month
|
2007-11-13 17:17:07 +00:00
|
|
|
|
break;
|
|
|
|
|
|
} else {
|
2007-12-20 15:59:39 +00:00
|
|
|
|
# Subtract the days of the current month
|
|
|
|
|
|
$hebrewDay -= $days;
|
|
|
|
|
|
# Try in the next month
|
|
|
|
|
|
$hebrewMonth++;
|
2007-11-13 17:17:07 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2007-12-20 15:59:39 +00:00
|
|
|
|
return array( $hebrewYear, $hebrewMonth, $hebrewDay, $days );
|
2007-12-06 20:14:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2007-11-13 17:17:07 +00:00
|
|
|
|
/**
|
2007-12-20 15:59:39 +00:00
|
|
|
|
* This calculates the Hebrew year start, as days since 1 September.
|
2007-11-13 17:17:07 +00:00
|
|
|
|
* Based on Carl Friedrich Gauss algorithm for finding Easter date.
|
|
|
|
|
|
* Used for Hebrew date.
|
|
|
|
|
|
*/
|
2007-12-20 15:59:39 +00:00
|
|
|
|
private static function hebrewYearStart( $year ) {
|
|
|
|
|
|
$a = intval( ( 12 * ( $year - 1 ) + 17 ) % 19 );
|
|
|
|
|
|
$b = intval( ( $year - 1 ) % 4 );
|
|
|
|
|
|
$m = 32.044093161144 + 1.5542417966212 * $a + $b / 4.0 - 0.0031777940220923 * ( $year - 1 );
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $m < 0 ) {
|
2007-11-13 17:17:07 +00:00
|
|
|
|
$m--;
|
|
|
|
|
|
}
|
2007-11-22 09:17:13 +00:00
|
|
|
|
$Mar = intval( $m );
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $m < 0 ) {
|
2007-11-13 17:17:07 +00:00
|
|
|
|
$m++;
|
|
|
|
|
|
}
|
|
|
|
|
|
$m -= $Mar;
|
|
|
|
|
|
|
2010-07-29 09:43:18 +00:00
|
|
|
|
$c = intval( ( $Mar + 3 * ( $year - 1 ) + 5 * $b + 5 ) % 7 );
|
|
|
|
|
|
if ( $c == 0 && $a > 11 && $m >= 0.89772376543210 ) {
|
2007-11-13 17:17:07 +00:00
|
|
|
|
$Mar++;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
} else if ( $c == 1 && $a > 6 && $m >= 0.63287037037037 ) {
|
2007-11-13 17:17:07 +00:00
|
|
|
|
$Mar += 2;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
} else if ( $c == 2 || $c == 4 || $c == 6 ) {
|
2007-11-13 17:17:07 +00:00
|
|
|
|
$Mar++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2007-12-20 15:59:39 +00:00
|
|
|
|
$Mar += intval( ( $year - 3761 ) / 100 ) - intval( ( $year - 3761 ) / 400 ) - 24;
|
2007-11-13 17:17:07 +00:00
|
|
|
|
return $Mar;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2007-12-15 14:35:15 +00:00
|
|
|
|
/**
|
2009-05-20 01:53:39 +00:00
|
|
|
|
* Algorithm to convert Gregorian dates to Thai solar dates,
|
|
|
|
|
|
* Minguo dates or Minguo dates.
|
2007-12-15 14:35:15 +00:00
|
|
|
|
*
|
|
|
|
|
|
* Link: http://en.wikipedia.org/wiki/Thai_solar_calendar
|
2009-05-20 01:53:39 +00:00
|
|
|
|
* http://en.wikipedia.org/wiki/Minguo_calendar
|
|
|
|
|
|
* http://en.wikipedia.org/wiki/Japanese_era_name
|
2007-12-15 14:35:15 +00:00
|
|
|
|
*
|
2010-02-22 21:34:19 +00:00
|
|
|
|
* @param $ts String: 14-character timestamp
|
|
|
|
|
|
* @param $cName String: calender name
|
|
|
|
|
|
* @return Array: converted year, month, day
|
2007-12-15 14:35:15 +00:00
|
|
|
|
*/
|
2009-05-20 01:53:39 +00:00
|
|
|
|
private static function tsToYear( $ts, $cName ) {
|
2007-12-15 14:35:15 +00:00
|
|
|
|
$gy = substr( $ts, 0, 4 );
|
|
|
|
|
|
$gm = substr( $ts, 4, 2 );
|
|
|
|
|
|
$gd = substr( $ts, 6, 2 );
|
|
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !strcmp( $cName, 'thai' ) ) {
|
2009-05-20 01:53:39 +00:00
|
|
|
|
# Thai solar dates
|
|
|
|
|
|
# Add 543 years to the Gregorian calendar
|
|
|
|
|
|
# Months and days are identical
|
|
|
|
|
|
$gy_offset = $gy + 543;
|
2010-04-08 20:19:03 +00:00
|
|
|
|
} else if ( ( !strcmp( $cName, 'minguo' ) ) || !strcmp( $cName, 'juche' ) ) {
|
2009-05-20 01:53:39 +00:00
|
|
|
|
# Minguo dates
|
|
|
|
|
|
# Deduct 1911 years from the Gregorian calendar
|
|
|
|
|
|
# Months and days are identical
|
|
|
|
|
|
$gy_offset = $gy - 1911;
|
2010-04-08 20:19:03 +00:00
|
|
|
|
} else if ( !strcmp( $cName, 'tenno' ) ) {
|
2009-05-20 15:49:30 +00:00
|
|
|
|
# Nengō dates up to Meiji period
|
2009-05-20 01:53:39 +00:00
|
|
|
|
# Deduct years from the Gregorian calendar
|
|
|
|
|
|
# depending on the nengo periods
|
|
|
|
|
|
# Months and days are identical
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( ( $gy < 1912 ) || ( ( $gy == 1912 ) && ( $gm < 7 ) ) || ( ( $gy == 1912 ) && ( $gm == 7 ) && ( $gd < 31 ) ) ) {
|
2009-05-20 15:49:30 +00:00
|
|
|
|
# Meiji period
|
|
|
|
|
|
$gy_gannen = $gy - 1868 + 1;
|
|
|
|
|
|
$gy_offset = $gy_gannen;
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( $gy_gannen == 1 ) {
|
2009-05-20 15:49:30 +00:00
|
|
|
|
$gy_offset = '元';
|
2010-04-08 20:19:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
$gy_offset = '明治' . $gy_offset;
|
|
|
|
|
|
} else if (
|
|
|
|
|
|
( ( $gy == 1912 ) && ( $gm == 7 ) && ( $gd == 31 ) ) ||
|
|
|
|
|
|
( ( $gy == 1912 ) && ( $gm >= 8 ) ) ||
|
|
|
|
|
|
( ( $gy > 1912 ) && ( $gy < 1926 ) ) ||
|
|
|
|
|
|
( ( $gy == 1926 ) && ( $gm < 12 ) ) ||
|
|
|
|
|
|
( ( $gy == 1926 ) && ( $gm == 12 ) && ( $gd < 26 ) )
|
|
|
|
|
|
)
|
|
|
|
|
|
{
|
2009-05-20 15:49:30 +00:00
|
|
|
|
# Taishō period
|
|
|
|
|
|
$gy_gannen = $gy - 1912 + 1;
|
|
|
|
|
|
$gy_offset = $gy_gannen;
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( $gy_gannen == 1 ) {
|
2009-05-20 15:49:30 +00:00
|
|
|
|
$gy_offset = '元';
|
2010-04-08 20:19:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
$gy_offset = '大正' . $gy_offset;
|
|
|
|
|
|
} else if (
|
|
|
|
|
|
( ( $gy == 1926 ) && ( $gm == 12 ) && ( $gd >= 26 ) ) ||
|
|
|
|
|
|
( ( $gy > 1926 ) && ( $gy < 1989 ) ) ||
|
|
|
|
|
|
( ( $gy == 1989 ) && ( $gm == 1 ) && ( $gd < 8 ) )
|
|
|
|
|
|
)
|
|
|
|
|
|
{
|
2009-05-20 01:53:39 +00:00
|
|
|
|
# Shōwa period
|
|
|
|
|
|
$gy_gannen = $gy - 1926 + 1;
|
2009-05-20 15:08:18 +00:00
|
|
|
|
$gy_offset = $gy_gannen;
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( $gy_gannen == 1 ) {
|
2009-05-20 01:53:39 +00:00
|
|
|
|
$gy_offset = '元';
|
2010-04-08 20:19:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
$gy_offset = '昭和' . $gy_offset;
|
2009-05-20 01:53:39 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
# Heisei period
|
|
|
|
|
|
$gy_gannen = $gy - 1989 + 1;
|
2009-05-20 15:08:18 +00:00
|
|
|
|
$gy_offset = $gy_gannen;
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( $gy_gannen == 1 ) {
|
2009-05-20 01:53:39 +00:00
|
|
|
|
$gy_offset = '元';
|
2010-04-08 20:19:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
$gy_offset = '平成' . $gy_offset;
|
2009-05-20 01:53:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$gy_offset = $gy;
|
|
|
|
|
|
}
|
2009-05-19 16:38:21 +00:00
|
|
|
|
|
2009-05-20 01:53:39 +00:00
|
|
|
|
return array( $gy_offset, $gm, $gd );
|
2009-05-19 16:38:21 +00:00
|
|
|
|
}
|
2007-12-15 14:35:15 +00:00
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
/**
|
2006-09-25 05:59:00 +00:00
|
|
|
|
* Roman number formatting up to 3000
|
2006-07-26 07:15:39 +00:00
|
|
|
|
*/
|
|
|
|
|
|
static function romanNumeral( $num ) {
|
2006-09-25 05:59:00 +00:00
|
|
|
|
static $table = array(
|
|
|
|
|
|
array( '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X' ),
|
|
|
|
|
|
array( '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', 'C' ),
|
|
|
|
|
|
array( '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', 'M' ),
|
|
|
|
|
|
array( '', 'M', 'MM', 'MMM' )
|
|
|
|
|
|
);
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
$num = intval( $num );
|
2006-09-25 05:59:00 +00:00
|
|
|
|
if ( $num > 3000 || $num <= 0 ) {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
return $num;
|
|
|
|
|
|
}
|
2006-09-25 05:59:00 +00:00
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
$s = '';
|
2006-09-25 05:59:00 +00:00
|
|
|
|
for ( $pow10 = 1000, $i = 3; $i >= 0; $pow10 /= 10, $i-- ) {
|
|
|
|
|
|
if ( $num >= $pow10 ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$s .= $table[$i][floor( $num / $pow10 )];
|
2006-09-25 05:59:00 +00:00
|
|
|
|
}
|
|
|
|
|
|
$num = $num % $pow10;
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
return $s;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2007-11-13 17:17:07 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Hebrew Gematria number formatting up to 9999
|
|
|
|
|
|
*/
|
|
|
|
|
|
static function hebrewNumeral( $num ) {
|
|
|
|
|
|
static $table = array(
|
|
|
|
|
|
array( '', 'א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ז', 'ח', 'ט', 'י' ),
|
|
|
|
|
|
array( '', 'י', 'כ', 'ל', 'מ', 'נ', 'ס', 'ע', 'פ', 'צ', 'ק' ),
|
|
|
|
|
|
array( '', 'ק', 'ר', 'ש', 'ת', 'תק', 'תר', 'תש', 'תת', 'תתק', 'תתר' ),
|
|
|
|
|
|
array( '', 'א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ז', 'ח', 'ט', 'י' )
|
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
$num = intval( $num );
|
|
|
|
|
|
if ( $num > 9999 || $num <= 0 ) {
|
|
|
|
|
|
return $num;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$s = '';
|
|
|
|
|
|
for ( $pow10 = 1000, $i = 3; $i >= 0; $pow10 /= 10, $i-- ) {
|
|
|
|
|
|
if ( $num >= $pow10 ) {
|
|
|
|
|
|
if ( $num == 15 || $num == 16 ) {
|
2007-11-22 09:17:13 +00:00
|
|
|
|
$s .= $table[0][9] . $table[0][$num - 9];
|
2007-11-13 17:17:07 +00:00
|
|
|
|
$num = 0;
|
|
|
|
|
|
} else {
|
2007-11-22 09:17:13 +00:00
|
|
|
|
$s .= $table[$i][intval( ( $num / $pow10 ) )];
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $pow10 == 1000 ) {
|
2007-11-13 17:17:07 +00:00
|
|
|
|
$s .= "'";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
$num = $num % $pow10;
|
|
|
|
|
|
}
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( strlen( $s ) == 2 ) {
|
2007-11-13 17:17:07 +00:00
|
|
|
|
$str = $s . "'";
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$str = substr( $s, 0, strlen( $s ) - 2 ) . '"';
|
|
|
|
|
|
$str .= substr( $s, strlen( $s ) - 2, 2 );
|
|
|
|
|
|
}
|
2007-11-24 11:29:19 +00:00
|
|
|
|
$start = substr( $str, 0, strlen( $str ) - 2 );
|
|
|
|
|
|
$end = substr( $str, strlen( $str ) - 2 );
|
|
|
|
|
|
switch( $end ) {
|
|
|
|
|
|
case 'כ':
|
|
|
|
|
|
$str = $start . 'ך';
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'מ':
|
|
|
|
|
|
$str = $start . 'ם';
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'נ':
|
|
|
|
|
|
$str = $start . 'ן';
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'פ':
|
|
|
|
|
|
$str = $start . 'ף';
|
|
|
|
|
|
break;
|
|
|
|
|
|
case 'צ':
|
|
|
|
|
|
$str = $start . 'ץ';
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
2007-11-13 17:17:07 +00:00
|
|
|
|
return $str;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2005-04-07 19:05:42 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* This is meant to be used by time(), date(), and timeanddate() to get
|
|
|
|
|
|
* the date preference they're supposed to use, it should be used in
|
|
|
|
|
|
* all children.
|
|
|
|
|
|
*
|
|
|
|
|
|
*<code>
|
2005-09-13 06:55:43 +00:00
|
|
|
|
* function timeanddate([...], $format = true) {
|
2005-04-07 19:05:42 +00:00
|
|
|
|
* $datePreference = $this->dateFormat($format);
|
|
|
|
|
|
* [...]
|
2006-07-26 07:15:39 +00:00
|
|
|
|
* }
|
2005-04-07 19:05:42 +00:00
|
|
|
|
*</code>
|
|
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $usePrefs Mixed: if true, the user's preference is used
|
2005-11-08 00:57:09 +00:00
|
|
|
|
* if false, the site/language default is used
|
|
|
|
|
|
* if int/string, assumed to be a format.
|
2005-04-07 19:05:42 +00:00
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
2005-09-13 06:55:43 +00:00
|
|
|
|
function dateFormat( $usePrefs = true ) {
|
2006-01-10 17:46:23 +00:00
|
|
|
|
global $wgUser;
|
2005-04-13 08:37:03 +00:00
|
|
|
|
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( is_bool( $usePrefs ) ) {
|
|
|
|
|
|
if ( $usePrefs ) {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
$datePreference = $wgUser->getDatePreference();
|
2005-11-08 00:57:09 +00:00
|
|
|
|
} else {
|
2010-03-27 16:15:17 +00:00
|
|
|
|
$datePreference = (string)User::getDefaultOption( 'date' );
|
2005-11-08 00:57:09 +00:00
|
|
|
|
}
|
2005-04-13 08:37:03 +00:00
|
|
|
|
} else {
|
2005-11-08 00:57:09 +00:00
|
|
|
|
$datePreference = (string)$usePrefs;
|
2005-04-07 19:05:42 +00:00
|
|
|
|
}
|
2005-09-13 06:55:43 +00:00
|
|
|
|
|
2006-01-10 12:22:58 +00:00
|
|
|
|
// return int
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $datePreference == '' ) {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
return 'default';
|
2005-09-13 06:55:43 +00:00
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2005-09-13 06:55:43 +00:00
|
|
|
|
return $datePreference;
|
2005-04-07 19:05:42 +00:00
|
|
|
|
}
|
2005-07-03 07:15:53 +00:00
|
|
|
|
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Get a format string for a given type and preference
|
|
|
|
|
|
* @param $type May be date, time or both
|
|
|
|
|
|
* @param $pref The format name as it appears in Messages*.php
|
|
|
|
|
|
*/
|
|
|
|
|
|
function getDateFormatString( $type, $pref ) {
|
|
|
|
|
|
if ( !isset( $this->dateFormatStrings[$type][$pref] ) ) {
|
|
|
|
|
|
if ( $pref == 'default' ) {
|
|
|
|
|
|
$pref = $this->getDefaultDateFormat();
|
|
|
|
|
|
$df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
|
|
|
|
|
|
if ( is_null( $df ) ) {
|
|
|
|
|
|
$pref = $this->getDefaultDateFormat();
|
|
|
|
|
|
$df = self::$dataCache->getSubitem( $this->mCode, 'dateFormats', "$pref $type" );
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
$this->dateFormatStrings[$type][$pref] = $df;
|
|
|
|
|
|
}
|
|
|
|
|
|
return $this->dateFormatStrings[$type][$pref];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2005-04-04 22:58:18 +00:00
|
|
|
|
/**
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $ts Mixed: the time format which needs to be turned into a
|
|
|
|
|
|
* date('YmdHis') format with wfTimestamp(TS_MW,$ts)
|
|
|
|
|
|
* @param $adj Bool: whether to adjust the time output according to the
|
|
|
|
|
|
* user configured offset ($timecorrection)
|
|
|
|
|
|
* @param $format Mixed: true to use user's date format preference
|
|
|
|
|
|
* @param $timecorrection String: the time offset as returned by
|
|
|
|
|
|
* validateTimeZone() in Special:Preferences
|
2005-04-04 22:58:18 +00:00
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
2005-05-08 15:58:52 +00:00
|
|
|
|
function date( $ts, $adj = false, $format = true, $timecorrection = false ) {
|
2010-01-11 04:23:41 +00:00
|
|
|
|
if ( $adj ) {
|
|
|
|
|
|
$ts = $this->userAdjust( $ts, $timecorrection );
|
2006-01-10 12:22:58 +00:00
|
|
|
|
}
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
$df = $this->getDateFormatString( 'date', $this->dateFormat( $format ) );
|
|
|
|
|
|
return $this->sprintfDate( $df, $ts );
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
2005-04-04 22:58:18 +00:00
|
|
|
|
|
|
|
|
|
|
/**
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $ts Mixed: the time format which needs to be turned into a
|
|
|
|
|
|
* date('YmdHis') format with wfTimestamp(TS_MW,$ts)
|
|
|
|
|
|
* @param $adj Bool: whether to adjust the time output according to the
|
|
|
|
|
|
* user configured offset ($timecorrection)
|
|
|
|
|
|
* @param $format Mixed: true to use user's date format preference
|
|
|
|
|
|
* @param $timecorrection String: the time offset as returned by
|
|
|
|
|
|
* validateTimeZone() in Special:Preferences
|
|
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
2005-05-08 11:03:13 +00:00
|
|
|
|
function time( $ts, $adj = false, $format = true, $timecorrection = false ) {
|
2010-01-11 04:23:41 +00:00
|
|
|
|
if ( $adj ) {
|
|
|
|
|
|
$ts = $this->userAdjust( $ts, $timecorrection );
|
2004-04-03 00:53:17 +00:00
|
|
|
|
}
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
$df = $this->getDateFormatString( 'time', $this->dateFormat( $format ) );
|
|
|
|
|
|
return $this->sprintfDate( $df, $ts );
|
2005-11-08 00:57:09 +00:00
|
|
|
|
}
|
2005-07-03 07:15:53 +00:00
|
|
|
|
|
2005-04-04 22:58:18 +00:00
|
|
|
|
/**
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $ts Mixed: the time format which needs to be turned into a
|
|
|
|
|
|
* date('YmdHis') format with wfTimestamp(TS_MW,$ts)
|
|
|
|
|
|
* @param $adj Bool: whether to adjust the time output according to the
|
|
|
|
|
|
* user configured offset ($timecorrection)
|
|
|
|
|
|
* @param $format Mixed: what format to return, if it's false output the
|
|
|
|
|
|
* default one (default true)
|
|
|
|
|
|
* @param $timecorrection String: the time offset as returned by
|
|
|
|
|
|
* validateTimeZone() in Special:Preferences
|
|
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
2010-07-29 09:43:18 +00:00
|
|
|
|
function timeanddate( $ts, $adj = false, $format = true, $timecorrection = false ) {
|
2007-03-28 19:54:45 +00:00
|
|
|
|
$ts = wfTimestamp( TS_MW, $ts );
|
2010-01-11 04:23:41 +00:00
|
|
|
|
if ( $adj ) {
|
|
|
|
|
|
$ts = $this->userAdjust( $ts, $timecorrection );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
$df = $this->getDateFormatString( 'both', $this->dateFormat( $format ) );
|
|
|
|
|
|
return $this->sprintfDate( $df, $ts );
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2004-11-21 07:36:46 +00:00
|
|
|
|
function getMessage( $key ) {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getSubitem( $this->mCode, 'messages', $key );
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
2004-07-08 15:40:27 +00:00
|
|
|
|
|
2004-11-21 07:36:46 +00:00
|
|
|
|
function getAllMessages() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'messages' );
|
2003-09-21 13:10:10 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2003-04-14 23:10:40 +00:00
|
|
|
|
function iconv( $in, $out, $string ) {
|
2009-07-07 09:56:53 +00:00
|
|
|
|
# This is a wrapper for iconv in all languages except esperanto,
|
|
|
|
|
|
# which does some nasty x-conversions beforehand
|
|
|
|
|
|
|
|
|
|
|
|
# Even with //IGNORE iconv can whine about illegal characters in
|
|
|
|
|
|
# *input* string. We just ignore those too.
|
|
|
|
|
|
# REF: http://bugs.php.net/bug.php?id=37166
|
|
|
|
|
|
# REF: https://bugzilla.wikimedia.org/show_bug.cgi?id=16885
|
|
|
|
|
|
wfSuppressWarnings();
|
|
|
|
|
|
$text = iconv( $in, $out . '//IGNORE', $string );
|
|
|
|
|
|
wfRestoreWarnings();
|
|
|
|
|
|
return $text;
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
2004-07-08 15:40:27 +00:00
|
|
|
|
|
2006-09-20 10:22:12 +00:00
|
|
|
|
// callback functions for uc(), lc(), ucwords(), ucwordbreaks()
|
2010-04-08 20:19:03 +00:00
|
|
|
|
function ucwordbreaksCallbackAscii( $matches ) {
|
|
|
|
|
|
return $this->ucfirst( $matches[1] );
|
2006-09-20 10:22:12 +00:00
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
function ucwordbreaksCallbackMB( $matches ) {
|
|
|
|
|
|
return mb_strtoupper( $matches[0] );
|
2006-09-20 10:22:12 +00:00
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
function ucCallback( $matches ) {
|
2006-09-20 20:05:32 +00:00
|
|
|
|
list( $wikiUpperChars ) = self::getCaseMaps();
|
|
|
|
|
|
return strtr( $matches[1], $wikiUpperChars );
|
2006-09-20 10:22:12 +00:00
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
function lcCallback( $matches ) {
|
2006-09-20 20:05:32 +00:00
|
|
|
|
list( , $wikiLowerChars ) = self::getCaseMaps();
|
|
|
|
|
|
return strtr( $matches[1], $wikiLowerChars );
|
2006-09-20 10:22:12 +00:00
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
function ucwordsCallbackMB( $matches ) {
|
|
|
|
|
|
return mb_strtoupper( $matches[0] );
|
2006-09-20 10:22:12 +00:00
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
function ucwordsCallbackWiki( $matches ) {
|
2006-09-20 20:05:32 +00:00
|
|
|
|
list( $wikiUpperChars ) = self::getCaseMaps();
|
|
|
|
|
|
return strtr( $matches[0], $wikiUpperChars );
|
2006-09-20 10:22:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
function ucfirst( $str ) {
|
Reverted breakage of non-ASCII message keys, Domas says that's not allowed. Optimised Language::lcfirst and Language::ucfirst() instead.
Timings in microseconds for ASCII no-change, ASCII change, non-ASCII no-change, non-ASCII change:
lcfirst: 1.8, 3.6, 21.2, 22.1
ucfirst: 1.5, 2.3, 21.1, 21.7
2009-08-28 17:58:54 +00:00
|
|
|
|
$o = ord( $str );
|
|
|
|
|
|
if ( $o < 96 ) {
|
|
|
|
|
|
return $str;
|
|
|
|
|
|
} elseif ( $o < 128 ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return ucfirst( $str );
|
Reverted breakage of non-ASCII message keys, Domas says that's not allowed. Optimised Language::lcfirst and Language::ucfirst() instead.
Timings in microseconds for ASCII no-change, ASCII change, non-ASCII no-change, non-ASCII change:
lcfirst: 1.8, 3.6, 21.2, 22.1
ucfirst: 1.5, 2.3, 21.1, 21.7
2009-08-28 17:58:54 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
// fall back to more complex logic in case of multibyte strings
|
2010-07-25 18:13:56 +00:00
|
|
|
|
return $this->uc( $str, true );
|
Reverted breakage of non-ASCII message keys, Domas says that's not allowed. Optimised Language::lcfirst and Language::ucfirst() instead.
Timings in microseconds for ASCII no-change, ASCII change, non-ASCII no-change, non-ASCII change:
lcfirst: 1.8, 3.6, 21.2, 22.1
ucfirst: 1.5, 2.3, 21.1, 21.7
2009-08-28 17:58:54 +00:00
|
|
|
|
}
|
2006-06-09 23:23:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
function uc( $str, $first = false ) {
|
2007-01-12 07:26:32 +00:00
|
|
|
|
if ( function_exists( 'mb_strtoupper' ) ) {
|
|
|
|
|
|
if ( $first ) {
|
2010-07-25 18:13:56 +00:00
|
|
|
|
if ( $this->isMultibyte( $str ) ) {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
return mb_strtoupper( mb_substr( $str, 0, 1 ) ) . mb_substr( $str, 1 );
|
2007-01-12 07:26:32 +00:00
|
|
|
|
} else {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
return ucfirst( $str );
|
2007-01-12 07:26:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
} else {
|
2010-07-25 18:13:56 +00:00
|
|
|
|
return $this->isMultibyte( $str ) ? mb_strtoupper( $str ) : strtoupper( $str );
|
2007-01-12 07:26:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
} else {
|
2010-07-25 18:13:56 +00:00
|
|
|
|
if ( $this->isMultibyte( $str ) ) {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
$x = $first ? '^' : '';
|
2006-09-20 10:22:12 +00:00
|
|
|
|
return preg_replace_callback(
|
|
|
|
|
|
"/$x([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)/",
|
2010-04-08 20:19:03 +00:00
|
|
|
|
array( $this, 'ucCallback' ),
|
2006-07-26 07:15:39 +00:00
|
|
|
|
$str
|
|
|
|
|
|
);
|
2007-01-12 07:26:32 +00:00
|
|
|
|
} else {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
return $first ? ucfirst( $str ) : strtoupper( $str );
|
2007-01-12 07:26:32 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
function lcfirst( $str ) {
|
Reverted breakage of non-ASCII message keys, Domas says that's not allowed. Optimised Language::lcfirst and Language::ucfirst() instead.
Timings in microseconds for ASCII no-change, ASCII change, non-ASCII no-change, non-ASCII change:
lcfirst: 1.8, 3.6, 21.2, 22.1
ucfirst: 1.5, 2.3, 21.1, 21.7
2009-08-28 17:58:54 +00:00
|
|
|
|
$o = ord( $str );
|
|
|
|
|
|
if ( !$o ) {
|
|
|
|
|
|
return strval( $str );
|
|
|
|
|
|
} elseif ( $o >= 128 ) {
|
2010-07-25 18:13:56 +00:00
|
|
|
|
return $this->lc( $str, true );
|
Reverted breakage of non-ASCII message keys, Domas says that's not allowed. Optimised Language::lcfirst and Language::ucfirst() instead.
Timings in microseconds for ASCII no-change, ASCII change, non-ASCII no-change, non-ASCII change:
lcfirst: 1.8, 3.6, 21.2, 22.1
ucfirst: 1.5, 2.3, 21.1, 21.7
2009-08-28 17:58:54 +00:00
|
|
|
|
} elseif ( $o > 96 ) {
|
|
|
|
|
|
return $str;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$str[0] = strtolower( $str[0] );
|
2007-11-12 22:34:39 +00:00
|
|
|
|
return $str;
|
|
|
|
|
|
}
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function lc( $str, $first = false ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( function_exists( 'mb_strtolower' ) ) {
|
|
|
|
|
|
if ( $first ) {
|
2010-07-25 18:13:56 +00:00
|
|
|
|
if ( $this->isMultibyte( $str ) ) {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
return mb_strtolower( mb_substr( $str, 0, 1 ) ) . mb_substr( $str, 1 );
|
2010-04-08 20:19:03 +00:00
|
|
|
|
} else {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
return strtolower( substr( $str, 0, 1 ) ) . substr( $str, 1 );
|
2010-04-08 20:19:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
} else {
|
2010-07-25 18:13:56 +00:00
|
|
|
|
return $this->isMultibyte( $str ) ? mb_strtolower( $str ) : strtolower( $str );
|
2010-04-08 20:19:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
} else {
|
2010-07-25 18:13:56 +00:00
|
|
|
|
if ( $this->isMultibyte( $str ) ) {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
$x = $first ? '^' : '';
|
2006-09-20 10:22:12 +00:00
|
|
|
|
return preg_replace_callback(
|
|
|
|
|
|
"/$x([A-Z]|[\\xc0-\\xff][\\x80-\\xbf]*)/",
|
2010-04-08 20:19:03 +00:00
|
|
|
|
array( $this, 'lcCallback' ),
|
2006-07-26 07:15:39 +00:00
|
|
|
|
$str
|
|
|
|
|
|
);
|
2010-04-08 20:19:03 +00:00
|
|
|
|
} else {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
return $first ? strtolower( substr( $str, 0, 1 ) ) . substr( $str, 1 ) : strtolower( $str );
|
2010-04-08 20:19:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2006-06-09 23:23:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
function isMultibyte( $str ) {
|
2006-08-17 23:48:11 +00:00
|
|
|
|
return (bool)preg_match( '/[\x80-\xff]/', $str );
|
2005-10-22 19:39:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
function ucwords( $str ) {
|
2010-07-25 18:13:56 +00:00
|
|
|
|
if ( $this->isMultibyte( $str ) ) {
|
|
|
|
|
|
$str = $this->lc( $str );
|
2006-09-20 10:22:12 +00:00
|
|
|
|
|
|
|
|
|
|
// regexp to find first letter in each word (i.e. after each space)
|
|
|
|
|
|
$replaceRegexp = "/^([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)| ([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)/";
|
|
|
|
|
|
|
|
|
|
|
|
// function to use to capitalize a single char
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( function_exists( 'mb_strtoupper' ) ) {
|
2006-09-20 10:22:12 +00:00
|
|
|
|
return preg_replace_callback(
|
|
|
|
|
|
$replaceRegexp,
|
2010-04-08 20:19:03 +00:00
|
|
|
|
array( $this, 'ucwordsCallbackMB' ),
|
2006-09-20 10:22:12 +00:00
|
|
|
|
$str
|
|
|
|
|
|
);
|
2010-04-08 20:19:03 +00:00
|
|
|
|
} else {
|
2006-09-20 10:22:12 +00:00
|
|
|
|
return preg_replace_callback(
|
|
|
|
|
|
$replaceRegexp,
|
2010-04-08 20:19:03 +00:00
|
|
|
|
array( $this, 'ucwordsCallbackWiki' ),
|
2006-09-20 10:22:12 +00:00
|
|
|
|
$str
|
|
|
|
|
|
);
|
2010-04-08 20:19:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
} else {
|
2006-09-20 10:22:12 +00:00
|
|
|
|
return ucwords( strtolower( $str ) );
|
2010-04-08 20:19:03 +00:00
|
|
|
|
}
|
2006-09-20 10:22:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
# capitalize words at word breaks
|
|
|
|
|
|
function ucwordbreaks( $str ) {
|
2010-07-25 18:13:56 +00:00
|
|
|
|
if ( $this->isMultibyte( $str ) ) {
|
|
|
|
|
|
$str = $this->lc( $str );
|
2006-09-20 10:22:12 +00:00
|
|
|
|
|
|
|
|
|
|
// since \b doesn't work for UTF-8, we explicitely define word break chars
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$breaks = "[ \-\(\)\}\{\.,\?!]";
|
2006-09-20 10:22:12 +00:00
|
|
|
|
|
|
|
|
|
|
// find first letter after word break
|
|
|
|
|
|
$replaceRegexp = "/^([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)|$breaks([a-z]|[\\xc0-\\xff][\\x80-\\xbf]*)/";
|
|
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( function_exists( 'mb_strtoupper' ) ) {
|
2006-09-20 10:22:12 +00:00
|
|
|
|
return preg_replace_callback(
|
|
|
|
|
|
$replaceRegexp,
|
2010-04-08 20:19:03 +00:00
|
|
|
|
array( $this, 'ucwordbreaksCallbackMB' ),
|
2006-09-20 10:22:12 +00:00
|
|
|
|
$str
|
|
|
|
|
|
);
|
2010-04-08 20:19:03 +00:00
|
|
|
|
} else {
|
2006-09-20 10:22:12 +00:00
|
|
|
|
return preg_replace_callback(
|
|
|
|
|
|
$replaceRegexp,
|
2010-04-08 20:19:03 +00:00
|
|
|
|
array( $this, 'ucwordsCallbackWiki' ),
|
2006-09-20 10:22:12 +00:00
|
|
|
|
$str
|
|
|
|
|
|
);
|
2010-04-08 20:19:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
} else {
|
2006-09-20 10:22:12 +00:00
|
|
|
|
return preg_replace_callback(
|
2010-04-08 20:19:03 +00:00
|
|
|
|
'/\b([\w\x80-\xff]+)\b/',
|
|
|
|
|
|
array( $this, 'ucwordbreaksCallbackAscii' ),
|
|
|
|
|
|
$str
|
|
|
|
|
|
);
|
|
|
|
|
|
}
|
2006-09-20 10:22:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2006-10-30 06:25:31 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Return a case-folded representation of $s
|
|
|
|
|
|
*
|
2010-01-11 04:23:41 +00:00
|
|
|
|
* This is a representation such that caseFold($s1)==caseFold($s2) if $s1
|
2006-10-30 06:25:31 +00:00
|
|
|
|
* and $s2 are the same except for the case of their characters. It is not
|
|
|
|
|
|
* necessary for the value returned to make sense when displayed.
|
|
|
|
|
|
*
|
|
|
|
|
|
* Do *not* perform any other normalisation in this function. If a caller
|
|
|
|
|
|
* uses this function when it should be using a more general normalisation
|
|
|
|
|
|
* function, then fix the caller.
|
|
|
|
|
|
*/
|
|
|
|
|
|
function caseFold( $s ) {
|
|
|
|
|
|
return $this->uc( $s );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2003-04-14 23:10:40 +00:00
|
|
|
|
function checkTitleEncoding( $s ) {
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( is_array( $s ) ) {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
wfDebugDieBacktrace( 'Given array to checkTitleEncoding.' );
|
|
|
|
|
|
}
|
|
|
|
|
|
# Check for non-UTF-8 URLs
|
2010-07-29 09:43:18 +00:00
|
|
|
|
$ishigh = preg_match( '/[\x80-\xff]/', $s );
|
|
|
|
|
|
if ( !$ishigh ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return $s;
|
|
|
|
|
|
}
|
2003-04-14 23:10:40 +00:00
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
$isutf8 = preg_match( '/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
|
|
|
|
|
|
'[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s );
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $isutf8 ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return $s;
|
|
|
|
|
|
}
|
2004-07-08 15:40:27 +00:00
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return $this->iconv( $this->fallback8bitEncoding(), 'utf-8', $s );
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
2005-07-03 07:15:53 +00:00
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
function fallback8bitEncoding() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'fallback8bitEncoding' );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2009-06-24 02:27:51 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Most writing systems use whitespace to break up words.
|
|
|
|
|
|
* Some languages such as Chinese don't conventionally do this,
|
|
|
|
|
|
* which requires special handling when breaking up words for
|
|
|
|
|
|
* searching etc.
|
|
|
|
|
|
*/
|
|
|
|
|
|
function hasWordBreaks() {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2010-04-08 20:19:03 +00:00
|
|
|
|
|
2010-02-02 15:09:01 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Some languages such as Chinese require word segmentation,
|
|
|
|
|
|
* Specify such segmentation when overridden in derived class.
|
2010-04-08 20:19:03 +00:00
|
|
|
|
*
|
2010-02-02 15:09:01 +00:00
|
|
|
|
* @param $string String
|
|
|
|
|
|
* @return String
|
|
|
|
|
|
*/
|
2010-03-10 21:54:23 +00:00
|
|
|
|
function segmentByWord( $string ) {
|
2010-02-02 15:09:01 +00:00
|
|
|
|
return $string;
|
|
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
/**
|
2010-02-02 15:09:01 +00:00
|
|
|
|
* Some languages have special punctuation need to be normalized.
|
2010-01-18 20:54:43 +00:00
|
|
|
|
* Make such changes here.
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $string String
|
|
|
|
|
|
* @return String
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
*/
|
2010-02-02 15:09:01 +00:00
|
|
|
|
function normalizeForSearch( $string ) {
|
2010-07-29 09:43:18 +00:00
|
|
|
|
return self::convertDoubleWidth( $string );
|
2008-11-25 02:39:06 +00:00
|
|
|
|
}
|
2003-04-14 23:10:40 +00:00
|
|
|
|
|
2010-01-07 04:50:32 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* convert double-width roman characters to single-width.
|
|
|
|
|
|
* range: ff00-ff5f ~= 0020-007f
|
|
|
|
|
|
*/
|
|
|
|
|
|
protected static function convertDoubleWidth( $string ) {
|
2010-03-23 19:50:59 +00:00
|
|
|
|
static $full = null;
|
|
|
|
|
|
static $half = null;
|
|
|
|
|
|
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $full === null ) {
|
2010-03-23 19:50:59 +00:00
|
|
|
|
$fullWidth = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
|
|
|
|
$halfWidth = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
|
|
|
|
|
|
$full = str_split( $fullWidth, 3 );
|
|
|
|
|
|
$half = str_split( $halfWidth );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$string = str_replace( $full, $half, $string );
|
2010-01-07 04:50:32 +00:00
|
|
|
|
return $string;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2010-02-02 15:09:01 +00:00
|
|
|
|
protected static function insertSpace( $string, $pattern ) {
|
2010-01-07 04:50:32 +00:00
|
|
|
|
$string = preg_replace( $pattern, " $1 ", $string );
|
|
|
|
|
|
$string = preg_replace( '/ +/', ' ', $string );
|
|
|
|
|
|
return $string;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2004-11-29 01:22:44 +00:00
|
|
|
|
function convertForSearchResult( $termsArray ) {
|
|
|
|
|
|
# some languages, e.g. Chinese, need to do a conversion
|
|
|
|
|
|
# in order for search results to be displayed correctly
|
|
|
|
|
|
return $termsArray;
|
2005-07-03 07:15:53 +00:00
|
|
|
|
}
|
2004-11-29 01:22:44 +00:00
|
|
|
|
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
/**
|
2010-01-11 04:23:41 +00:00
|
|
|
|
* Get the first character of a string.
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $s string
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
2004-06-05 08:31:41 +00:00
|
|
|
|
function firstChar( $s ) {
|
2007-01-12 07:26:32 +00:00
|
|
|
|
$matches = array();
|
2010-04-08 20:19:03 +00:00
|
|
|
|
preg_match(
|
|
|
|
|
|
'/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' .
|
|
|
|
|
|
'[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})/',
|
|
|
|
|
|
$s,
|
|
|
|
|
|
$matches
|
|
|
|
|
|
);
|
2006-07-26 07:15:39 +00:00
|
|
|
|
|
2008-05-19 20:20:33 +00:00
|
|
|
|
if ( isset( $matches[1] ) ) {
|
|
|
|
|
|
if ( strlen( $matches[1] ) != 3 ) {
|
|
|
|
|
|
return $matches[1];
|
|
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2008-05-19 20:20:33 +00:00
|
|
|
|
// Break down Hangul syllables to grab the first jamo
|
|
|
|
|
|
$code = utf8ToCodepoint( $matches[1] );
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( $code < 0xac00 || 0xd7a4 <= $code ) {
|
2008-05-19 20:20:33 +00:00
|
|
|
|
return $matches[1];
|
|
|
|
|
|
} elseif ( $code < 0xb098 ) {
|
|
|
|
|
|
return "\xe3\x84\xb1";
|
|
|
|
|
|
} elseif ( $code < 0xb2e4 ) {
|
|
|
|
|
|
return "\xe3\x84\xb4";
|
|
|
|
|
|
} elseif ( $code < 0xb77c ) {
|
|
|
|
|
|
return "\xe3\x84\xb7";
|
|
|
|
|
|
} elseif ( $code < 0xb9c8 ) {
|
|
|
|
|
|
return "\xe3\x84\xb9";
|
|
|
|
|
|
} elseif ( $code < 0xbc14 ) {
|
|
|
|
|
|
return "\xe3\x85\x81";
|
|
|
|
|
|
} elseif ( $code < 0xc0ac ) {
|
|
|
|
|
|
return "\xe3\x85\x82";
|
|
|
|
|
|
} elseif ( $code < 0xc544 ) {
|
|
|
|
|
|
return "\xe3\x85\x85";
|
|
|
|
|
|
} elseif ( $code < 0xc790 ) {
|
|
|
|
|
|
return "\xe3\x85\x87";
|
|
|
|
|
|
} elseif ( $code < 0xcc28 ) {
|
|
|
|
|
|
return "\xe3\x85\x88";
|
|
|
|
|
|
} elseif ( $code < 0xce74 ) {
|
|
|
|
|
|
return "\xe3\x85\x8a";
|
|
|
|
|
|
} elseif ( $code < 0xd0c0 ) {
|
|
|
|
|
|
return "\xe3\x85\x8b";
|
|
|
|
|
|
} elseif ( $code < 0xd30c ) {
|
|
|
|
|
|
return "\xe3\x85\x8c";
|
|
|
|
|
|
} elseif ( $code < 0xd558 ) {
|
|
|
|
|
|
return "\xe3\x85\x8d";
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return "\xe3\x85\x8e";
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return '';
|
2008-05-19 20:20:33 +00:00
|
|
|
|
}
|
2004-06-05 08:31:41 +00:00
|
|
|
|
}
|
2003-04-14 23:10:40 +00:00
|
|
|
|
|
2005-03-14 02:00:53 +00:00
|
|
|
|
function initEncoding() {
|
|
|
|
|
|
# Some languages may have an alternate char encoding option
|
|
|
|
|
|
# (Esperanto X-coding, Japanese furigana conversion, etc)
|
|
|
|
|
|
# If this language is used as the primary content language,
|
|
|
|
|
|
# an override to the defaults can be set here on startup.
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function recodeForEdit( $s ) {
|
|
|
|
|
|
# For some languages we'll want to explicitly specify
|
|
|
|
|
|
# which characters make it into the edit box raw
|
|
|
|
|
|
# or are converted in some way or another.
|
|
|
|
|
|
# Note that if wgOutputEncoding is different from
|
|
|
|
|
|
# wgInputEncoding, this text will be further converted
|
|
|
|
|
|
# to wgOutputEncoding.
|
2006-07-26 07:15:39 +00:00
|
|
|
|
global $wgEditEncoding;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $wgEditEncoding == '' || $wgEditEncoding == 'UTF-8' ) {
|
2003-04-14 23:10:40 +00:00
|
|
|
|
return $s;
|
|
|
|
|
|
} else {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
return $this->iconv( 'UTF-8', $wgEditEncoding, $s );
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function recodeInput( $s ) {
|
|
|
|
|
|
# Take the previous into account.
|
2006-07-26 07:15:39 +00:00
|
|
|
|
global $wgEditEncoding;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $wgEditEncoding != '' ) {
|
2003-04-14 23:10:40 +00:00
|
|
|
|
$enc = $wgEditEncoding;
|
|
|
|
|
|
} else {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
$enc = 'UTF-8';
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $enc == 'UTF-8' ) {
|
2003-04-14 23:10:40 +00:00
|
|
|
|
return $s;
|
|
|
|
|
|
} else {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
return $this->iconv( $enc, 'UTF-8', $s );
|
2003-04-14 23:10:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2010-01-04 08:28:50 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Convert a UTF-8 string to normal form C. In Malayalam and Arabic, this
|
2010-01-11 04:23:41 +00:00
|
|
|
|
* also cleans up certain backwards-compatible sequences, converting them
|
2010-01-04 08:28:50 +00:00
|
|
|
|
* to the modern Unicode equivalent.
|
|
|
|
|
|
*
|
|
|
|
|
|
* This is language-specific for performance reasons only.
|
|
|
|
|
|
*/
|
|
|
|
|
|
function normalize( $s ) {
|
2010-07-08 09:15:53 +00:00
|
|
|
|
global $wgAllUnicodeFixes;
|
|
|
|
|
|
$s = UtfNormal::cleanUp( $s );
|
|
|
|
|
|
if ( $wgAllUnicodeFixes ) {
|
|
|
|
|
|
$s = $this->transformUsingPairFile( 'normalize-ar.ser', $s );
|
|
|
|
|
|
$s = $this->transformUsingPairFile( 'normalize-ml.ser', $s );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return $s;
|
2010-01-04 08:28:50 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Transform a string using serialized data stored in the given file (which
|
|
|
|
|
|
* must be in the serialized subdirectory of $IP). The file contains pairs
|
2010-01-11 04:23:41 +00:00
|
|
|
|
* mapping source characters to destination characters.
|
2010-01-04 08:28:50 +00:00
|
|
|
|
*
|
2010-01-11 04:23:41 +00:00
|
|
|
|
* The data is cached in process memory. This will go faster if you have the
|
2010-01-04 08:28:50 +00:00
|
|
|
|
* FastStringSearch extension.
|
|
|
|
|
|
*/
|
|
|
|
|
|
function transformUsingPairFile( $file, $string ) {
|
|
|
|
|
|
if ( !isset( $this->transformData[$file] ) ) {
|
|
|
|
|
|
$data = wfGetPrecompiledData( $file );
|
|
|
|
|
|
if ( $data === false ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
throw new MWException( __METHOD__ . ": The transformation file $file is missing" );
|
2010-01-04 08:28:50 +00:00
|
|
|
|
}
|
|
|
|
|
|
$this->transformData[$file] = new ReplacementArray( $data );
|
|
|
|
|
|
}
|
|
|
|
|
|
return $this->transformData[$file]->replace( $string );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* For right-to-left language support
|
2005-05-03 12:27:30 +00:00
|
|
|
|
*
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
* @return bool
|
|
|
|
|
|
*/
|
2010-01-11 04:23:41 +00:00
|
|
|
|
function isRTL() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'rtl' );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2009-08-22 01:24:04 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Return the correct HTML 'dir' attribute value for this language.
|
|
|
|
|
|
* @return String
|
|
|
|
|
|
*/
|
|
|
|
|
|
function getDir() {
|
|
|
|
|
|
return $this->isRTL() ? 'rtl' : 'ltr';
|
|
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2009-08-22 01:24:04 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Return 'left' or 'right' as appropriate alignment for line-start
|
|
|
|
|
|
* for this language's text direction.
|
|
|
|
|
|
*
|
|
|
|
|
|
* Should be equivalent to CSS3 'start' text-align value....
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return String
|
|
|
|
|
|
*/
|
|
|
|
|
|
function alignStart() {
|
|
|
|
|
|
return $this->isRTL() ? 'right' : 'left';
|
|
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2009-08-22 01:24:04 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Return 'right' or 'left' as appropriate alignment for line-end
|
|
|
|
|
|
* for this language's text direction.
|
|
|
|
|
|
*
|
|
|
|
|
|
* Should be equivalent to CSS3 'end' text-align value....
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return String
|
|
|
|
|
|
*/
|
|
|
|
|
|
function alignEnd() {
|
|
|
|
|
|
return $this->isRTL() ? 'left' : 'right';
|
|
|
|
|
|
}
|
2006-06-20 08:11:56 +00:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* A hidden direction mark (LRM or RLM), depending on the language direction
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
2006-08-06 18:08:21 +00:00
|
|
|
|
function getDirMark() {
|
|
|
|
|
|
return $this->isRTL() ? "\xE2\x80\x8F" : "\xE2\x80\x8E";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2009-06-17 04:26:06 +00:00
|
|
|
|
function capitalizeAllNouns() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'capitalizeAllNouns' );
|
2009-06-17 04:26:06 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2006-08-06 18:08:21 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* An arrow, depending on the language direction
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
|
|
|
|
|
function getArrow() {
|
|
|
|
|
|
return $this->isRTL() ? '←' : '→';
|
|
|
|
|
|
}
|
2003-08-31 09:46:37 +00:00
|
|
|
|
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* To allow "foo[[bar]]" to extend the link over the whole word "foobar"
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return bool
|
|
|
|
|
|
*/
|
2006-08-06 18:08:21 +00:00
|
|
|
|
function linkPrefixExtension() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'linkPrefixExtension' );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
2004-02-15 10:05:52 +00:00
|
|
|
|
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
function getMagicWords() {
|
|
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'magicWords' );
|
2003-08-31 09:46:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Fill a MagicWord object with data from here
|
2009-08-21 20:18:20 +00:00
|
|
|
|
function getMagic( $mw ) {
|
2007-09-04 02:48:34 +00:00
|
|
|
|
if ( !$this->mMagicHookDone ) {
|
|
|
|
|
|
$this->mMagicHookDone = true;
|
2009-09-14 21:30:01 +00:00
|
|
|
|
wfProfileIn( 'LanguageGetMagic' );
|
2006-07-03 03:30:28 +00:00
|
|
|
|
wfRunHooks( 'LanguageGetMagic', array( &$this->mMagicExtensions, $this->getCode() ) );
|
2009-09-14 21:30:01 +00:00
|
|
|
|
wfProfileOut( 'LanguageGetMagic' );
|
2004-05-28 21:20:51 +00:00
|
|
|
|
}
|
2006-07-03 03:30:28 +00:00
|
|
|
|
if ( isset( $this->mMagicExtensions[$mw->mId] ) ) {
|
|
|
|
|
|
$rawEntry = $this->mMagicExtensions[$mw->mId];
|
|
|
|
|
|
} else {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
$magicWords = $this->getMagicWords();
|
2006-07-03 03:30:28 +00:00
|
|
|
|
if ( isset( $magicWords[$mw->mId] ) ) {
|
|
|
|
|
|
$rawEntry = $magicWords[$mw->mId];
|
|
|
|
|
|
} else {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
$rawEntry = false;
|
2006-07-03 03:30:28 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( !is_array( $rawEntry ) ) {
|
2006-08-31 10:19:12 +00:00
|
|
|
|
error_log( "\"$rawEntry\" is not a valid magic thingie for \"$mw->mId\"" );
|
2007-12-06 22:16:47 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
$mw->mCaseSensitive = $rawEntry[0];
|
|
|
|
|
|
$mw->mSynonyms = array_slice( $rawEntry, 1 );
|
2006-08-31 10:19:12 +00:00
|
|
|
|
}
|
2003-08-31 09:46:37 +00:00
|
|
|
|
}
|
2005-07-03 07:15:53 +00:00
|
|
|
|
|
2007-09-04 02:48:34 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Add magic words to the extension array
|
|
|
|
|
|
*/
|
|
|
|
|
|
function addMagicWordsByLang( $newWords ) {
|
|
|
|
|
|
$code = $this->getCode();
|
|
|
|
|
|
$fallbackChain = array();
|
|
|
|
|
|
while ( $code && !in_array( $code, $fallbackChain ) ) {
|
|
|
|
|
|
$fallbackChain[] = $code;
|
|
|
|
|
|
$code = self::getFallbackFor( $code );
|
|
|
|
|
|
}
|
2007-09-06 00:21:49 +00:00
|
|
|
|
if ( !in_array( 'en', $fallbackChain ) ) {
|
|
|
|
|
|
$fallbackChain[] = 'en';
|
|
|
|
|
|
}
|
2007-09-04 02:48:34 +00:00
|
|
|
|
$fallbackChain = array_reverse( $fallbackChain );
|
|
|
|
|
|
foreach ( $fallbackChain as $code ) {
|
|
|
|
|
|
if ( isset( $newWords[$code] ) ) {
|
|
|
|
|
|
$this->mMagicExtensions = $newWords[$code] + $this->mMagicExtensions;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2006-10-30 06:25:31 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Get special page names, as an associative array
|
|
|
|
|
|
* case folded alias => real name
|
|
|
|
|
|
*/
|
|
|
|
|
|
function getSpecialPageAliases() {
|
2008-06-25 10:59:22 +00:00
|
|
|
|
// Cache aliases because it may be slow to load them
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
if ( is_null( $this->mExtendedSpecialPageAliases ) ) {
|
2008-06-25 10:59:22 +00:00
|
|
|
|
// Initialise array
|
2010-01-11 04:23:41 +00:00
|
|
|
|
$this->mExtendedSpecialPageAliases =
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
self::$dataCache->getItem( $this->mCode, 'specialPageAliases' );
|
2008-06-25 10:59:22 +00:00
|
|
|
|
wfRunHooks( 'LanguageGetSpecialPageAliases',
|
2008-06-25 15:14:41 +00:00
|
|
|
|
array( &$this->mExtendedSpecialPageAliases, $this->getCode() ) );
|
2006-10-30 06:25:31 +00:00
|
|
|
|
}
|
2008-06-25 10:59:22 +00:00
|
|
|
|
|
2006-10-30 06:25:31 +00:00
|
|
|
|
return $this->mExtendedSpecialPageAliases;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2005-07-03 07:15:53 +00:00
|
|
|
|
/**
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
* Italic is unsuitable for some languages
|
|
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $text String: the text to be emphasized.
|
2005-05-03 12:27:30 +00:00
|
|
|
|
* @return string
|
* @package MediaWiki and @subpackage Language
* Documented getDefaultUserOptions(), getBookstoreList(), getNsText(),
getNsIndex(), getVariantname(), stripForSearch(), firstChar(), isRTL(),
linkPrefixExtension(), emphasize(), formatNum()
2005-04-05 11:12:30 +00:00
|
|
|
|
*/
|
2004-11-21 07:36:46 +00:00
|
|
|
|
function emphasize( $text ) {
|
2005-05-03 12:27:30 +00:00
|
|
|
|
return "<em>$text</em>";
|
2004-01-30 14:50:26 +00:00
|
|
|
|
}
|
2004-03-02 20:23:56 +00:00
|
|
|
|
|
2006-04-29 20:07:14 +00:00
|
|
|
|
/**
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* Normally we output all numbers in plain en_US style, that is
|
|
|
|
|
|
* 293,291.235 for twohundredninetythreethousand-twohundredninetyone
|
|
|
|
|
|
* point twohundredthirtyfive. However this is not sutable for all
|
|
|
|
|
|
* languages, some such as Pakaran want ੨੯੩,੨੯੫.੨੩੫ and others such as
|
|
|
|
|
|
* Icelandic just want to use commas instead of dots, and dots instead
|
|
|
|
|
|
* of commas like "293.291,235".
|
|
|
|
|
|
*
|
|
|
|
|
|
* An example of this function being called:
|
|
|
|
|
|
* <code>
|
|
|
|
|
|
* wfMsg( 'message', $wgLang->formatNum( $num ) )
|
|
|
|
|
|
* </code>
|
|
|
|
|
|
*
|
|
|
|
|
|
* See LanguageGu.php for the Gujarati implementation and
|
2008-10-17 20:06:37 +00:00
|
|
|
|
* $separatorTransformTable on MessageIs.php for
|
|
|
|
|
|
* the , => . and . => , implementation.
|
2008-05-21 18:18:58 +00:00
|
|
|
|
*
|
|
|
|
|
|
* @todo check if it's viable to use localeconv() for the decimal
|
2008-09-15 20:38:27 +00:00
|
|
|
|
* separator thing.
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $number Mixed: the string to be formatted, should be an integer
|
|
|
|
|
|
* or a floating point number.
|
|
|
|
|
|
* @param $nocommafy Bool: set to true for special numbers like dates
|
|
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
2006-04-29 21:44:57 +00:00
|
|
|
|
function formatNum( $number, $nocommafy = false ) {
|
2006-04-29 20:07:14 +00:00
|
|
|
|
global $wgTranslateNumerals;
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !$nocommafy ) {
|
|
|
|
|
|
$number = $this->commafy( $number );
|
2006-04-29 20:07:14 +00:00
|
|
|
|
$s = $this->separatorTransformTable();
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( $s ) {
|
|
|
|
|
|
$number = strtr( $number, $s );
|
|
|
|
|
|
}
|
2006-04-29 20:07:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( $wgTranslateNumerals ) {
|
2006-04-29 20:07:14 +00:00
|
|
|
|
$s = $this->digitTransformTable();
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( $s ) {
|
|
|
|
|
|
$number = strtr( $number, $s );
|
|
|
|
|
|
}
|
2006-04-29 20:07:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return $number;
|
2004-03-06 03:03:14 +00:00
|
|
|
|
}
|
2005-07-03 07:15:53 +00:00
|
|
|
|
|
2006-12-23 18:58:44 +00:00
|
|
|
|
function parseFormattedNumber( $number ) {
|
|
|
|
|
|
$s = $this->digitTransformTable();
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( $s ) {
|
|
|
|
|
|
$number = strtr( $number, array_flip( $s ) );
|
|
|
|
|
|
}
|
2006-12-23 18:58:44 +00:00
|
|
|
|
|
|
|
|
|
|
$s = $this->separatorTransformTable();
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( $s ) {
|
|
|
|
|
|
$number = strtr( $number, array_flip( $s ) );
|
|
|
|
|
|
}
|
2006-12-23 18:58:44 +00:00
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$number = strtr( $number, array( ',' => '' ) );
|
2006-12-23 18:58:44 +00:00
|
|
|
|
return $number;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2005-04-12 23:21:59 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Adds commas to a given number
|
|
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $_ mixed
|
2005-04-12 23:21:59 +00:00
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
2010-07-29 09:43:18 +00:00
|
|
|
|
function commafy( $_ ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
return strrev( (string)preg_replace( '/(\d{3})(?=\d)(?!\d*\.)/', '$1,', strrev( $_ ) ) );
|
2005-04-12 23:21:59 +00:00
|
|
|
|
}
|
2005-04-13 08:37:03 +00:00
|
|
|
|
|
2006-04-29 20:07:14 +00:00
|
|
|
|
function digitTransformTable() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'digitTransformTable' );
|
2006-04-29 20:07:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function separatorTransformTable() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'separatorTransformTable' );
|
2006-04-29 20:07:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2005-04-13 08:37:03 +00:00
|
|
|
|
/**
|
2008-12-27 19:58:11 +00:00
|
|
|
|
* Take a list of strings and build a locale-friendly comma-separated
|
|
|
|
|
|
* list, using the local comma-separator message.
|
|
|
|
|
|
* The last two strings are chained with an "and".
|
2005-04-13 08:37:03 +00:00
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $l Array
|
2005-04-13 08:37:03 +00:00
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
2004-08-01 20:43:54 +00:00
|
|
|
|
function listToText( $l ) {
|
|
|
|
|
|
$s = '';
|
2008-12-27 19:58:11 +00:00
|
|
|
|
$m = count( $l ) - 1;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $m == 1 ) {
|
2008-12-27 19:58:11 +00:00
|
|
|
|
return $l[0] . $this->getMessageFromDB( 'and' ) . $this->getMessageFromDB( 'word-separator' ) . $l[1];
|
2010-04-08 20:19:03 +00:00
|
|
|
|
} else {
|
2008-12-27 19:58:11 +00:00
|
|
|
|
for ( $i = $m; $i >= 0; $i-- ) {
|
|
|
|
|
|
if ( $i == $m ) {
|
|
|
|
|
|
$s = $l[$i];
|
2010-07-29 09:43:18 +00:00
|
|
|
|
} else if ( $i == $m - 1 ) {
|
2008-12-27 19:58:11 +00:00
|
|
|
|
$s = $l[$i] . $this->getMessageFromDB( 'and' ) . $this->getMessageFromDB( 'word-separator' ) . $s;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$s = $l[$i] . $this->getMessageFromDB( 'comma-separator' ) . $s;
|
|
|
|
|
|
}
|
2004-08-01 20:43:54 +00:00
|
|
|
|
}
|
2008-12-27 19:58:11 +00:00
|
|
|
|
return $s;
|
2004-08-01 20:43:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2008-12-27 19:58:11 +00:00
|
|
|
|
|
2008-09-19 18:47:47 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Take a list of strings and build a locale-friendly comma-separated
|
|
|
|
|
|
* list, using the local comma-separator message.
|
2008-09-30 16:24:23 +00:00
|
|
|
|
* @param $list array of strings to put in a comma list
|
|
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
2008-12-27 20:30:33 +00:00
|
|
|
|
function commaList( $list ) {
|
2008-09-30 16:24:23 +00:00
|
|
|
|
return implode(
|
|
|
|
|
|
$list,
|
2010-04-08 20:19:03 +00:00
|
|
|
|
wfMsgExt(
|
|
|
|
|
|
'comma-separator',
|
|
|
|
|
|
array( 'parsemag', 'escapenoentities', 'language' => $this )
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
2008-09-30 16:24:23 +00:00
|
|
|
|
}
|
2009-03-06 10:56:37 +00:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Take a list of strings and build a locale-friendly semicolon-separated
|
|
|
|
|
|
* list, using the local semicolon-separator message.
|
|
|
|
|
|
* @param $list array of strings to put in a semicolon list
|
|
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
|
|
|
|
|
function semicolonList( $list ) {
|
|
|
|
|
|
return implode(
|
|
|
|
|
|
$list,
|
2010-04-08 20:19:03 +00:00
|
|
|
|
wfMsgExt(
|
|
|
|
|
|
'semicolon-separator',
|
|
|
|
|
|
array( 'parsemag', 'escapenoentities', 'language' => $this )
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
2009-03-06 10:56:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2008-09-30 16:24:23 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Same as commaList, but separate it with the pipe instead.
|
|
|
|
|
|
* @param $list array of strings to put in a pipe list
|
|
|
|
|
|
* @return string
|
2008-09-19 18:47:47 +00:00
|
|
|
|
*/
|
2008-09-30 17:15:11 +00:00
|
|
|
|
function pipeList( $list ) {
|
2008-09-19 18:47:47 +00:00
|
|
|
|
return implode(
|
|
|
|
|
|
$list,
|
2010-04-08 20:19:03 +00:00
|
|
|
|
wfMsgExt(
|
|
|
|
|
|
'pipe-separator',
|
|
|
|
|
|
array( 'escapenoentities', 'language' => $this )
|
|
|
|
|
|
)
|
|
|
|
|
|
);
|
2008-09-19 18:47:47 +00:00
|
|
|
|
}
|
2004-08-09 05:38:11 +00:00
|
|
|
|
|
2007-08-29 01:34:44 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Truncate a string to a specified length in bytes, appending an optional
|
|
|
|
|
|
* string (e.g. for ellipses)
|
|
|
|
|
|
*
|
|
|
|
|
|
* The database offers limited byte lengths for some columns in the database;
|
|
|
|
|
|
* multi-byte character sets mean we need to ensure that only whole characters
|
|
|
|
|
|
* are included, otherwise broken characters can be passed to the user
|
|
|
|
|
|
*
|
|
|
|
|
|
* If $length is negative, the string will be truncated from the beginning
|
2010-01-11 04:23:41 +00:00
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $string String to truncate
|
|
|
|
|
|
* @param $length Int: maximum length (excluding ellipses)
|
|
|
|
|
|
* @param $ellipsis String to append to the truncated text
|
2007-08-29 01:34:44 +00:00
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
2009-02-13 19:13:48 +00:00
|
|
|
|
function truncate( $string, $length, $ellipsis = '...' ) {
|
|
|
|
|
|
# Use the localized ellipsis character
|
2010-02-24 04:14:45 +00:00
|
|
|
|
if ( $ellipsis == '...' ) {
|
2009-02-13 19:13:48 +00:00
|
|
|
|
$ellipsis = wfMsgExt( 'ellipsis', array( 'escapenoentities', 'language' => $this ) );
|
|
|
|
|
|
}
|
2010-02-24 04:14:45 +00:00
|
|
|
|
# Check if there is no need to truncate
|
|
|
|
|
|
if ( $length == 0 ) {
|
2004-08-01 20:43:54 +00:00
|
|
|
|
return $ellipsis;
|
2010-02-24 04:14:45 +00:00
|
|
|
|
} elseif ( strlen( $string ) <= abs( $length ) ) {
|
2004-08-01 20:43:54 +00:00
|
|
|
|
return $string;
|
|
|
|
|
|
}
|
2010-01-29 13:39:06 +00:00
|
|
|
|
$stringOriginal = $string;
|
2010-02-24 04:14:45 +00:00
|
|
|
|
if ( $length > 0 ) {
|
|
|
|
|
|
$string = substr( $string, 0, $length ); // xyz...
|
2010-02-26 07:11:01 +00:00
|
|
|
|
$string = $this->removeBadCharLast( $string );
|
2010-02-11 21:21:22 +00:00
|
|
|
|
$string = $string . $ellipsis;
|
2004-08-01 20:43:54 +00:00
|
|
|
|
} else {
|
2010-02-24 04:14:45 +00:00
|
|
|
|
$string = substr( $string, $length ); // ...xyz
|
2010-02-26 07:11:01 +00:00
|
|
|
|
$string = $this->removeBadCharFirst( $string );
|
2010-02-11 21:21:22 +00:00
|
|
|
|
$string = $ellipsis . $string;
|
|
|
|
|
|
}
|
2010-03-07 12:32:21 +00:00
|
|
|
|
# Do not truncate if the ellipsis makes the string longer/equal (bug 22181)
|
2010-02-11 21:21:22 +00:00
|
|
|
|
if ( strlen( $string ) < strlen( $stringOriginal ) ) {
|
|
|
|
|
|
return $string;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return $stringOriginal;
|
2004-04-26 05:14:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2004-08-27 14:55:41 +00:00
|
|
|
|
|
2010-02-24 04:14:45 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Remove bytes that represent an incomplete Unicode character
|
|
|
|
|
|
* at the end of string (e.g. bytes of the char are missing)
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param $string String
|
|
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
|
|
|
|
|
protected function removeBadCharLast( $string ) {
|
|
|
|
|
|
$char = ord( $string[strlen( $string ) - 1] );
|
|
|
|
|
|
$m = array();
|
|
|
|
|
|
if ( $char >= 0xc0 ) {
|
|
|
|
|
|
# We got the first byte only of a multibyte char; remove it.
|
|
|
|
|
|
$string = substr( $string, 0, -1 );
|
|
|
|
|
|
} elseif ( $char >= 0x80 &&
|
|
|
|
|
|
preg_match( '/^(.*)(?:[\xe0-\xef][\x80-\xbf]|' .
|
|
|
|
|
|
'[\xf0-\xf7][\x80-\xbf]{1,2})$/', $string, $m ) )
|
|
|
|
|
|
{
|
|
|
|
|
|
# We chopped in the middle of a character; remove it
|
|
|
|
|
|
$string = $m[1];
|
|
|
|
|
|
}
|
|
|
|
|
|
return $string;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Remove bytes that represent an incomplete Unicode character
|
|
|
|
|
|
* at the start of string (e.g. bytes of the char are missing)
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param $string String
|
|
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
|
|
|
|
|
protected function removeBadCharFirst( $string ) {
|
|
|
|
|
|
$char = ord( $string[0] );
|
|
|
|
|
|
if ( $char >= 0x80 && $char < 0xc0 ) {
|
|
|
|
|
|
# We chopped in the middle of a character; remove the whole thing
|
|
|
|
|
|
$string = preg_replace( '/^[\x80-\xbf]+/', '', $string );
|
|
|
|
|
|
}
|
|
|
|
|
|
return $string;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
* Truncate a string of valid HTML to a specified length in bytes,
|
|
|
|
|
|
* appending an optional string (e.g. for ellipses), and return valid HTML
|
|
|
|
|
|
*
|
|
|
|
|
|
* This is only intended for styled/linked text, such as HTML with
|
|
|
|
|
|
* tags like <span> and <a>, were the tags are self-contained (valid HTML)
|
|
|
|
|
|
*
|
|
|
|
|
|
* Note: tries to fix broken HTML with MWTidy
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param string $text String to truncate
|
|
|
|
|
|
* @param int $length (zero/positive) Maximum length (excluding ellipses)
|
|
|
|
|
|
* @param string $ellipsis String to append to the truncated text
|
|
|
|
|
|
* @returns string
|
|
|
|
|
|
*/
|
|
|
|
|
|
function truncateHtml( $text, $length, $ellipsis = '...' ) {
|
|
|
|
|
|
# Use the localized ellipsis character
|
|
|
|
|
|
if ( $ellipsis == '...' ) {
|
|
|
|
|
|
$ellipsis = wfMsgExt( 'ellipsis', array( 'escapenoentities', 'language' => $this ) );
|
|
|
|
|
|
}
|
|
|
|
|
|
# Check if there is no need to truncate
|
|
|
|
|
|
if ( $length <= 0 ) {
|
|
|
|
|
|
return $ellipsis; // no text shown, nothing to format
|
2010-04-08 20:19:03 +00:00
|
|
|
|
} elseif ( strlen( $text ) <= $length ) {
|
2010-02-24 04:14:45 +00:00
|
|
|
|
return $text; // string short enough even *with* HTML
|
|
|
|
|
|
}
|
|
|
|
|
|
$text = MWTidy::tidy( $text ); // fix tags
|
|
|
|
|
|
$displayLen = 0; // innerHTML legth so far
|
2010-03-07 12:32:21 +00:00
|
|
|
|
$testingEllipsis = false; // checking if ellipses will make string longer/equal?
|
2010-02-24 04:14:45 +00:00
|
|
|
|
$tagType = 0; // 0-open, 1-close
|
|
|
|
|
|
$bracketState = 0; // 1-tag start, 2-tag name, 0-neither
|
|
|
|
|
|
$entityState = 0; // 0-not entity, 1-entity
|
|
|
|
|
|
$tag = $ret = $ch = '';
|
|
|
|
|
|
$openTags = array();
|
2010-07-29 09:43:18 +00:00
|
|
|
|
$textLen = strlen( $text );
|
|
|
|
|
|
for ( $pos = 0; $pos < $textLen; ++$pos ) {
|
2010-02-24 04:14:45 +00:00
|
|
|
|
$ch = $text[$pos];
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$lastCh = $pos ? $text[$pos - 1] : '';
|
2010-02-24 04:14:45 +00:00
|
|
|
|
$ret .= $ch; // add to result string
|
|
|
|
|
|
if ( $ch == '<' ) {
|
2010-02-26 07:11:01 +00:00
|
|
|
|
$this->truncate_endBracket( $tag, $tagType, $lastCh, $openTags ); // for bad HTML
|
2010-02-24 04:14:45 +00:00
|
|
|
|
$entityState = 0; // for bad HTML
|
|
|
|
|
|
$bracketState = 1; // tag started (checking for backslash)
|
|
|
|
|
|
} elseif ( $ch == '>' ) {
|
2010-02-26 07:11:01 +00:00
|
|
|
|
$this->truncate_endBracket( $tag, $tagType, $lastCh, $openTags );
|
2010-02-24 04:14:45 +00:00
|
|
|
|
$entityState = 0; // for bad HTML
|
|
|
|
|
|
$bracketState = 0; // out of brackets
|
|
|
|
|
|
} elseif ( $bracketState == 1 ) {
|
|
|
|
|
|
if ( $ch == '/' ) {
|
|
|
|
|
|
$tagType = 1; // close tag (e.g. "</span>")
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$tagType = 0; // open tag (e.g. "<span>")
|
|
|
|
|
|
$tag .= $ch;
|
|
|
|
|
|
}
|
|
|
|
|
|
$bracketState = 2; // building tag name
|
|
|
|
|
|
} elseif ( $bracketState == 2 ) {
|
|
|
|
|
|
if ( $ch != ' ' ) {
|
|
|
|
|
|
$tag .= $ch;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// Name found (e.g. "<a href=..."), add on tag attributes...
|
2010-02-26 07:11:01 +00:00
|
|
|
|
$pos += $this->truncate_skip( $ret, $text, "<>", $pos + 1 );
|
2010-02-24 04:14:45 +00:00
|
|
|
|
}
|
|
|
|
|
|
} elseif ( $bracketState == 0 ) {
|
|
|
|
|
|
if ( $entityState ) {
|
|
|
|
|
|
if ( $ch == ';' ) {
|
|
|
|
|
|
$entityState = 0;
|
|
|
|
|
|
$displayLen++; // entity is one displayed char
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if ( $ch == '&' ) {
|
2010-05-30 17:33:59 +00:00
|
|
|
|
$entityState = 1; // entity found, (e.g. " ")
|
2010-02-24 04:14:45 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
$displayLen++; // this char is displayed
|
|
|
|
|
|
// Add on the other display text after this...
|
2010-02-26 07:11:01 +00:00
|
|
|
|
$skipped = $this->truncate_skip(
|
2010-02-24 04:14:45 +00:00
|
|
|
|
$ret, $text, "<>&", $pos + 1, $length - $displayLen );
|
|
|
|
|
|
$displayLen += $skipped;
|
|
|
|
|
|
$pos += $skipped;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2010-03-07 12:32:21 +00:00
|
|
|
|
# Consider truncation once the display length has reached the maximim.
|
|
|
|
|
|
# Double-check that we're not in the middle of a bracket/entity...
|
2010-02-24 04:14:45 +00:00
|
|
|
|
if ( $displayLen >= $length && $bracketState == 0 && $entityState == 0 ) {
|
2010-03-07 12:32:21 +00:00
|
|
|
|
if ( !$testingEllipsis ) {
|
|
|
|
|
|
$testingEllipsis = true;
|
2010-03-07 23:47:00 +00:00
|
|
|
|
# Save where we are; we will truncate here unless
|
2010-03-07 12:32:21 +00:00
|
|
|
|
# the ellipsis actually makes the string longer.
|
|
|
|
|
|
$pOpenTags = $openTags; // save state
|
|
|
|
|
|
$pRet = $ret; // save state
|
2010-04-08 20:19:03 +00:00
|
|
|
|
} elseif ( $displayLen > ( $length + strlen( $ellipsis ) ) ) {
|
2010-03-07 12:32:21 +00:00
|
|
|
|
# Ellipsis won't make string longer/equal, the truncation point was OK.
|
|
|
|
|
|
$openTags = $pOpenTags; // reload state
|
|
|
|
|
|
$ret = $this->removeBadCharLast( $pRet ); // reload state, multi-byte char fix
|
|
|
|
|
|
$ret .= $ellipsis; // add ellipsis
|
2010-02-24 04:14:45 +00:00
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if ( $displayLen == 0 ) {
|
|
|
|
|
|
return ''; // no text shown, nothing to format
|
|
|
|
|
|
}
|
2010-04-08 20:19:03 +00:00
|
|
|
|
$this->truncate_endBracket( $tag, $text[$textLen - 1], $tagType, $openTags ); // for bad HTML
|
2010-02-24 04:14:45 +00:00
|
|
|
|
while ( count( $openTags ) > 0 ) {
|
|
|
|
|
|
$ret .= '</' . array_pop( $openTags ) . '>'; // close open tags
|
|
|
|
|
|
}
|
|
|
|
|
|
return $ret;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// truncateHtml() helper function
|
|
|
|
|
|
// like strcspn() but adds the skipped chars to $ret
|
2010-02-26 07:11:01 +00:00
|
|
|
|
private function truncate_skip( &$ret, $text, $search, $start, $len = -1 ) {
|
2010-02-24 04:14:45 +00:00
|
|
|
|
$skipCount = 0;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $start < strlen( $text ) ) {
|
2010-02-24 04:14:45 +00:00
|
|
|
|
$skipCount = strcspn( $text, $search, $start, $len );
|
|
|
|
|
|
$ret .= substr( $text, $start, $skipCount );
|
|
|
|
|
|
}
|
|
|
|
|
|
return $skipCount;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// truncateHtml() helper function
|
|
|
|
|
|
// (a) push or pop $tag from $openTags as needed
|
|
|
|
|
|
// (b) clear $tag value
|
2010-02-26 07:11:01 +00:00
|
|
|
|
private function truncate_endBracket( &$tag, $tagType, $lastCh, &$openTags ) {
|
2010-02-24 04:14:45 +00:00
|
|
|
|
$tag = ltrim( $tag );
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $tag != '' ) {
|
|
|
|
|
|
if ( $tagType == 0 && $lastCh != '/' ) {
|
2010-02-24 04:14:45 +00:00
|
|
|
|
$openTags[] = $tag; // tag opened (didn't close itself)
|
2010-07-29 09:43:18 +00:00
|
|
|
|
} else if ( $tagType == 1 ) {
|
|
|
|
|
|
if ( $openTags && $tag == $openTags[count( $openTags ) - 1] ) {
|
2010-02-24 04:14:45 +00:00
|
|
|
|
array_pop( $openTags ); // tag closed
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
$tag = '';
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2005-04-13 08:37:03 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Grammatical transformations, needed for inflected languages
|
|
|
|
|
|
* Invoked by putting {{grammar:case|word}} in a message
|
|
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $word string
|
|
|
|
|
|
* @param $case string
|
2005-04-13 08:37:03 +00:00
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
2004-08-27 14:55:41 +00:00
|
|
|
|
function convertGrammar( $word, $case ) {
|
2006-05-25 14:21:45 +00:00
|
|
|
|
global $wgGrammarForms;
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( isset( $wgGrammarForms[$this->getCode()][$case][$word] ) ) {
|
2008-01-02 19:58:15 +00:00
|
|
|
|
return $wgGrammarForms[$this->getCode()][$case][$word];
|
2006-05-25 14:21:45 +00:00
|
|
|
|
}
|
2004-08-27 14:55:41 +00:00
|
|
|
|
return $word;
|
|
|
|
|
|
}
|
2004-09-17 05:51:03 +00:00
|
|
|
|
|
2009-01-26 09:48:17 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Provides an alternative text depending on specified gender.
|
|
|
|
|
|
* Usage {{gender:username|masculine|feminine|neutral}}.
|
|
|
|
|
|
* username is optional, in which case the gender of current user is used,
|
|
|
|
|
|
* but only in (some) interface messages; otherwise default gender is used.
|
|
|
|
|
|
* If second or third parameter are not specified, masculine is used.
|
|
|
|
|
|
* These details may be overriden per language.
|
|
|
|
|
|
*/
|
|
|
|
|
|
function gender( $gender, $forms ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !count( $forms ) ) {
|
|
|
|
|
|
return '';
|
|
|
|
|
|
}
|
2009-01-26 09:48:17 +00:00
|
|
|
|
$forms = $this->preConvertPlural( $forms, 2 );
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( $gender === 'male' ) {
|
|
|
|
|
|
return $forms[0];
|
|
|
|
|
|
}
|
|
|
|
|
|
if ( $gender === 'female' ) {
|
|
|
|
|
|
return $forms[1];
|
|
|
|
|
|
}
|
|
|
|
|
|
return isset( $forms[2] ) ? $forms[2] : $forms[0];
|
2009-01-26 09:48:17 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2005-09-05 19:22:09 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Plural form transformations, needed for some languages.
|
2007-10-15 10:32:54 +00:00
|
|
|
|
* For example, there are 3 form of plural in Russian and Polish,
|
2005-09-05 19:22:09 +00:00
|
|
|
|
* depending on "count mod 10". See [[w:Plural]]
|
|
|
|
|
|
* For English it is pretty simple.
|
|
|
|
|
|
*
|
2005-09-06 17:02:19 +00:00
|
|
|
|
* Invoked by putting {{plural:count|wordform1|wordform2}}
|
|
|
|
|
|
* or {{plural:count|wordform1|wordform2|wordform3}}
|
2005-09-05 19:22:09 +00:00
|
|
|
|
*
|
2006-01-07 13:09:30 +00:00
|
|
|
|
* Example: {{plural:{{NUMBEROFARTICLES}}|article|articles}}
|
2005-09-05 19:22:09 +00:00
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $count Integer: non-localized number
|
|
|
|
|
|
* @param $forms Array: different plural forms
|
2007-11-18 20:15:49 +00:00
|
|
|
|
* @return string Correct form of plural for $count in this language
|
|
|
|
|
|
*/
|
|
|
|
|
|
function convertPlural( $count, $forms ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( !count( $forms ) ) {
|
|
|
|
|
|
return '';
|
|
|
|
|
|
}
|
2007-11-18 20:15:49 +00:00
|
|
|
|
$forms = $this->preConvertPlural( $forms, 2 );
|
|
|
|
|
|
|
2008-09-03 03:54:38 +00:00
|
|
|
|
return ( $count == 1 ) ? $forms[0] : $forms[1];
|
2007-11-18 20:15:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Checks that convertPlural was given an array and pads it to requested
|
|
|
|
|
|
* amound of forms by copying the last one.
|
|
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $count Integer: How many forms should there be at least
|
|
|
|
|
|
* @param $forms Array of forms given to convertPlural
|
2007-11-18 20:15:49 +00:00
|
|
|
|
* @return array Padded array of forms or an exception if not an array
|
2005-09-05 19:22:09 +00:00
|
|
|
|
*/
|
2007-12-22 12:41:42 +00:00
|
|
|
|
protected function preConvertPlural( /* Array */ $forms, $count ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
while ( count( $forms ) < $count ) {
|
|
|
|
|
|
$forms[] = $forms[count( $forms ) - 1];
|
2007-11-18 20:15:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
return $forms;
|
2005-09-05 19:22:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2005-08-27 16:35:10 +00:00
|
|
|
|
/**
|
2010-04-08 20:19:03 +00:00
|
|
|
|
* For translating of expiry times
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $str String: the validated block time in English
|
2005-08-27 16:35:10 +00:00
|
|
|
|
* @return Somehow translated block time
|
|
|
|
|
|
* @see LanguageFi.php for example implementation
|
|
|
|
|
|
*/
|
2007-09-10 01:53:24 +00:00
|
|
|
|
function translateBlockExpiry( $str ) {
|
2006-08-06 18:32:12 +00:00
|
|
|
|
$scBlockExpiryOptions = $this->getMessageFromDB( 'ipboptions' );
|
2006-01-03 20:59:19 +00:00
|
|
|
|
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( $scBlockExpiryOptions == '-' ) {
|
2006-01-03 20:59:19 +00:00
|
|
|
|
return $str;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2010-07-29 09:43:18 +00:00
|
|
|
|
foreach ( explode( ',', $scBlockExpiryOptions ) as $option ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( strpos( $option, ':' ) === false ) {
|
2006-01-03 20:59:19 +00:00
|
|
|
|
continue;
|
2010-04-08 20:19:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
list( $show, $value ) = explode( ':', $option );
|
|
|
|
|
|
if ( strcmp( $str, $value ) == 0 ) {
|
2007-09-10 01:53:24 +00:00
|
|
|
|
return htmlspecialchars( trim( $show ) );
|
2007-02-16 20:48:33 +00:00
|
|
|
|
}
|
2006-01-03 20:59:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2005-08-27 16:35:10 +00:00
|
|
|
|
return $str;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2005-04-13 08:37:03 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* languages like Chinese need to be segmented in order for the diff
|
|
|
|
|
|
* to be of any use
|
|
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $text String
|
|
|
|
|
|
* @return String
|
2005-04-13 08:37:03 +00:00
|
|
|
|
*/
|
2004-12-05 02:17:21 +00:00
|
|
|
|
function segmentForDiff( $text ) {
|
|
|
|
|
|
return $text;
|
|
|
|
|
|
}
|
2005-07-03 07:15:53 +00:00
|
|
|
|
|
2005-04-13 08:37:03 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* and unsegment to show the result
|
|
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $text String
|
|
|
|
|
|
* @return String
|
2005-04-13 08:37:03 +00:00
|
|
|
|
*/
|
2004-12-05 02:17:21 +00:00
|
|
|
|
function unsegmentForDiff( $text ) {
|
|
|
|
|
|
return $text;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2009-05-30 05:07:46 +00:00
|
|
|
|
# convert text to all supported variants
|
2010-04-08 20:19:03 +00:00
|
|
|
|
function autoConvertToAllVariants( $text ) {
|
|
|
|
|
|
return $this->mConverter->autoConvertToAllVariants( $text );
|
2009-05-30 05:07:46 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2004-12-24 02:47:38 +00:00
|
|
|
|
# convert text to different variants of a language.
|
2010-04-10 13:38:50 +00:00
|
|
|
|
function convert( $text ) {
|
|
|
|
|
|
return $this->mConverter->convert( $text );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Convert a Title object to a string in the preferred variant
|
|
|
|
|
|
function convertTitle( $title ) {
|
|
|
|
|
|
return $this->mConverter->convertTitle( $title );
|
2004-10-19 18:02:44 +00:00
|
|
|
|
}
|
2005-07-03 07:15:53 +00:00
|
|
|
|
|
2006-09-20 10:22:12 +00:00
|
|
|
|
# Check if this is a language with variants
|
2010-04-08 20:19:03 +00:00
|
|
|
|
function hasVariants() {
|
|
|
|
|
|
return sizeof( $this->getVariants() ) > 1;
|
2006-09-20 10:22:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2006-12-11 23:33:27 +00:00
|
|
|
|
# Put custom tags (e.g. -{ }-) around math to prevent conversion
|
2010-04-08 20:19:03 +00:00
|
|
|
|
function armourMath( $text ) {
|
|
|
|
|
|
return $this->mConverter->armourMath( $text );
|
2006-12-11 23:33:27 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2005-06-28 19:56:17 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Perform output conversion on a string, and encode for safe HTML output.
|
2009-07-26 15:54:11 +00:00
|
|
|
|
* @param $text String text to be converted
|
|
|
|
|
|
* @param $isTitle Bool whether this conversion is for the article title
|
2005-06-28 19:56:17 +00:00
|
|
|
|
* @return string
|
|
|
|
|
|
* @todo this should get integrated somewhere sane
|
|
|
|
|
|
*/
|
|
|
|
|
|
function convertHtml( $text, $isTitle = false ) {
|
|
|
|
|
|
return htmlspecialchars( $this->convert( $text, $isTitle ) );
|
|
|
|
|
|
}
|
2004-10-19 18:02:44 +00:00
|
|
|
|
|
2005-04-28 03:33:54 +00:00
|
|
|
|
function convertCategoryKey( $key ) {
|
|
|
|
|
|
return $this->mConverter->convertCategoryKey( $key );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2005-04-08 16:31:32 +00:00
|
|
|
|
/**
|
2010-04-08 20:19:03 +00:00
|
|
|
|
* Get the list of variants supported by this langauge
|
2005-04-08 16:31:32 +00:00
|
|
|
|
* see sample implementation in LanguageZh.php
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return array an array of language codes
|
|
|
|
|
|
*/
|
2004-09-24 18:37:33 +00:00
|
|
|
|
function getVariants() {
|
2005-04-15 14:12:39 +00:00
|
|
|
|
return $this->mConverter->getVariants();
|
2004-09-24 18:37:33 +00:00
|
|
|
|
}
|
2005-04-08 16:31:32 +00:00
|
|
|
|
|
2009-12-04 15:47:25 +00:00
|
|
|
|
function getPreferredVariant( $fromUser = true, $fromHeader = false ) {
|
|
|
|
|
|
return $this->mConverter->getPreferredVariant( $fromUser, $fromHeader );
|
2004-09-24 18:37:33 +00:00
|
|
|
|
}
|
2004-10-21 02:47:51 +00:00
|
|
|
|
|
2005-04-08 16:31:32 +00:00
|
|
|
|
/**
|
2010-04-08 20:19:03 +00:00
|
|
|
|
* If a language supports multiple variants, it is
|
2005-04-07 21:59:02 +00:00
|
|
|
|
* possible that non-existing link in one variant
|
2005-07-03 07:15:53 +00:00
|
|
|
|
* actually exists in another variant. this function
|
2005-04-07 21:59:02 +00:00
|
|
|
|
* tries to find it. See e.g. LanguageZh.php
|
2005-04-08 16:31:32 +00:00
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $link String: the name of the link
|
|
|
|
|
|
* @param $nt Mixed: the title object of the link
|
2010-02-22 21:34:19 +00:00
|
|
|
|
* @param $ignoreOtherCond Boolean: to disable other conditions when
|
2009-02-02 07:54:43 +00:00
|
|
|
|
* we need to transclude a template or update a category's link
|
2005-04-08 16:31:32 +00:00
|
|
|
|
* @return null the input parameters may be modified upon return
|
2005-04-07 21:59:02 +00:00
|
|
|
|
*/
|
2009-02-02 07:54:43 +00:00
|
|
|
|
function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) {
|
|
|
|
|
|
$this->mConverter->findVariantLink( $link, $nt, $ignoreOtherCond );
|
2004-10-21 02:47:51 +00:00
|
|
|
|
}
|
2004-12-07 22:23:21 +00:00
|
|
|
|
|
2006-09-20 10:22:12 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* If a language supports multiple variants, converts text
|
|
|
|
|
|
* into an array of all possible variants of the text:
|
|
|
|
|
|
* 'variant' => text in that variant
|
|
|
|
|
|
*/
|
2010-04-08 20:19:03 +00:00
|
|
|
|
function convertLinkToAllVariants( $text ) {
|
|
|
|
|
|
return $this->mConverter->convertLinkToAllVariants( $text );
|
2006-09-20 10:22:12 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2005-04-08 16:31:32 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* returns language specific options used by User::getPageRenderHash()
|
|
|
|
|
|
* for example, the preferred language variant
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return string
|
2005-04-07 21:59:02 +00:00
|
|
|
|
*/
|
2004-12-07 22:23:21 +00:00
|
|
|
|
function getExtraHashOptions() {
|
2005-04-15 14:12:39 +00:00
|
|
|
|
return $this->mConverter->getExtraHashOptions();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2010-04-08 20:19:03 +00:00
|
|
|
|
* For languages that support multiple variants, the title of an
|
2005-04-15 14:12:39 +00:00
|
|
|
|
* article may be displayed differently in different variants. this
|
|
|
|
|
|
* function returns the apporiate title defined in the body of the article.
|
2005-07-03 07:15:53 +00:00
|
|
|
|
*
|
2005-04-15 14:12:39 +00:00
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
|
|
|
|
|
function getParsedTitle() {
|
|
|
|
|
|
return $this->mConverter->getParsedTitle();
|
2004-12-07 22:23:21 +00:00
|
|
|
|
}
|
2005-07-03 07:15:53 +00:00
|
|
|
|
|
2005-04-15 14:12:39 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Enclose a string with the "no conversion" tag. This is used by
|
|
|
|
|
|
* various functions in the Parser
|
2005-07-03 07:15:53 +00:00
|
|
|
|
*
|
2008-05-21 18:18:58 +00:00
|
|
|
|
* @param $text String: text to be tagged for no conversion
|
|
|
|
|
|
* @param $noParse
|
2005-04-15 14:12:39 +00:00
|
|
|
|
* @return string the tagged text
|
2008-05-21 18:18:58 +00:00
|
|
|
|
*/
|
2010-04-08 20:19:03 +00:00
|
|
|
|
function markNoConversion( $text, $noParse = false ) {
|
2006-09-20 10:22:12 +00:00
|
|
|
|
return $this->mConverter->markNoConversion( $text, $noParse );
|
2005-04-15 14:12:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2004-12-09 05:51:20 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* A regular expression to match legal word-trailing characters
|
|
|
|
|
|
* which should be merged onto a link of the form [[foo]]bar.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return string
|
|
|
|
|
|
*/
|
|
|
|
|
|
function linkTrail() {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::$dataCache->getItem( $this->mCode, 'linkTrail' );
|
2004-12-09 05:51:20 +00:00
|
|
|
|
}
|
2004-12-07 22:23:21 +00:00
|
|
|
|
|
2004-12-24 02:47:38 +00:00
|
|
|
|
function getLangObj() {
|
|
|
|
|
|
return $this;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2005-07-06 07:53:51 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Get the RFC 3066 code for this language object
|
|
|
|
|
|
*/
|
|
|
|
|
|
function getCode() {
|
2006-07-26 07:15:39 +00:00
|
|
|
|
return $this->mCode;
|
2005-07-06 07:53:51 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
function setCode( $code ) {
|
|
|
|
|
|
$this->mCode = $code;
|
|
|
|
|
|
}
|
2005-04-07 23:04:08 +00:00
|
|
|
|
|
2010-01-06 10:20:38 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Get the name of a file for a certain language code
|
|
|
|
|
|
* @param $prefix string Prepend this to the filename
|
|
|
|
|
|
* @param $code string Language code
|
|
|
|
|
|
* @param $suffix string Append this to the filename
|
|
|
|
|
|
* @return string $prefix . $mangledCode . $suffix
|
|
|
|
|
|
*/
|
2006-07-26 07:15:39 +00:00
|
|
|
|
static function getFileName( $prefix = 'Language', $code, $suffix = '.php' ) {
|
|
|
|
|
|
return $prefix . str_replace( '-', '_', ucfirst( $code ) ) . $suffix;
|
|
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2010-01-06 10:20:38 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Get the language code from a file name. Inverse of getFileName()
|
|
|
|
|
|
* @param $filename string $prefix . $languageCode . $suffix
|
|
|
|
|
|
* @param $prefix string Prefix before the language code
|
|
|
|
|
|
* @param $suffix string Suffix after the language code
|
|
|
|
|
|
* @return Language code, or false if $prefix or $suffix isn't found
|
|
|
|
|
|
*/
|
|
|
|
|
|
static function getCodeFromFileName( $filename, $prefix = 'Language', $suffix = '.php' ) {
|
|
|
|
|
|
$m = null;
|
2010-01-06 19:24:26 +00:00
|
|
|
|
preg_match( '/' . preg_quote( $prefix, '/' ) . '([A-Z][a-z_]+)' .
|
|
|
|
|
|
preg_quote( $suffix, '/' ) . '/', $filename, $m );
|
2010-01-06 10:20:38 +00:00
|
|
|
|
if ( !count( $m ) ) {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
return str_replace( '_', '-', strtolower( $m[1] ) );
|
|
|
|
|
|
}
|
2006-07-26 07:15:39 +00:00
|
|
|
|
|
2006-10-04 01:39:28 +00:00
|
|
|
|
static function getMessagesFileName( $code ) {
|
|
|
|
|
|
global $IP;
|
|
|
|
|
|
return self::getFileName( "$IP/languages/messages/Messages", $code, '.php' );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static function getClassFileName( $code ) {
|
|
|
|
|
|
global $IP;
|
|
|
|
|
|
return self::getFileName( "$IP/languages/classes/Language", $code, '.php' );
|
|
|
|
|
|
}
|
2010-01-11 04:23:41 +00:00
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* Get the fallback for a given language
|
|
|
|
|
|
*/
|
|
|
|
|
|
static function getFallbackFor( $code ) {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
if ( $code === 'en' ) {
|
|
|
|
|
|
// Shortcut
|
|
|
|
|
|
return false;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
return self::getLocalisationCache()->getItem( $code, 'fallback' );
|
2008-04-27 14:37:37 +00:00
|
|
|
|
}
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2010-01-11 04:23:41 +00:00
|
|
|
|
/**
|
2006-07-26 07:15:39 +00:00
|
|
|
|
* Get all messages for a given language
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
* WARNING: this may take a long time
|
2006-07-26 07:15:39 +00:00
|
|
|
|
*/
|
|
|
|
|
|
static function getMessagesFor( $code ) {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::getLocalisationCache()->getItem( $code, 'messages' );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2010-01-11 04:23:41 +00:00
|
|
|
|
/**
|
2006-08-07 12:21:06 +00:00
|
|
|
|
* Get a message for a given language
|
|
|
|
|
|
*/
|
|
|
|
|
|
static function getMessageFor( $key, $code ) {
|
* Introduced a new system for localisation caching. The system is based around fast fetches of individual messages, minimising memory overhead and startup time in the typical case. It handles both core messages (formerly in Language.php) and extension messages (formerly in MessageCache.php). Profiling indicates a significant win for average throughput.
* The serialized message cache, which would have been redundant, has been removed. Similar performance characteristics can be achieved with $wgLocalisationCacheConf['manualRecache'] = true;
* Added a maintenance script rebuildLocalisationCache.php for offline rebuilding of the localisation cache.
* Extension i18n files can now contain any of the variables which can be set in Messages*.php. It is possible, and recommended, to use this feature instead of the hooks for special page aliases and magic words.
* $wgExtensionAliasesFiles, LanguageGetMagic and LanguageGetSpecialPageAliases are retained for backwards compatibility. $wgMessageCache->addMessages() and related functions have been removed. wfLoadExtensionMessages() is a no-op and can continue to be called for b/c.
* Introduced $wgCacheDirectory as a default location for the various local caches that have accumulated. Suggested $IP/cache as a good place for it in the default LocalSettings.php and created this directory with a deny-all .htaccess.
* Patched Exception.php to avoid using the message cache when an exception is thrown from within LocalisationCache, since this tends to fail horribly.
* Removed Language::getLocalisationArray(), Language::loadLocalisation(), Language::load()
* Fixed FileDependency::__sleep()
* In Cdb.php, fixed newlines in debug messages
In MessageCache::get():
* Replaced calls to $wgContLang capitalisation functions with plain PHP functions, reducing the typical case from 99us to 93us. Message cache keys are already documented as being restricted to ASCII.
* Implemented a more efficient way to filter out bogus language codes, reducing the "foo/en" case from 430us to 101us
* Optimised wfRunHooks() in the typical do-nothing case, from ~30us to ~3us. This reduced MessageCache::get() typical case time from 93us to 38us.
* Removed hook MessageNotInMwNs to save an extra 3us per cache hit. Reimplemented the only user (LocalisationUpdate) using the new hook LocalisationCacheRecache.
2009-06-28 07:11:43 +00:00
|
|
|
|
return self::getLocalisationCache()->getSubitem( $code, 'messages', $key );
|
2006-07-26 07:15:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2009-01-31 17:00:23 +00:00
|
|
|
|
function fixVariableInNamespace( $talk ) {
|
2010-04-08 20:19:03 +00:00
|
|
|
|
if ( strpos( $talk, '$1' ) === false ) {
|
|
|
|
|
|
return $talk;
|
|
|
|
|
|
}
|
2009-01-31 17:00:23 +00:00
|
|
|
|
|
|
|
|
|
|
global $wgMetaNamespace;
|
|
|
|
|
|
$talk = str_replace( '$1', $wgMetaNamespace, $talk );
|
|
|
|
|
|
|
|
|
|
|
|
# Allow grammar transformations
|
2010-01-11 04:23:41 +00:00
|
|
|
|
# Allowing full message-style parsing would make simple requests
|
|
|
|
|
|
# such as action=raw much more expensive than they need to be.
|
2009-01-31 17:00:23 +00:00
|
|
|
|
# This will hopefully cover most cases.
|
2010-01-11 04:23:41 +00:00
|
|
|
|
$talk = preg_replace_callback( '/{{grammar:(.*?)\|(.*?)}}/i',
|
2009-01-31 17:00:23 +00:00
|
|
|
|
array( &$this, 'replaceGrammarInNamespace' ), $talk );
|
|
|
|
|
|
return str_replace( ' ', '_', $talk );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2006-08-02 03:19:55 +00:00
|
|
|
|
function replaceGrammarInNamespace( $m ) {
|
|
|
|
|
|
return $this->convertGrammar( trim( $m[2] ), trim( $m[1] ) );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2006-07-26 07:15:39 +00:00
|
|
|
|
static function getCaseMaps() {
|
|
|
|
|
|
static $wikiUpperChars, $wikiLowerChars;
|
|
|
|
|
|
if ( isset( $wikiUpperChars ) ) {
|
|
|
|
|
|
return array( $wikiUpperChars, $wikiLowerChars );
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
wfProfileIn( __METHOD__ );
|
|
|
|
|
|
$arr = wfGetPrecompiledData( 'Utf8Case.ser' );
|
|
|
|
|
|
if ( $arr === false ) {
|
2010-01-11 04:23:41 +00:00
|
|
|
|
throw new MWException(
|
2006-07-26 07:15:39 +00:00
|
|
|
|
"Utf8Case.ser is missing, please run \"make\" in the serialized directory\n" );
|
|
|
|
|
|
}
|
|
|
|
|
|
extract( $arr );
|
|
|
|
|
|
wfProfileOut( __METHOD__ );
|
|
|
|
|
|
return array( $wikiUpperChars, $wikiLowerChars );
|
|
|
|
|
|
}
|
Basic integrated audio/video support, with Ogg implementation.
* JavaScript video player based loosely on Greg Maxwell's player
* Image page text snippet customisation
* Abstraction of transform parameters in the parser. Introduced Linker::makeImageLink2().
* Made canRender(), mustRender() depend on file, not just on handler. Moved width=0, height=0 checking to ImageHandler::canRender(), since audio streams have width=height=0 but should be rendered.
Also:
* Automatic upgrade for oldimage rows on image page view, allows media handler selection based on oi_*_mime
* oi_*_mime unconditionally referenced, REQUIRES SCHEMA UPGRADE
* Don't destroy file info for missing files on upgrade
* Simple, centralised extension message file handling
* Made MessageCache::loadAllMessages non-static, optimised for repeated-call case due to abuse in User.php
* Support for lightweight parser output hooks, with callback whitelist for security
* Moved Linker::formatSize() to Language, to join the new formatTimePeriod() and formatBitrate()
* Introduced MagicWordArray, regex capture trick requires that magic word IDs DO NOT CONTAIN HYPHENS.
2007-08-15 10:50:09 +00:00
|
|
|
|
|
|
|
|
|
|
function formatTimePeriod( $seconds ) {
|
|
|
|
|
|
if ( $seconds < 10 ) {
|
2010-07-04 16:35:33 +00:00
|
|
|
|
return $this->formatNum( sprintf( "%.1f", $seconds ) ) . $this->getMessageFromDB( 'seconds-abbrev' );
|
Basic integrated audio/video support, with Ogg implementation.
* JavaScript video player based loosely on Greg Maxwell's player
* Image page text snippet customisation
* Abstraction of transform parameters in the parser. Introduced Linker::makeImageLink2().
* Made canRender(), mustRender() depend on file, not just on handler. Moved width=0, height=0 checking to ImageHandler::canRender(), since audio streams have width=height=0 but should be rendered.
Also:
* Automatic upgrade for oldimage rows on image page view, allows media handler selection based on oi_*_mime
* oi_*_mime unconditionally referenced, REQUIRES SCHEMA UPGRADE
* Don't destroy file info for missing files on upgrade
* Simple, centralised extension message file handling
* Made MessageCache::loadAllMessages non-static, optimised for repeated-call case due to abuse in User.php
* Support for lightweight parser output hooks, with callback whitelist for security
* Moved Linker::formatSize() to Language, to join the new formatTimePeriod() and formatBitrate()
* Introduced MagicWordArray, regex capture trick requires that magic word IDs DO NOT CONTAIN HYPHENS.
2007-08-15 10:50:09 +00:00
|
|
|
|
} elseif ( $seconds < 60 ) {
|
2010-07-04 16:35:33 +00:00
|
|
|
|
return $this->formatNum( round( $seconds ) ) . $this->getMessageFromDB( 'seconds-abbrev' );
|
Basic integrated audio/video support, with Ogg implementation.
* JavaScript video player based loosely on Greg Maxwell's player
* Image page text snippet customisation
* Abstraction of transform parameters in the parser. Introduced Linker::makeImageLink2().
* Made canRender(), mustRender() depend on file, not just on handler. Moved width=0, height=0 checking to ImageHandler::canRender(), since audio streams have width=height=0 but should be rendered.
Also:
* Automatic upgrade for oldimage rows on image page view, allows media handler selection based on oi_*_mime
* oi_*_mime unconditionally referenced, REQUIRES SCHEMA UPGRADE
* Don't destroy file info for missing files on upgrade
* Simple, centralised extension message file handling
* Made MessageCache::loadAllMessages non-static, optimised for repeated-call case due to abuse in User.php
* Support for lightweight parser output hooks, with callback whitelist for security
* Moved Linker::formatSize() to Language, to join the new formatTimePeriod() and formatBitrate()
* Introduced MagicWordArray, regex capture trick requires that magic word IDs DO NOT CONTAIN HYPHENS.
2007-08-15 10:50:09 +00:00
|
|
|
|
} elseif ( $seconds < 3600 ) {
|
2010-04-29 15:09:22 +00:00
|
|
|
|
$minutes = floor( $seconds / 60 );
|
|
|
|
|
|
$secondsPart = round( fmod( $seconds, 60 ) );
|
|
|
|
|
|
if ( $secondsPart == 60 ) {
|
|
|
|
|
|
$secondsPart = 0;
|
|
|
|
|
|
$minutes++;
|
|
|
|
|
|
}
|
2010-07-04 16:35:33 +00:00
|
|
|
|
return $this->formatNum( $minutes ) . $this->getMessageFromDB( 'minutes-abbrev' ) . ' ' .
|
|
|
|
|
|
$this->formatNum( $secondsPart ) . $this->getMessageFromDB( 'seconds-abbrev' );
|
Basic integrated audio/video support, with Ogg implementation.
* JavaScript video player based loosely on Greg Maxwell's player
* Image page text snippet customisation
* Abstraction of transform parameters in the parser. Introduced Linker::makeImageLink2().
* Made canRender(), mustRender() depend on file, not just on handler. Moved width=0, height=0 checking to ImageHandler::canRender(), since audio streams have width=height=0 but should be rendered.
Also:
* Automatic upgrade for oldimage rows on image page view, allows media handler selection based on oi_*_mime
* oi_*_mime unconditionally referenced, REQUIRES SCHEMA UPGRADE
* Don't destroy file info for missing files on upgrade
* Simple, centralised extension message file handling
* Made MessageCache::loadAllMessages non-static, optimised for repeated-call case due to abuse in User.php
* Support for lightweight parser output hooks, with callback whitelist for security
* Moved Linker::formatSize() to Language, to join the new formatTimePeriod() and formatBitrate()
* Introduced MagicWordArray, regex capture trick requires that magic word IDs DO NOT CONTAIN HYPHENS.
2007-08-15 10:50:09 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
$hours = floor( $seconds / 3600 );
|
|
|
|
|
|
$minutes = floor( ( $seconds - $hours * 3600 ) / 60 );
|
|
|
|
|
|
$secondsPart = round( $seconds - $hours * 3600 - $minutes * 60 );
|
2010-04-29 15:09:22 +00:00
|
|
|
|
if ( $secondsPart == 60 ) {
|
|
|
|
|
|
$secondsPart = 0;
|
|
|
|
|
|
$minutes++;
|
|
|
|
|
|
}
|
|
|
|
|
|
if ( $minutes == 60 ) {
|
|
|
|
|
|
$minutes = 0;
|
|
|
|
|
|
$hours++;
|
|
|
|
|
|
}
|
2010-07-04 16:35:33 +00:00
|
|
|
|
return $this->formatNum( $hours ) . $this->getMessageFromDB( 'hours-abbrev' ) . ' ' .
|
|
|
|
|
|
$this->formatNum( $minutes ) . $this->getMessageFromDB( 'minutes-abbrev' ) . ' ' .
|
|
|
|
|
|
$this->formatNum( $secondsPart ) . $this->getMessageFromDB( 'seconds-abbrev' );
|
Basic integrated audio/video support, with Ogg implementation.
* JavaScript video player based loosely on Greg Maxwell's player
* Image page text snippet customisation
* Abstraction of transform parameters in the parser. Introduced Linker::makeImageLink2().
* Made canRender(), mustRender() depend on file, not just on handler. Moved width=0, height=0 checking to ImageHandler::canRender(), since audio streams have width=height=0 but should be rendered.
Also:
* Automatic upgrade for oldimage rows on image page view, allows media handler selection based on oi_*_mime
* oi_*_mime unconditionally referenced, REQUIRES SCHEMA UPGRADE
* Don't destroy file info for missing files on upgrade
* Simple, centralised extension message file handling
* Made MessageCache::loadAllMessages non-static, optimised for repeated-call case due to abuse in User.php
* Support for lightweight parser output hooks, with callback whitelist for security
* Moved Linker::formatSize() to Language, to join the new formatTimePeriod() and formatBitrate()
* Introduced MagicWordArray, regex capture trick requires that magic word IDs DO NOT CONTAIN HYPHENS.
2007-08-15 10:50:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function formatBitrate( $bps ) {
|
|
|
|
|
|
$units = array( 'bps', 'kbps', 'Mbps', 'Gbps' );
|
|
|
|
|
|
if ( $bps <= 0 ) {
|
|
|
|
|
|
return $this->formatNum( $bps ) . $units[0];
|
|
|
|
|
|
}
|
|
|
|
|
|
$unitIndex = floor( log10( $bps ) / 3 );
|
|
|
|
|
|
$mantissa = $bps / pow( 1000, $unitIndex );
|
|
|
|
|
|
if ( $mantissa < 10 ) {
|
|
|
|
|
|
$mantissa = round( $mantissa, 1 );
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$mantissa = round( $mantissa );
|
|
|
|
|
|
}
|
|
|
|
|
|
return $this->formatNum( $mantissa ) . $units[$unitIndex];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Format a size in bytes for output, using an appropriate
|
|
|
|
|
|
* unit (B, KB, MB or GB) according to the magnitude in question
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param $size Size to format
|
|
|
|
|
|
* @return string Plain text (not HTML)
|
|
|
|
|
|
*/
|
|
|
|
|
|
function formatSize( $size ) {
|
|
|
|
|
|
// For small sizes no decimal places necessary
|
|
|
|
|
|
$round = 0;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $size > 1024 ) {
|
Basic integrated audio/video support, with Ogg implementation.
* JavaScript video player based loosely on Greg Maxwell's player
* Image page text snippet customisation
* Abstraction of transform parameters in the parser. Introduced Linker::makeImageLink2().
* Made canRender(), mustRender() depend on file, not just on handler. Moved width=0, height=0 checking to ImageHandler::canRender(), since audio streams have width=height=0 but should be rendered.
Also:
* Automatic upgrade for oldimage rows on image page view, allows media handler selection based on oi_*_mime
* oi_*_mime unconditionally referenced, REQUIRES SCHEMA UPGRADE
* Don't destroy file info for missing files on upgrade
* Simple, centralised extension message file handling
* Made MessageCache::loadAllMessages non-static, optimised for repeated-call case due to abuse in User.php
* Support for lightweight parser output hooks, with callback whitelist for security
* Moved Linker::formatSize() to Language, to join the new formatTimePeriod() and formatBitrate()
* Introduced MagicWordArray, regex capture trick requires that magic word IDs DO NOT CONTAIN HYPHENS.
2007-08-15 10:50:09 +00:00
|
|
|
|
$size = $size / 1024;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $size > 1024 ) {
|
Basic integrated audio/video support, with Ogg implementation.
* JavaScript video player based loosely on Greg Maxwell's player
* Image page text snippet customisation
* Abstraction of transform parameters in the parser. Introduced Linker::makeImageLink2().
* Made canRender(), mustRender() depend on file, not just on handler. Moved width=0, height=0 checking to ImageHandler::canRender(), since audio streams have width=height=0 but should be rendered.
Also:
* Automatic upgrade for oldimage rows on image page view, allows media handler selection based on oi_*_mime
* oi_*_mime unconditionally referenced, REQUIRES SCHEMA UPGRADE
* Don't destroy file info for missing files on upgrade
* Simple, centralised extension message file handling
* Made MessageCache::loadAllMessages non-static, optimised for repeated-call case due to abuse in User.php
* Support for lightweight parser output hooks, with callback whitelist for security
* Moved Linker::formatSize() to Language, to join the new formatTimePeriod() and formatBitrate()
* Introduced MagicWordArray, regex capture trick requires that magic word IDs DO NOT CONTAIN HYPHENS.
2007-08-15 10:50:09 +00:00
|
|
|
|
$size = $size / 1024;
|
|
|
|
|
|
// For MB and bigger two decimal places are smarter
|
|
|
|
|
|
$round = 2;
|
2010-07-29 09:43:18 +00:00
|
|
|
|
if ( $size > 1024 ) {
|
Basic integrated audio/video support, with Ogg implementation.
* JavaScript video player based loosely on Greg Maxwell's player
* Image page text snippet customisation
* Abstraction of transform parameters in the parser. Introduced Linker::makeImageLink2().
* Made canRender(), mustRender() depend on file, not just on handler. Moved width=0, height=0 checking to ImageHandler::canRender(), since audio streams have width=height=0 but should be rendered.
Also:
* Automatic upgrade for oldimage rows on image page view, allows media handler selection based on oi_*_mime
* oi_*_mime unconditionally referenced, REQUIRES SCHEMA UPGRADE
* Don't destroy file info for missing files on upgrade
* Simple, centralised extension message file handling
* Made MessageCache::loadAllMessages non-static, optimised for repeated-call case due to abuse in User.php
* Support for lightweight parser output hooks, with callback whitelist for security
* Moved Linker::formatSize() to Language, to join the new formatTimePeriod() and formatBitrate()
* Introduced MagicWordArray, regex capture trick requires that magic word IDs DO NOT CONTAIN HYPHENS.
2007-08-15 10:50:09 +00:00
|
|
|
|
$size = $size / 1024;
|
|
|
|
|
|
$msg = 'size-gigabytes';
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$msg = 'size-megabytes';
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$msg = 'size-kilobytes';
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$msg = 'size-bytes';
|
|
|
|
|
|
}
|
|
|
|
|
|
$size = round( $size, $round );
|
|
|
|
|
|
$text = $this->getMessageFromDB( $msg );
|
|
|
|
|
|
return str_replace( '$1', $this->formatNum( $size ), $text );
|
|
|
|
|
|
}
|
2010-01-08 08:22:19 +00:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Get the conversion rule title, if any.
|
|
|
|
|
|
*/
|
|
|
|
|
|
function getConvRuleTitle() {
|
2010-01-15 19:14:23 +00:00
|
|
|
|
return $this->mConverter->getConvRuleTitle();
|
2010-01-08 08:22:19 +00:00
|
|
|
|
}
|
2010-07-23 19:52:02 +00:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Given a string, convert it to a (hopefully short) key that can be used
|
|
|
|
|
|
* for efficient sorting. A binary sort according to the sortkeys
|
2010-07-26 22:04:19 +00:00
|
|
|
|
* corresponds to a logical sort of the corresponding strings. Current
|
|
|
|
|
|
* code expects that a null character should sort before all others, but
|
|
|
|
|
|
* has no other particular expectations (and that one can be changed if
|
|
|
|
|
|
* necessary).
|
2010-07-23 19:52:02 +00:00
|
|
|
|
*
|
|
|
|
|
|
* @param string $string UTF-8 string
|
|
|
|
|
|
* @return string Binary sortkey
|
|
|
|
|
|
*/
|
|
|
|
|
|
public function convertToSortkey( $string ) {
|
2010-07-23 20:58:11 +00:00
|
|
|
|
# Fake function for now
|
|
|
|
|
|
return strtoupper( $string );
|
2010-07-23 19:52:02 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Does it make sense for lists to be split up into sections based on their
|
|
|
|
|
|
* first letter? Logogram-based scripts probably want to return false.
|
|
|
|
|
|
*
|
|
|
|
|
|
* TODO: Use this in CategoryPage.php.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @return boolean
|
|
|
|
|
|
*/
|
|
|
|
|
|
public function usesFirstLettersInLists() {
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Given a string, return the logical "first letter" to be used for
|
|
|
|
|
|
* grouping on category pages and so on. This has to be coordinated
|
|
|
|
|
|
* carefully with convertToSortkey(), or else the sorted list might jump
|
|
|
|
|
|
* back and forth between the same "initial letters" or other pathological
|
|
|
|
|
|
* behavior. For instance, if you just return the first character, but "a"
|
|
|
|
|
|
* sorts the same as "A" based on convertToSortkey(), then you might get a
|
|
|
|
|
|
* list like
|
|
|
|
|
|
*
|
|
|
|
|
|
* == A ==
|
|
|
|
|
|
* * [[Aardvark]]
|
|
|
|
|
|
*
|
|
|
|
|
|
* == a ==
|
|
|
|
|
|
* * [[antelope]]
|
|
|
|
|
|
*
|
|
|
|
|
|
* == A ==
|
|
|
|
|
|
* * [[Ape]]
|
|
|
|
|
|
*
|
|
|
|
|
|
* etc., assuming for the sake of argument that $wgCapitalLinks is false.
|
|
|
|
|
|
* Obviously, this is ignored if usesFirstLettersInLists() is false.
|
|
|
|
|
|
*
|
|
|
|
|
|
* @param string $string UTF-8 string
|
|
|
|
|
|
* @return string UTF-8 string corresponding to the first letter of input
|
|
|
|
|
|
*/
|
|
|
|
|
|
public function firstLetterForLists( $string ) {
|
2010-07-26 22:04:19 +00:00
|
|
|
|
if ( $string[0] == "\0" ) {
|
|
|
|
|
|
$string = substr( $string, 1 );
|
|
|
|
|
|
}
|
2010-08-03 17:47:10 +00:00
|
|
|
|
return strtoupper( $this->firstChar( $string ) );
|
2010-07-23 19:52:02 +00:00
|
|
|
|
}
|
2007-11-13 04:05:13 +00:00
|
|
|
|
}
|