Перейти к основному содержимому

languageDetector

Модуль languageDetector определяет язык запроса пользователя и записывает двухбуквенный ISO-код языка в $session.language.

Используйте этот модуль для разработки мультиязычных ботов. С помощью languageDetector вы можете определять язык запросов и давать ответ в зависимости от значения $session.language. Также модуль имеет гибкие настройки: вы можете указывать, в каких случаях нужно определять язык, настраивать логику и управлять методами определения языка.

Чтобы использовать languageDetector:

  1. Добавьте в проект ключ для Detect Language API.
  2. Импортируйте модуль в сценарий.

Как работает модуль

Когда вы импортируете модуль languageDetector, в сценарий добавляется обработчик preProcess.

подсказка

Работа модуля зависит от настроек, которые вы передали при импорте. Узнайте подробнее о настройках в статье Конфигурация.

Также вы можете посмотреть исходный код модуля в редакторе сценариев внутри раздела Зависимости.

Для каждого запроса бот проверяет, нужно ли определить язык. Если для запроса нужно определить язык:

  1. Бот получает ISO-код языка запроса:

    • Если в запросе 5 или более слов, бот обращается к методу $caila.detectLanguage. Вы можете посмотреть список поддерживаемых языков на сайте FastText.

    • Если в запросе меньше 5 слов, бот обращается к Detect Language API. Этот API лучше определяет язык в коротких текстах. Вы можете посмотреть список поддерживаемых языков на сайте Detect Language API.

      предупреждение

      Чтобы использовать API, добавьте в проект ключ.

  2. Бот проверяет, входит ли язык в список целевых языков targetLanguages и нужно ли его заменить на родственный язык с помощью параметра sameGroupLanguageReplacement.

Далее бот действует в зависимости от результатов:

  • Если язык определен успешно, бот записывает ISO-код языка в $session.language.
  • Если язык не удалось определить, бот переходит в стейт из параметра stateWithLanguageQuestion. Если такой стейт не указан, бот указывает в $session.language предыдущее значение с помощью параметра previousLanguagePreference или язык по умолчанию из defaultLanguage.

Ключ Detect Language API

Если в запросе пользователя меньше 5 слов, бот обращается к Detect Language API. Также если метод $caila.detectLanguage определил язык не из списка targetLanguages, бот еще раз пробует определить язык с помощью API.

Чтобы бот мог отправлять запросы к API, добавьте ключ в проект:

  1. Зарегистрируйтесь в Detect Language API.

  2. Получите API-ключ на сайте.

    к сведению

    По умолчанию в Detect Language API вам доступен бесплатный тариф, у которого есть ограничения на количество запросов и объем данных.

  3. В проекте JAICP перейдите в раздел Токены и переменные.

  4. Добавьте токен:

    • Название — getLanguageToken.
    • Значение — API-ключ с сайта Detect Language API.
предупреждение

Если вы не хотите использовать Detect Language API, в настройках модуля укажите true для параметра onlyCailaMethod. В этом случае бот всегда будет определять язык только с помощью $caila.detectLanguage.

Импорт модуля

Импортируйте модуль в сценарий с помощью тега require. Вы можете передать настройки модуля через параметр injector.

require: languageDetector/languageDetector.sc
module = sys.zb-common
injector = {
detectorMode: "every",
defaultLanguage: "ru"
}

Пример использования в сценарии

require: languageDetector/languageDetector.sc
module = sys.zb-common
injector = {
detectorMode: "default", # Бот определяет язык в первом и втором запросе.
defaultLanguage: "ru", # Язык по умолчанию — русский.
targetLanguages: ["ru", "en"], # Целевые языки — русский и английский.
detectorStates: ["/Complaint"], # Бот всегда определяет язык для стейта /Complaint.
stateWithLanguageQuestion: "/SelectLanguage", # Стейт с вопросом о языке.
stateForChangingLanguage: "/SpeakInOtherLanguage" # Стейт с интентом для смены языка.
}

theme: /

# ...

# Стейт с мультиязычным интентом.
# Стейт указан в detectorStates. Бот всегда определяет язык, если запрос попал в этот интент.
state: /Complaint
intent!: /жалоба
if: $session.language === "ru"
a: Нам очень жаль, что …
if: $session.language === "en"
a: We are very sorry that …

# Бот переходит в этот стейт, если он не смог определить язык.
# После этого стейта бот не будет определять язык. Исключение — /Complaint.
state: SelectLanguage
# Бот предлагает выбрать язык.
a: Выберите язык

state: Language
intent: /языки
# Бот извлекает язык из ответа и записывает в $session.language.
script:
$session.language = $parseTree._languages.name;

# Бот переходит в стейт, если пользователь просит говорить на другом языке.
# Пример запроса пользователя: «говори на русском».
# После этого стейта бот не будет определять язык. Исключение — /Complaint.
state: SpeakInOtherLanguage
intent!: /говори на другом языке
# Бот извлекает язык из запроса и записывает в $session.language
script:
$session.language = $parseTree._languages.name;