first step

This commit is contained in:
2026-04-05 12:18:33 +03:00
parent 4a03f3e3cf
commit 3992121397
17 changed files with 3367 additions and 0 deletions

91
locales/__init__.py Normal file
View File

@@ -0,0 +1,91 @@
import json
from pathlib import Path
from typing import Optional
class Localization:
"""Класс для управления локализацией"""
_instance = None
_locales = {}
_default_locale = "ru"
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self):
if not self._locales:
self.load_locales()
def load_locales(self):
"""Загрузка всех файлов локализации"""
locales_dir = Path(__file__).parent
for locale_file in locales_dir.glob("*.json"):
locale_code = locale_file.stem
with open(locale_file, "r", encoding="utf-8") as f:
self._locales[locale_code] = json.load(f)
def get(self, key: str, locale: str = None, **kwargs) -> str:
"""
Получение локализованной строки
Args:
key: Ключ строки (например, "welcome", "buttons.buy_subscription")
locale: Код языка (ru, en, kz)
**kwargs: Параметры для форматирования строки
"""
if locale is None:
locale = self._default_locale
if locale not in self._locales:
locale = self._default_locale
keys = key.split(".")
value = self._locales.get(locale, {})
for k in keys:
if isinstance(value, dict):
value = value.get(k)
else:
value = None
break
if value is None:
# Пытаемся найти в default locale
value = self._locales.get(self._default_locale, {})
for k in keys:
if isinstance(value, dict):
value = value.get(k)
else:
value = None
break
if value is None:
return key
if kwargs:
try:
value = value.format(**kwargs)
except KeyError:
pass
return value
def get_locale_name(self, locale: str) -> str:
"""Получение названия языка на родном языке"""
return self.get(f"languages.{locale}", locale)
def set_default_locale(self, locale: str):
"""Установка языка по умолчанию"""
if locale in self._locales:
self._default_locale = locale
def get_available_locales(self) -> list:
"""Получение списка доступных языков"""
return list(self._locales.keys())
# Глобальный экземпляр локализации
localization = Localization()

45
locales/en.json Normal file
View File

@@ -0,0 +1,45 @@
{
"welcome": "Hello, {username}!",
"subscription_status": "Your subscription: {status}",
"select_action": "Select an action:",
"subscription_active": "Active",
"subscription_inactive": "Inactive",
"buttons": {
"buy_subscription": "💳 Buy Subscription",
"support": "📞 Support",
"rules": "📜 Service Rules",
"language": "🌐 Language",
"back": "🔙 Back"
},
"messages": {
"support": "Support: {username}",
"support_title": "📞 Support",
"support_description": "This is the ticket center: create requests, view responses and history.\n\n📝 Create ticket - describe your problem or question.\n📋 My tickets - status and correspondence\n\nTry to use tickets - this way we can help faster and nothing gets lost.",
"rules_title": "📜 VPN Rules",
"rules_text": "1. By using the bot, you agree to the rules and use the service lawfully.\n2. VPN is designed to protect data and secure internet access.\n3. Prohibited: hacking, spam, fraud, viruses and illegal content 🚫\n4. User is solely responsible for their actions.\n5. Technical data may be collected (not shared with third parties, except by law).\n6. Access may be restricted without refund for violations.\n\n⚠ VPN does not guarantee complete anonymity.",
"select_tariff": "Select tariff:",
"tariff_selected": "You selected: {tariff}",
"select_language": "Выберите язык / Select language:",
"language_changed": "Language changed to {language}",
"payment_instruction_title": "Hello! 👋",
"payment_instruction_text": "To purchase a subscription, follow these steps:\n\n1⃣ Transfer via SBP to: {phone}\n2⃣ After payment, send the receipt or screenshot to this chat\n\nAfter payment confirmation, we will activate your subscription.\n\nThank you! 😊",
"payment_receipt_sent": "✅ Receipt received! Wait for payment confirmation."
},
"subscription": {
"standard_title": "Standard Subscription",
"standard_description": "Basic tariff plan"
},
"tariffs": {
"14_days": "14 days - 150₽",
"30_days": "30 days - 300₽",
"60_days": "60 days - 600₽",
"90_days": "90 days - 900₽",
"180_days": "180 days - 1800₽",
"360_days": "360 days - 3600₽"
},
"languages": {
"ru": "🇷🇺 Русский",
"en": "🇬🇧 English",
"kz": "🇰🇿 Қазақша"
}
}

45
locales/kz.json Normal file
View File

