diff --git a/languages/Language.php b/languages/Language.php index 262d86fa3e6..fb2cb7573bf 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -682,7 +682,18 @@ class Language { } } - $this->namespaceAliases = $aliases; + # Also add converted namespace names as aliases, to avoid confusion. + $convertedNames = array(); + foreach ( $this->getVariants() as $variant ) { + if ( $variant === $this->mCode ) { + continue; + } + foreach ( $this->getNamespaces() as $ns => $_ ) { + $convertedNames[$this->getConverter()->convertNamespace( $ns, $variant )] = $ns; + } + } + + $this->namespaceAliases = $aliases + $convertedNames; } return $this->namespaceAliases; } diff --git a/languages/LanguageConverter.php b/languages/LanguageConverter.php index a02fc8ad978..6aeb7399ae3 100644 --- a/languages/LanguageConverter.php +++ b/languages/LanguageConverter.php @@ -551,7 +551,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 +563,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 { diff --git a/tests/phpunit/languages/LanguageTest.php b/tests/phpunit/languages/LanguageTest.php index 9023dc77736..7a267803988 100644 --- a/tests/phpunit/languages/LanguageTest.php +++ b/tests/phpunit/languages/LanguageTest.php @@ -1504,4 +1504,28 @@ class LanguageTest extends LanguageClassesTestCase { array( 'en', null, 'en does not have converter. Although FakeConverter handles en -> en conversion but it is useless' ), ); } + + /** + * @dataProvider provideGetNamespaceAliases + */ + function testGetNamespaceAliases( $languageCode, $subset ) { + $language = Language::factory( $languageCode ); + $aliases = $language->getNamespaceAliases(); + foreach ( $subset as $alias => $nsId ) { + $this->assertEquals( $nsId, $aliases[$alias] ); + } + } + + function provideGetNamespaceAliases() { + // TODO: Add tests for NS_PROJECT_TALK and GenderNamespaces + return array( + array( + 'zh', + array( + '文件' => NS_FILE, + '檔案' => NS_FILE, + ), + ), + ); + } }