Add project files
This commit is contained in:
parent
ace5cf9e70
commit
32e797bce7
0
bot/__init__.py
Normal file
0
bot/__init__.py
Normal file
3
bot/admin.py
Normal file
3
bot/admin.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
5
bot/apps.py
Normal file
5
bot/apps.py
Normal file
@ -0,0 +1,5 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class BotConfig(AppConfig):
|
||||
name = 'bot'
|
||||
85
bot/handlers.py
Normal file
85
bot/handlers.py
Normal file
@ -0,0 +1,85 @@
|
||||
# bot/handlers.py
|
||||
from telegram import Update
|
||||
from telegram.ext import ContextTypes
|
||||
from django.utils import translation
|
||||
from django.utils.translation import gettext as _
|
||||
from .utils import render_keyboard, render_message
|
||||
from .router import router
|
||||
|
||||
# 1. Сценарий: Меню
|
||||
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
# Установка языка по умолчанию
|
||||
context.user_data['lang'] = 'ru'
|
||||
|
||||
keyboard = render_keyboard('bot/menu.html')
|
||||
text = _("Добро пожаловать! Выберите действие:")
|
||||
|
||||
await update.message.reply_text(text, reply_markup=keyboard)
|
||||
|
||||
# Обработчики callback-ов через наш роутер
|
||||
|
||||
@router.route('set_lang')
|
||||
async def set_language_menu(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
# Показываем меню выбора языка
|
||||
keyboard = render_keyboard('bot/lang_menu.html')
|
||||
await update.callback_query.edit_message_text(
|
||||
_("Выберите язык интерфейса:"),
|
||||
reply_markup=keyboard
|
||||
)
|
||||
|
||||
@router.route('lang_ru')
|
||||
async def lang_ru(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
context.user_data['lang'] = 'ru'
|
||||
translation.activate('ru')
|
||||
await show_main_menu(update, _("Язык сменен на Русский"))
|
||||
|
||||
@router.route('lang_en')
|
||||
async def lang_en(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
context.user_data['lang'] = 'en'
|
||||
translation.activate('en')
|
||||
await show_main_menu(update, _("Language changed to English"))
|
||||
|
||||
@router.route('lang_fr')
|
||||
async def lang_fr(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
context.user_data['lang'] = 'fr'
|
||||
translation.activate('fr')
|
||||
await show_main_menu(update, _("Язык сменен на Французский"))
|
||||
|
||||
@router.route('lang_de')
|
||||
async def lang_de(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
context.user_data['lang'] = 'de'
|
||||
translation.activate('de')
|
||||
await show_main_menu(update, _("Язык сменен на Немецкий"))
|
||||
|
||||
@router.route('profile')
|
||||
async def profile(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
user = update.effective_user
|
||||
text = _("Ваш профиль:\nID: {id}\nИмя: {name}").format(id=user.id, name=user.first_name)
|
||||
|
||||
keyboard = render_keyboard('bot/back.html')
|
||||
await update.callback_query.edit_message_text(text, reply_markup=keyboard)
|
||||
|
||||
@router.route('help')
|
||||
async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
# Текст помощи (можно тоже вынести в HTML, но для простоты тут текст)
|
||||
text = _("ℹ️ *Справка*\n\n"
|
||||
"Это демонстрационный бот на Django.\n"
|
||||
"Вы можете менять язык интерфейса и смотреть профиль.\n\n"
|
||||
"Версия: 1.0")
|
||||
|
||||
# Используем кнопку "Назад", которая у нас уже есть
|
||||
keyboard = render_keyboard('bot/back.html')
|
||||
|
||||
await update.callback_query.edit_message_text(
|
||||
text,
|
||||
reply_markup=keyboard,
|
||||
parse_mode='Markdown'
|
||||
)
|
||||
|
||||
@router.route('main_menu')
|
||||
async def back_to_main(update: Update, context: ContextTypes.DEFAULT_TYPE):
|
||||
await show_main_menu(update, _("Главное меню"))
|
||||
|
||||
async def show_main_menu(update, text):
|
||||
keyboard = render_keyboard('bot/menu.html')
|
||||
await update.callback_query.edit_message_text(text, reply_markup=keyboard)
|
||||
0
bot/management/__init__.py
Normal file
0
bot/management/__init__.py
Normal file
0
bot/management/commands/__init__.py
Normal file
0
bot/management/commands/__init__.py
Normal file
28
bot/management/commands/runbot.py
Normal file
28
bot/management/commands/runbot.py
Normal file
@ -0,0 +1,28 @@
|
||||
# bot/management/commands/runbot.py
|
||||
from django.core.management.base import BaseCommand
|
||||
from django.conf import settings
|
||||
from telegram.ext import ApplicationBuilder, CommandHandler, CallbackQueryHandler
|
||||
from bot.handlers import start, router
|
||||
import logging
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Запускает Telegram бота'
|
||||
|
||||
def handle(self, *args, **options):
|
||||
# Логирование для отладки
|
||||
logging.basicConfig(
|
||||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||||
level=logging.INFO
|
||||
)
|
||||
|
||||
print("Starting bot...")
|
||||
|
||||
application = ApplicationBuilder().token(settings.TELEGRAM_TOKEN).build()
|
||||
|
||||
# Регистрация хендлеров
|
||||
application.add_handler(CommandHandler("start", start))
|
||||
|
||||
# Все callback-и идут в наш роутер
|
||||
application.add_handler(CallbackQueryHandler(router.handle))
|
||||
|
||||
application.run_polling()
|
||||
0
bot/migrations/__init__.py
Normal file
0
bot/migrations/__init__.py
Normal file
3
bot/models.py
Normal file
3
bot/models.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
44
bot/router.py
Normal file
44
bot/router.py
Normal file
@ -0,0 +1,44 @@
|
||||
import logging
|
||||
from django.utils import translation
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class CallbackRouter:
|
||||
def __init__(self):
|
||||
self.routes = {}
|
||||
|
||||
def route(self, pattern):
|
||||
"""Декоратор для регистрации обработчика callback"""
|
||||
def decorator(func):
|
||||
self.routes[pattern] = func
|
||||
return func
|
||||
return decorator
|
||||
|
||||
async def handle(self, update, context):
|
||||
query = update.callback_query
|
||||
await query.answer()
|
||||
|
||||
data = query.data
|
||||
# Простой протокол: "action:payload"
|
||||
action = data.split(':')[0]
|
||||
|
||||
handler = self.routes.get(action)
|
||||
if handler:
|
||||
# Берем язык из данных пользователя (по умолчанию ru)
|
||||
user_lang = context.user_data.get('lang', 'ru')
|
||||
translation.activate(user_lang)
|
||||
|
||||
try:
|
||||
await handler(update, context)
|
||||
except Exception as e:
|
||||
logger.error(f"Error in handler {action}: {e}")
|
||||
finally:
|
||||
translation.deactivate()
|
||||
else:
|
||||
try:
|
||||
await query.edit_message_text("Неизвестная команда / Unknown command")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# Глобальный объект роутера, который мы импортируем в handlers.py
|
||||
router = CallbackRouter()
|
||||
4
bot/templates/bot/back.html
Normal file
4
bot/templates/bot/back.html
Normal file
@ -0,0 +1,4 @@
|
||||
{% load i18n %}
|
||||
<ul>
|
||||
<li><a href="main_menu">🔙 {% trans "Вернуться в меню" %}</a></li>
|
||||
</ul>
|
||||
8
bot/templates/bot/lang_menu.html
Normal file
8
bot/templates/bot/lang_menu.html
Normal file
@ -0,0 +1,8 @@
|
||||
{% load i18n %}
|
||||
<ul>
|
||||
<li><a href="lang_ru">🇷🇺 Русский</a></li>
|
||||
<li><a href="lang_en">🇺🇸 English</a></li>
|
||||
<li><a href="lang_fr">🇫🇷 Français</a></li>
|
||||
<li><a href="lang_de">🇩🇪 Deutsch</a></li>
|
||||
<li><a href="main_menu">🔙 {% trans "Назад" %}</a></li>
|
||||
</ul>
|
||||
10
bot/templates/bot/menu.html
Normal file
10
bot/templates/bot/menu.html
Normal file
@ -0,0 +1,10 @@
|
||||
{% load i18n %}
|
||||
<ul>
|
||||
<li>
|
||||
<a href="profile">{% trans "👤 Профиль" %}</a>
|
||||
<a href="set_lang">{% trans "🌐 Язык" %}</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="help">{% trans "ℹ️ Помощь" %}</a>
|
||||
</li>
|
||||
</ul>
|
||||
3
bot/tests.py
Normal file
3
bot/tests.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
40
bot/utils.py
Normal file
40
bot/utils.py
Normal file
@ -0,0 +1,40 @@
|
||||
from bs4 import BeautifulSoup
|
||||
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
|
||||
from django.template.loader import render_to_string
|
||||
|
||||
def render_keyboard(template_name, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
html_content = render_to_string(template_name, context)
|
||||
soup = BeautifulSoup(html_content, 'html.parser')
|
||||
keyboard = []
|
||||
|
||||
# Если есть списки <li>, считаем их строками
|
||||
rows = soup.find_all('li')
|
||||
if not rows:
|
||||
# Если списков нет, собираем все ссылки в одну строку
|
||||
buttons = []
|
||||
for a in soup.find_all('a'):
|
||||
text = a.get_text(strip=True)
|
||||
callback_data = a.get('href')
|
||||
buttons.append(InlineKeyboardButton(text=text, callback_data=callback_data))
|
||||
if buttons:
|
||||
keyboard.append(buttons)
|
||||
else:
|
||||
for row in rows:
|
||||
row_buttons = []
|
||||
for a in row.find_all('a'):
|
||||
text = a.get_text(strip=True)
|
||||
callback_data = a.get('href')
|
||||
row_buttons.append(InlineKeyboardButton(text=text, callback_data=callback_data))
|
||||
if row_buttons:
|
||||
keyboard.append(row_buttons)
|
||||
|
||||
return InlineKeyboardMarkup(keyboard)
|
||||
|
||||
def render_message(template_name, context=None):
|
||||
html_content = render_to_string(template_name, context)
|
||||
soup = BeautifulSoup(html_content, 'html.parser')
|
||||
for tag in soup.find_all(['ul', 'li', 'a']):
|
||||
tag.decompose()
|
||||
return soup.get_text(separator='\n', strip=True)
|
||||
3
bot/views.py
Normal file
3
bot/views.py
Normal file
@ -0,0 +1,3 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
||||
0
config/__init__.py
Normal file
0
config/__init__.py
Normal file
16
config/asgi.py
Normal file
16
config/asgi.py
Normal file
@ -0,0 +1,16 @@
|
||||
"""
|
||||
ASGI config for config project.
|
||||
|
||||
It exposes the ASGI callable as a module-level variable named ``application``.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/6.0/howto/deployment/asgi/
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
from django.core.asgi import get_asgi_application
|
||||
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
|
||||
|
||||
application = get_asgi_application()
|
||||
90
config/settings.py
Normal file
90
config/settings.py
Normal file
@ -0,0 +1,90 @@
|
||||
from pathlib import Path
|
||||
import os
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# 1. Загружаем переменные из .env
|
||||
load_dotenv()
|
||||
|
||||
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||
|
||||
# 2. Настройки безопасности
|
||||
SECRET_KEY = os.getenv('SECRET_KEY', 'django-insecure-default-key-if-env-missing')
|
||||
DEBUG = os.getenv('DEBUG') == 'True'
|
||||
ALLOWED_HOSTS = []
|
||||
|
||||
# 3. ПОДКЛЮЧЕННЫЕ ПРИЛОЖЕНИЯ (Этого не хватало!)
|
||||
INSTALLED_APPS = [
|
||||
'django.contrib.admin',
|
||||
'django.contrib.auth',
|
||||
'django.contrib.contenttypes',
|
||||
'django.contrib.sessions',
|
||||
'django.contrib.messages',
|
||||
'django.contrib.staticfiles',
|
||||
'bot',
|
||||
]
|
||||
|
||||
MIDDLEWARE = [
|
||||
'django.middleware.security.SecurityMiddleware',
|
||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||
'django.middleware.common.CommonMiddleware',
|
||||
'django.middleware.csrf.CsrfViewMiddleware',
|
||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||
'django.contrib.messages.middleware.MessageMiddleware',
|
||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||
]
|
||||
|
||||
ROOT_URLCONF = 'config.urls'
|
||||
|
||||
# 4. НАСТРОЙКИ ШАБЛОНОВ (Нужны для вашего HTML-DSL)
|
||||
TEMPLATES = [
|
||||
{
|
||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||
'DIRS': [],
|
||||
'APP_DIRS': True, # Важно: True, чтобы искать шаблоны внутри папки bot/templates
|
||||
'OPTIONS': {
|
||||
'context_processors': [
|
||||
'django.template.context_processors.debug',
|
||||
'django.template.context_processors.request',
|
||||
'django.contrib.auth.context_processors.auth',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
],
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
WSGI_APPLICATION = 'config.wsgi.application'
|
||||
|
||||
# 5. База данных (SQLite по умолчанию)
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': BASE_DIR / 'db.sqlite3',
|
||||
}
|
||||
}
|
||||
|
||||
# 6. Язык и локализация (Ваши настройки)
|
||||
LANGUAGE_CODE = 'ru'
|
||||
TIME_ZONE = 'UTC'
|
||||
USE_I18N = True
|
||||
USE_TZ = True
|
||||
|
||||
LANGUAGES = [
|
||||
('ru', 'Russian'),
|
||||
('en', 'English'),
|
||||
('fr', 'French'),
|
||||
('de', 'German'),
|
||||
]
|
||||
|
||||
LOCALE_PATHS = [
|
||||
BASE_DIR / 'locale',
|
||||
]
|
||||
|
||||
STATIC_URL = 'static/'
|
||||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||
|
||||
# 7. Токен бота
|
||||
TELEGRAM_TOKEN = os.getenv('TELEGRAM_TOKEN')
|
||||
|
||||
# Проверка, чтобы не запускать без токена
|
||||
if not TELEGRAM_TOKEN:
|
||||
print("WARNING: TELEGRAM_TOKEN не найден в .env, бот не запустится!")
|
||||
22
config/urls.py
Normal file
22
config/urls.py
Normal file
@ -0,0 +1,22 @@
|
||||
"""
|
||||
URL configuration for config project.
|
||||
|
||||
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||
https://docs.djangoproject.com/en/6.0/topics/http/urls/
|
||||
Examples:
|
||||
Function views
|
||||
1. Add an import: from my_app import views
|
||||
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
||||
Class-based views
|
||||
1. Add an import: from other_app.views import Home
|
||||
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
||||
Including another URLconf
|
||||
1. Import the include() function: from django.urls import include, path
|
||||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||
"""
|
||||
from django.contrib import admin
|
||||
from django.urls import path
|
||||
|
||||
urlpatterns = [
|
||||
path('admin/', admin.site.urls),
|
||||
]
|
||||
16
config/wsgi.py
Normal file
16
config/wsgi.py
Normal file
@ -0,0 +1,16 @@
|
||||
"""
|
||||
WSGI config for config project.
|
||||
|
||||
It exposes the WSGI callable as a module-level variable named ``application``.
|
||||
|
||||
For more information on this file, see
|
||||
https://docs.djangoproject.com/en/6.0/howto/deployment/wsgi/
|
||||
"""
|
||||
|
||||
import os
|
||||
|
||||
from django.core.wsgi import get_wsgi_application
|
||||
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
|
||||
|
||||
application = get_wsgi_application()
|
||||
50
locale/de/LC_MESSAGES/django.po
Normal file
50
locale/de/LC_MESSAGES/django.po
Normal file
@ -0,0 +1,50 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-28 23:00+0000\n"
|
||||
"PO-Revision-Date: 2025-12-28 23:00+0000\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "👤 Профиль"
|
||||
msgstr "👤 Profil"
|
||||
|
||||
msgid "🌐 Язык"
|
||||
msgstr "🌐 Sprache"
|
||||
|
||||
msgid "ℹ️ Помощь"
|
||||
msgstr "ℹ️ Hilfe"
|
||||
|
||||
msgid "Назад"
|
||||
msgstr "Zurück"
|
||||
|
||||
msgid "Вернуться в меню"
|
||||
msgstr "Zurück zum Menü"
|
||||
|
||||
msgid "Добро пожаловать! Выберите действие:"
|
||||
msgstr "Willkommen! Wählen Sie eine Aktion:"
|
||||
|
||||
msgid "Выберите язык интерфейса:"
|
||||
msgstr "Wählen Sie die Sprache:"
|
||||
|
||||
msgid "Главное меню"
|
||||
msgstr "Hauptmenü"
|
||||
|
||||
msgid "Язык сменен на Русский"
|
||||
msgstr "Sprache auf Russisch geändert"
|
||||
|
||||
msgid "Language changed to English"
|
||||
msgstr "Sprache auf Englisch geändert"
|
||||
|
||||
msgid "Язык сменен на Французский"
|
||||
msgstr "Sprache auf Französisch geändert"
|
||||
|
||||
msgid "Язык сменен на Немецкий"
|
||||
msgstr "Sprache auf Deutsch geändert"
|
||||
|
||||
msgid "Ваш профиль:\nID: {id}\nИмя: {name}"
|
||||
msgstr "Ihr Profil:\nID: {id}\nName: {name}"
|
||||
50
locale/en/LC_MESSAGES/django.po
Normal file
50
locale/en/LC_MESSAGES/django.po
Normal file
@ -0,0 +1,50 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-28 23:00+0000\n"
|
||||
"PO-Revision-Date: 2025-12-28 23:00+0000\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "👤 Профиль"
|
||||
msgstr "👤 Profile"
|
||||
|
||||
msgid "🌐 Язык"
|
||||
msgstr "🌐 Language"
|
||||
|
||||
msgid "ℹ️ Помощь"
|
||||
msgstr "ℹ️ Help"
|
||||
|
||||
msgid "Назад"
|
||||
msgstr "Back"
|
||||
|
||||
msgid "Вернуться в меню"
|
||||
msgstr "Back to menu"
|
||||
|
||||
msgid "Добро пожаловать! Выберите действие:"
|
||||
msgstr "Welcome! Choose an action:"
|
||||
|
||||
msgid "Выберите язык интерфейса:"
|
||||
msgstr "Choose interface language:"
|
||||
|
||||
msgid "Главное меню"
|
||||
msgstr "Main menu"
|
||||
|
||||
msgid "Язык сменен на Русский"
|
||||
msgstr "Language changed to Russian"
|
||||
|
||||
msgid "Language changed to English"
|
||||
msgstr "Language changed to English"
|
||||
|
||||
msgid "Язык сменен на Французский"
|
||||
msgstr "Language changed to French"
|
||||
|
||||
msgid "Язык сменен на Немецкий"
|
||||
msgstr "Language changed to German"
|
||||
|
||||
msgid "Ваш профиль:\nID: {id}\nИмя: {name}"
|
||||
msgstr "Your profile:\nID: {id}\nName: {name}"
|
||||
50
locale/fr/LC_MESSAGES/django.po
Normal file
50
locale/fr/LC_MESSAGES/django.po
Normal file
@ -0,0 +1,50 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-28 23:00+0000\n"
|
||||
"PO-Revision-Date: 2025-12-28 23:00+0000\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "👤 Профиль"
|
||||
msgstr "👤 Profil"
|
||||
|
||||
msgid "🌐 Язык"
|
||||
msgstr "🌐 Langue"
|
||||
|
||||
msgid "ℹ️ Помощь"
|
||||
msgstr "ℹ️ Aide"
|
||||
|
||||
msgid "Назад"
|
||||
msgstr "Retour"
|
||||
|
||||
msgid "Вернуться в меню"
|
||||
msgstr "Retour au menu"
|
||||
|
||||
msgid "Добро пожаловать! Выберите действие:"
|
||||
msgstr "Bienvenue ! Choisissez une action :"
|
||||
|
||||
msgid "Выберите язык интерфейса:"
|
||||
msgstr "Choisissez la langue de l'interface :"
|
||||
|
||||
msgid "Главное меню"
|
||||
msgstr "Menu principal"
|
||||
|
||||
msgid "Язык сменен на Русский"
|
||||
msgstr "Langue changée en Russe"
|
||||
|
||||
msgid "Language changed to English"
|
||||
msgstr "Langue changée en Anglais"
|
||||
|
||||
msgid "Язык сменен на Французский"
|
||||
msgstr "Langue changée en Français"
|
||||
|
||||
msgid "Язык сменен на Немецкий"
|
||||
msgstr "Langue changée en Allemand"
|
||||
|
||||
msgid "Ваш профиль:\nID: {id}\nИмя: {name}"
|
||||
msgstr "Votre profil :\nID : {id}\nNom : {name}"
|
||||
50
locale/ru/LC_MESSAGES/django.po
Normal file
50
locale/ru/LC_MESSAGES/django.po
Normal file
@ -0,0 +1,50 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2025-12-28 23:00+0000\n"
|
||||
"PO-Revision-Date: 2025-12-28 23:00+0000\n"
|
||||
"Last-Translator: \n"
|
||||
"Language-Team: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "👤 Профиль"
|
||||
msgstr "👤 Профиль"
|
||||
|
||||
msgid "🌐 Язык"
|
||||
msgstr "🌐 Язык"
|
||||
|
||||
msgid "ℹ️ Помощь"
|
||||
msgstr "ℹ️ Помощь"
|
||||
|
||||
msgid "Назад"
|
||||
msgstr "Назад"
|
||||
|
||||
msgid "Вернуться в меню"
|
||||
msgstr "Вернуться в меню"
|
||||
|
||||
msgid "Добро пожаловать! Выберите действие:"
|
||||
msgstr "Добро пожаловать! Выберите действие:"
|
||||
|
||||
msgid "Выберите язык интерфейса:"
|
||||
msgstr "Выберите язык интерфейса:"
|
||||
|
||||
msgid "Главное меню"
|
||||
msgstr "Главное меню"
|
||||
|
||||
msgid "Язык сменен на Русский"
|
||||
msgstr "Язык сменен на Русский"
|
||||
|
||||
msgid "Language changed to English"
|
||||
msgstr "Язык сменен на Английский"
|
||||
|
||||
msgid "Язык сменен на Французский"
|
||||
msgstr "Язык сменен на Французский"
|
||||
|
||||
msgid "Язык сменен на Немецкий"
|
||||
msgstr "Язык сменен на Немецкий"
|
||||
|
||||
msgid "Ваш профиль:\nID: {id}\nИмя: {name}"
|
||||
msgstr "Ваш профиль:\nID: {id}\nИмя: {name}"
|
||||
22
manage.py
Normal file
22
manage.py
Normal file
@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env python
|
||||
"""Django's command-line utility for administrative tasks."""
|
||||
import os
|
||||
import sys
|
||||
|
||||
|
||||
def main():
|
||||
"""Run administrative tasks."""
|
||||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
|
||||
try:
|
||||
from django.core.management import execute_from_command_line
|
||||
except ImportError as exc:
|
||||
raise ImportError(
|
||||
"Couldn't import Django. Are you sure it's installed and "
|
||||
"available on your PYTHONPATH environment variable? Did you "
|
||||
"forget to activate a virtual environment?"
|
||||
) from exc
|
||||
execute_from_command_line(sys.argv)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Loading…
Reference in New Issue
Block a user