Перевод с английского на русский
У меня есть логи изменения ролей в дискорде, но когда я изменяю права у роли, то они высвечиваются на английском. Я создал словарь с этими правами и их переводом(в коде скину), но как перевести - не знаю. Ещё нужно, чтобы права писались в столбик, а не через запятую(скрин также ниже)
@bot.event
async def on_guild_role_update(before, after):
array = {
'create_instant_invite':'Создавать приглашение в канал',
'kick_members':'Кикать участников',
'ban_members':'Банить участников',
'administrator':'Администратор',
'manage_channels':'Управлять каналами',
'manage_guild':'Управлять сервером',
'add_reactions':'Добавлять реакции',
'view_audit_log':'Просматривать журнал аудита',
'priority_speaker':'Приоритетный режим',
'stream':'Включать трансляции',
'read_messages':'Читать сообщения',
'send_messages':'Отправлять сообщения',
'send_tts_messages':'Отправлять TTS сообщения',
'manage_messages':'Управлять сообщениями',
'embed_links':'Отправлять ссылки',
'attach_files':'Прикреплять файлы',
'read_message_history':'Читать историю сообщений',
'mention_everyone':'Использовать @everyone',
'external_emojis':'Использовать эмодзи с других серверов',
'view_guild_insights':'Просмотр аналитики сервера',
'connect':'Подключаться',
'speak':'Разговаривать',
'mute_members':'Заглушать участников',
'deafen_members':'Давать Тайм-аут',
'move_members':'Перемещать участников',
'use_voice_activation':'Использовать режим активации по клавише',
'change_nickname':'Изменять никнейм',
'manage_nicknames':'Управлять никнеймами',
'manage_roles':'Управлять ролями',
'manage_webhooks':'Управлять вебхуками',
'manage_emojis':'Управлять эмодзи',
'use_slash_commands':'Использовать слэш-команды',
'request_to_speak':'Попросить выступить'
}
now = datetime.now()
embed = discord.Embed(
title='Роль была изменена!',
color=0xfaa41b
)
embed.set_footer(text=f'ID: {before.id} • Сегодня, в {now.hour}:{now.minute}')
if before.name != after.name:
embed.add_field(name='Название:', value=f'{before.name} => {after.name}', inline=False)
if before.color != after.color:
embed.add_field(name='Цвет:', value=f'{before.color} => {after.color}', inline=False)
if before.permissions != after.permissions:
async for event in before.guild.audit_logs(limit=None, action=discord.AuditLogAction.role_update):
if getattr(event.target, 'id', None) == before.id:
continue
removed_perm = []
added_perm = []
for i in before.permissions:
if i in before.permissions and i not in after.permissions:
name, flag = i
if flag == True:
removed_perm.append(name)
for i in after.permissions:
if i in after.permissions and i not in before.permissions:
name, flag = i
if flag == True:
added_perm.append(name)
embed.add_field(name='Добавленные права:', value=','.join(added_perm), inline=True)
embed.add_field(name='Убранные права:', value=','.join(removed_perm), inline=True)
embed.add_field(name='Модератор:', value=f'{event.user}({event.user.mention})', inline=False)
await bot.get_channel(911633362949648464).send(embed=embed)
Ответы (1 шт):
У вас в коде есть 2 цикла for, в которых вы заполняете списки добавленных и удаленных прав (added_perm и removed_perm).
Чтобы был перевод, при добавлении, вместо того, чтобы просто записывать в конец название добавленного/удаленного права, записывайте в список соответствующее значение из вашего словаря array, то есть:
removed_perm = []
added_perm = []
for perm in before.permissions:
if perm not in after.permissions and perm[1]:
removed_perm.append(array[perm[0]])
for perm in after.permissions:
if perm not in before.permissions and perm[1]:
added_perm.append(array[perm[0]])
Или компактнее:
removed_perm = [array[perm[0]] for perm in before.permissions if perm not in after.permissions and perm[1]]
added_perm = [array[perm[0]] for perm in after.permissions if perm not in before.permissions and perm[1]]
И кстати, в вашем коде, внутри этих циклов зачем-то есть проверка наличия переменной цикла внутри списка прав:
for i in before.permissions:
if i in before.permissions . . .
. . .
Думаю, понятно почему так делать не надо :)
Ну а далее, чтобы изменения отображались в столбик, их нужно писать с новой строки, а не через запятую. То есть для .join() вместо ',' нужно указать '\n'
Ну и необходимо проверять есть ли вообще какие-то элементы с списке удаленных и добавленных прав. Иначе параметр value поля с изменениями окажется пустым и дискорд не пропустит такое сообщение.
if len(added_perm) > 0:
embed.add_field(name='Добавленные права:', value='\n'.join(added_perm), inline=True)
if len(removed_perm) > 0:
embed.add_field(name='Убранные права:', value='\n'.join(removed_perm), inline=True)
