first step
This commit is contained in:
91
locales/__init__.py
Normal file
91
locales/__init__.py
Normal 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
45
locales/en.json
Normal 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
45
locales/kz.json
Normal 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
45
locales/ru.json
Normal 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": "🇰🇿 Қазақша"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user