X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=languages%2FLanguageCode.php;h=f50c55fe765d90de964ac630e2e06a5d90adcc4f;hb=49053c905a072e4b0e3a132854aad1d9cc274bb0;hp=3fa3dc16e527ae38114181cb68e58034857e972f;hpb=a8a5f03b3b6653136c4dc5925d6bb2b806010725;p=lhc%2Fweb%2Fwiklou.git diff --git a/languages/LanguageCode.php b/languages/LanguageCode.php index 3fa3dc16e5..f50c55fe76 100644 --- a/languages/LanguageCode.php +++ b/languages/LanguageCode.php @@ -80,4 +80,36 @@ class LanguageCode { } return $code; } + + /** + * Get the normalised IETF language tag + * See unit test for examples. + * See mediawiki.language.bcp47 for the JavaScript implementation. + * + * @param string $code The language code. + * @return string The language code which complying with BCP 47 standards. + * + * @since 1.31 + */ + public static function bcp47( $code ) { + $codeSegment = explode( '-', $code ); + $codeBCP = []; + foreach ( $codeSegment as $segNo => $seg ) { + // when previous segment is x, it is a private segment and should be lc + if ( $segNo > 0 && strtolower( $codeSegment[( $segNo - 1 )] ) == 'x' ) { + $codeBCP[$segNo] = strtolower( $seg ); + // ISO 3166 country code + } elseif ( ( strlen( $seg ) == 2 ) && ( $segNo > 0 ) ) { + $codeBCP[$segNo] = strtoupper( $seg ); + // ISO 15924 script code + } elseif ( ( strlen( $seg ) == 4 ) && ( $segNo > 0 ) ) { + $codeBCP[$segNo] = ucfirst( strtolower( $seg ) ); + // Use lowercase for other cases + } else { + $codeBCP[$segNo] = strtolower( $seg ); + } + } + $langCode = implode( '-', $codeBCP ); + return $langCode; + } }