diff --git a/lib/internal/Magento/Framework/Filter/Test/Unit/TranslitTest.php b/lib/internal/Magento/Framework/Filter/Test/Unit/TranslitTest.php index 58238dbc7de57..131caab12d03d 100644 --- a/lib/internal/Magento/Framework/Filter/Test/Unit/TranslitTest.php +++ b/lib/internal/Magento/Framework/Filter/Test/Unit/TranslitTest.php @@ -19,6 +19,211 @@ class TranslitTest extends TestCase */ protected $model; + /** + * @var string[] + */ + protected $automatedConversions = [ + 'À' => 'a', + 'Á' => 'a', + 'Â' => 'a', + 'Ä' => 'a', + 'Å' => 'a', + 'Ç' => 'c', + 'È' => 'e', + 'É' => 'e', + 'Ë' => 'e', + 'Ì' => 'i', + 'Í' => 'i', + 'Î' => 'i', + 'Ï' => 'i', + 'Ò' => 'o', + 'Ó' => 'o', + 'Ô' => 'o', + 'Õ' => 'o', + 'Ö' => 'o', + 'Ù' => 'u', + 'Ú' => 'u', + 'Û' => 'u', + 'Ü' => 'u', + 'Ý' => 'y', + 'à' => 'a', + 'á' => 'a', + 'â' => 'a', + 'ä' => 'a', + 'å' => 'a', + 'ç' => 'c', + 'è' => 'e', + 'é' => 'e', + 'ê' => 'e', + 'ë' => 'e', + 'ì' => 'i', + 'í' => 'i', + 'î' => 'i', + 'ï' => 'i', + 'ò' => 'o', + 'ó' => 'o', + 'ô' => 'o', + 'õ' => 'o', + 'ö' => 'o', + 'ù' => 'u', + 'ú' => 'u', + 'û' => 'u', + 'ü' => 'u', + 'ý' => 'y', + 'ÿ' => 'y', + 'Ā' => 'a', + 'ā' => 'a', + 'Ă' => 'a', + 'ă' => 'a', + 'Ą' => 'a', + 'ą' => 'a', + 'Ć' => 'c', + 'ć' => 'c', + 'Ĉ' => 'c', + 'ĉ' => 'c', + 'Ċ' => 'c', + 'ċ' => 'c', + 'Č' => 'c', + 'č' => 'c', + 'Ď' => 'd', + 'ď' => 'd', + 'Ē' => 'e', + 'ē' => 'e', + 'Ĕ' => 'e', + 'ĕ' => 'e', + 'Ė' => 'e', + 'ė' => 'e', + 'Ę' => 'e', + 'ę' => 'e', + 'Ě' => 'e', + 'ě' => 'e', + 'Ĝ' => 'g', + 'ĝ' => 'g', + 'Ğ' => 'g', + 'ğ' => 'g', + 'Ġ' => 'g', + 'ġ' => 'g', + 'Ģ' => 'g', + 'ģ' => 'g', + 'Ĥ' => 'h', + 'ĥ' => 'h', + 'Ĩ' => 'i', + 'ĩ' => 'i', + 'Ī' => 'i', + 'ī' => 'i', + 'Ĭ' => 'i', + 'ĭ' => 'i', + 'Į' => 'i', + 'į' => 'i', + 'İ' => 'i', + 'Ĵ' => 'j', + 'ĵ' => 'j', + 'Ķ' => 'k', + 'ķ' => 'k', + 'Ĺ' => 'l', + 'ĺ' => 'l', + 'Ļ' => 'l', + 'ļ' => 'l', + 'Ľ' => 'l', + 'ľ' => 'l', + 'Ń' => 'n', + 'ń' => 'n', + 'Ņ' => 'n', + 'ņ' => 'n', + 'Ň' => 'n', + 'ň' => 'n', + 'Ō' => 'o', + 'ō' => 'o', + 'Ŏ' => 'o', + 'ŏ' => 'o', + 'Ő' => 'o', + 'ő' => 'o', + 'Ŕ' => 'r', + 'ŕ' => 'r', + 'Ŗ' => 'r', + 'ŗ' => 'r', + 'Ř' => 'r', + 'ř' => 'r', + 'Ś' => 's', + 'ś' => 's', + 'Ŝ' => 's', + 'ŝ' => 's', + 'Ş' => 's', + 'ş' => 's', + 'Š' => 's', + 'š' => 's', + 'Ţ' => 't', + 'ţ' => 't', + 'Ť' => 't', + 'ť' => 't', + 'Ũ' => 'u', + 'ũ' => 'u', + 'Ū' => 'u', + 'ū' => 'u', + 'Ŭ' => 'u', + 'ŭ' => 'u', + 'Ů' => 'u', + 'ů' => 'u', + 'Ű' => 'u', + 'ű' => 'u', + 'Ų' => 'u', + 'ų' => 'u', + 'Ŵ' => 'w', + 'ŵ' => 'w', + 'Ŷ' => 'y', + 'ŷ' => 'y', + 'Ÿ' => 'y', + 'Ź' => 'z', + 'ź' => 'z', + 'Ż' => 'z', + 'ż' => 'z', + 'Ž' => 'z', + 'ž' => 'z', + 'Ơ' => 'o', + 'ơ' => 'o', + 'Ư' => 'u', + 'ư' => 'u', + 'Ǎ' => 'a', + 'ǎ' => 'a', + 'Ǐ' => 'i', + 'ǐ' => 'i', + 'Ǒ' => 'o', + 'ǒ' => 'o', + 'Ǔ' => 'u', + 'ǔ' => 'u', + 'Ǖ' => 'u', + 'ǖ' => 'u', + 'Ǘ' => 'u', + 'ǘ' => 'u', + 'Ǚ' => 'u', + 'ǚ' => 'u', + 'Ǜ' => 'u', + 'ǜ' => 'u', + 'Ǻ' => 'a', + 'ǻ' => 'a', + 'Ǽ' => 'ae', + 'ǽ' => 'ae', + 'Ǿ' => 'o', + 'ǿ' => 'o', + 'Ї' => 'i', + 'ї' => 'i', + 'ά' => 'a', + 'Ά' => 'a', + 'έ' => 'e', + 'Έ' => 'e', + 'ή' => 'i', + 'ί' => 'i', + 'ϊ' => 'i', + 'ΐ' => 'i', + 'Ί' => 'i', + 'ό' => 'o', + 'Ό' => 'o', + 'ύ' => 'u', + 'Ύ' => 'y', + 'ώ' => 'o', + 'Ώ' => 'o', + ]; + protected function setUp(): void { $objectManager = new ObjectManager($this); @@ -47,7 +252,8 @@ public function testFilter($testString, $result, $resultIconv, $isIconv) public function filterDataProvider() { $isIconv = '"libiconv"' == ICONV_IMPL; - return [ + + $data = [ ['test', 'test', 'test', $isIconv], ['привет мир', 'privet mir', 'privet mir', $isIconv], [ @@ -56,6 +262,12 @@ public function filterDataProvider() 'Weiss, Goldmann, Gobel, Weiss, Gothe, Goethe und Gotz', $isIconv ], + [ + 'Brasília, português, Hà Nội, tiếng Việt, Москва, русский язык', + 'Brasilia, portugues, Ha Noi, tieng Viet, moskva, russkij jazyk', + 'Brasilia, portugues, Ha Noi, tieng Viet, moskva, russkij jazyk', + $isIconv + ], [ '❤ ☀ ☆ ☂ ☻ ♞ ☯ ☭ ☢ € → ☎ ❄ ♫ ✂ ▷ ✇ ♎ ⇧ ☮', '❤ ☀ ☆ ☂ ☻ ♞ ☯ ☭ ☢ € → ☎ ❄ ♫ ✂ ▷ ✇ ♎ ⇧ ☮', @@ -65,6 +277,12 @@ public function filterDataProvider() ['™', 'tm', 'tm', $isIconv], ['লক্ষ্য এনালগ ওয়াচ টি ২০', 'laksoa enaalaga oyaoaca tai 20', 'laksoa enaalaga oyaoaca tai 20', $isIconv] ]; + + foreach ($this->automatedConversions as $from => $to) { + $data[] = [ $from, $to, $to, $isIconv ]; + } + + return $data; } public function testFilterConfigured() diff --git a/lib/internal/Magento/Framework/Filter/Translit.php b/lib/internal/Magento/Framework/Filter/Translit.php index 38ec05d1ee9ba..1b706581a6d72 100644 --- a/lib/internal/Magento/Framework/Filter/Translit.php +++ b/lib/internal/Magento/Framework/Filter/Translit.php @@ -13,230 +13,159 @@ class Translit implements \Zend_Filter_Interface { /** - * Symbol convert table + * A conversion table for symbols that should be replaced before Unicode "marks" are removed from + * transliterated strings. * - * @var array + * @var string[] */ protected $convertTable = [ + 'Ё' => 'jo', + 'Й' => 'j', + 'й' => 'j', + 'ё' => 'jo', + 'অ' => 'a', + 'আ' => 'aa', + 'ই' => 'i', + 'ঈ' => 'ii', + 'উ' => 'u', + 'ঊ' => 'uu', + 'ঋ' => 'r', + 'ৠ' => 'ri', + 'এ' => 'e', + 'ঐ' => 'ai', + 'ও' => 'o', + 'ঔ' => 'ou', + 'ক' => 'ka', + 'খ' => 'kha', + 'গ' => 'ga', + 'ঘ' => 'gha', + 'ঙ' => 'na', + 'চ' => 'ca', + 'ছ' => 'cha', + 'জ' => 'ja', + 'ঝ' => 'jha', + 'ঞ' => 'na', + 'ট' => 'ta', + 'ঠ' => 'tha', + 'ড' => 'da', + 'ড়' => 'ra', + 'ঢ' => 'dha', + 'ঢ়' => 'rha', + 'ণ' => 'na', + 'ত' => 'ta', + 'ৎ' => 't', + 'থ' => 'tha', + 'দ' => 'da', + 'ধ' => 'dha', + 'ন' => 'na', + 'প' => 'pa', + 'ফ' => 'pha', + 'ব' => 'ba', + 'ভ' => 'bha', + 'ম' => 'ma', + 'য' => 'ya', + 'য়' => 'ya', + 'র' => 'ra', + 'ল' => 'la', + 'শ' => 'sa', + 'ষ' => 'sha', + 'স' => 'sa', + 'হ' => 'ha', + '০' => '0', + '১' => '1', + '২' => '2', + '৩' => '3', + '৪' => '4', + '৫' => '5', + '৬' => '6', + '৭' => '7', + '৮' => '8', + '৯' => '9', + 'ক্ষ' => 'kso', + 'ষ্ণ' => 'sno', + 'জ্ঞ' => 'jno', + 'ঞ্জ' => 'nchho', + 'হ্ম' => 'hmo', + 'ঞ্চ' => 'ncho', + 'ঙ্ক' => 'ngko', + 'ট্ট' => 'tto', + 'ক্ষ্ম' => 'ksmo', + 'হ্ন' => 'hno', + 'হ্ণ' => 'hno', + 'ক্র' => 'kro', + 'গ্ধ' => 'gdho', + 'ত্র' => 'tro', + 'ক্ত' => 'kto', + 'ক্স' => 'kso', + 'ত্ত' => 'tto', + 'ত্ম' => 'tmo', + 'ক্ক' => 'kko', + 'ক্ম' => 'kmo', + 'ক্ল' => 'klo', + 'া' => 'a', + 'ি' => 'i', + 'ী' => 'ee', + 'ু' => 'o', + 'ূ' => 'u', + 'ৃ' => 'ri', + 'ৄ' => 'rii', + 'ে' => 'a', + 'ৈ' => 'ai', + 'ো' => 'o', + 'ৌ' => 'ow', + '্য' => 'a', + '্র' => 'r', + 'ঁ' => 'n', + 'ঃ' => 'oh', + '়' => 'o', + '্' => 'h', + 'ং' => 'ng', + 'ৢ' => 'n', + 'ৣ' => 'nn', + ]; + + /** + * A conversion table for symbols that should be replaced after Unicode "marks" are removed from + * transliterated strings. + * + * @var string[] + */ + protected $normalizedConvertTable = [ '&' => 'and', '@' => 'at', '©' => 'c', '®' => 'r', - 'À' => 'a', - 'Á' => 'a', - 'Â' => 'a', - 'Ä' => 'a', - 'Å' => 'a', 'Æ' => 'ae', - 'Ç' => 'c', - 'È' => 'e', - 'É' => 'e', - 'Ë' => 'e', - 'Ì' => 'i', - 'Í' => 'i', - 'Î' => 'i', - 'Ï' => 'i', - 'Ò' => 'o', - 'Ó' => 'o', - 'Ô' => 'o', - 'Õ' => 'o', - 'Ö' => 'o', 'Ø' => 'o', - 'Ù' => 'u', - 'Ú' => 'u', - 'Û' => 'u', - 'Ü' => 'u', - 'Ý' => 'y', 'ß' => 'ss', - 'à' => 'a', - 'á' => 'a', - 'â' => 'a', - 'ä' => 'a', - 'å' => 'a', 'æ' => 'ae', - 'ç' => 'c', - 'è' => 'e', - 'é' => 'e', - 'ê' => 'e', - 'ë' => 'e', - 'ì' => 'i', - 'í' => 'i', - 'î' => 'i', - 'ï' => 'i', - 'ò' => 'o', - 'ó' => 'o', - 'ô' => 'o', - 'õ' => 'o', - 'ö' => 'o', 'ø' => 'o', - 'ù' => 'u', - 'ú' => 'u', - 'û' => 'u', - 'ü' => 'u', - 'ý' => 'y', 'þ' => 'p', - 'ÿ' => 'y', - 'Ā' => 'a', - 'ā' => 'a', - 'Ă' => 'a', - 'ă' => 'a', - 'Ą' => 'a', - 'ą' => 'a', - 'Ć' => 'c', - 'ć' => 'c', - 'Ĉ' => 'c', - 'ĉ' => 'c', - 'Ċ' => 'c', - 'ċ' => 'c', - 'Č' => 'c', - 'č' => 'c', - 'Ď' => 'd', - 'ď' => 'd', 'Đ' => 'd', 'đ' => 'd', - 'Ē' => 'e', - 'ē' => 'e', - 'Ĕ' => 'e', - 'ĕ' => 'e', - 'Ė' => 'e', - 'ė' => 'e', - 'Ę' => 'e', - 'ę' => 'e', - 'Ě' => 'e', - 'ě' => 'e', - 'Ĝ' => 'g', - 'ĝ' => 'g', - 'Ğ' => 'g', - 'ğ' => 'g', - 'Ġ' => 'g', - 'ġ' => 'g', - 'Ģ' => 'g', - 'ģ' => 'g', - 'Ĥ' => 'h', - 'ĥ' => 'h', 'Ħ' => 'h', 'ħ' => 'h', - 'Ĩ' => 'i', - 'ĩ' => 'i', - 'Ī' => 'i', - 'ī' => 'i', - 'Ĭ' => 'i', - 'ĭ' => 'i', - 'Į' => 'i', - 'į' => 'i', - 'İ' => 'i', 'ı' => 'i', 'IJ' => 'ij', 'ij' => 'ij', - 'Ĵ' => 'j', - 'ĵ' => 'j', - 'Ķ' => 'k', - 'ķ' => 'k', 'ĸ' => 'k', - 'Ĺ' => 'l', - 'ĺ' => 'l', - 'Ļ' => 'l', - 'ļ' => 'l', - 'Ľ' => 'l', - 'ľ' => 'l', 'Ŀ' => 'l', 'ŀ' => 'l', 'Ł' => 'l', 'ł' => 'l', - 'Ń' => 'n', - 'ń' => 'n', - 'Ņ' => 'n', - 'ņ' => 'n', - 'Ň' => 'n', - 'ň' => 'n', 'ʼn' => 'n', 'Ŋ' => 'n', 'ŋ' => 'n', - 'Ō' => 'o', - 'ō' => 'o', - 'Ŏ' => 'o', - 'ŏ' => 'o', - 'Ő' => 'o', - 'ő' => 'o', 'Œ' => 'oe', 'œ' => 'oe', - 'Ŕ' => 'r', - 'ŕ' => 'r', - 'Ŗ' => 'r', - 'ŗ' => 'r', - 'Ř' => 'r', - 'ř' => 'r', - 'Ś' => 's', - 'ś' => 's', - 'Ŝ' => 's', - 'ŝ' => 's', - 'Ş' => 's', - 'ş' => 's', - 'Š' => 's', - 'š' => 's', - 'Ţ' => 't', - 'ţ' => 't', - 'Ť' => 't', - 'ť' => 't', 'Ŧ' => 't', 'ŧ' => 't', - 'Ũ' => 'u', - 'ũ' => 'u', - 'Ū' => 'u', - 'ū' => 'u', - 'Ŭ' => 'u', - 'ŭ' => 'u', - 'Ů' => 'u', - 'ů' => 'u', - 'Ű' => 'u', - 'ű' => 'u', - 'Ų' => 'u', - 'ų' => 'u', - 'Ŵ' => 'w', - 'ŵ' => 'w', - 'Ŷ' => 'y', - 'ŷ' => 'y', - 'Ÿ' => 'y', - 'Ź' => 'z', - 'ź' => 'z', - 'Ż' => 'z', - 'ż' => 'z', - 'Ž' => 'z', - 'ž' => 'z', 'ſ' => 'z', 'Ə' => 'e', 'ƒ' => 'f', - 'Ơ' => 'o', - 'ơ' => 'o', - 'Ư' => 'u', - 'ư' => 'u', - 'Ǎ' => 'a', - 'ǎ' => 'a', - 'Ǐ' => 'i', - 'ǐ' => 'i', - 'Ǒ' => 'o', - 'ǒ' => 'o', - 'Ǔ' => 'u', - 'ǔ' => 'u', - 'Ǖ' => 'u', - 'ǖ' => 'u', - 'Ǘ' => 'u', - 'ǘ' => 'u', - 'Ǚ' => 'u', - 'ǚ' => 'u', - 'Ǜ' => 'u', - 'ǜ' => 'u', - 'Ǻ' => 'a', - 'ǻ' => 'a', - 'Ǽ' => 'ae', - 'ǽ' => 'ae', - 'Ǿ' => 'o', - 'ǿ' => 'o', 'ə' => 'e', - 'Ё' => 'jo', 'Є' => 'e', 'І' => 'i', - 'Ї' => 'i', 'А' => 'a', 'Б' => 'b', 'В' => 'v', @@ -246,7 +175,6 @@ class Translit implements \Zend_Filter_Interface 'Ж' => 'zh', 'З' => 'z', 'И' => 'i', - 'Й' => 'j', 'К' => 'k', 'Л' => 'l', 'М' => 'm', @@ -278,7 +206,6 @@ class Translit implements \Zend_Filter_Interface 'ж' => 'zh', 'з' => 'z', 'и' => 'i', - 'й' => 'j', 'к' => 'k', 'л' => 'l', 'м' => 'm', @@ -301,10 +228,8 @@ class Translit implements \Zend_Filter_Interface 'э' => 'je', 'ю' => 'ju', 'я' => 'ja', - 'ё' => 'jo', 'є' => 'e', 'і' => 'i', - 'ї' => 'i', 'Ґ' => 'g', 'ґ' => 'g', 'א' => 'a', @@ -336,8 +261,6 @@ class Translit implements \Zend_Filter_Interface 'ת' => 't', '™' => 'tm', 'α' => 'a', - 'ά' => 'a', - 'Ά' => 'a', 'Α' => 'a', 'β' => 'b', 'Β' => 'b', @@ -346,22 +269,15 @@ class Translit implements \Zend_Filter_Interface 'δ' => 'd', 'Δ' => 'd', 'ε' => 'e', - 'έ' => 'e', 'Ε' => 'e', - 'Έ' => 'e', 'ζ' => 'z', 'Ζ' => 'z', 'η' => 'i', - 'ή' => 'i', 'Η' => 'i', 'θ' => 'th', 'Θ' => 'th', 'ι' => 'i', - 'ί' => 'i', - 'ϊ' => 'i', - 'ΐ' => 'i', 'Ι' => 'i', - 'Ί' => 'i', 'κ' => 'k', 'Κ' => 'k', 'λ' => 'l', @@ -373,9 +289,7 @@ class Translit implements \Zend_Filter_Interface 'ξ' => 'x', 'Ξ' => 'x', 'ο' => 'o', - 'ό' => 'o', 'Ο' => 'o', - 'Ό' => 'o', 'π' => 'p', 'Π' => 'p', 'ρ' => 'r', @@ -386,9 +300,7 @@ class Translit implements \Zend_Filter_Interface 'τ' => 't', 'Τ' => 't', 'υ' => 'u', - 'ύ' => 'u', 'Υ' => 'y', - 'Ύ' => 'y', 'φ' => 'f', 'Φ' => 'f', 'χ' => 'ch', @@ -396,108 +308,7 @@ class Translit implements \Zend_Filter_Interface 'ψ' => 'ps', 'Ψ' => 'ps', 'ω' => 'o', - 'ώ' => 'o', 'Ω' => 'o', - 'Ώ' => 'o', - 'অ' => 'a', - 'আ' => 'aa', - 'ই' => 'i', - 'ঈ' => 'ii', - 'উ' => 'u', - 'ঊ' => 'uu', - 'ঋ' => 'r', - 'ৠ' => 'ri', - 'এ' => 'e', - 'ঐ' => 'ai', - 'ও' => 'o', - 'ঔ' => 'ou', - 'ক' => 'ka', - 'খ' => 'kha', - 'গ' => 'ga', - 'ঘ' => 'gha', - 'ঙ' => 'na', - 'চ' => 'ca', - 'ছ' => 'cha', - 'জ' => 'ja', - 'ঝ' => 'jha', - 'ঞ' => 'na', - 'ট' => 'ta', - 'ঠ' => 'tha', - 'ড' => 'da', - 'ড়' => 'ra', - 'ঢ' => 'dha', - 'ঢ়' => 'rha', - 'ণ' => 'na', - 'ত' => 'ta', - 'ৎ' => 't', - 'থ' => 'tha', - 'দ' => 'da', - 'ধ' => 'dha', - 'ন' => 'na', - 'প' => 'pa', - 'ফ' => 'pha', - 'ব' => 'ba', - 'ভ' => 'bha', - 'ম' => 'ma', - 'য' => 'ya', - 'য়' => 'ya', - 'র' => 'ra', - 'ল' => 'la', - 'শ' => 'sa', - 'ষ' => 'sha', - 'স' => 'sa', - 'হ' => 'ha', - '০' => '0', - '১' => '1', - '২' => '2', - '৩' => '3', - '৪' => '4', - '৫' => '5', - '৬' => '6', - '৭' => '7', - '৮' => '8', - '৯' => '9', - 'ক্ষ' => 'kso', - 'ষ্ণ' => 'sno', - 'জ্ঞ' => 'jno', - 'ঞ্জ' => 'nchho', - 'হ্ম' => 'hmo', - 'ঞ্চ' => 'ncho', - 'ঙ্ক' => 'ngko', - 'ট্ট' => 'tto', - 'ক্ষ্ম' => 'ksmo', - 'হ্ন' => 'hno', - 'হ্ণ' => 'hno', - 'ক্র' => 'kro', - 'গ্ধ' => 'gdho', - 'ত্র' => 'tro', - 'ক্ত' => 'kto', - 'ক্স' => 'kso', - 'ত্ত' => 'tto', - 'ত্ম' => 'tmo', - 'ক্ক' => 'kko', - 'ক্ম' => 'kmo', - 'ক্ল' => 'klo', - 'া' => 'a', - 'ি' => 'i', - 'ী' => 'ee', - 'ু' => 'o', - 'ূ' => 'u', - 'ৃ' => 'ri', - 'ৄ' => 'rii', - 'ে' => 'a', - 'ৈ' => 'ai', - 'ো' => 'o', - 'ৌ' => 'ow', - '্য' => 'a', - '্র' => 'r', - 'ঁ' => 'n', - 'ঃ' => 'oh', - '়' => 'o', - '্' => 'h', - 'ং' => 'ng', - 'ৢ' => 'n', - 'ৣ' => 'nn' ]; /** @@ -514,15 +325,29 @@ public function __construct(\Magento\Framework\App\Config\ScopeConfigInterface $ } /** - * Get chars convertation table + * Returns a conversion table for symbols that should be replaced before Unicode "marks" are removed from + * transliterated strings. * - * @return array + * This includes conversions from the system configuration. + * + * @return string[] */ protected function getConvertTable() { return $this->convertTable; } + /** + * Returns a conversion table for symbols that should be replaced after Unicode "marks" are removed from + * transliterated strings. + * + * @return string[] + */ + protected function getNormalizedConvertTable() + { + return $this->normalizedConvertTable; + } + /** * Filter value * @@ -531,7 +356,33 @@ protected function getConvertTable() */ public function filter($string) { - $string = strtr($string, $this->getConvertTable()); + $string = \Normalizer::normalize( + strtr($string, $this->getConvertTable()), + \Normalizer::FORM_D + ); + + $convertTable = $this->getNormalizedConvertTable(); + + $string = preg_replace_callback( + '/(([a-z])|.)\p{M}+/iu', + function ($matches) use ($convertTable) { + if (isset($matches[2])) { + // Preserve the original behavior of lowercasing accented uppercase characters. + return strtolower($matches[2]); + } elseif (isset($convertTable[$matches[1]])) { + return $convertTable[$matches[1]]; + } + + return $matches[0]; + }, + $string + ); + + $string = strtr( + \Normalizer::normalize($string, \Normalizer::FORM_C), + $convertTable + ); + return '"libiconv"' == ICONV_IMPL ? iconv( \Magento\Framework\Stdlib\StringUtils::ICONV_CHARSET, 'ascii//ignore//translit',