| 1 |  |  | <?php | 
            
                                                                                                            
                            
            
                                    
            
            
                | 2 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 3 |  |  | /** | 
            
                                                                                                            
                            
            
                                    
            
            
                | 4 |  |  |  * webtrees: online genealogy | 
            
                                                                                                            
                            
            
                                    
            
            
                | 5 |  |  |  * Copyright (C) 2019 webtrees development team | 
            
                                                                                                            
                            
            
                                    
            
            
                | 6 |  |  |  * This program is free software: you can redistribute it and/or modify | 
            
                                                                                                            
                            
            
                                    
            
            
                | 7 |  |  |  * it under the terms of the GNU General Public License as published by | 
            
                                                                                                            
                            
            
                                    
            
            
                | 8 |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
            
                                                                                                            
                            
            
                                    
            
            
                | 9 |  |  |  * (at your option) any later version. | 
            
                                                                                                            
                            
            
                                    
            
            
                | 10 |  |  |  * This program is distributed in the hope that it will be useful, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 11 |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
            
                                                                                                            
                            
            
                                    
            
            
                | 12 |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 
            
                                                                                                            
                            
            
                                    
            
            
                | 13 |  |  |  * GNU General Public License for more details. | 
            
                                                                                                            
                            
            
                                    
            
            
                | 14 |  |  |  * You should have received a copy of the GNU General Public License | 
            
                                                                                                            
                            
            
                                    
            
            
                | 15 |  |  |  * along with this program. If not, see <http://www.gnu.org/licenses/>. | 
            
                                                                                                            
                            
            
                                    
            
            
                | 16 |  |  |  */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 17 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 18 |  |  | declare(strict_types=1); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 19 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 20 |  |  | namespace Fisharebest\Webtrees\Services; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 21 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 22 |  |  | use Fisharebest\ExtCalendar\ArabicCalendar; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 23 |  |  | use Fisharebest\ExtCalendar\CalendarInterface; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 24 |  |  | use Fisharebest\ExtCalendar\GregorianCalendar; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 25 |  |  | use Fisharebest\ExtCalendar\JewishCalendar; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 26 |  |  | use Fisharebest\ExtCalendar\PersianCalendar; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 27 |  |  | use Fisharebest\Localization\Locale\LocaleInterface; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 28 |  |  | use Fisharebest\Webtrees\I18N; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 29 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 30 |  |  | /** | 
            
                                                                                                            
                            
            
                                    
            
            
                | 31 |  |  |  * Utilities to support localization. | 
            
                                                                                                            
                            
            
                                    
            
            
                | 32 |  |  |  */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 33 |  |  | class LocalizationService | 
            
                                                                                                            
                            
            
                                    
            
            
                | 34 |  |  | { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 35 |  |  |     // Alphabets used by various scripts and locales. | 
            
                                                                                                            
                            
            
                                    
            
            
                | 36 |  |  |     private const ARABIC_ALPHABET     = ['ا', 'ب', 'ت', 'ث', 'ج', 'ح', 'خ', 'د', 'ذ', 'ر', 'ز', 'س', 'ش', 'ص', 'ض', 'ط', 'ظ', 'ع', 'غ', 'ف', 'ق', 'ك', 'ل', 'م', 'ن', 'ه', 'و', 'ي', 'آ', 'ة', 'ى', 'ی']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 37 |  |  |     private const CZECH_ALPHABET      = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'CH', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 38 |  |  |     private const CYRILLIC_ALPHABET   = ['А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 39 |  |  |     private const DUTCH_ALPHABET      = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'IJ']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 40 |  |  |     private const ESTONIAN_ALPHABET   = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Š', 'Z', 'Ž', 'T', 'U', 'V', 'W', 'Õ', 'Ä', 'Ö', 'Ü', 'X', 'Y']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 41 |  |  |     private const GREEK_ALPHABET      = ['Α', 'Β', 'Γ', 'Δ', 'Ε', 'Ζ', 'Η', 'Θ', 'Ι', 'Κ', 'Λ', 'Μ', 'Ν', 'Ξ', 'Ο', 'Π', 'Ρ', 'Σ', 'Τ', 'Υ', 'Φ', 'Χ', 'Ψ', 'Ω']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 42 |  |  |     private const HEBREW_ALPHABET     = ['א', 'ב', 'ג', 'ד', 'ה', 'ו', 'ז', 'ח', 'ט', 'י', 'כ', 'ל', 'מ', 'נ', 'ס', 'ע', 'פ', 'צ', 'ק', 'ר', 'ש', 'ת']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 43 |  |  |     private const LATIN_ALPHABET      = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 44 |  |  |     private const LITHUANIAN_ALPHABET = ['A', 'Ą', 'B', 'C', 'Č', 'D', 'E', 'Ę', 'Ė', 'F', 'G', 'H', 'I', 'Y', 'Į', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'Š', 'T', 'U', 'Ų', 'Ū', 'V', 'Z', 'Ž']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 45 |  |  |     private const HUNGARIAN_ALPHABET  = ['A', 'B', 'C', 'CS', 'D', 'DZ', 'DZS', 'E', 'F', 'G', 'GY', 'H', 'I', 'J', 'K', 'L', 'LY', 'M', 'N', 'NY', 'O', 'Ö', 'P', 'Q', 'R', 'S', 'SZ', 'T', 'TY', 'U', 'Ü', 'V', 'W', 'X', 'Y', 'Z', 'ZS']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 46 |  |  |     private const NORWEGIAN_ALPHABET  = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Æ', 'Ø', 'Å']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 47 |  |  |     private const POLISH_ALPHABET     = ['A', 'B', 'C', 'Ć', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'Ł', 'M', 'N', 'O', 'Ó', 'P', 'Q', 'R', 'S', 'Ś', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ź', 'Ż']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 48 |  |  |     private const ROMANIAN_ALPHABET   = ['A', 'Ă', 'Â', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'Î', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Ş', 'T', 'Ţ', 'U', 'V', 'W', 'X', 'Y', 'Z']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 49 |  |  |     private const SERBIAN_ALPHABET    = ['A', 'B', 'C', 'Č', 'Ć', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Š', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ž']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 50 |  |  |     private const SLOVAKIAN_ALPHABET  = ['A', 'Á', 'Ä', 'B', 'C', 'Č', 'D', 'Ď', 'E', 'É', 'F', 'G', 'H', 'I', 'Í', 'J', 'K', 'L', 'Ľ', 'Ĺ', 'M', 'N', 'Ň', 'O', 'Ó', 'Ô', 'P', 'Q', 'R', 'Ŕ', 'S', 'Š', 'T', 'Ť', 'U', 'Ú', 'V', 'W', 'X', 'Y', 'Ý', 'Z', 'Ž']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 51 |  |  |     private const SLOVENIAN_ALPHABET  = ['A', 'B', 'C', 'Č', 'Ć', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'Š', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Ž']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 52 |  |  |     private const SPANISH_ALPHABET    = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'Ñ', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 53 |  |  |     private const SWEDISH_ALPHABET    = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'Å', 'Ä', 'Ö']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 54 |  |  |     private const TURKISH_ALPHABET    = ['A', 'B', 'C', 'Ç', 'D', 'E', 'F', 'G', 'Ğ', 'H', 'I', 'İ', 'J', 'K', 'L', 'M', 'N', 'O', 'Ö', 'P', 'R', 'S', 'Ş', 'T', 'U', 'Ü', 'V', 'Y', 'Z']; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 55 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 56 |  |  |     // Scripts with a default alphabet. | 
            
                                                                                                            
                            
            
                                    
            
            
                | 57 |  |  |     private const ALPHABETS_FOR_SCRIPT = [ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 58 |  |  |         'Latn' => self::LATIN_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 59 |  |  |         'Cyrl' => self::CYRILLIC_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 60 |  |  |         'Grek' => self::GREEK_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 61 |  |  |         'Hebr' => self::HEBREW_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 62 |  |  |     ]; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 63 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 64 |  |  |     // Locales that use a non-default alphabet. | 
            
                                                                                                            
                            
            
                                    
            
            
                | 65 |  |  |     private const ALPHABETS = [ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 66 |  |  |         'ar'      => self::ARABIC_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 67 |  |  |         'cs'      => self::CZECH_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 68 |  |  |         'da'      => self::NORWEGIAN_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 69 |  |  |         'es'      => self::SPANISH_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 70 |  |  |         'et'      => self::ESTONIAN_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 71 |  |  |         'fi'      => self::SWEDISH_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 72 |  |  |         'hu'      => self::HUNGARIAN_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 73 |  |  |         'lt'      => self::LITHUANIAN_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 74 |  |  |         'nb'      => self::NORWEGIAN_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 75 |  |  |         'nl'      => self::DUTCH_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 76 |  |  |         'nn'      => self::NORWEGIAN_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 77 |  |  |         'pl'      => self::POLISH_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 78 |  |  |         'ro'      => self::ROMANIAN_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 79 |  |  |         'sk'      => self::SLOVAKIAN_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 80 |  |  |         'sl'      => self::SLOVENIAN_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 81 |  |  |         'sr-Latn' => self::SERBIAN_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 82 |  |  |         'tr'      => self::TURKISH_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 83 |  |  |         'sv'      => self::SWEDISH_ALPHABET, | 
            
                                                                                                            
                            
            
                                    
            
            
                | 84 |  |  |     ]; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 85 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 86 |  |  |     // Some language collate names using digraphs (or trigraphs). | 
            
                                                                                                            
                            
            
                                    
            
            
                | 87 |  |  |     private const DIGRAPHS = [ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 88 |  |  |         'cs' => ['CH' => 'CH'], | 
            
                                                                                                            
                            
            
                                    
            
            
                | 89 |  |  |         'da' => ['AA' => 'Å'], | 
            
                                                                                                            
                            
            
                                    
            
            
                | 90 |  |  |         'nb' => ['AA' => 'Å'], | 
            
                                                                                                            
                            
            
                                    
            
            
                | 91 |  |  |         'hu' => ['CS' => 'CS', 'DZS' => 'DZS', 'DZ' => 'DZ', 'GY' => 'GY', 'LY' => 'LY', 'NY' => 'NY', 'SZ' => 'SZ', 'TY' => 'TY', 'ZS' => 'ZS'], | 
            
                                                                                                            
                            
            
                                    
            
            
                | 92 |  |  |         'nl' => ['IJ' => 'IJ'], | 
            
                                                                                                            
                            
            
                                    
            
            
                | 93 |  |  |         'nn' => ['AA' => 'Å'], | 
            
                                                                                                            
                            
            
                                    
            
            
                | 94 |  |  |     ]; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 95 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 96 |  |  |     /** | 
            
                                                                                                            
                            
            
                                    
            
            
                | 97 |  |  |      * Which alphabet is used in a locale? | 
            
                                                                                                            
                            
            
                                    
            
            
                | 98 |  |  |      * | 
            
                                                                                                            
                            
            
                                    
            
            
                | 99 |  |  |      * @param LocaleInterface $locale | 
            
                                                                                                            
                            
            
                                    
            
            
                | 100 |  |  |      * | 
            
                                                                                                            
                            
            
                                    
            
            
                | 101 |  |  |      * @return array | 
            
                                                                                                            
                            
            
                                    
            
            
                | 102 |  |  |      */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 103 |  |  |     public function alphabet(LocaleInterface $locale): array | 
            
                                                                                                            
                            
            
                                    
            
            
                | 104 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 105 |  |  |         $language = $locale->languageTag(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 106 |  |  |         $script   = $locale->script()->code(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 107 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 108 |  |  |         return self::ALPHABETS[$language] ?? self::ALPHABETS_FOR_SCRIPT[$script] ?? self::LATIN_ALPHABET; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 109 |  |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 110 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 111 |  |  |     /** | 
            
                                                                                                            
                            
            
                                    
            
            
                | 112 |  |  |      * Which calendar is used in a locale? | 
            
                                                                                                            
                            
            
                                    
            
            
                | 113 |  |  |      * | 
            
                                                                                                            
                            
            
                                    
            
            
                | 114 |  |  |      * @param LocaleInterface $locale | 
            
                                                                                                            
                            
            
                                    
            
            
                | 115 |  |  |      * | 
            
                                                                                                            
                            
            
                                    
            
            
                | 116 |  |  |      * @return CalendarInterface | 
            
                                                                                                            
                            
            
                                    
            
            
                | 117 |  |  |      */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 118 |  |  |     public function calendar(LocaleInterface $locale): CalendarInterface | 
            
                                                                                                            
                            
            
                                    
            
            
                | 119 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 120 |  |  |         $non_gregorian_calendars = [ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 121 |  |  |             'ar' => new ArabicCalendar(), | 
            
                                                                                                            
                            
            
                                    
            
            
                | 122 |  |  |             'fa' => new PersianCalendar(), | 
            
                                                                                                            
                            
            
                                    
            
            
                | 123 |  |  |             'he' => new JewishCalendar(), | 
            
                                                                                                            
                            
            
                                    
            
            
                | 124 |  |  |             'yi' => new JewishCalendar(), | 
            
                                                                                                            
                            
            
                                    
            
            
                | 125 |  |  |         ]; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 126 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 127 |  |  |         return $non_gregorian_calendars[$locale->languageTag()] ?? new GregorianCalendar(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 128 |  |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 129 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 130 |  |  |     /** | 
            
                                                                                                            
                            
            
                                    
            
            
                | 131 |  |  |      * Which MySQL collation should be used for this locale? | 
            
                                                                                                            
                            
            
                                    
            
            
                | 132 |  |  |      * | 
            
                                                                                                            
                            
            
                                    
            
            
                | 133 |  |  |      * @param LocaleInterface $locale | 
            
                                                                                                            
                            
            
                                    
            
            
                | 134 |  |  |      * | 
            
                                                                                                            
                            
            
                                    
            
            
                | 135 |  |  |      * @return string | 
            
                                                                                                            
                            
            
                                    
            
            
                | 136 |  |  |      */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 137 |  |  |     public function collation(LocaleInterface $locale): string | 
            
                                                                                                            
                            
            
                                    
            
            
                | 138 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 139 |  |  |         $collation = $locale->collation(); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 140 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 141 |  |  |         switch ($collation) { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 142 |  |  |             case 'croatian_ci': | 
            
                                                                                                            
                            
            
                                    
            
            
                | 143 |  |  |             case 'german2_ci': | 
            
                                                                                                            
                            
            
                                    
            
            
                | 144 |  |  |             case 'vietnamese_ci': | 
            
                                                                                                            
                            
            
                                    
            
            
                | 145 |  |  |                 // Only available in MySQL 5.6 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 146 |  |  |                 return 'utf8_unicode_ci'; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 147 |  |  |             default: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 148 |  |  |                 return 'utf8_' . $collation; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 149 |  |  |         } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 150 |  |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 151 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 152 |  |  |     /** | 
            
                                                                                                            
                            
            
                                    
            
            
                | 153 |  |  |      * Extract the initial letter (or digraph or trigraph) from a name. | 
            
                                                                                                            
                            
            
                                    
            
            
                | 154 |  |  |      * | 
            
                                                                                                            
                            
            
                                    
            
            
                | 155 |  |  |      * @param string          $text | 
            
                                                                                                            
                            
            
                                    
            
            
                | 156 |  |  |      * @param LocaleInterface $locale | 
            
                                                                                                            
                            
            
                                    
            
            
                | 157 |  |  |      * | 
            
                                                                                                            
                            
            
                                    
            
            
                | 158 |  |  |      * @return string | 
            
                                                                                                            
                            
            
                                    
            
            
                | 159 |  |  |      */ | 
            
                                                                                                            
                            
            
                                    
            
            
                | 160 |  |  |     public function initialLetter(string $text, LocaleInterface $locale): string | 
            
                                                                                                            
                            
            
                                    
            
            
                | 161 |  |  |     { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 162 |  |  |         $text = I18N::strtoupper($text); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 163 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 164 |  |  |         $digraphs = self::DIGRAPHS[$locale->languageTag()] ?? []; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 165 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 166 |  |  |         foreach ($digraphs as $key => $value) { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 167 |  |  |             if (substr_compare($text, $key, 0, strlen($key)) === 0) { | 
            
                                                                                                            
                            
            
                                    
            
            
                | 168 |  |  |                 return $value; | 
            
                                                                                                            
                            
            
                                    
            
            
                | 169 |  |  |             } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 170 |  |  |         } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 171 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 172 |  |  |         // No special rules - just take the first character | 
            
                                                                                                            
                            
            
                                    
            
            
                | 173 |  |  |         return mb_substr($text, 0, 1); | 
            
                                                                                                            
                            
            
                                    
            
            
                | 174 |  |  |     } | 
            
                                                                                                            
                            
            
                                    
            
            
                | 175 |  |  | } | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 176 |  |  |  |