尝试使用 Google Translate API 翻译 Discord Message 的结果只是构成输入的字母列表
Results of attempt to translate a Discord Message with Google Translate API is just a list of the letters making up the input
Edit4:进一步审查,如果我用 JP 发送文本并将其翻译成 EN,它会起作用。我现在相信它会将字符串作为 UTF-8 字节序列返回。我现在正试图弄清楚如何将其转换回实际字符。
编辑 3:添加了一个 await asyncio.sleep(3) 行,如果我使用英语到西班牙语,它似乎已经修复了它,因为它正确地将 "Hello" 翻译成 "Hola" 仍在获取不过,对于英语到日语来说,这是一条奇怪的台词。我的猜测是它与非罗马字符有关。
Translation:translated_text: "313323313311317"
编辑2:我认为这可能与日语不使用罗马字母有关。将语言更改为西班牙语(ISO 代码:es)仍然会出错。
Translation:translated_text: "H"
Translation:translated_text: "mi"
Translation:translated_text: "l"
Translation:translated_text: "l"
Translation:translated_text: "o"
Translation:translated_text: "20"
Translation:translated_text: "W"
Translation:translated_text: "o"
Translation:translated_text: "r"
Translation:translated_text: "l"
Translation:translated_text: "re"
编辑:这没有用。仍然收到相同的回复。我可能已经想通了这个问题。不过我下班后才能测试它。在 API 示例中,我注意到我没有包含一行。所以我认为这可能是它返回奇怪结果的原因。
for translation in response.translations:
原创:我一直在尝试为我的 discord 机器人设置一个附加功能,以使用 Google 的翻译 API 将以短语 !trans 开头的消息从英语翻译成日语。我没有得到翻译结果,而是得到了组成输入的字符的细分。预先感谢您的帮助!
最初的尝试是翻译不和谐消息。此代码还切掉了字符串开头的 !trans 标签。
entrans = message.content[6:]
起初我认为问题出在 Discord 消息的格式化方式上。因此,我试图通过删除该部分并简单地将相位更改为 "Hello".
来隔离该问题
entrans = 'Hello'
当这也不起作用时,我认为这可能是翻译模型的问题。所以我想也许设置模型会有所帮助,但它仍然按字母分解我的翻译结果,唯一的区别是它在每个字母后列出了一行用于所使用的模型。在此示例中,L 所在的位置仅列出了数字。
translations {
translated_text: "H"
model: "projects/Unique Project ID/locations/global/models/general/base"
}
translations {
translated_text: "E"
model: "projects/Unique Project ID/locations/global/models/general/base"
}
translations {
translated_text: "332333330333"
model: "projects/Unique Project ID/locations/global/models/general/base"
}
translations {
translated_text: "332333330333"
model: "projects/Unique Project ID/locations/global/models/general/base"
}
translations {
translated_text: "O"
model: "projects/Unique Project ID/locations/global/models/general/base"
}
下面列出了我最初尝试的代码。
import discord
import os
from google.cloud import translate_v3beta1 as translate
gclient = translate.TranslationServiceClient()
client = discord.Client()
location = 'global'
parent = gclient.location_path("My Project ID here",location)
@client.event
async def on_message(message):
if message.content.startswith('!trans'):
entrans = message.content[6:]
jtranresult = gclient.translate_text(
parent=parent,
contents=entrans,
mime_type='text/plain',
source_language_code='en',
target_language_code='ja',
)
print(f"Translation:{jtranresult}")
我预计结果会是日语的“こんニちは”或类似的东西。
相反,我收到了以下结果。
结果:
translations {
translated_text: "20"
}
translations {
translated_text: "H"
}
translations {
translated_text: "e"
}
translations {
translated_text: "l"
}
translations {
translated_text: "l"
}
translations {
translated_text: "o"
首先,translate_text
method takes contents
arg as list。如果您将字符串作为 contents
提供,那么它将被分隔到列表中。
第二:translate_text
方法returnsTranslateTextResponse
。我想,要从中获取翻译,您需要从 TranslateTextResponse.translations
获取
所以,我猜你的代码一定是这样的:
import discord
import os
from google.cloud import translate_v3beta1 as translate
gclient = translate.TranslationServiceClient()
client = discord.Client()
location = 'global'
parent = gclient.location_path("My Project ID here",location)
@client.event
async def on_message(message):
if message.content.startswith('!trans'):
entrans = message.content[6:]
jtranresult = gclient.translate_text(
parent=parent,
contents=[entrans],
mime_type='text/plain',
source_language_code='en',
target_language_code='ja'
)
print(f"Translation: {jtranresult.translations[0].translated_text}")
此外,我建议使用 commands extension 用于带有命令的机器人。类似的东西
import os # unused import?
from functools import partial
from discord.ext import commands
from google.cloud import translate_v3beta1 as translate
PROJECT_ID = ""
gclient = translate.TranslationServiceClient()
bot = commands.Bot(command_prefix="!")
location = "global"
parent = gclient.location_path(PROJECT_ID, location)
@bot.command()
async def trans(
ctx, *, text: str
): # https://discordpy.readthedocs.io/en/v1.2.3/ext/commands/commands.html#keyword-only-arguments
"""Translation command""" # Will be used as description in !help
jtranresult = bot.loop.run_in_executor(
None,
partial(
gclient.translate_text,
parent=parent,
contents=[text],
mime_type="text/plain",
source_language_code="en",
target_language_code="ja",
),
)
# run_in_executor will prevent bot "freezing" when translate_text func is active, since it not async
await ctx.send(f"Translation: {jtranresult.translations[0].translated_text}")
Edit4:进一步审查,如果我用 JP 发送文本并将其翻译成 EN,它会起作用。我现在相信它会将字符串作为 UTF-8 字节序列返回。我现在正试图弄清楚如何将其转换回实际字符。
编辑 3:添加了一个 await asyncio.sleep(3) 行,如果我使用英语到西班牙语,它似乎已经修复了它,因为它正确地将 "Hello" 翻译成 "Hola" 仍在获取不过,对于英语到日语来说,这是一条奇怪的台词。我的猜测是它与非罗马字符有关。
Translation:translated_text: "313323313311317"
编辑2:我认为这可能与日语不使用罗马字母有关。将语言更改为西班牙语(ISO 代码:es)仍然会出错。
Translation:translated_text: "H"
Translation:translated_text: "mi"
Translation:translated_text: "l"
Translation:translated_text: "l"
Translation:translated_text: "o"
Translation:translated_text: "20"
Translation:translated_text: "W"
Translation:translated_text: "o"
Translation:translated_text: "r"
Translation:translated_text: "l"
Translation:translated_text: "re"
编辑:这没有用。仍然收到相同的回复。我可能已经想通了这个问题。不过我下班后才能测试它。在 API 示例中,我注意到我没有包含一行。所以我认为这可能是它返回奇怪结果的原因。
for translation in response.translations:
原创:我一直在尝试为我的 discord 机器人设置一个附加功能,以使用 Google 的翻译 API 将以短语 !trans 开头的消息从英语翻译成日语。我没有得到翻译结果,而是得到了组成输入的字符的细分。预先感谢您的帮助!
最初的尝试是翻译不和谐消息。此代码还切掉了字符串开头的 !trans 标签。
entrans = message.content[6:]
起初我认为问题出在 Discord 消息的格式化方式上。因此,我试图通过删除该部分并简单地将相位更改为 "Hello".
来隔离该问题entrans = 'Hello'
当这也不起作用时,我认为这可能是翻译模型的问题。所以我想也许设置模型会有所帮助,但它仍然按字母分解我的翻译结果,唯一的区别是它在每个字母后列出了一行用于所使用的模型。在此示例中,L 所在的位置仅列出了数字。
translations {
translated_text: "H"
model: "projects/Unique Project ID/locations/global/models/general/base"
}
translations {
translated_text: "E"
model: "projects/Unique Project ID/locations/global/models/general/base"
}
translations {
translated_text: "332333330333"
model: "projects/Unique Project ID/locations/global/models/general/base"
}
translations {
translated_text: "332333330333"
model: "projects/Unique Project ID/locations/global/models/general/base"
}
translations {
translated_text: "O"
model: "projects/Unique Project ID/locations/global/models/general/base"
}
下面列出了我最初尝试的代码。
import discord
import os
from google.cloud import translate_v3beta1 as translate
gclient = translate.TranslationServiceClient()
client = discord.Client()
location = 'global'
parent = gclient.location_path("My Project ID here",location)
@client.event
async def on_message(message):
if message.content.startswith('!trans'):
entrans = message.content[6:]
jtranresult = gclient.translate_text(
parent=parent,
contents=entrans,
mime_type='text/plain',
source_language_code='en',
target_language_code='ja',
)
print(f"Translation:{jtranresult}")
我预计结果会是日语的“こんニちは”或类似的东西。
相反,我收到了以下结果。
结果:
translations {
translated_text: "20"
}
translations {
translated_text: "H"
}
translations {
translated_text: "e"
}
translations {
translated_text: "l"
}
translations {
translated_text: "l"
}
translations {
translated_text: "o"
首先,translate_text
method takes contents
arg as list。如果您将字符串作为 contents
提供,那么它将被分隔到列表中。
第二:translate_text
方法returnsTranslateTextResponse
。我想,要从中获取翻译,您需要从 TranslateTextResponse.translations
所以,我猜你的代码一定是这样的:
import discord
import os
from google.cloud import translate_v3beta1 as translate
gclient = translate.TranslationServiceClient()
client = discord.Client()
location = 'global'
parent = gclient.location_path("My Project ID here",location)
@client.event
async def on_message(message):
if message.content.startswith('!trans'):
entrans = message.content[6:]
jtranresult = gclient.translate_text(
parent=parent,
contents=[entrans],
mime_type='text/plain',
source_language_code='en',
target_language_code='ja'
)
print(f"Translation: {jtranresult.translations[0].translated_text}")
此外,我建议使用 commands extension 用于带有命令的机器人。类似的东西
import os # unused import?
from functools import partial
from discord.ext import commands
from google.cloud import translate_v3beta1 as translate
PROJECT_ID = ""
gclient = translate.TranslationServiceClient()
bot = commands.Bot(command_prefix="!")
location = "global"
parent = gclient.location_path(PROJECT_ID, location)
@bot.command()
async def trans(
ctx, *, text: str
): # https://discordpy.readthedocs.io/en/v1.2.3/ext/commands/commands.html#keyword-only-arguments
"""Translation command""" # Will be used as description in !help
jtranresult = bot.loop.run_in_executor(
None,
partial(
gclient.translate_text,
parent=parent,
contents=[text],
mime_type="text/plain",
source_language_code="en",
target_language_code="ja",
),
)
# run_in_executor will prevent bot "freezing" when translate_text func is active, since it not async
await ctx.send(f"Translation: {jtranresult.translations[0].translated_text}")