From d0e3dc94c3e4e8d4784123737fe31bf6877e728e Mon Sep 17 00:00:00 2001 From: Liangent Date: Thu, 14 Mar 2013 19:29:49 +0800 Subject: [PATCH] Add converted namespace names as aliases to avoid confusion. Currently if the site language is zh and a user is using variant zh-tw, namespace names from zh-hant are displayed because of the language converter, but they're not accepted by MediaWiki as valid namespace names by default because zh falls back to zh-hans. For core namespaces, all converted namespace names are manually added as $namespaceAliases in MessagesZh.php but it's not always done in extensions. With this patch converted namespace names are automatically added as namespace aliases when namespace aliases are loaded. In some followup commit it makes sense to remove existing core namespace aliases which were created for this reason. Change-Id: I01873d9c64a9943afbb655d6203cec9ebd39fb72 --- languages/Language.php | 13 ++++++++++++- languages/LanguageConverter.php | 9 ++++++--- tests/phpunit/languages/LanguageTest.php | 24 ++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/languages/Language.php b/languages/Language.php index 262d86fa3e..fb2cb7573b 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 a02fc8ad97..6aeb7399ae 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 9023dc7773..7a26780398 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, + ), + ), + ); + } } -- 2.20.1