From: Amir E. Aharoni Date: Mon, 21 Jan 2013 04:15:32 +0000 (+0200) Subject: (bug 41476) Implement Language::isKnownLanguageTag() X-Git-Tag: 1.31.0-rc.0~20881^2 X-Git-Url: http://git.cyclocoop.org/url?a=commitdiff_plain;h=fee2b0045edca419f431bbe411dbd3a636f3bc77;p=lhc%2Fweb%2Fwiklou.git (bug 41476) Implement Language::isKnownLanguageTag() Change-Id: I130d8e0b397323e21058cf46510440da066fa12b --- diff --git a/languages/Language.php b/languages/Language.php index 212ca323e8..dd2fef6cb4 100644 --- a/languages/Language.php +++ b/languages/Language.php @@ -361,6 +361,30 @@ class Language { return (bool)preg_match( '/^[a-z0-9-]+$/i', $code ); } + /** + * Returns true if a language code is an IETF tag known to MediaWiki. + * + * @param $code string + * + * @since 1.21 + * @return bool + */ + public static function isKnownLanguageTag( $tag ) { + static $coreLanguageNames; + + if ( $coreLanguageNames === null ) { + include( MWInit::compiledPath( 'languages/Names.php' ) ); + } + + if ( isset( $coreLanguageNames[$tag] ) + || self::fetchLanguageName( $tag, $tag ) !== '' + ) { + return true; + } + + return false; + } + /** * @param $code * @return String Name of the language class diff --git a/tests/phpunit/languages/LanguageTest.php b/tests/phpunit/languages/LanguageTest.php index 5594670f30..ec7f9db0de 100644 --- a/tests/phpunit/languages/LanguageTest.php +++ b/tests/phpunit/languages/LanguageTest.php @@ -449,6 +449,56 @@ class LanguageTest extends LanguageClassesTestCase { ); } + /** + * Test Language::isKnownLanguageTag() + * @dataProvider provideKnownLanguageTags + */ + function testKnownLanguageTag( $code, $message = '' ) { + $this->assertTrue( + (bool) Language::isKnownLanguageTag( $code ), + "validating code $code - $message" + ); + } + + function provideKnownLanguageTags() { + return array( + array( 'fr', 'simple code' ), + array( 'bat-smg', 'an MW legacy tag' ), + array( 'sgs', 'an internal standard MW name, for which a legacy tag is used externally' ), + ); + } + + /** + * Test Language::isKnownLanguageTag() + */ + function testKnownCldrLanguageTag() { + if ( !class_exists( 'LanguageNames' ) ) { + $this->markTestSkipped( 'reason' ); + } + + $this->assertTrue( + (bool) Language::isKnownLanguageTag( 'pal' ), + 'validating code "pal" an ancient language, which probably will not appear in Names.php, but appears in CLDR in English' + ); + } + + /** + * Negative tests for Language::isKnownLanguageTag() + * @dataProvider provideUnKnownLanguageTags + */ + function testUnknownLanguageTag( $code, $message = '' ) { + $this->assertFalse( + (bool) Language::isKnownLanguageTag( $code ), + "checking that code $code is invalid - $message" + ); + } + + function provideUnknownLanguageTags() { + return array( + array( 'mw', 'non-existent two-letter code' ), + ); + } + /** * @dataProvider provideSprintfDateSamples */