function PhpTransliteration::transliterate

Same name and namespace in other branches
  1. 9 core/lib/Drupal/Component/Transliteration/PhpTransliteration.php \Drupal\Component\Transliteration\PhpTransliteration::transliterate()
  2. 8.9.x core/lib/Drupal/Component/Transliteration/PhpTransliteration.php \Drupal\Component\Transliteration\PhpTransliteration::transliterate()
  3. 10 core/lib/Drupal/Component/Transliteration/PhpTransliteration.php \Drupal\Component\Transliteration\PhpTransliteration::transliterate()

Overrides TransliterationInterface::transliterate

File

core/lib/Drupal/Component/Transliteration/PhpTransliteration.php, line 127

Class

PhpTransliteration
Implements transliteration without using the PECL extensions.

Namespace

Drupal\Component\Transliteration

Code

public function transliterate($string, $langcode = 'en', $unknown_character = '?', $max_length = NULL) {
    $result = '';
    $length = 0;
    $hash = FALSE;
    // Replace question marks with a unique hash if necessary. This because
    // mb_convert_encoding() replaces all invalid characters with a question
    // mark.
    if ($unknown_character != '?' && str_contains($string, '?')) {
        $hash = hash('sha256', $string);
        $string = str_replace('?', $hash, $string);
    }
    // Ensure the string is valid UTF8 for preg_split(). Unknown characters will
    // be replaced by a question mark.
    $string = mb_convert_encoding($string, 'UTF-8', 'UTF-8');
    // Use the provided unknown character instead of a question mark.
    if ($unknown_character != '?') {
        $string = str_replace('?', $unknown_character, $string);
        // Restore original question marks if necessary.
        if ($hash !== FALSE) {
            $string = str_replace($hash, '?', $string);
        }
    }
    // Split into Unicode characters and transliterate each one.
    foreach (preg_split('//u', $string, 0, PREG_SPLIT_NO_EMPTY) as $character) {
        $code = self::ordUTF8($character);
        if ($code == -1) {
            $to_add = $unknown_character;
        }
        else {
            $to_add = $this->replace($code, $langcode, $unknown_character);
        }
        // Check if this exceeds the maximum allowed length.
        if (isset($max_length)) {
            $length += strlen($to_add);
            if ($length > $max_length) {
                // There is no more space.
                return $result;
            }
        }
        $result .= $to_add;
    }
    return $result;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.