""" Все пользовательские тексты и подписи кнопок. Шаблоны с плейсхолдерами форматируются на месте вызова через .format(...). """ class AuthTexts: # bot_started — заблокированный пользователь BLOCKED = ( "⛔ Ваш номер не найден в системе. Доступ заблокирован.\n" "Обратитесь к администратору для подключения." ) # /start — заблокированный пользователь BLOCKED_SHORT = "⛔ Доступ заблокирован. Обратитесь к администратору." # bot_started — новый пользователь WELCOME_NEW = ( "👋 Добро пожаловать в систему технической поддержки!\n\n" "Для входа нажмите кнопку ниже и поделитесь своим номером телефона." ) # /start — новый пользователь WELCOME_START = ( "👋 Добро пожаловать!\n\n" "Поделитесь номером телефона для доступа к системе." ) # /start — пользователь не авторизован SHARE_PHONE = "Поделитесь номером телефона для доступа:" # bot_started — возвращающийся пользователь (префикс перед текстом меню) WELCOME_BACK = "👋 С возвращением!\n\n" # Успешная авторизация (префикс перед текстом меню) AUTHORIZED = "✅ Вы успешно авторизованы!\n\n" # Ошибки при шаринге контакта CONTACT_READ_ERROR = "Не удалось прочитать контакт. Попробуйте ещё раз." CONTACT_NO_PHONE = "В контакте не найден номер телефона. Попробуйте ещё раз." # Загрузка после шаринга номера LOADING = "⏳ Проверяем номер..." # Телефон не найден в белом списке PHONE_NOT_FOUND = ( "⛔ Ваш номер не найден в системе.\n" "Доступ заблокирован. Обратитесь к администратору для подключения." ) class TicketTexts: # Шаг 1 — приглашение описать проблему ENTER_DESCRIPTION = ( "📝 Опишите вашу проблему.\n\n" "Вы также можете прикрепить файлы, фото или голосовые сообщения.\n" "Когда закончите — нажмите «👁 Перейти к предпросмотру»." ) # Прислали что-то без текста и без вложений NEED_TEXT = "❗ Пожалуйста, напишите описание проблемы текстом." # Прислали файл, но нет текста FILE_RECEIVED_NEED_TEXT = "✅ Вложение принято! Теперь напишите описание проблемы текстом:" # Описание принято, можно добавить ещё DESCRIPTION_ACCEPTED = ( "✏️ Описание принято. Вы можете добавить ещё файлы " "или нажмите «👁 Перейти к предпросмотру»." ) # Нажали «Готово» без описания — уведомление PREVIEW_NEED_TEXT_NOTIF = "Сначала опишите проблему!" # Нажали «Готово» без описания — сообщение PREVIEW_NEED_TEXT = "❗ Пожалуйста, сначала напишите описание проблемы." # Вернулись к редактированию из предпросмотра CONTINUE_EDITING = ( "✏️ Продолжайте добавлять описание или вложения.\n" "Нажмите «👁 Перейти к предпросмотру» когда будете готовы." ) # Уведомление при отмене создания CANCEL_NOTIF = "Создание отменено" # Отправка заявки SENDING = "⏳ Отправляем заявку…" # Успешное создание CREATED = "✅ Заявка успешно создана!" # Номер созданной заявки: .format(number=n) CREATED_NUMBER = "Номер заявки: #{number}" # Подпись после создания CREATED_CONTACT = "Наши специалисты свяжутся с вами в ближайшее время." # Предпросмотр PREVIEW_HEADER = "📋 Предпросмотр заявки:" PREVIEW_ATTACHMENTS_HEADER = "📎 Вложения:" PREVIEW_CONFIRM_PROMPT = "Всё верно? Подтвердите или вернитесь к редактированию." # Подписи вложений в предпросмотре ATT_PHOTO = "🖼 Фото" ATT_VIDEO = "📹 Видео" ATT_AUDIO = "🎤 Голосовое" ATT_AUDIO_DUR = "🎤 Голосовое ({mins:02d}:{secs:02d})" ATT_FILE = "📎 {fname}" ATT_FILE_UNNAMED = "📎 Файл" ATT_OTHER = "📎 Вложение" class TicketListTexts: LOADING = "⏳ Загружаем список заявок..." NO_ORG = "⚠️ Ваша организация не привязана к Intradesk. Обратитесь к администратору." EMPTY = "📭 Активных заявок нет." # Заголовок списка: .format(total=n, page=n, pages=n) HEADER = "📋 Активные заявки (всего: {total}) — стр. {page}/{pages}" NO_COMMENTS = "💬 Нет комментариев" class TicketDetailTexts: LOADING = "⏳ Загружаем заявку..." NOT_FOUND = "⚠️ Заявка не найдена. Вернитесь к списку." DESCRIPTION_HEADER = "📝 Описание:" COMMENTS_HEADER = "💬 Комментарии ({count}):" NO_COMMENTS = "💬 Комментариев нет" # Закрытие заявки CLOSING = "⏳ Закрываем заявку..." # .format(num_str=" #123" или "") CLOSED = "✅ Заявка{num_str} закрыта." CLOSE_ERROR = "⚠️ Не удалось закрыть заявку. Попробуйте позже." CLOSE_NUMBER_ERROR = "⚠️ Не удалось определить номер заявки. Вернитесь к списку." GENERIC_ERROR = "Ошибка" class CommentTexts: # .format(num_str=" к заявке #123" или "") PROMPT = ( "💬 Напишите комментарий{num_str}:\n\n" "Можно отправить текст, файл, фото или голосовое сообщение.\n" "Нажмите «← Назад к заявке» для отмены." ) EMPTY_ERROR = "❗ Комментарий не может быть пустым. Напишите текст или прикрепите файл:" FILE_ONLY = "📎 Файл прикреплён" # .format(num_str=" к заявке #123" или "") SUCCESS = "✅ Комментарий{num_str} успешно отправлен!" ERROR = "⚠️ Не удалось отправить комментарий. Попробуйте позже." class MenuTexts: LOADING = "⏳ Загружаем меню..." SEPARATOR = "━" * 16 # .format(org_name="...") ORG_HEADER = "🏢 {org_name}" NO_ORG_HEADER = "🏠 Поддержка" NO_TICKETS = "📭 Активных заявок нет" NO_TICKETS_HINT = "Нажмите «Создать заявку» и мы\nсвяжемся с вами в ближайшее время." # .format(active=n) ACTIVE_COUNT = "📋 Активных заявок: {active}" # .format(num_str=" (заявка #123)" или "") LAST_COMMENT = "💬 Последний ответ{num_str}:" # .format(author="...", short_date="...") LAST_COMMENT_AUTHOR = "— {author}, {short_date}" NO_NEW_COMMENTS = "💬 Новых ответов нет" NO_ORG_DATA = "📭 Нет данных об организации" CHOOSE_ACTION = "Выберите действие 👇" # Префикс при /cancel с активным флоу CANCEL_PREFIX = "❌ Действие отменено.\n\n" class QuickReplyTexts: # .format(number=task_number, text=user_text) CONFIRM = ( "📨 Отправить как ответ на заявку #{number}?\n\n" "«{text}»" ) # .format(number=task_number) SENT = "✅ Ответ на заявку #{number} отправлен." ERROR = "⚠️ Не удалось отправить ответ. Попробуйте через меню." class Btn: """Подписи всех inline-кнопок.""" # Главное меню CREATE_TICKET = "📝 Создать заявку" VIEW_TICKETS = "📋 Мои заявки" MAIN_MENU = "🏠 Главное меню" # Авторизация SHARE_CONTACT = "📱 Поделиться контактом" # Создание заявки DONE_TICKET = "✅ Готово" CONFIRM_TICKET = "✅ Подтвердить" EDIT_TICKET = "✏️ Продолжить редактирование" CANCEL_TICKET = "❌ Отменить создание" # Навигация по заявкам PREV_PAGE = "← Пред." NEXT_PAGE = "След. →" BACK_TO_MENU = "← Назад в меню" BACK_TO_LIST = "← К списку заявок" BACK_TO_TICKET = "← Назад к заявке" BACK_TO_TICKETS = "← К списку" # Карточка заявки ADD_COMMENT = "💬 Оставить комментарий" CLOSE_TICKET = "🔒 Закрыть заявку" # Уведомления и быстрый ответ REPLY_TO_TICKET = "💬 Ответить" OPEN_TICKET = "📋 К заявке" CONFIRM_REPLY = "✅ Отправить" CANCEL_REPLY = "❌ Отмена" CHOOSE_TICKET = "📋 Выбрать другую заявку"