Skip to main content
Документация
Центр обучения

Освойте модерацию контента с подробными руководствами, обучающими материалами и документацией API

Быстрые ссылки

Определение языка

Discuse определяет язык сообщения, чтобы вы могли применить подходящие правила модерации до выполнения каких-либо действий. Отправьте текст на POST https://api.discuse.com/api/v2/check с включённым параметром check_language и считайте код определённого языка из results.language.language. Добавьте expected_language, чтобы помечать контент, написанный не на нужном вам языке.

Для чего нужно определение языка?

Предварительное определение языка позволяет:

  • Применять пороги модерации с учётом конкретного языка
  • Направлять контент нужным модераторам или команде поддержки
  • Обеспечивать соблюдение языковой политики сообщества
  • Фильтровать или локализовать ленты по языку

Как определить язык?

curl -X POST https://api.discuse.com/api/v2/check \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d '{
    "content": {
      "text": "Bonjour, comment allez-vous aujourd'\''hui?"
    },
    "settings": {
      "check_language": true
    }
  }'

Формат ответа

{
  "has_violations": false,
  "cached": false,
  "results": {
    "language": {
      "language": "fr",
      "confidence": 0.99,
      "hit": false
    }
  }
}

Код определённого языка находится в results.language.language. Когда включена проверка expected_language, также заполняются поля detected и expected (см. ниже).

Какие поля возвращает результат определения языка?

Поле Тип Значение
language string Код определённого языка (например, en, fr, es)
confidence number Уверенность определения (0.0–1.0)
expected string Обязательный код языка, если задан expected_language
detected string Определённый код (псевдоним language, заполняется при проверке соответствия)
hit bool True, если определённый язык не совпадает с expected
delete_only bool Если true, сообщение следует удалить без дополнительных санкций
error string Присутствует только в случае ошибки определения

Какие языки поддерживаются?

Discuse возвращает коды языков в стиле ISO. Часто определяемые языки:

Код Язык Код Язык
en Английский de Немецкий
es Испанский fr Французский
it Итальянский pt Португальский
nl Нидерландский pl Польский
ru Русский uk Украинский
zh Китайский ja Японский
ko Корейский ar Арабский
hi Хинди tr Турецкий

Считывайте значение напрямую из results.language.language, а не задавайте фиксированный список в коде.

Как обеспечить использование конкретного языка?

Задайте в expected_language нужный вам код. Если определённый язык отличается, language.hit будет true, а поля expected/detected будут заполнены:

Запрос:

{
  "content": { "text": "Hola, cómo estás?" },
  "settings": {
    "check_language": true,
    "expected_language": "en"
  }
}

Ответ:

{
  "has_violations": true,
  "message": "Content is not in expected language",
  "results": {
    "hits": true,
    "language": {
      "language": "es",
      "detected": "es",
      "expected": "en",
      "confidence": 0.97,
      "hit": true
    }
  }
}

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

Форумы только на английском

async function validatePost(post) {
  const result = await fetch('https://api.discuse.com/api/v2/check', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': process.env.DISCUSE_API_KEY
    },
    body: JSON.stringify({
      content: { text: post.content },
      settings: { check_language: true, expected_language: 'en' }
    })
  }).then(r => r.json());

  if (result.results.language.hit) {
    return {
      approved: false,
      reason: 'Posts must be in English',
      detected_language: result.results.language.language
    };
  }
  return { approved: true };
}

Маршрутизация для нескольких языков

async function routeContent(content) {
  const result = await checkLanguage(content.text);
  const language = result.results.language.language;

  const moderatorQueue = {
    en: 'english-moderation',
    es: 'spanish-moderation',
    fr: 'french-moderation',
    de: 'german-moderation',
    default: 'general-moderation'
  };

  const queue = moderatorQueue[language] || moderatorQueue.default;
  await addToQueue(queue, content);
  return { queued: true, language };
}

Совмещение с модерацией контента

Запускайте определение языка вместе с анализом тональности и проверкой на спам в одном запросе:

{
  "content": {
    "text": "User message in any language"
  },
  "settings": {
    "check_language": true,
    "check_sentiment": true,
    "check_spam": true
  }
}

Затем определённый язык можно использовать для выбора порогов тональности для каждого языка:

const LANGUAGE_THRESHOLDS = {
  en: { toxicity: 0.7, profanity: 0.6 },
  de: { toxicity: 0.6, profanity: 0.5 },
  es: { toxicity: 0.7, profanity: 0.7 },
  default: { toxicity: 0.7, profanity: 0.6 }
};

async function moderateContent(text) {
  const result = await checkText(text); // check_language + check_sentiment
  const language = result.results.language.language;
  const thresholds = LANGUAGE_THRESHOLDS[language] || LANGUAGE_THRESHOLDS.default;
  const sentiment = result.results.sentiment;

  if (sentiment.toxicity > thresholds.toxicity) {
    return { action: 'block', reason: 'toxic_content' };
  }
  if (sentiment.profanity > thresholds.profanity) {
    return { action: 'flag', reason: 'profanity' };
  }
  return { action: 'allow' };
}

Рекомендации

Учитывайте короткие тексты

На очень коротких строках определение менее надёжно. Пропускайте проверку, если текст короче минимальной длины:

async function smartLanguageCheck(text) {
  if (text.length < 20) {
    return { language: 'unknown', confidence: 0 };
  }
  const result = await checkLanguage(text);
  return result.results.language;
}

Кэшируйте результаты

async function getLanguageWithCache(text, contentId) {
  const cached = await cache.get(`lang:${contentId}`);
  if (cached) return JSON.parse(cached);

  const result = await checkLanguage(text);
  const language = result.results.language;
  await cache.set(`lang:${contentId}`, JSON.stringify(language), 'EX', 3600);
  return language;
}

Лимиты использования

Определение языка расходует вашу квоту на анализ текста:

Тариф Анализов в месяц
Basic 1,000
Gold 5,000
Platinum 15,000
Ultimate 30,000

Кэшированные ответы не учитываются в вашей квоте.

Примеры интеграции

Node.js

const checkLanguage = async (text, expectedLanguage = null) => {
  const settings = { check_language: true };
  if (expectedLanguage) settings.expected_language = expectedLanguage;

  const response = await fetch('https://api.discuse.com/api/v2/check', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': process.env.DISCUSE_API_KEY
    },
    body: JSON.stringify({ content: { text }, settings })
  });

  return response.json();
};

Python

import os
import requests

def check_language(text, expected_language=None):
    settings = {'check_language': True}
    if expected_language:
        settings['expected_language'] = expected_language

    response = requests.post(
        'https://api.discuse.com/api/v2/check',
        headers={
            'Content-Type': 'application/json',
            'X-API-Key': os.environ['DISCUSE_API_KEY']
        },
        json={'content': {'text': text}, 'settings': settings}
    )
    return response.json()

Что дальше

Автор: Команда Discuse · Обновлено June 2026

Похожие статьи

Анализ текста и определение тональности

Выявляйте спам, токсичность, ненормативную лексику и анализируйте тональность текстового контента

Определение NSFW на изображениях

Автоматически выявляйте и фильтруйте неприемлемые изображения и контент для взрослых

Обнаружение спама

Фильтрация спама в тексте и сообщениях на базе AI