Перевод с английского на русский

У меня есть логи изменения ролей в дискорде, но когда я изменяю права у роли, то они высвечиваются на английском. Я создал словарь с этими правами и их переводом(в коде скину), но как перевести - не знаю. Ещё нужно, чтобы права писались в столбик, а не через запятую(скрин также ниже)

@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)

screenshot


Ответы (1 шт):

Автор решения: denisnumb

У вас в коде есть 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)
→ Ссылка