public function phonetic_sentence($input, $useStopWords = true, $skipShortWords = 2, $key = null)
  {
    // init
    $words = array();
    static $STOP_WORDS_CACHE = array();

    if ($skipShortWords === false) {
      $skipShortWords = null;
    }

    if (\is_array($input) === true) {
      foreach ($input as $inputKey => $inputString) {
        $words[$inputKey] = UTF8::str_to_words($inputString, '', true, $skipShortWords);
      }
    } else {
      $words = UTF8::str_to_words($input, '', true, $skipShortWords);
    }

    if (
        $useStopWords === true
        &&
        !isset($STOP_WORDS_CACHE[$this->language])
    ) {
      try {
        $STOP_WORDS_CACHE[$this->language] = $this->stopWords->getStopWordsFromLanguage($this->language);
      } catch (StopWordsLanguageNotExists $e) {
        $STOP_WORDS_CACHE[$this->language] = array();
      }
    }

    $return = array();
    foreach ($words as $wordKey => $word) {

      if (\is_array($word) === true) {
        foreach ($word as $wordInner) {
          $return = \array_replace_recursive(
              $return,
              $this->phonetic_sentence($wordInner, $useStopWords, $skipShortWords, $key !== null ? $key : $wordKey)
          );
        }

        continue;
      }

      if (
          $useStopWords === true
          &&
          \in_array($word, $STOP_WORDS_CACHE[$this->language], true)
      ) {
        continue;
      }

      $code = $this->phonetic->phonetic_word($word);
      if ($code !== '') {
        if ($key !== null) {
          $return[$key][$word] = $code;
        } else {
          $return[$word] = $code;
        }
      }
    }

    return $return;
  }