from __future__ import annotations from html import escape from typing import Dict, Optional from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup DEFAULT_LANGUAGE = "ru" SUPPORTED_LANGUAGES = ("ru", "uk") Language = str SERVICES_RU = ( "🌐 1. Покупка/продажа криптовалюты за наличные — лучшие условия " "во всех странах и крупных городах.\n\n" "💸 2. Перестановка наличных — выдача день в день.\n\n" "💳 3. Оплата на карты\n\n" "• Покупка/продажа криптовалюты.\n\n" "• Оплата на карты EUR, TRY, KZT, PLN, THB.\n\n" "• Оплата физ.лиц (со счетов в ЕС): USD, EUR, GBP через Wise, Paysera, Revolut, ZEN.\n\n" "• Прием/оплата UAH: ТОВ, ФОП, физлица.\n\n" "• Оплата по ссылкам: Visa, Mastercard, American Express.\n\n" "• Оплата Инвойсов (USD, EUR): товар, логистика, маркетинг, IT, Консалтинг, " "тур. услуги, авто (Copart, IAAI), оплата авто в ЕС.\n\n" "🔒 4. Электронные деньги и платежные системы\n\n" "• Payeer, Capitalist, Perfect Money, Skrill, AdvCash, Payoneer.\n\n" "• Оплата Юань на карты: AliPay, WeChat Pay." ) SERVICES_UK = ( "🌐 1. Купівля/продаж криптовалюти за готівку — найкращі умови " "в усіх країнах і великих містах.\n\n" "💸 2. Перестановка готівки — видача в той же день.\n\n" "💳 3. Оплата на картки\n\n" "• Купівля/продаж криптовалюти.\n\n" "• Оплата на картки EUR, TRY, KZT, PLN, THB.\n\n" "• Оплата фіз.осіб (з рахунків в ЄС): USD, EUR, GBP через Wise, Paysera, Revolut, ZEN.\n\n" "• Прийом/оплата UAH: ТОВ, ФОП, фізособи.\n\n" "• Оплата за посиланнями: Visa, Mastercard, American Express.\n\n" "• Оплата інвойсів (USD, EUR): товар, логістика, маркетинг, IT, консалтинг, " "тур. послуги, авто (Copart, IAAI), оплата авто в ЄС.\n\n" "🔒 4. Електронні гроші та платіжні системи\n\n" "• Payeer, Capitalist, Perfect Money, Skrill, AdvCash, Payoneer.\n\n" "• Оплата юаня на картки: AliPay, WeChat Pay." ) TEXTS: Dict[str, Dict[str, str]] = { "ru": { "welcome": ( "Здравствуйте!\n\n" "Напишите ваш запрос — менеджер ответит здесь.\n\n" "Укажите что конкретно вам нужно сделать.\n\n" "🔶 Все наши услуги посмотрите по кнопке ниже." ), "ack": "Спасибо, подождите ответ.", "cooldown": "Подождите немного, не спамьте.", "send_failed": ( "Не удалось отправить сообщение менеджеру. Попробуйте позже." ), "choose_language": "Выберите язык / Оберіть мову:", "language_set": "Язык сохранён: русский.", "prefix_bot": "Бот:", "prefix_manager": "Менеджер:", "lang_button": "Ru", "services_button": "Список услуг", "services": SERVICES_RU, "client_blocked": ( "⚠️ Клиент заблокировал бота. Сообщение не доставлено." ), "deliver_failed": "⚠️ Не удалось доставить сообщение клиенту.", "edit_failed": "⚠️ Не удалось обновить сообщение у клиента.", "deleted_notice": "🗑 Сообщение удалено.", }, "uk": { "welcome": ( "Вітаємо!\n\n" "Напишіть ваш запит — менеджер відповість тут.\n\n" "Вкажіть, що саме вам потрібно зробити.\n\n" "🔶 Всі наші послуги подивіться по кнопці нижче." ), "ack": "Дякуємо, зачекайте на відповідь.", "cooldown": "Зачекайте трохи, не спамте.", "send_failed": ( "Не вдалося надіслати повідомлення менеджеру. Спробуйте пізніше." ), "choose_language": "Оберіть мову / Выберите язык:", "language_set": "Мову збережено: українська.", "prefix_bot": "Бот:", "prefix_manager": "Менеджер:", "lang_button": "Ukr", "services_button": "Список послуг", "services": SERVICES_UK, "client_blocked": ( "⚠️ Клієнт заблокував бота. Повідомлення не доставлено." ), "deliver_failed": "⚠️ Не вдалося доставити повідомлення клієнту.", "edit_failed": "⚠️ Не вдалося оновити повідомлення у клієнта.", "deleted_notice": "🗑 Повідомлення видалено.", }, } def normalize_language(language: Optional[str]) -> Optional[str]: if language is None: return None code = language.strip().lower() if code in SUPPORTED_LANGUAGES: return code return None def resolve_language(language: Optional[str]) -> str: return normalize_language(language) or DEFAULT_LANGUAGE def t(language: Optional[str], key: str) -> str: lang = resolve_language(language) return TEXTS[lang][key] def format_prefix(language: Optional[str], key: str) -> str: return f"{escape(t(language, key))}" def format_labeled_message(label: str, text: str) -> str: """Label + plain text body (body is escaped).""" return f"{escape(label)}\n\n{escape(text)}" def format_labeled_html(label: str, html_body: str) -> str: """Label + pre-formatted HTML body (body is not escaped).""" return f"{escape(label)}\n\n{html_body}" def format_bot_message(language: Optional[str], text: str) -> str: return format_labeled_message(t(language, "prefix_bot"), text) def format_bot_html(language: Optional[str], html_body: str) -> str: """Bot prefix + pre-formatted HTML body (not escaped).""" return f"{format_prefix(language, 'prefix_bot')}\n\n{html_body}" def format_manager_message(language: Optional[str], text: str) -> str: return format_labeled_message(t(language, "prefix_manager"), text) def format_manager_html(language: Optional[str], html_body: str) -> str: return format_labeled_html(t(language, "prefix_manager"), html_body) def language_keyboard() -> InlineKeyboardMarkup: return InlineKeyboardMarkup( inline_keyboard=[ [ InlineKeyboardButton( text=TEXTS[code]["lang_button"], callback_data=f"lang:{code}", ) ] for code in SUPPORTED_LANGUAGES ] ) def services_keyboard(language: Optional[str]) -> InlineKeyboardMarkup: return InlineKeyboardMarkup( inline_keyboard=[ [ InlineKeyboardButton( text=t(language, "services_button"), callback_data="services", ) ] ] )