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

Discord机器人翻译命令报错AttributeError: 'coroutine' object has no attribute 'text'求助

问题分析与解决方案

让我帮你一步步拆解并解决这个问题,你的代码里有几个关键细节错误导致了当前的异常:

1. 翻译器实例的作用域混淆

你在on_ready里创建的translator = Translator()是局部变量,在translate命令里根本访问不到。更糟的是你的Cog类名字也是translator,这会导致命名冲突——命令里的translator.translate其实是在调用类本身,而不是你想要的翻译器实例。

解决方法:把翻译器实例作为Cog的类属性保存,这样整个类都能正常访问:

class translator(commands.Cog):
    def __init__(self, client):
        self.client = client
        # 在这里初始化翻译器,作为类的全局属性
        self.translator = Translator()

    @commands.Cog.listener()
    async def on_ready(self):
        print("Translator is loaded")
        # 移除这里的局部translator变量

2. 错误的await使用与属性访问

googletrans的translate方法是同步方法,返回的是Translated对象,不是协程,完全不需要用await。而且text是这个对象的属性,不是方法,不需要加括号。你之前写的await translation.text或者await translation.text()都是错误用法。

修正后的翻译调用逻辑:

translation = self.translator.translate(text_to_translate, dest=lang)
await ctx.send(translation.text)

3. 命令参数的输入捕获问题

你的translate命令参数texts只会接收用户输入的第一个单词,因为discord.py默认把空格分隔的内容拆分为不同参数。如果要接收完整的待翻译文本,需要用*texts来捕获所有后续参数,再拼接成完整字符串:

@commands.command()
async def translate(self, ctx, lang="en", *texts):
    # 把所有分散的文本参数拼接成完整字符串
    text_to_translate = " ".join(texts)

(我把lang和texts的顺序调换了,这样用户输入!translate zh hello world时,zh是目标语言,后面的是待翻译文本,更符合使用习惯)

4. 赋值语句的低级错误

你之前写的lang == "en"是比较运算符,不是赋值操作,应该改成lang = "en"。不过上面的参数默认值写法lang="en"已经帮你处理了默认语言的逻辑,不需要额外判断。


完整修正后的代码

import googletrans
from googletrans import Translator, constants
import discord
from discord.ext import commands

class translator(commands.Cog):
    def __init__(self, client):
        self.client = client
        # 初始化翻译器实例为类属性
        self.translator = Translator()

    @commands.Cog.listener()
    async def on_ready(self):
        print("Translator is loaded")

    @commands.command()
    async def translate(self, ctx, lang="en", *texts):
        # 处理用户未输入文本的情况
        if not texts:
            await ctx.send("请提供需要翻译的文本!")
            return
        
        # 拼接所有文本参数
        text_to_translate = " ".join(texts)
        # 调用翻译方法(同步方法,无需await)
        translation = self.translator.translate(text_to_translate, dest=lang)
        # 格式化发送翻译结果
        await ctx.send(f"**翻译结果 ({lang}):** {translation.text}")

def setup(client):
    client.add_cog(translator(client))

额外提示

  • googletrans是非官方的第三方库,有时候可能会遇到API访问限制,如果后续出现报错,可以考虑使用官方的Google Cloud Translation API,或者更稳定的翻译库比如translatepy。

内容的提问来源于stack exchange,提问作者Dheeraj-Tech

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 08:22:35