3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 * http://www.gnu.org/copyleft/gpl.html
23 * Methods for dealing with language codes.
24 * @todo Move some of the code-related static methods out of Language into this class
31 * Mapping of deprecated language codes that were used in previous
32 * versions of MediaWiki to up-to-date, current language codes.
34 * @var array Mapping from language code to language code
38 private static $deprecatedLanguageCodeMapping = [
39 // Note that als is actually a valid ISO 639 code (Tosk Albanian), but it
40 // was previously used in MediaWiki for Alsatian, which comes under gsw
43 'be-x-old' => 'be-tarask',
46 'zh-classical' => 'lzh',
47 'zh-min-nan' => 'nan',
52 * Returns a mapping of deprecated language codes that were used in previous
53 * versions of MediaWiki to up-to-date, current language codes.
55 * This array is merged into $wgDummyLanguageCodes in Setup.php, along with
56 * the fake language codes 'qqq' and 'qqx', which are used internally by
57 * MediaWiki's localisation system.
63 public static function getDeprecatedCodeMapping() {
64 return self
::$deprecatedLanguageCodeMapping;
68 * Replace deprecated language codes that were used in previous
69 * versions of MediaWiki to up-to-date, current language codes.
70 * Other values will returned unchanged.
72 * @param string $code Old language code
73 * @return string New language code
77 public static function replaceDeprecatedCodes( $code ) {
78 if ( isset( self
::$deprecatedLanguageCodeMapping[$code] ) ) {
79 return self
::$deprecatedLanguageCodeMapping[$code];
85 * Get the normalised IETF language tag
86 * See unit test for examples.
87 * See mediawiki.language.bcp47 for the JavaScript implementation.
89 * @param string $code The language code.
90 * @return string The language code which complying with BCP 47 standards.
94 public static function bcp47( $code ) {
95 $codeSegment = explode( '-', $code );
97 foreach ( $codeSegment as $segNo => $seg ) {
98 // when previous segment is x, it is a private segment and should be lc
99 if ( $segNo > 0 && strtolower( $codeSegment[( $segNo - 1 )] ) == 'x' ) {
100 $codeBCP[$segNo] = strtolower( $seg );
101 // ISO 3166 country code
102 } elseif ( ( strlen( $seg ) == 2 ) && ( $segNo > 0 ) ) {
103 $codeBCP[$segNo] = strtoupper( $seg );
104 // ISO 15924 script code
105 } elseif ( ( strlen( $seg ) == 4 ) && ( $segNo > 0 ) ) {
106 $codeBCP[$segNo] = ucfirst( strtolower( $seg ) );
107 // Use lowercase for other cases
109 $codeBCP[$segNo] = strtolower( $seg );
112 $langCode = implode( '-', $codeBCP );