diff options
Diffstat (limited to 'languages/LanguageConverter.php')
-rw-r--r-- | languages/LanguageConverter.php | 84 |
1 files changed, 63 insertions, 21 deletions
diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php index 43afe653..96a71a09 100644 --- a/languages/LanguageConverter.php +++ b/languages/LanguageConverter.php @@ -246,7 +246,7 @@ class LanguageConverter { * @return Mixed: variant if one found, false otherwise. */ protected function getUserVariant() { - global $wgUser; + global $wgUser, $wgContLang; // memoizing this function wreaks havoc on parserTest.php /* @@ -258,8 +258,12 @@ class LanguageConverter { // Get language variant preference from logged in users // Don't call this on stub objects because that causes infinite // recursion during initialisation - if ( $wgUser->isLoggedIn() ) { - $ret = $wgUser->getOption( 'variant' ); + if ( $wgUser->isLoggedIn() ) { + if ( $this->mMainLanguageCode == $wgContLang->getCode() ) { + $ret = $wgUser->getOption( 'variant' ); + } else { + $ret = $wgUser->getOption( 'variant-' . $this->mMainLanguageCode ); + } } else { // figure out user lang without constructing wgLang to avoid // infinite recursion @@ -344,7 +348,7 @@ class LanguageConverter { } } - if( $this->guessVariant( $text, $toVariant ) ) { + if ( $this->guessVariant( $text, $toVariant ) ) { wfProfileOut( __METHOD__ ); return $text; } @@ -364,11 +368,11 @@ class LanguageConverter { // this one is needed when the text is inside an HTML markup $htmlfix = '|<[^>]+$|^[^<>]*>'; - // disable convert to variants between <code></code> tags + // disable convert to variants between <code> tags $codefix = '<code>.+?<\/code>|'; - // disable convertsion of <script type="text/javascript"> ... </script> + // disable conversion of <script> tags $scriptfix = '<script.*?>.*?<\/script>|'; - // disable conversion of <pre xxxx> ... </pre> + // disable conversion of <pre> tags $prefix = '<pre.*?>.*?<\/pre>|'; $reg = '/' . $codefix . $scriptfix . $prefix . @@ -551,7 +555,7 @@ class LanguageConverter { $variant = $this->getPreferredVariant(); $index = $title->getNamespace(); if ( $index !== NS_MAIN ) { - $text = $this->convertNamespace( $index ) . ':'; + $text = $this->convertNamespace( $index, $variant ) . ':'; } else { $text = ''; } @@ -563,10 +567,13 @@ class LanguageConverter { * Get the namespace display name in the preferred variant. * * @param $index int namespace id + * @param $variant string|null variant code or null for preferred variant * @return String: namespace name for display */ - public function convertNamespace( $index ) { - $variant = $this->getPreferredVariant(); + public function convertNamespace( $index, $variant = null ) { + if ( $variant === null ) { + $variant = $this->getPreferredVariant(); + } if ( $index === NS_MAIN ) { return ''; } else { @@ -644,14 +651,14 @@ class LanguageConverter { if ( $pos === false ) { // No more markup, append final segment $fragment = substr( $text, $startPos ); - $out .= $shouldConvert? $this->autoConvert( $fragment, $variant ): $fragment; + $out .= $shouldConvert ? $this->autoConvert( $fragment, $variant ) : $fragment; return $out; } // Markup found // Append initial segment $fragment = substr( $text, $startPos, $pos - $startPos ); - $out .= $shouldConvert? $this->autoConvert( $fragment, $variant ): $fragment; + $out .= $shouldConvert ? $this->autoConvert( $fragment, $variant ) : $fragment; // Advance position $startPos = $pos; @@ -687,7 +694,7 @@ class LanguageConverter { while ( $startPos < $length ) { $m = false; - preg_match( '/-\{|\}-/', $text, $m, PREG_OFFSET_CAPTURE, $startPos ); + preg_match( '/-\{|\}-/', $text, $m, PREG_OFFSET_CAPTURE, $startPos ); if ( !$m ) { // Unclosed rule break; @@ -833,7 +840,7 @@ class LanguageConverter { * @author Nikola Smolenski <smolensk@eunet.rs> * @since 1.19 */ - public function guessVariant($text, $variant) { + public function guessVariant( $text, $variant ) { return false; } @@ -941,7 +948,7 @@ class LanguageConverter { $parsed[$key] = true; if ( $subpage === '' ) { - $txt = MessageCache::singleton()->get( 'conversiontable', true, $code ); + $txt = MessageCache::singleton()->getMsgFromNamespace( $key, $code ); } else { $txt = false; $title = Title::makeTitleSafe( NS_MEDIAWIKI, $key ); @@ -952,7 +959,7 @@ class LanguageConverter { $txt = $revision->getContent( Revision::RAW )->getNativeData(); } - //@todo: in the future, use a specialized content model, perhaps based on json! + // @todo in the future, use a specialized content model, perhaps based on json! } } } @@ -1096,6 +1103,7 @@ class LanguageConverter { * @param $text String: text to armour against conversion * @return String: armoured text where { and } have been converted to * { and } + * @deprecated since 1.22 is no longer used */ public function armourMath( $text ) { // convert '-{' and '}-' to '-{' and '}-' to prevent @@ -1256,17 +1264,20 @@ class ConverterRule { $variants = $this->mConverter->mVariants; $varsep_pattern = $this->mConverter->getVarSeparatorPattern(); + // Split according to $varsep_pattern, but ignore semicolons from HTML entities + $rules = preg_replace( '/(&[#a-zA-Z0-9]+);/', "$1\x01", $rules ); $choice = preg_split( $varsep_pattern, $rules ); + $choice = str_replace( "\x01", ';', $choice ); foreach ( $choice as $c ) { - $v = explode( ':', $c, 2 ); + $v = explode( ':', $c, 2 ); if ( count( $v ) != 2 ) { // syntax error, skip continue; } $to = trim( $v[1] ); - $v = trim( $v[0] ); - $u = explode( '=>', $v, 2 ); + $v = trim( $v[0] ); + $u = explode( '=>', $v, 2 ); // if $to is empty, strtr() could return a wrong result if ( count( $u ) == 1 && $to && in_array( $v, $variants ) ) { $bidtable[$v] = $to; @@ -1358,6 +1369,37 @@ class ConverterRule { } /** + * Similar to getRuleConvertedStr(), but this prefers to use original + * page title if $variant === $this->mConverter->mMainLanguageCode + * and may return false in this case (so this title conversion rule + * will be ignored and the original title is shown). + * + * @since 1.22 + * @param $variant The variant code to display page title in + * @return String|false The converted title or false if just page name + */ + function getRuleConvertedTitle( $variant ) { + if ( $variant === $this->mConverter->mMainLanguageCode ) { + // If a string targeting exactly this variant is set, + // use it. Otherwise, just return false, so the real + // page name can be shown (and because variant === main, + // there'll be no further automatic conversion). + $disp = $this->getTextInBidtable( $variant ); + if ( $disp ) { + return $disp; + } + if ( array_key_exists( $variant, $this->mUnidtable ) ) { + $disp = array_values( $this->mUnidtable[$variant] ); + $disp = $disp[0]; + } + // Assigned above or still false. + return $disp; + } else { + return $this->getRuleConvertedStr( $variant ); + } + } + + /** * Generate conversion table for all text. * @private */ @@ -1439,7 +1481,7 @@ class ConverterRule { // then we check its fallback variants. $variantFallbacks = $this->mConverter->getVariantFallbacks( $variant ); - if( is_array( $variantFallbacks ) ) { + if ( is_array( $variantFallbacks ) ) { foreach ( $variantFallbacks as $variantFallback ) { // if current variant's fallback exist in flags if ( isset( $this->mVariantFlags[$variantFallback] ) ) { @@ -1509,7 +1551,7 @@ class ConverterRule { $this->mRuleDisplay = $this->getRuleConvertedStr( $variant ); break; case 'T': - $this->mRuleTitle = $this->getRuleConvertedStr( $variant ); + $this->mRuleTitle = $this->getRuleConvertedTitle( $variant ); $this->mRuleDisplay = ''; break; default: |