193 lines
10 KiB
Python
193 lines
10 KiB
Python
"""
|
||
Все пользовательские тексты и подписи кнопок.
|
||
|
||
Шаблоны с плейсхолдерами форматируются на месте вызова через .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 = "📋 Выбрать другую заявку"
|