From 72e90545454c0e014318fa3c81658e035aac58c1 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Wed, 10 Jun 2009 13:00:47 +0200 Subject: applying patch to version 1.15.0 --- languages/Language.php | 96 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 76 insertions(+), 20 deletions(-) (limited to 'languages/Language.php') diff --git a/languages/Language.php b/languages/Language.php index 6502aa0d..8853aced 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -39,7 +39,7 @@ class FakeConverter { function parserConvert($t, $p) {return $t;} function getVariants() { return array( $this->mLang->getCode() ); } function getPreferredVariant() {return $this->mLang->getCode(); } - function findVariantLink(&$l, &$n, $forTemplate = false) {} + function findVariantLink(&$l, &$n, $ignoreOtherCond = false) {} function getExtraHashOptions() {return '';} function getParsedTitle() {return '';} function markNoConversion($text, $noParse=false) {return $text;} @@ -1564,7 +1564,7 @@ class Language { $n = $minLength-1; $out = preg_replace( "/\b(\w{1,$n})\b/", - "$1U800", + "$1u800", $out ); } @@ -1576,7 +1576,7 @@ class Language { // "example.wikipedia.com" and "192.168.83.1" as well. $out = preg_replace( "/(\w)\.(\w|\*)/u", - "$1U82e$2", + "$1u82e$2", $out ); wfProfileOut( __METHOD__ ); @@ -1589,7 +1589,7 @@ class Language { * settings or anything else of the sort. */ protected function stripForSearchCallback( $matches ) { - return 'U8' . bin2hex( $matches[1] ); + return 'u8' . bin2hex( $matches[1] ); } /** @@ -1989,7 +1989,19 @@ class Language { $list, wfMsgExt( 'comma-separator', array( 'escapenoentities', 'language' => $this ) ) ); } - + + /** + * 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, + wfMsgExt( 'semicolon-separator', array( 'escapenoentities', 'language' => $this ) ) ); + } + /** * Same as commaList, but separate it with the pipe instead. * @param $list array of strings to put in a pipe list @@ -2016,7 +2028,12 @@ class Language { * @param $ellipsis String to append to the truncated text * @return string */ - function truncate( $string, $length, $ellipsis = "" ) { + function truncate( $string, $length, $ellipsis = '...' ) { + # Use the localized ellipsis character + if( $ellipsis == '...' ) { + $ellipsis = wfMsgExt( 'ellipsis', array( 'escapenoentities', 'language' => $this ) ); + } + if( $length == 0 ) { return $ellipsis; } @@ -2033,7 +2050,7 @@ class Language { } 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 + # We chopped in the middle of a character; remove it $string = $m[1]; } return $string . $ellipsis; @@ -2064,6 +2081,22 @@ class Language { return $word; } + /** + * 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 ) { + if ( !count($forms) ) { return ''; } + $forms = $this->preConvertPlural( $forms, 2 ); + if ( $gender === 'male' ) return $forms[0]; + if ( $gender === 'female' ) return $forms[1]; + return isset($forms[2]) ? $forms[2] : $forms[0]; + } + /** * Plural form transformations, needed for some languages. * For example, there are 3 form of plural in Russian and Polish, @@ -2207,10 +2240,12 @@ class Language { * * @param $link String: the name of the link * @param $nt Mixed: the title object of the link + * @param boolean $ignoreOtherCond: to disable other conditions when + * we need to transclude a template or update a category's link * @return null the input parameters may be modified upon return */ - function findVariantLink( &$link, &$nt, $forTemplate = false ) { - $this->mConverter->findVariantLink($link, $nt, $forTemplate ); + function findVariantLink( &$link, &$nt, $ignoreOtherCond = false ) { + $this->mConverter->findVariantLink( $link, $nt, $ignoreOtherCond ); } /** @@ -2218,7 +2253,6 @@ class Language { * into an array of all possible variants of the text: * 'variant' => text in that variant */ - function convertLinkToAllVariants($text){ return $this->mConverter->convertLinkToAllVariants($text); } @@ -2379,6 +2413,12 @@ class Language { $cache = compact( self::$mLocalisationKeys ); wfDebug( "Language::loadLocalisation(): got localisation for $code from source\n" ); } + + # Load magic word source file + global $IP; + $filename = "$IP/includes/MagicWord.php"; + $newDeps = array( $filename => filemtime( $filename ) ); + $deps = array_merge( $deps, $newDeps ); if ( !empty( $fallback ) ) { # Load the fallback localisation, with a circular reference guard @@ -2455,6 +2495,10 @@ class Language { self::loadLocalisation( $cache ); $cache = self::$mLocalisationCache[$cache]; } + // At least one language file and the MagicWord file needed + if( count($cache['deps']) < 2 ) { + return true; + } $expired = false; foreach ( $cache['deps'] as $file => $mtime ) { if ( !file_exists( $file ) || filemtime( $file ) > $mtime ) { @@ -2549,16 +2593,8 @@ class Language { $this->namespaceNames[NS_PROJECT_TALK] = $wgMetaNamespaceTalk; } else { $talk = $this->namespaceNames[NS_PROJECT_TALK]; - $talk = str_replace( '$1', $wgMetaNamespace, $talk ); - - # Allow grammar transformations - # Allowing full message-style parsing would make simple requests - # such as action=raw much more expensive than they need to be. - # This will hopefully cover most cases. - $talk = preg_replace_callback( '/{{grammar:(.*?)\|(.*?)}}/i', - array( &$this, 'replaceGrammarInNamespace' ), $talk ); - $talk = str_replace( ' ', '_', $talk ); - $this->namespaceNames[NS_PROJECT_TALK] = $talk; + $this->namespaceNames[NS_PROJECT_TALK] = + $this->fixVariableInNamespace( $talk ); } # The above mixing may leave namespaces out of canonical order. @@ -2575,6 +2611,11 @@ class Language { } if ( $this->namespaceAliases ) { foreach ( $this->namespaceAliases as $name => $index ) { + if ( $index === NS_PROJECT_TALK ) { + unset( $this->namespaceAliases[$name] ); + $name = $this->fixVariableInNamespace( $name ); + $this->namespaceAliases[$name] = $index; + } $this->mNamespaceIds[$this->lc($name)] = $index; } } @@ -2590,6 +2631,21 @@ class Language { wfProfileOut( __METHOD__ ); } + function fixVariableInNamespace( $talk ) { + if ( strpos( $talk, '$1' ) === false ) return $talk; + + global $wgMetaNamespace; + $talk = str_replace( '$1', $wgMetaNamespace, $talk ); + + # Allow grammar transformations + # Allowing full message-style parsing would make simple requests + # such as action=raw much more expensive than they need to be. + # This will hopefully cover most cases. + $talk = preg_replace_callback( '/{{grammar:(.*?)\|(.*?)}}/i', + array( &$this, 'replaceGrammarInNamespace' ), $talk ); + return str_replace( ' ', '_', $talk ); + } + function replaceGrammarInNamespace( $m ) { return $this->convertGrammar( trim( $m[2] ), trim( $m[1] ) ); } -- cgit v1.2.2