X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=languages%2Fclasses%2FLanguageTr.php;h=03790fa5309bae924f64de01bfadbf87dc6951e1;hb=3a458a32e7bb6ade4cbbc6bc83d7f1392461518b;hp=49ee88ac8dcc97527217bc17b9834117f3abd6b8;hpb=17eda64357834fa847126d8d7f49f6f5b42c4d89;p=lhc%2Fweb%2Fwiklou.git diff --git a/languages/classes/LanguageTr.php b/languages/classes/LanguageTr.php index 49ee88ac8d..03790fa530 100644 --- a/languages/classes/LanguageTr.php +++ b/languages/classes/LanguageTr.php @@ -24,21 +24,33 @@ /** * Turkish (Türkçe) * - * Turkish has two different i, one with a dot and another without a dot. They - * are totally different letters in this language, so we have to override the + * The Turkish language, like other Turkic languages, distinguishes + * a dotted letter 'i' from a dotless letter 'ı' (U+0131 LATIN SMALL LETTER DOTLESS I). + * In these languages, each has an equivalent uppercase mapping: + * ı (U+0131 LATIN SMALL LETTER DOTLESS I) -> I (U+0049 LATIN CAPITAL LETTER I), + * i (U+0069 LATIN SMALL LETTER I) -> İ (U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE). + * + * Unicode CaseFolding.txt defines this case as type 'T', a special case for Turkic languages: + * tr and az. PHP 7.3 parser ignores this special cases. so we have to override the * ucfirst and lcfirst methods. + * * See https://en.wikipedia.org/wiki/Dotted_and_dotless_I and T30040 * @ingroup Language */ class LanguageTr extends Language { + private $uc = [ 'I', 'İ' ]; + private $lc = [ 'ı', 'i' ]; + /** * @param string $string * @return string */ public function ucfirst( $string ) { - if ( strlen( $string ) && $string[0] == 'i' ) { - return 'İ' . substr( $string, 1 ); + $first = mb_substr( $string, 0, 1 ); + if ( in_array( $first, $this->lc ) ) { + $first = str_replace( $this->lc, $this->uc, $first ); + return $first . mb_substr( $string, 1 ); } return parent::ucfirst( $string ); } @@ -48,8 +60,10 @@ class LanguageTr extends Language { * @return mixed|string */ function lcfirst( $string ) { - if ( strlen( $string ) && $string[0] == 'I' ) { - return 'ı' . substr( $string, 1 ); + $first = mb_substr( $string, 0, 1 ); + if ( in_array( $first, $this->uc ) ) { + $first = str_replace( $this->uc, $this->lc, $first ); + return $first . mb_substr( $string, 1 ); } return parent::lcfirst( $string ); }