diff options
Diffstat (limited to 'languages/Language.php')
-rw-r--r-- | languages/Language.php | 1226 |
1 files changed, 1226 insertions, 0 deletions
diff --git a/languages/Language.php b/languages/Language.php new file mode 100644 index 00000000..cbb5e316 --- /dev/null +++ b/languages/Language.php @@ -0,0 +1,1226 @@ +<?php +/** + * @package MediaWiki + * @subpackage Language + */ + +if( defined( 'MEDIAWIKI' ) ) { + +# +# In general you should not make customizations in these language files +# directly, but should use the MediaWiki: special namespace to customize +# user interface messages through the wiki. +# See http://meta.wikipedia.org/wiki/MediaWiki_namespace +# +# NOTE TO TRANSLATORS: Do not copy this whole file when making translations! +# A lot of common constants and a base class with inheritable methods are +# defined here, which should not be redefined. See the other LanguageXx.php +# files for examples. +# + +#-------------------------------------------------------------------------- +# Language-specific text +#-------------------------------------------------------------------------- + +if($wgMetaNamespace === FALSE) + $wgMetaNamespace = str_replace( ' ', '_', $wgSitename ); + +/* private */ $wgNamespaceNamesEn = array( + NS_MEDIA => 'Media', + NS_SPECIAL => 'Special', + NS_MAIN => '', + NS_TALK => 'Talk', + NS_USER => 'User', + NS_USER_TALK => 'User_talk', + NS_PROJECT => $wgMetaNamespace, + NS_PROJECT_TALK => $wgMetaNamespace . '_talk', + NS_IMAGE => 'Image', + NS_IMAGE_TALK => 'Image_talk', + NS_MEDIAWIKI => 'MediaWiki', + NS_MEDIAWIKI_TALK => 'MediaWiki_talk', + NS_TEMPLATE => 'Template', + NS_TEMPLATE_TALK => 'Template_talk', + NS_HELP => 'Help', + NS_HELP_TALK => 'Help_talk', + NS_CATEGORY => 'Category', + NS_CATEGORY_TALK => 'Category_talk', +); + +if(isset($wgExtraNamespaces)) { + $wgNamespaceNamesEn=$wgNamespaceNamesEn+$wgExtraNamespaces; +} + +/* private */ $wgDefaultUserOptionsEn = array( + 'quickbar' => 1, + 'underline' => 2, + 'cols' => 80, + 'rows' => 25, + 'searchlimit' => 20, + 'contextlines' => 5, + 'contextchars' => 50, + 'skin' => $wgDefaultSkin, + 'math' => 1, + 'rcdays' => 7, + 'rclimit' => 50, + 'wllimit' => 250, + 'highlightbroken' => 1, + 'stubthreshold' => 0, + 'previewontop' => 1, + 'editsection' => 1, + 'editsectiononrightclick'=> 0, + 'showtoc' => 1, + 'showtoolbar' => 1, + 'date' => 0, + 'imagesize' => 2, + 'thumbsize' => 2, + 'rememberpassword' => 0, + 'enotifwatchlistpages' => 0, + 'enotifusertalkpages' => 1, + 'enotifminoredits' => 0, + 'enotifrevealaddr' => 0, + 'shownumberswatching' => 1, + 'fancysig' => 0, + 'externaleditor' => 0, + 'externaldiff' => 0, + 'showjumplinks' => 1, + 'numberheadings' => 0, + 'uselivepreview' => 0, + 'watchlistdays' => 3.0, +); + +/* private */ $wgQuickbarSettingsEn = array( + 'None', 'Fixed left', 'Fixed right', 'Floating left', 'Floating right' +); + +/* private */ $wgSkinNamesEn = array( + 'standard' => 'Classic', + 'nostalgia' => 'Nostalgia', + 'cologneblue' => 'Cologne Blue', + 'davinci' => 'DaVinci', + 'mono' => 'Mono', + 'monobook' => 'MonoBook', + 'myskin' => 'MySkin', + 'chick' => 'Chick' +); + +/* private */ $wgMathNamesEn = array( + MW_MATH_PNG => 'mw_math_png', + MW_MATH_SIMPLE => 'mw_math_simple', + MW_MATH_HTML => 'mw_math_html', + MW_MATH_SOURCE => 'mw_math_source', + MW_MATH_MODERN => 'mw_math_modern', + MW_MATH_MATHML => 'mw_math_mathml' +); + +/** + * Whether to use user or default setting in Language::date() + * + * NOTE: the array string values are no longer important! + * The actual date format functions are now called for the selection in + * Special:Preferences, and the 'datedefault' message for MW_DATE_DEFAULT. + * + * The array keys make up the set of formats which this language allows + * the user to select. It's exposed via Language::getDateFormats(). + * + * @private + */ +$wgDateFormatsEn = array( + MW_DATE_DEFAULT => 'No preference', + MW_DATE_DMY => '16:12, 15 January 2001', + MW_DATE_MDY => '16:12, January 15, 2001', + MW_DATE_YMD => '16:12, 2001 January 15', + MW_DATE_ISO => '2001-01-15 16:12:34' +); + +/* private */ $wgUserTogglesEn = array( + 'highlightbroken', + 'justify', + 'hideminor', + 'extendwatchlist', + 'usenewrc', + 'numberheadings', + 'showtoolbar', + 'editondblclick', + 'editsection', + 'editsectiononrightclick', + 'showtoc', + 'rememberpassword', + 'editwidth', + 'watchcreations', + 'watchdefault', + 'minordefault', + 'previewontop', + 'previewonfirst', + 'nocache', + 'enotifwatchlistpages', + 'enotifusertalkpages', + 'enotifminoredits', + 'enotifrevealaddr', + 'shownumberswatching', + 'fancysig', + 'externaleditor', + 'externaldiff', + 'showjumplinks', + 'uselivepreview', + 'autopatrol', + 'forceeditsummary', + 'watchlisthideown', + 'watchlisthidebots', +); + +/* private */ $wgBookstoreListEn = array( + 'AddALL' => 'http://www.addall.com/New/Partner.cgi?query=$1&type=ISBN', + 'PriceSCAN' => 'http://www.pricescan.com/books/bookDetail.asp?isbn=$1', + 'Barnes & Noble' => 'http://search.barnesandnoble.com/bookSearch/isbnInquiry.asp?isbn=$1', + 'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1' +); + +# Read language names +global $wgLanguageNames; +/** */ +require_once( 'Names.php' ); + +$wgLanguageNamesEn =& $wgLanguageNames; + + +/* private */ $wgWeekdayNamesEn = array( + 'sunday', 'monday', 'tuesday', 'wednesday', 'thursday', + 'friday', 'saturday' +); + + +/* private */ $wgMonthNamesEn = array( + 'january', 'february', 'march', 'april', 'may_long', 'june', + 'july', 'august', 'september', 'october', 'november', + 'december' +); +/* private */ $wgMonthNamesGenEn = 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' +); + +/* private */ $wgMonthAbbreviationsEn = array( + 'jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', + 'sep', 'oct', 'nov', 'dec' +); + +# Note to translators: +# Please include the English words as synonyms. This allows people +# from other wikis to contribute more easily. +# +/* private */ $wgMagicWordsEn = array( +# ID CASE SYNONYMS + MAG_REDIRECT => array( 0, '#REDIRECT' ), + MAG_NOTOC => array( 0, '__NOTOC__' ), + MAG_NOGALLERY => array( 0, '__NOGALLERY__' ), + MAG_FORCETOC => array( 0, '__FORCETOC__' ), + MAG_TOC => array( 0, '__TOC__' ), + MAG_NOEDITSECTION => array( 0, '__NOEDITSECTION__' ), + MAG_START => array( 0, '__START__' ), + MAG_CURRENTMONTH => array( 1, 'CURRENTMONTH' ), + MAG_CURRENTMONTHNAME => array( 1, 'CURRENTMONTHNAME' ), + MAG_CURRENTMONTHNAMEGEN => array( 1, 'CURRENTMONTHNAMEGEN' ), + MAG_CURRENTMONTHABBREV => array( 1, 'CURRENTMONTHABBREV' ), + MAG_CURRENTDAY => array( 1, 'CURRENTDAY' ), + MAG_CURRENTDAY2 => array( 1, 'CURRENTDAY2' ), + MAG_CURRENTDAYNAME => array( 1, 'CURRENTDAYNAME' ), + MAG_CURRENTYEAR => array( 1, 'CURRENTYEAR' ), + MAG_CURRENTTIME => array( 1, 'CURRENTTIME' ), + MAG_NUMBEROFPAGES => array( 1, 'NUMBEROFPAGES' ), + MAG_NUMBEROFARTICLES => array( 1, 'NUMBEROFARTICLES' ), + MAG_NUMBEROFFILES => array( 1, 'NUMBEROFFILES' ), + MAG_NUMBEROFUSERS => array( 1, 'NUMBEROFUSERS' ), + MAG_PAGENAME => array( 1, 'PAGENAME' ), + MAG_PAGENAMEE => array( 1, 'PAGENAMEE' ), + MAG_NAMESPACE => array( 1, 'NAMESPACE' ), + MAG_NAMESPACEE => array( 1, 'NAMESPACEE' ), + MAG_TALKSPACE => array( 1, 'TALKSPACE' ), + MAG_TALKSPACEE => array( 1, 'TALKSPACEE' ), + MAG_SUBJECTSPACE => array( 1, 'SUBJECTSPACE', 'ARTICLESPACE' ), + MAG_SUBJECTSPACEE => array( 1, 'SUBJECTSPACEE', 'ARTICLESPACEE' ), + MAG_FULLPAGENAME => array( 1, 'FULLPAGENAME' ), + MAG_FULLPAGENAMEE => array( 1, 'FULLPAGENAMEE' ), + MAG_SUBPAGENAME => array( 1, 'SUBPAGENAME' ), + MAG_SUBPAGENAMEE => array( 1, 'SUBPAGENAMEE' ), + MAG_BASEPAGENAME => array( 1, 'BASEPAGENAME' ), + MAG_BASEPAGENAMEE => array( 1, 'BASEPAGENAMEE' ), + MAG_TALKPAGENAME => array( 1, 'TALKPAGENAME' ), + MAG_TALKPAGENAMEE => array( 1, 'TALKPAGENAMEE' ), + MAG_SUBJECTPAGENAME => array( 1, 'SUBJECTPAGENAME', 'ARTICLEPAGENAME' ), + MAG_SUBJECTPAGENAMEE => array( 1, 'SUBJECTPAGENAMEE', 'ARTICLEPAGENAMEE' ), + MAG_MSG => array( 0, 'MSG:' ), + MAG_SUBST => array( 0, 'SUBST:' ), + MAG_MSGNW => array( 0, 'MSGNW:' ), + MAG_END => array( 0, '__END__' ), + MAG_IMG_THUMBNAIL => array( 1, 'thumbnail', 'thumb' ), + MAG_IMG_MANUALTHUMB => array( 1, 'thumbnail=$1', 'thumb=$1'), + MAG_IMG_RIGHT => array( 1, 'right' ), + MAG_IMG_LEFT => array( 1, 'left' ), + MAG_IMG_NONE => array( 1, 'none' ), + MAG_IMG_WIDTH => array( 1, '$1px' ), + MAG_IMG_CENTER => array( 1, 'center', 'centre' ), + MAG_IMG_FRAMED => array( 1, 'framed', 'enframed', 'frame' ), + MAG_INT => array( 0, 'INT:' ), + MAG_SITENAME => array( 1, 'SITENAME' ), + MAG_NS => array( 0, 'NS:' ), + MAG_LOCALURL => array( 0, 'LOCALURL:' ), + MAG_LOCALURLE => array( 0, 'LOCALURLE:' ), + MAG_SERVER => array( 0, 'SERVER' ), + MAG_SERVERNAME => array( 0, 'SERVERNAME' ), + MAG_SCRIPTPATH => array( 0, 'SCRIPTPATH' ), + MAG_GRAMMAR => array( 0, 'GRAMMAR:' ), + MAG_NOTITLECONVERT => array( 0, '__NOTITLECONVERT__', '__NOTC__'), + MAG_NOCONTENTCONVERT => array( 0, '__NOCONTENTCONVERT__', '__NOCC__'), + MAG_CURRENTWEEK => array( 1, 'CURRENTWEEK' ), + MAG_CURRENTDOW => array( 1, 'CURRENTDOW' ), + MAG_REVISIONID => array( 1, 'REVISIONID' ), + MAG_PLURAL => array( 0, 'PLURAL:' ), + MAG_FULLURL => array( 0, 'FULLURL:' ), + MAG_FULLURLE => array( 0, 'FULLURLE:' ), + MAG_LCFIRST => array( 0, 'LCFIRST:' ), + MAG_UCFIRST => array( 0, 'UCFIRST:' ), + MAG_LC => array( 0, 'LC:' ), + MAG_UC => array( 0, 'UC:' ), + MAG_RAW => array( 0, 'RAW:' ), + MAG_DISPLAYTITLE => array( 1, 'DISPLAYTITLE' ), + MAG_RAWSUFFIX => array( 1, 'R' ), + MAG_NEWSECTIONLINK => array( 1, '__NEWSECTIONLINK__' ), + MAG_CURRENTVERSION => array( 1, 'CURRENTVERSION' ), + MAG_URLENCODE => array( 0, 'URLENCODE:' ), + MAG_CURRENTTIMESTAMP => array( 1, 'CURRENTTIMESTAMP' ), + MAG_DIRECTIONMARK => array( 1, 'DIRECTIONMARK', 'DIRMARK' ), + MAG_LANGUAGE => array( 0, '#LANGUAGE:' ), + MAG_CONTENTLANGUAGE => array( 1, 'CONTENTLANGUAGE', 'CONTENTLANG' ), + MAG_PAGESINNAMESPACE => array( 1, 'PAGESINNAMESPACE:', 'PAGESINNS:' ), + MAG_NUMBEROFADMINS => array( 1, 'NUMBEROFADMINS' ), + MAG_FORMATNUM => array( 0, 'FORMATNUM' ), + +); + +if (!$wgCachedMessageArrays) { + require_once('Messages.php'); +} + +/* a fake language converter */ +class fakeConverter { + var $mLang; + function fakeConverter($langobj) {$this->mLang = $langobj;} + function convert($t, $i) {return $t;} + function parserConvert($t, $p) {return $t;} + function getVariants() { return array( $this->mLang->getCode() ); } + function getPreferredVariant() {return $this->mLang->getCode(); } + function findVariantLink(&$l, &$n) {} + function getExtraHashOptions() {return '';} + function getParsedTitle() {return '';} + function markNoConversion($text) {return $text;} + function convertCategoryKey( $key ) {return $key; } + +} + +#-------------------------------------------------------------------------- +# Internationalisation code +#-------------------------------------------------------------------------- + +class Language { + var $mConverter; + function __construct() { + $this->mConverter = new fakeConverter($this); + } + + /** + * Exports the default user options as defined in + * $wgDefaultUserOptionsEn, user preferences can override some of these + * depending on what's in (Local|Default)Settings.php and some defines. + * + * @return array + */ + function getDefaultUserOptions() { + global $wgDefaultUserOptionsEn; + return $wgDefaultUserOptionsEn; + } + + /** + * Exports $wgBookstoreListEn + * @return array + */ + function getBookstoreList() { + global $wgBookstoreListEn; + return $wgBookstoreListEn; + } + + /** + * @return array + */ + function getNamespaces() { + global $wgNamespaceNamesEn; + return $wgNamespaceNamesEn; + } + + /** + * 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(); + foreach($ns as $k => $v) { + $ns[$k] = strtr($v, '_', ' '); + } + return $ns; + } + + /** + * Get a namespace value by key + * <code> + * $mw_ns = $wgContLang->getNsText( NS_MEDIAWIKI ); + * echo $mw_ns; // prints 'MediaWiki' + * </code> + * + * @param int $index the array key of the namespace to return + * @return mixed, string if the namespace value exists, otherwise false + */ + function getNsText( $index ) { + $ns = $this->getNamespaces(); + return isset( $ns[$index] ) ? $ns[$index] : false; + } + + /** + * 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 ); + return strtr($ns, '_', ' '); + } + + /** + * Get a namespace key by value, case insensetive. + * + * @param string $text + * @return mixed An integer if $text is a valid value otherwise false + */ + function getNsIndex( $text ) { + $ns = $this->getNamespaces(); + + foreach ( $ns as $i => $n ) { + if ( strcasecmp( $n, $text ) == 0) + return $i; + } + return false; + } + + /** + * short names for language variants used for language conversion links. + * + * @param string $code + * @return string + */ + function getVariantname( $code ) { + return wfMsg( "variantname-$code" ); + } + + function specialPage( $name ) { + return $this->getNsText(NS_SPECIAL) . ':' . $name; + } + + function getQuickbarSettings() { + global $wgQuickbarSettingsEn; + return $wgQuickbarSettingsEn; + } + + function getSkinNames() { + global $wgSkinNamesEn; + return $wgSkinNamesEn; + } + + function getMathNames() { + global $wgMathNamesEn; + return $wgMathNamesEn; + } + + function getDateFormats() { + global $wgDateFormatsEn; + return $wgDateFormatsEn; + } + + function getUserToggles() { + global $wgUserTogglesEn; + return $wgUserTogglesEn; + } + + function getUserToggle( $tog ) { + return wfMsg( "tog-$tog" ); + } + + function getLanguageNames() { + global $wgLanguageNamesEn; + return $wgLanguageNamesEn; + } + + function getLanguageName( $code ) { + global $wgLanguageNamesEn; + if ( ! array_key_exists( $code, $wgLanguageNamesEn ) ) { + return ''; + } + return $wgLanguageNamesEn[$code]; + } + + function getMonthName( $key ) { + global $wgMonthNamesEn, $wgContLang; + // see who called us and use the correct message function + if( get_class( $wgContLang->getLangObj() ) == get_class( $this ) ) + return wfMsgForContent($wgMonthNamesEn[$key-1]); + else + return wfMsg($wgMonthNamesEn[$key-1]); + } + + /* by default we just return base form */ + function getMonthNameGen( $key ) { + return $this->getMonthName( $key ); + } + + function getMonthAbbreviation( $key ) { + global $wgMonthAbbreviationsEn, $wgContLang; + // see who called us and use the correct message function + if( get_class( $wgContLang->getLangObj() ) == get_class( $this ) ) + return wfMsgForContent(@$wgMonthAbbreviationsEn[$key-1]); + else + return wfMsg(@$wgMonthAbbreviationsEn[$key-1]); + } + + function getWeekdayName( $key ) { + global $wgWeekdayNamesEn, $wgContLang; + // see who called us and use the correct message function + if( get_class( $wgContLang->getLangObj() ) == get_class( $this ) ) + return wfMsgForContent($wgWeekdayNamesEn[$key-1]); + else + return wfMsg($wgWeekdayNamesEn[$key-1]); + } + + /** + * Used by date() and time() to adjust the time output. + * @public + * @param int $ts the time in date('YmdHis') format + * @param mixed $tz adjust the time by this amount (default false, + * mean we get user timecorrection setting) + * @return int + + */ + function userAdjust( $ts, $tz = false ) { + global $wgUser, $wgLocalTZoffset; + + if (!$tz) { + $tz = $wgUser->getOption( 'timecorrection' ); + } + + # minutes and hours differences: + $minDiff = 0; + $hrDiff = 0; + + if ( $tz === '' ) { + # Global offset in minutes. + if( isset($wgLocalTZoffset) ) { + $hrDiff = $wgLocalTZoffset % 60; + $minDiff = $wgLocalTZoffset - ($hrDiff * 60); + } + } elseif ( strpos( $tz, ':' ) !== false ) { + $tzArray = explode( ':', $tz ); + $hrDiff = intval($tzArray[0]); + $minDiff = intval($hrDiff < 0 ? -$tzArray[1] : $tzArray[1]); + } else { + $hrDiff = intval( $tz ); + } + + # No difference ? Return time unchanged + if ( 0 == $hrDiff && 0 == $minDiff ) { return $ts; } + + # Generate an adjusted date + $t = mktime( ( + (int)substr( $ts, 8, 2) ) + $hrDiff, # Hours + (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 + (int)substr( $ts, 0, 4 ) ); #Year + return date( 'YmdHis', $t ); + } + + /** + * 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> + * function timeanddate([...], $format = true) { + * $datePreference = $this->dateFormat($format); + * [...] + *</code> + * + * @param mixed $usePrefs: if true, the user's preference is used + * if false, the site/language default is used + * if int/string, assumed to be a format. + * @return string + */ + function dateFormat( $usePrefs = true ) { + global $wgUser; + + if( is_bool( $usePrefs ) ) { + if( $usePrefs ) { + $datePreference = $wgUser->getOption( 'date' ); + } else { + $options = $this->getDefaultUserOptions(); + $datePreference = (string)$options['date']; + } + } else { + $datePreference = (string)$usePrefs; + } + + // return int + if( $datePreference == '' ) { + return MW_DATE_DEFAULT; + } + + return $datePreference; + } + + /** + * @public + * @param mixed $ts the time format which needs to be turned into a + * date('YmdHis') format with wfTimestamp(TS_MW,$ts) + * @param bool $adj whether to adjust the time output according to the + * user configured offset ($timecorrection) + * @param mixed $format true to use user's date format preference + * @param string $timecorrection the time offset as returned by + * validateTimeZone() in Special:Preferences + * @return string + */ + function date( $ts, $adj = false, $format = true, $timecorrection = false ) { + global $wgUser, $wgAmericanDates; + + if ( $adj ) { $ts = $this->userAdjust( $ts, $timecorrection ); } + + $datePreference = $this->dateFormat( $format ); + if( $datePreference == MW_DATE_DEFAULT ) { + $datePreference = $wgAmericanDates ? MW_DATE_MDY : MW_DATE_DMY; + } + + $month = $this->formatMonth( substr( $ts, 4, 2 ), $datePreference ); + $day = $this->formatDay( substr( $ts, 6, 2 ), $datePreference ); + $year = $this->formatNum( substr( $ts, 0, 4 ), true ); + + switch( $datePreference ) { + case MW_DATE_DMY: return "$day $month $year"; + case MW_DATE_YMD: return "$year $month $day"; + case MW_DATE_ISO: return substr($ts, 0, 4). '-' . substr($ts, 4, 2). '-' .substr($ts, 6, 2); + default: return "$month $day, $year"; + } + } + + /** + * @public + * @param mixed $ts the time format which needs to be turned into a + * date('YmdHis') format with wfTimestamp(TS_MW,$ts) + * @param bool $adj whether to adjust the time output according to the + * user configured offset ($timecorrection) + * @param mixed $format true to use user's date format preference + * @param string $timecorrection the time offset as returned by + * validateTimeZone() in Special:Preferences + * @return string + */ + function time( $ts, $adj = false, $format = true, $timecorrection = false ) { + global $wgUser; + + if ( $adj ) { $ts = $this->userAdjust( $ts, $timecorrection ); } + $datePreference = $this->dateFormat( $format ); + + $sep = $this->timeSeparator( $format ); + + $hh = substr( $ts, 8, 2 ); + $mm = substr( $ts, 10, 2 ); + $ss = substr( $ts, 12, 2 ); + + if ( $datePreference != MW_DATE_ISO ) { + $hh = $this->formatNum( $hh, true ); + $mm = $this->formatNum( $mm, true ); + //$ss = $this->formatNum( $ss, true ); + return $hh . $sep . $mm; + } else { + return $hh . ':' . $mm . ':' . $ss; + } + } + + /** + * Default separator character between hours, minutes, and seconds. + * Will be used by Language::time() for non-ISO formats. + * (ISO will always use a colon.) + * @return string + */ + function timeSeparator( $format ) { + return ':'; + } + + /** + * String to insert between the time and the date in a combined + * string. Should include any relevant whitespace. + * @return string + */ + function timeDateSeparator( $format ) { + return ', '; + } + + /** + * Return true if the time should display before the date. + * @return bool + * @private + */ + function timeBeforeDate() { + return true; + } + + function formatMonth( $month, $format ) { + return $this->getMonthName( $month ); + } + + function formatDay( $day, $format ) { + return $this->formatNum( 0 + $day, true ); + } + + /** + * @public + * @param mixed $ts the time format which needs to be turned into a + * date('YmdHis') format with wfTimestamp(TS_MW,$ts) + * @param bool $adj whether to adjust the time output according to the + * user configured offset ($timecorrection) + + * @param mixed $format what format to return, if it's false output the + * default one (default true) + * @param string $timecorrection the time offset as returned by + * validateTimeZone() in Special:Preferences + * @return string + */ + function timeanddate( $ts, $adj = false, $format = true, $timecorrection = false) { + global $wgUser; + + $datePreference = $this->dateFormat($format); + switch ( $datePreference ) { + case MW_DATE_ISO: return $this->date( $ts, $adj, $format, $timecorrection ) . ' ' . + $this->time( $ts, $adj, $format, $timecorrection ); + default: + $time = $this->time( $ts, $adj, $format, $timecorrection ); + $sep = $this->timeDateSeparator( $datePreference ); + $date = $this->date( $ts, $adj, $format, $timecorrection ); + return $this->timeBeforeDate( $datePreference ) + ? $time . $sep . $date + : $date . $sep . $time; + } + } + + function getMessage( $key ) { + global $wgAllMessagesEn; + return @$wgAllMessagesEn[$key]; + } + + function getAllMessages() { + global $wgAllMessagesEn; + return $wgAllMessagesEn; + } + + function iconv( $in, $out, $string ) { + # For most languages, this is a wrapper for iconv + return iconv( $in, $out, $string ); + } + + function ucfirst( $string ) { + # For most languages, this is a wrapper for ucfirst() + return ucfirst( $string ); + } + + function uc( $str ) { + return strtoupper( $str ); + } + + function lcfirst( $s ) { + return strtolower( $s{0} ). substr( $s, 1 ); + } + + function lc( $str ) { + return strtolower( $str ); + } + + function checkTitleEncoding( $s ) { + global $wgInputEncoding; + + # Check for UTF-8 URLs; Internet Explorer produces these if you + # type non-ASCII chars in the URL bar or follow unescaped links. + $ishigh = preg_match( '/[\x80-\xff]/', $s); + $isutf = ($ishigh ? preg_match( '/^([\x00-\x7f]|[\xc0-\xdf][\x80-\xbf]|' . + '[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xf7][\x80-\xbf]{3})+$/', $s ) : true ); + + if( ($wgInputEncoding != 'utf-8') and $ishigh and $isutf ) + return @iconv( 'UTF-8', $wgInputEncoding, $s ); + + if( ($wgInputEncoding == 'utf-8') and $ishigh and !$isutf ) + return utf8_encode( $s ); + + # Other languages can safely leave this function, or replace + # it with one to detect and convert another legacy encoding. + return $s; + } + + /** + * Some languages have special punctuation to strip out + * or characters which need to be converted for MySQL's + * indexing to grok it correctly. Make such changes here. + * + * @param string $in + * @return string + */ + function stripForSearch( $in ) { + return strtolower( $in ); + } + + function convertForSearchResult( $termsArray ) { + # some languages, e.g. Chinese, need to do a conversion + # in order for search results to be displayed correctly + return $termsArray; + } + + /** + * Get the first character of a string. In ASCII, return + * first byte of the string. UTF8 and others have to + * overload this. + * + * @param string $s + * @return string + */ + function firstChar( $s ) { + return $s[0]; + } + + 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. + #global $wgInputEncoding, $wgOutputEncoding, $wgEditEncoding; + } + + function setAltEncoding() { + # Some languages may have an alternate char encoding option + # (Esperanto X-coding, Japanese furigana conversion, etc) + # If 'altencoding' is checked in user prefs, this gives a + # chance to swap out the default encoding settings. + #global $wgInputEncoding, $wgOutputEncoding, $wgEditEncoding; + } + + 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. + global $wgInputEncoding, $wgEditEncoding; + if( $wgEditEncoding == '' or + $wgEditEncoding == $wgInputEncoding ) { + return $s; + } else { + return $this->iconv( $wgInputEncoding, $wgEditEncoding, $s ); + } + } + + function recodeInput( $s ) { + # Take the previous into account. + global $wgInputEncoding, $wgOutputEncoding, $wgEditEncoding; + if($wgEditEncoding != "") { + $enc = $wgEditEncoding; + } else { + $enc = $wgOutputEncoding; + } + if( $enc == $wgInputEncoding ) { + return $s; + } else { + return $this->iconv( $enc, $wgInputEncoding, $s ); + } + } + + /** + * For right-to-left language support + * + * @return bool + */ + function isRTL() { return false; } + + /** + * A hidden direction mark (LRM or RLM), depending on the language direction + * + * @return string + */ + function getDirMark() { return $this->isRTL() ? "\xE2\x80\x8F" : "\xE2\x80\x8E"; } + + /** + * To allow "foo[[bar]]" to extend the link over the whole word "foobar" + * + * @return bool + */ + function linkPrefixExtension() { return false; } + + function &getMagicWords() { + global $wgMagicWordsEn; + return $wgMagicWordsEn; + } + + # Fill a MagicWord object with data from here + function getMagic( &$mw ) { + if ( !isset( $this->mMagicExtensions ) ) { + $this->mMagicExtensions = array(); + wfRunHooks( 'LanguageGetMagic', array( &$this->mMagicExtensions, $this->getCode() ) ); + } + if ( isset( $this->mMagicExtensions[$mw->mId] ) ) { + $rawEntry = $this->mMagicExtensions[$mw->mId]; + } else { + $magicWords =& $this->getMagicWords(); + if ( isset( $magicWords[$mw->mId] ) ) { + $rawEntry = $magicWords[$mw->mId]; + } else { + # Fall back to English if local list is incomplete + $magicWords =& Language::getMagicWords(); + $rawEntry = $magicWords[$mw->mId]; + } + } + + $mw->mCaseSensitive = $rawEntry[0]; + $mw->mSynonyms = array_slice( $rawEntry, 1 ); + } + + /** + * Italic is unsuitable for some languages + * + * @public + * + * @param string $text The text to be emphasized. + * @return string + */ + function emphasize( $text ) { + return "<em>$text</em>"; + } + + /** + * 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 + * LanguageIs.php for the , => . and . => , implementation. + * + * @todo check if it's viable to use localeconv() for the decimal + * seperator thing. + * @public + * @param mixed $number the string to be formatted, should be an integer or + * a floating point number. + * @param bool $nocommafy Set to true for special numbers like dates + * @return string + */ + function formatNum( $number, $nocommafy = false ) { + global $wgTranslateNumerals; + if (!$nocommafy) { + $number = $this->commafy($number); + $s = $this->separatorTransformTable(); + if (!is_null($s)) { $number = strtr($number, $s); } + } + + if ($wgTranslateNumerals) { + $s = $this->digitTransformTable(); + if (!is_null($s)) { $number = strtr($number, $s); } + } + + return $number; + } + + /** + * Adds commas to a given number + * + * @param mixed $_ + * @return string + */ + function commafy($_) { + return strrev((string)preg_replace('/(\d{3})(?=\d)(?!\d*\.)/','$1,',strrev($_))); + } + + function digitTransformTable() { + return null; + } + + function separatorTransformTable() { + return null; + } + + + /** + * For the credit list in includes/Credits.php (action=credits) + * + * @param array $l + * @return string + */ + function listToText( $l ) { + $s = ''; + $m = count($l) - 1; + for ($i = $m; $i >= 0; $i--) { + if ($i == $m) { + $s = $l[$i]; + } else if ($i == $m - 1) { + $s = $l[$i] . ' ' . wfMsg('and') . ' ' . $s; + } else { + $s = $l[$i] . ', ' . $s; + } + } + return $s; + } + + # Crop a string from the beginning or end to a certain number of bytes. + # (Bytes are used because our storage has limited byte lengths for some + # columns in the database.) Multibyte charsets will need to make sure that + # only whole characters are included! + # + # $length does not include the optional ellipsis. + # If $length is negative, snip from the beginning + function truncate( $string, $length, $ellipsis = '' ) { + if( $length == 0 ) { + return $ellipsis; + } + if ( strlen( $string ) <= abs( $length ) ) { + return $string; + } + if( $length > 0 ) { + $string = substr( $string, 0, $length ); + return $string . $ellipsis; + } else { + $string = substr( $string, $length ); + return $ellipsis . $string; + } + } + + /** + * Grammatical transformations, needed for inflected languages + * Invoked by putting {{grammar:case|word}} in a message + * + * @param string $word + * @param string $case + * @return string + */ + function convertGrammar( $word, $case ) { + global $wgGrammarForms; + if ( isset($wgGrammarForms['en'][$case][$word]) ) { + return $wgGrammarForms['en'][$case][$word]; + } + return $word; + } + + /** + * Plural form transformations, needed for some languages. + * For example, where are 3 form of plural in Russian and Polish, + * depending on "count mod 10". See [[w:Plural]] + * For English it is pretty simple. + * + * Invoked by putting {{plural:count|wordform1|wordform2}} + * or {{plural:count|wordform1|wordform2|wordform3}} + * + * Example: {{plural:{{NUMBEROFARTICLES}}|article|articles}} + * + * @param integer $count + * @param string $wordform1 + * @param string $wordform2 + * @param string $wordform3 (optional) + * @return string + */ + function convertPlural( $count, $wordform1, $wordform2, $wordform3) { + return $count == '1' ? $wordform1 : $wordform2; + } + + /** + * For translaing of expiry times + * @param string The validated block time in English + * @return Somehow translated block time + * @see LanguageFi.php for example implementation + */ + function translateBlockExpiry( $str ) { + + $scBlockExpiryOptions = wfMsg( 'ipboptions' ); + + if ( $scBlockExpiryOptions == '-') { + return $str; + } + + foreach (explode(',', $scBlockExpiryOptions) as $option) { + if ( strpos($option, ":") === false ) + continue; + list($show, $value) = explode(":", $option); + if ( strcmp ( $str, $value) == 0 ) + return '<span title="' . htmlspecialchars($str). '">' . + htmlspecialchars( trim( $show ) ) . '</span>'; + } + + return $str; + } + + /** + * languages like Chinese need to be segmented in order for the diff + * to be of any use + * + * @param string $text + * @return string + */ + function segmentForDiff( $text ) { + return $text; + } + + /** + * and unsegment to show the result + * + * @param string $text + * @return string + */ + function unsegmentForDiff( $text ) { + return $text; + } + + # convert text to different variants of a language. + function convert( $text, $isTitle = false) { + return $this->mConverter->convert($text, $isTitle); + } + + # Convert text from within Parser + function parserConvert( $text, &$parser ) { + return $this->mConverter->parserConvert( $text, $parser ); + } + + /** + * Perform output conversion on a string, and encode for safe HTML output. + * @param string $text + * @param bool $isTitle -- wtf? + * @return string + * @todo this should get integrated somewhere sane + */ + function convertHtml( $text, $isTitle = false ) { + return htmlspecialchars( $this->convert( $text, $isTitle ) ); + } + + function convertCategoryKey( $key ) { + return $this->mConverter->convertCategoryKey( $key ); + } + + /** + * get the list of variants supported by this langauge + * see sample implementation in LanguageZh.php + * + * @return array an array of language codes + */ + function getVariants() { + return $this->mConverter->getVariants(); + } + + + function getPreferredVariant() { + return $this->mConverter->getPreferredVariant(); + } + + /** + * if a language supports multiple variants, it is + * possible that non-existing link in one variant + * actually exists in another variant. this function + * tries to find it. See e.g. LanguageZh.php + * + * @param string $link the name of the link + * @param mixed $nt the title object of the link + * @return null the input parameters may be modified upon return + */ + function findVariantLink( &$link, &$nt ) { + $this->mConverter->findVariantLink($link, $nt); + } + + /** + * returns language specific options used by User::getPageRenderHash() + * for example, the preferred language variant + * + * @return string + * @public + */ + function getExtraHashOptions() { + return $this->mConverter->getExtraHashOptions(); + } + + /** + * for languages that support multiple variants, the title of an + * article may be displayed differently in different variants. this + * function returns the apporiate title defined in the body of the article. + * + * @return string + */ + function getParsedTitle() { + return $this->mConverter->getParsedTitle(); + } + + /** + * Enclose a string with the "no conversion" tag. This is used by + * various functions in the Parser + * + * @param string $text text to be tagged for no conversion + * @return string the tagged text + */ + function markNoConversion( $text ) { + return $this->mConverter->markNoConversion( $text ); + } + + /** + * A regular expression to match legal word-trailing characters + * which should be merged onto a link of the form [[foo]]bar. + * + * @return string + * @public + */ + function linkTrail() { + return $this->getMessage( 'linktrail' ); + } + + function getLangObj() { + return $this; + } + + /** + * Get the RFC 3066 code for this language object + */ + function getCode() { + return str_replace( '_', '-', strtolower( substr( get_class( $this ), 8 ) ) ); + } + + +} + +# FIXME: Merge all UTF-8 support code into Language base class. +# We no longer support Latin-1 charset. +require_once( 'LanguageUtf8.php' ); + +# This should fail gracefully if there's not a localization available +wfSuppressWarnings(); +// Preload base classes to work around APC/PHP5 bug +include_once( 'Language' . str_replace( '-', '_', ucfirst( $wgLanguageCode ) ) . '.deps.php' ); +include_once( 'Language' . str_replace( '-', '_', ucfirst( $wgLanguageCode ) ) . '.php' ); +wfRestoreWarnings(); + +} +?> |