from aiogram_dialog.widgets.kbd import Button, Row, Group, Radio, ManagedRadio
from aiogram_dialog import Dialog, Window, ChatEvent, DialogManager
from aiogram_dialog.widgets.text import Format
from aiogram_dialog.widgets.kbd import Cancel
from aiogram_dialog.widgets.kbd import SwitchTo
from aiogram.types import CallbackQuery
from fluentogram import TranslatorHub
from bot.dialogs.i18n_widget import I18NFormat
from bot.states.states import Settings
from database.repositories.user import UserRepository
from config import AVAILABLE_LANGUAGES_WORDS, AVAILABLE_LANGUAGES
async def on_cancel_settings(callback: ChatEvent, widget: Button, manager: DialogManager):
await callback.message.delete()
async def on_change_language(callback: CallbackQuery, select: ManagedRadio, dialog_manager: DialogManager, data):
if data == select.get_checked():
return
user = dialog_manager.middleware_data['user']
user_repo: UserRepository = dialog_manager.middleware_data['user_repo']
await user_repo.update(user, language=data)
translator_hub: TranslatorHub = dialog_manager.middleware_data.get('_translator_hub')
dialog_manager.middleware_data['i18n'] = translator_hub.get_translator_by_locale(data)
dialog = Dialog(
# /settings
Window(
I18NFormat('command_settings_text'),
Group(
SwitchTo(
I18NFormat('settings_language_text'),
id='settings_language',
state=Settings.language
),
Cancel(
I18NFormat('close_kb'),
id='cancel_settings',
on_click=on_cancel_settings
),
width=1
),
state=Settings.main,
),
Window(
I18NFormat('text_choose_lang'),
Group(
Radio(
checked_text=Format('✅{item[1]}'),
unchecked_text=Format('{item[1]}'),
id='radio_lang',
items=[(AVAILABLE_LANGUAGES[index], i) for index, i in enumerate(AVAILABLE_LANGUAGES_WORDS)], # [('ru', '🇷🇺Русский'), ('en', '🇺🇸English')],
item_id_getter=lambda x: x[0],
on_click=on_change_language
),
width=2
),
SwitchTo(
I18NFormat('back_kb'),
id='back_settings',
state=Settings.main
),
Cancel(
I18NFormat('close_kb'),
id='cancel_settings',
on_click=on_cancel_settings
),
state=Settings.language
),
)