summaryrefslogtreecommitdiff
path: root/languages/LanguageConverter.php
diff options
context:
space:
mode:
Diffstat (limited to 'languages/LanguageConverter.php')
-rw-r--r--languages/LanguageConverter.php84
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
* &#123; and &#125;
+ * @deprecated since 1.22 is no longer used
*/
public function armourMath( $text ) {
// convert '-{' and '}-' to '-&#123;' and '&#125;-' 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: