* @since 1.20
* @var array
*/
- static public $languagesWithVariants = [
+ public static $languagesWithVariants = [
'en',
'crh',
'gan',
public $mVariantFallbacks;
public $mVariantNames;
public $mTablesLoaded = false;
+
+ /**
+ * @var ReplacementArray[]
+ * @phan-var array<string,ReplacementArray>
+ */
public $mTables;
+
// 'bidirectional' 'unidirectional' 'disable' for each variant
public $mManualLevel;
* main code if there is no fallback
*/
public function getVariantFallbacks( $variant ) {
- if ( isset( $this->mVariantFallbacks[$variant] ) ) {
- return $this->mVariantFallbacks[$variant];
- }
- return $this->mMainLanguageCode;
+ return $this->mVariantFallbacks[$variant] ?? $this->mMainLanguageCode;
}
/**
$req = $this->validateVariant( $wgDefaultLanguageVariant );
}
+ $req = $this->validateVariant( $req );
+
// This function, unlike the other get*Variant functions, is
// not memoized (i.e. there return value is not cached) since
// new information might appear during processing after this
// is first called.
- if ( $this->validateVariant( $req ) ) {
+ if ( $req ) {
return $req;
}
return $this->mMainLanguageCode;
}
/**
- * Validate the variant
+ * Validate the variant and return an appropriate strict internal
+ * variant code if one exists. Compare to Language::hasVariant()
+ * which does a strict test.
+ *
* @param string|null $variant The variant to validate
- * @return mixed Returns the variant if it is valid, null otherwise
+ * @return mixed Returns an equivalent valid variant code if possible,
+ * null otherwise
*/
public function validateVariant( $variant = null ) {
- if ( $variant !== null && in_array( $variant, $this->mVariants ) ) {
+ if ( $variant === null ) {
+ return null;
+ }
+ // Our internal variants are always lower-case; the variant we
+ // are validating may have mixed case.
+ $variant = LanguageCode::replaceDeprecatedCodes( strtolower( $variant ) );
+ if ( in_array( $variant, $this->mVariants ) ) {
return $variant;
}
+ // Browsers are supposed to use BCP 47 standard in the
+ // Accept-Language header, but not all of our internal
+ // mediawiki variant codes are BCP 47. Map BCP 47 code
+ // to our internal code.
+ foreach ( $this->mVariants as $v ) {
+ // Case-insensitive match (BCP 47 is mixed case)
+ if ( strtolower( LanguageCode::bcp47( $v ) ) === $variant ) {
+ return $v;
+ }
+ }
return null;
}
return $this->mHeaderVariant;
}
- // see if some supported language variant is set in the
+ // See if some supported language variant is set in the
// HTTP header.
$languages = array_keys( $wgRequest->getAcceptLang() );
if ( empty( $languages ) ) {
$convTable = $convRule->getConvTable();
$action = $convRule->getRulesAction();
foreach ( $convTable as $variant => $pair ) {
- if ( !$this->validateVariant( $variant ) ) {
+ $v = $this->validateVariant( $variant );
+ if ( !$v ) {
continue;
}
if ( $action == 'add' ) {
// More efficient than array_merge(), about 2.5 times.
foreach ( $pair as $from => $to ) {
- $this->mTables[$variant]->setPair( $from, $to );
+ $this->mTables[$v]->setPair( $from, $to );
}
} elseif ( $action == 'remove' ) {
- $this->mTables[$variant]->removeArray( $pair );
+ $this->mTables[$v]->removeArray( $pair );
}
}
}
$revision = Revision::newFromTitle( $title );
if ( $revision ) {
if ( $revision->getContentModel() == CONTENT_MODEL_WIKITEXT ) {
- $txt = $revision->getContent( Revision::RAW )->getNativeData();
+ $txt = $revision->getContent( Revision::RAW )->getText();
}
// @todo in the future, use a specialized content model, perhaps based on json!
// [1] => 'zh-hant:<span style="font-size:120%;">yyy</span>'
// [2] => ''
// ]
- $pat = '/;\s*(?=';
+ $expandedVariants = [];
foreach ( $this->mVariants as $variant ) {
+ $expandedVariants[ $variant ] = 1;
+ // Accept standard BCP 47 names for variants as well.
+ $expandedVariants[ LanguageCode::bcp47( $variant ) ] = 1;
+ }
+ // Accept old deprecated names for variants
+ foreach ( LanguageCode::getDeprecatedCodeMapping() as $old => $new ) {
+ if ( isset( $expandedVariants[ $new ] ) ) {
+ $expandedVariants[ $old ] = 1;
+ }
+ }
+
+ $pat = '/;\s*(?=';
+ foreach ( $expandedVariants as $variant => $ignore ) {
// zh-hans:xxx;zh-hant:yyy
$pat .= $variant . '\s*:|';
// xxx=>zh-hans:yyy; xxx=>zh-hant:zzz