@@ -0,0 +1,45 @@
{
"welcome": "Сәлем, {username}!",
"subscription_status": "Сіздің жазылымыңыз: {status}",
"select_action": "Әрекетті таңдаңыз:",
"subscription_active": "Белсенді",
"subscription_inactive": "Белсенді емес",
"buttons": {
"buy_subscription": "💳 Жазылуды сатып алу",
"support": "📞 Қолдау қызметі",
"rules": "📜 Қызмет ережелері",
"language": "🌐 Тіл",
"back": "🔙 Артқа"
},
"messages": {
"support": "Қолдау қызметі: {username}",
"support_title": "📞 Қолдау",
"support_description": "Бұл тикет орталығы: өтініштер жасау, жауаптарды және тарихты қарау.\n\n📝 Тикет жасау - мәселеңізді немесе сұрағыңызды сипаттаңыз.\n📋 Менің тикеттерім - мәртебе және хат алмасу\n\nТикеттерді пайдаланыңыз - біз жылдамырақ көмектесеміз және ештеңе жоғалмайды.",
"rules_title": "📜 VPN ережелері",
"rules_text": "1. Ботты пайдалана отырып, сіз ережелермен келісесіз және сервисді заңды түрде пайдаланасыз.\n2. VPN деректерді қорғау және қауіпсіз интернетке қол жеткізу үшін арналған.\n3. Тыйым салынады: бұзу, спам, алаяқтық, вирустар және заңсыз контент 🚫\n4. Пайдаланушы өз әрекеттері үшін дербес жауап береді.\n5. Техникалық деректер жиналуы мүмкін (заңды жағдайларды қоспағанда, үшінші тұлғаларға берілмейді).\n6. Ережелерді бұзған жағдайда қол жеткізу қайтарусыз шектелуі мүмкін.\n\n⚠ VPN толық анонимділікті кепілдік бермейді.",
"select_tariff": "Тарифті таңдаңыз:",
"tariff_selected": "Сіз таңдадыңыз: {tariff}",
"select_language": "Выберите язык / Select language:",
"language_changed": "Тіл өзгертілді: {language}",
"payment_instruction_title": "Сәлем! 👋",
"payment_instruction_text": "Жазылымды сатып алу үшін мына әрекеттерді орындаңыз:\n\n1⃣ СБП арқылы {phone} нөміріне аударыңыз\n2⃣ Төлемнен кейін чекті немесе скриншотты осы чатқа жіберіңіз\n\nТөлем расталғаннан кейін жазылымыңызды белсендіреміз.\n\nРақмет! 😊",
"payment_receipt_sent": "✅ Чек қабылданды! Төлемнің расталуын күтіңіз."
},
"subscription": {
"standard_title": "Стандартты жазылым",
"standard_description": "Негізгі тарифтік жоспар"
},
"tariffs": {
"14_days": "14 күн - 150₽",
"30_days": "30 күн - 300₽",
"60_days": "60 күн - 600₽",
"90_days": "90 күн - 900₽",
"180_days": "180 күн - 1800₽",
"360_days": "360 күн - 3600₽"
},
"languages": {
"ru": "🇷🇺 Русский",
"en": "🇬🇧 English",
"kz": "🇰🇿 Қазақша"
}
}

45
locales/ru.json Normal file
View File

@@ -0,0 +1,45 @@
{
"welcome": "Привет, {username}!",
"subscription_status": "Твоя подписка: {status}",
"select_action": "Выберите действие:",
"subscription_active": "Активна",
"subscription_inactive": "Не активна",
"buttons": {
"buy_subscription": "💳 Купить подписку",
"support": "📞 Техподдержка",
"rules": "📜 Правила сервиса",
"language": "🌐 Язык",
"back": "🔙 Назад"
},
"messages": {
"support": "Техподдержка: {username}",
"support_title": "📞 Поддержка",
"support_description": "Это центр тикетов: создавайте обращения, просматривайте ответы и историю.\n\n📝 Создать тикет - опишите проблему или вопрос.\n📋 Мои тикеты - статус и переписка\n\nСтарайтесь использовать тикеты - так мы быстрее поможем и ничего не потеряется.",
"rules_title": "📜 Правила VPN",
"rules_text": "1. Используя бота, вы соглашаетесь с правилами и используете сервис законно.\n2. VPN предназначен для защиты данных и безопасного доступа к интернету.\n3. Запрещены: взломы, спам, мошенничество, вирусы и незаконный контент 🚫\n4. Пользователь сам несёт ответственность за свои действия.\n5. Возможен сбор технических данных (без передачи третьим лицам, кроме закона).\n6. За нарушения доступ может быть ограничен без возврата средств.\n\n⚠ VPN не гарантирует полной анонимности.",
"select_tariff": "Выберите тариф:",
"tariff_selected": "Вы выбрали тариф: {tariff}",
"select_language": "Выберите язык / Select language:",
"language_changed": "Язык изменён на {language}",
"payment_instruction_title": "Здравствуйте! 👋",
"payment_instruction_text": "Чтобы приобрести подписку, выполните следующие шаги:\n\n1⃣ Переведите сумму через СБП по номеру: {phone}\n2⃣ После оплаты отправьте чек или скриншот перевода в этот чат\n\nПосле подтверждения оплаты мы активируем вашу подписку.\n\nСпасибо! 😊",
"payment_receipt_sent": "✅ Чек получен! Ожидайте подтверждения оплаты."
},
"subscription": {
"standard_title": "Стандартная подписка",
"standard_description": "Базовый тарифный план"
},
"tariffs": {
"14_days": "14 дней - 150₽",
"30_days": "30 дней - 300₽",
"60_days": "60 дней - 600₽",
"90_days": "90 дней - 900₽",
"180_days": "180 дней - 1800₽",
"360_days": "360 дней - 3600₽"
},
"languages": {
"ru": "🇷🇺 Русский",
"en": "🇬🇧 English",
"kz": "🇰🇿 Қазақша"
}
}