app/I18N.php
public static function textScript($string): string
    {
        $string = strip_tags($string); // otherwise HTML tags show up as latin
        $string = html_entity_decode($string, ENT_QUOTES, 'UTF-8'); // otherwise HTML entities show up as latin
        $string = str_replace([
            '@N.N.',
            '@P.N.',
        ], '', $string); // otherwise unknown names show up as latin
        $pos    = 0;
        $strlen = strlen($string);
        while ($pos < $strlen) {
            // get the Unicode Code Point for the character at position $pos
            $byte1 = ord($string[$pos]);
            if ($byte1 < 0x80) {
                $code_point = $byte1;
                $chrlen     = 1;
            } elseif ($byte1 < 0xC0) {
                // Invalid continuation character
                return 'Latn';
            } elseif ($byte1 < 0xE0) {
                $code_point = (($byte1 & 0x1F) << 6) + (ord($string[$pos + 1]) & 0x3F);
                $chrlen     = 2;
            } elseif ($byte1 < 0xF0) {
                $code_point = (($byte1 & 0x0F) << 12) + ((ord($string[$pos + 1]) & 0x3F) << 6) + (ord($string[$pos + 2]) & 0x3F);
                $chrlen     = 3;
            } elseif ($byte1 < 0xF8) {
                $code_point = (($byte1 & 0x07) << 24) + ((ord($string[$pos + 1]) & 0x3F) << 12) + ((ord($string[$pos + 2]) & 0x3F) << 6) + (ord($string[$pos + 3]) & 0x3F);
                $chrlen     = 3;
            } else {
                // Invalid UTF
                return 'Latn';
            }

            foreach (self::SCRIPT_CHARACTER_RANGES as $range) {
                if ($code_point >= $range[1] && $code_point <= $range[2]) {
                    return $range[0];
                }
            }
            // Not a recognised script. Maybe punctuation, spacing, etc. Keep looking.
            $pos += $chrlen;
        }

        return 'Latn';
    }
public static function textScript($string): string
    {
        $string = strip_tags($string); // otherwise HTML tags show up as latin
        $string = html_entity_decode($string, ENT_QUOTES, 'UTF-8'); // otherwise HTML entities show up as latin
        $string = str_replace([
            '@N.N.',
            '@P.N.',
        ], '', $string); // otherwise unknown names show up as latin
        $pos    = 0;
        $strlen = strlen($string);
        while ($pos < $strlen) {
            // get the Unicode Code Point for the character at position $pos
            $byte1 = ord($string[$pos]);
            if ($byte1 < 0x80) {
                $code_point = $byte1;
                $chrlen     = 1;
            } elseif ($byte1 < 0xC0) {
                // Invalid continuation character
                return 'Latn';
            } elseif ($byte1 < 0xE0) {
                $code_point = (($byte1 & 0x1F) << 6) + (ord($string[$pos + 1]) & 0x3F);
                $chrlen     = 2;
            } elseif ($byte1 < 0xF0) {
                $code_point = (($byte1 & 0x0F) << 12) + ((ord($string[$pos + 1]) & 0x3F) << 6) + (ord($string[$pos + 2]) & 0x3F);
                $chrlen     = 3;
            } elseif ($byte1 < 0xF8) {
                $code_point = (($byte1 & 0x07) << 24) + ((ord($string[$pos + 1]) & 0x3F) << 12) + ((ord($string[$pos + 2]) & 0x3F) << 6) + (ord($string[$pos + 3]) & 0x3F);
                $chrlen     = 3;
            } else {
                // Invalid UTF
                return 'Latn';
            }

            foreach (self::SCRIPT_CHARACTER_RANGES as $range) {
                if ($code_point >= $range[1] && $code_point <= $range[2]) {
                    return $range[0];
                }
            }
            // Not a recognised script. Maybe punctuation, spacing, etc. Keep looking.
            $pos += $chrlen;
        }

        return 'Latn';
    }
public static function textScript ( $ string ) : string { $ string = strip_tags ( $ string ) ; // otherwise HTML tags show up as latin $ string = html_entity_decode ( $ string , ENT_QUOTES , 'UTF-8' ) ; // otherwise HTML entities show up as latin $ string = str_replace ( [ '@N.N.' , '@P.N.' , ] , '' , $ string ) ; // otherwise unknown names show up as latin $ pos = 0 ; $ strlen = strlen ( $ string ) ; while ( $ pos < $ strlen ) { // get the Unicode Code Point for the character at position $pos $ byte1 = ord ( $ string [ $ pos ] ) ; if ( $ byte1 < 0x80 ) { $ code_point = $ byte1 ; $ chrlen = 1 ; } elseif ( $ byte1 < 0xC0 ) { // Invalid continuation character return 'Latn' ; } elseif ( $ byte1 < 0xE0 ) { $ code_point = ( ( $ byte1 & 0x1F ) << 6 ) + ( ord ( $ string [ $ pos + 1 ] ) & 0x3F ) ; $ chrlen = 2 ; } elseif ( $ byte1 < 0xF0 ) { $ code_point = ( ( $ byte1 & 0x0F ) << 12 ) + ( ( ord ( $ string [ $ pos + 1 ] ) & 0x3F ) << 6 ) + ( ord ( $ string [ $ pos + 2 ] ) & 0x3F ) ; $ chrlen = 3 ; } elseif ( $ byte1 < 0xF8 ) { $ code_point = ( ( $ byte1 & 0x07 ) << 24 ) + ( ( ord ( $ string [ $ pos + 1 ] ) & 0x3F ) << 12 ) + ( ( ord ( $ string [ $ pos + 2 ] ) & 0x3F ) << 6 ) + ( ord ( $ string [ $ pos + 3 ] ) & 0x3F ) ; $ chrlen = 3 ; } else { // Invalid UTF return 'Latn' ; } foreach ( self :: SCRIPT_CHARACTER_RANGES as $ range ) { if ( $ code_point >= $ range [ 1 ] && $ code_point <= $ range [ 2 ] ) { return $ range [ 0 ] ; } } // Not a recognised script. Maybe punctuation, spacing, etc. Keep looking. $ pos += $ chrlen ; } return 'Latn' ; }
Identify the script used for a piece of text

@param string $string

@return string
Identify the script used for a piece of text