Merge "Add semantic tags to license info text"
[lhc/web/wiklou.git] / languages / LanguageCode.php
1 <?php
2 /**
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.
7 *
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.
12 *
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
17 *
18 * @file
19 * @ingroup Language
20 */
21
22 /**
23 * Methods for dealing with language codes.
24 * @todo Move some of the code-related static methods out of Language into this class
25 *
26 * @since 1.29
27 * @ingroup Language
28 */
29 class LanguageCode {
30 /**
31 * Mapping of deprecated language codes that were used in previous
32 * versions of MediaWiki to up-to-date, current language codes.
33 *
34 * @var array Mapping from language code to language code
35 *
36 * @since 1.30
37 */
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
41 'als' => 'gsw',
42 'bat-smg' => 'sgs',
43 'be-x-old' => 'be-tarask',
44 'fiu-vro' => 'vro',
45 'roa-rup' => 'rup',
46 'zh-classical' => 'lzh',
47 'zh-min-nan' => 'nan',
48 'zh-yue' => 'yue',
49 ];
50
51 /**
52 * Returns a mapping of deprecated language codes that were used in previous
53 * versions of MediaWiki to up-to-date, current language codes.
54 *
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.
58 *
59 * @return string[]
60 *
61 * @since 1.29
62 */
63 public static function getDeprecatedCodeMapping() {
64 return self::$deprecatedLanguageCodeMapping;
65 }
66
67 /**
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.
71 *
72 * @param string $code Old language code
73 * @return string New language code
74 *
75 * @since 1.30
76 */
77 public static function replaceDeprecatedCodes( $code ) {
78 if ( isset( self::$deprecatedLanguageCodeMapping[$code] ) ) {
79 return self::$deprecatedLanguageCodeMapping[$code];
80 }
81 return $code;
82 }
83
84 /**
85 * Get the normalised IETF language tag
86 * See unit test for examples.
87 * See mediawiki.language.bcp47 for the JavaScript implementation.
88 *
89 * @param string $code The language code.
90 * @return string The language code which complying with BCP 47 standards.
91 *
92 * @since 1.31
93 */
94 public static function bcp47( $code ) {
95 $codeSegment = explode( '-', $code );
96 $codeBCP = [];
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
108 } else {
109 $codeBCP[$segNo] = strtolower( $seg );
110 }
111 }
112 $langCode = implode( '-', $codeBCP );
113 return $langCode;
114 }
115 }