You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Discord自动翻译Bot报错:语言不支持问题求助

解决Discord翻译Bot的"语言不支持"报错问题

问题描述

我正在开发一款Python Discord自动翻译Bot,计划使用langdetect检测非英文语言,再通过deep-translator将其翻译成英文。但发送非英文消息时无任何反应,还收到“语言不支持”的报错,而该语言实际上是支持的。我是Python新手,希望能得到帮助。

原代码

import os
import discord
from dotenv import load_dotenv
from deep_translator import GoogleTranslator
from langdetect import detect

load_dotenv()  

intents = discord.Intents.default()
intents.members = True

client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(f'{client.user} is online')

@client.event
async def on_message(message):
    itself
    if message.author == client.user:
        return
    try:
        lang = detect(message.content)
    except:
        lang = 'unknown'
        
    if lang != 'en':
        
        translated_message = GoogleTranslator(source=lang, target='en').translate(message.content)
        response = f'{message.author.mention} said in {message.channel.name} ({lang}): {translated_message}'
       
        await message.channel.send(response)

TOKEN = os.environ.get("TOKEN")
client.run(TOKEN)

报错信息

2023-03-23 08:07:23 ERROR discord.client Ignoring exception in
on_message Traceback (most recent call last): File
"/home/runner/Auto-translate/venv/lib/python3.10/site-packages/discord/client.py",
line 441, in _run_event await coro(*args, **kwargs) File "main.py",
line 33, in on_message translated_message =
GoogleTranslator(source=lang, target='en').translate(message.content)
File
"/home/runner/Auto-translate/venv/lib/python3.10/site-packages/deep_translator/google.py",
line 39, in init super().init( File
"/home/runner/Auto-translate/venv/lib/python3.10/site-packages/deep_translator/base.py", line 44, in init self._source, self._target =
self._map_language_to_code(source, target) File
"/home/runner/Auto-translate/venv/lib/python3.10/site-packages/deep_translator/base.py", line 84, in _map_language_to_code raise LanguageNotSupportedException(
deep_translator.exceptions.LanguageNotSupportedException: unknown -->
No support for the provided language. Please select on of the
supported languages: {'afrikaans': 'af', 'albanian': 'sq', 'amharic':
'am', 'arabic': 'ar', 'armenian': 'hy', 'assamese': 'as', 'aymara':
'ay', 'azerbaijani': 'az', 'bambara': 'bm', 'basque': 'eu',
'belarusian': 'be', 'bengali': 'bn', 'bhojpuri': 'bho', 'bosnian':
'bs', 'bulgarian': 'bg', 'catalan': 'ca', 'cebuano': 'ceb',
'chichewa': 'ny', 'chinese (simplified)': 'zh-CN', 'chinese
(traditional)': 'zh-TW', 'corsican': 'co', 'croatian': 'hr', 'czech':
'cs', 'danish': 'da', 'dhivehi': 'dv', 'dogri': 'doi', 'dutch': 'nl',
'english': 'en', 'esperanto': 'eo', 'estonian': 'et', 'ewe': 'ee',
'filipino': 'tl', 'finnish': 'fi', 'french': 'fr', 'frisian': 'fy',
'galician': 'gl', 'georgian': 'ka', 'german': 'de', 'greek': 'el',
'guarani': 'gn', 'gujarati': 'gu', 'haitian creole': 'ht', 'hausa':
'ha', 'hawaiian': 'haw', 'hebrew': 'iw', 'hindi': 'hi', 'hmong':
'hmn', 'hungarian': 'hu', 'icelandic': 'is', 'igbo': 'ig', 'ilocano':
'ilo', 'indonesian': 'id', 'irish': 'ga', 'italian': 'it', 'japanese':
'ja', 'javanese': 'jw', 'kannada': 'kn', 'kazakh': 'kk', 'khmer':
'km', 'kinyarwanda': 'rw', 'konkani': 'gom', 'korean': 'ko', 'krio':
'kri', 'kurdish (kurmanji)': 'ku', 'kurdish (sorani)': 'ckb',
'kyrgyz': 'ky', 'lao': 'lo', 'latin': 'la', 'latvian': 'lv',
'lingala': 'ln', 'lithuanian': 'lt', 'luganda': 'lg', 'luxembourgish':
'lb', 'macedonian': 'mk', 'maithili': 'mai', 'malagasy': 'mg',
'malay': 'ms', 'malayalam': 'ml', 'maltese': 'mt', 'maori': 'mi',
'marathi': 'mr', 'meiteilon (manipuri)': 'mni-Mtei', 'mizo': 'lus',
'mongolian': 'mn', 'myanmar': 'my', 'nepali': 'ne', 'norwegian': 'no',
'odia (oriya)': 'or', 'oromo': 'om', 'pashto': 'ps', 'persian': 'fa',
'polish': 'pl', 'portuguese': 'pt', 'punjabi': 'pa', 'quechua': 'qu',
'romanian': 'ro', 'russian': 'ru', 'samoan': 'sm', 'sanskrit': 'sa',
'scots gaelic': 'gd', 'sepedi': 'nso', 'serbian': 'sr', 'sesotho':
'st', 'shona': 'sn', 'sindhi': 'sd', 'sinhala': 'si', 'slovak': 'sk',
'slovenian': 'sl', 'somali': 'so', 'spanish': 'es', 'sundanese': 'su',
'swahili': 'sw', 'swedish': 'sv', 'tajik': 'tg', 'tamil': 'ta',
'tatar': 'tt', 'telugu': 'te', 'thai': 'th', 'tigrinya': 'ti',
'tsonga': 'ts', 'turkish': 'tr', 'turkmen': 'tk', 'twi': 'ak',
'ukrainian': 'uk', 'urdu': 'ur', 'uyghur': 'ug', 'uzbek': 'uz',
'vietnamese': 'vi', 'welsh': 'cy', 'xhosa': 'xh', 'yiddish': 'yi',
'yoruba': 'yo', 'zulu': 'zu'}

问题分析

  1. 代码中有无效语句itself,会导致语法错误,直接中断逻辑执行。
  2. 当langdetect无法识别语言时,代码将lang设为'unknown',但deep-translator不支持把'unknown'作为源语言参数,触发报错后无异常处理,导致Bot直接终止当前消息的处理流程,无任何响应。
  3. Discord Bot需要开启message_content权限才能读取消息内容,原代码未设置该Intent,这也是消息无反应的核心原因之一。

修复方案

  1. 删除无效的itself语句。
  2. 增加对lang='unknown'的判断,跳过翻译或提示无法识别语言。
  3. 开启message_content Intent,确保Bot能读取消息。
  4. 给翻译逻辑添加异常捕获,避免单个翻译错误导致整个事件崩溃。

修复后的代码

import os
import discord
from dotenv import load_dotenv
from deep_translator import GoogleTranslator, LanguageNotSupportedException
from langdetect import detect, LangDetectException

load_dotenv()  

# 配置Intents,必须开启message_content才能读取消息
intents = discord.Intents.default()
intents.message_content = True
intents.members = True

client = discord.Client(intents=intents)

@client.event
async def on_ready():
    print(f'{client.user} is online')

@client.event
async def on_message(message):
    # 忽略Bot自己发送的消息
    if message.author == client.user:
        return
    
    lang = 'unknown'
    try:
        # 检测消息语言
        lang = detect(message.content)
    except LangDetectException:
        # 捕获语言检测失败的异常
        await message.channel.send(f'{message.author.mention} 无法识别你发送的语言')
        return
    
    # 只处理非英文内容
    if lang != 'en':
        try:
            # 翻译消息
            translated_message = GoogleTranslator(source=lang, target='en').translate(message.content)
            response = f'{message.author.mention} 在 {message.channel.name} 中说 ({lang}): {translated_message}'
            await message.channel.send(response)
        except LanguageNotSupportedException:
            # 捕获翻译不支持的语言异常
            await message.channel.send(f'{message.author.mention} 不支持翻译语言: {lang}')
        except Exception as e:
            # 捕获其他未知异常
            await message.channel.send(f'{message.author.mention} 翻译出错: {str(e)}')

TOKEN = os.environ.get("TOKEN")
client.run(TOKEN)

额外说明

  • 确保在Discord开发者平台的Bot设置中,开启「Message Content Intent」权限,否则Bot无法读取消息内容。
  • 明确捕获特定异常(LangDetectException、LanguageNotSupportedException)比捕获所有异常更安全,便于排查问题。

内容的提问来源于stack exchange,提问作者Peepo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:37:06