feature/localization #13

Merged
geekiot merged 7 commits from feature/localization into develop 2025-11-09 12:09:04 +05:00
4 changed files with 26 additions and 9 deletions
Showing only changes of commit 8320ab805e - Show all commits

View file

@ -1,8 +1,11 @@
__all__ = ["start_bot"] __all__ = ["start_bot"]
from pathlib import Path
from aiogram import Bot, Dispatcher from aiogram import Bot, Dispatcher
from aiogram.fsm.storage.redis import RedisStorage from aiogram.fsm.storage.redis import RedisStorage
from aiogram.utils.i18n import I18n
from loguru import logger as loguru_logger from loguru import logger as loguru_logger
from redis.asyncio.client import Redis from redis.asyncio.client import Redis
from sqlalchemy.ext.asyncio import async_sessionmaker from sqlalchemy.ext.asyncio import async_sessionmaker
@ -16,6 +19,7 @@ async def start_bot(
bot_token: str, bot_token: str,
redis_protocol: Redis, redis_protocol: Redis,
session_maker: async_sessionmaker, session_maker: async_sessionmaker,
i18n_domain: str,
) -> None: ) -> None:
""" """
Start Telegram bot. Start Telegram bot.
@ -24,6 +28,7 @@ async def start_bot(
bot_token (str): Telegram API bot token. bot_token (str): Telegram API bot token.
redis_client (Redis): async configured client for redis. redis_client (Redis): async configured client for redis.
session_maker (AsyncSession): async database session maker. session_maker (AsyncSession): async database session maker.
i18n_domain (str): the bot locales domain.
""" """
bot = Bot(bot_token) bot = Bot(bot_token)
@ -31,13 +36,15 @@ async def start_bot(
storage=RedisStorage(redis=redis_protocol), storage=RedisStorage(redis=redis_protocol),
) )
locales_dir = Path(".") / "src" / "locales"
i18n = I18n(path=locales_dir, default_locale="ru", domain=i18n_domain)
connect_middlewares( connect_middlewares(
dispatcher=dispatcher, dispatcher=dispatcher,
session_maker=session_maker, session_maker=session_maker,
i18n=i18n,
) )
loguru_logger.debug( loguru_logger.debug("Middlewares have been successfully connected.")
"Middlewares have been successfully connected."
)
include_routers(dispatcher) include_routers(dispatcher)
loguru_logger.debug("Routers have been successfully included.") loguru_logger.debug("Routers have been successfully included.")

View file

@ -2,9 +2,11 @@ __all__ = ["connect_middlewares"]
from aiogram import Dispatcher from aiogram import Dispatcher
from aiogram.utils.i18n import I18n
from sqlalchemy.ext.asyncio import async_sessionmaker from sqlalchemy.ext.asyncio import async_sessionmaker
from .database import DatabaseSessionMiddleware from .database import DatabaseSessionMiddleware
from .i18n import I18nMiddleware
from .registration import RegistrationMiddleware from .registration import RegistrationMiddleware
from .telegram_user import TelegramUserMiddleware from .telegram_user import TelegramUserMiddleware
@ -12,6 +14,7 @@ from .telegram_user import TelegramUserMiddleware
def connect_middlewares( def connect_middlewares(
dispatcher: Dispatcher, dispatcher: Dispatcher,
session_maker: async_sessionmaker, session_maker: async_sessionmaker,
i18n: I18n,
) -> None: ) -> None:
""" """
Connecting all middleware for the dispatcher. Connecting all middleware for the dispatcher.
@ -19,10 +22,12 @@ def connect_middlewares(
1. DatabaseSessionMiddleware (outer): provides a session. 1. DatabaseSessionMiddleware (outer): provides a session.
2. TelegramUserMiddleware (outer): uses session to get a user. 2. TelegramUserMiddleware (outer): uses session to get a user.
3. RegistrationMiddleware (outer): uses user to check status. 3. RegistrationMiddleware (outer): uses user to check status.
4. I18nMiddleware (inter): uses session to get user's locale code.
Args: Args:
dispatcher (Dispatcher): bot dispatcher. dispatcher (Dispatcher): bot dispatcher.
session_maker (async_sessionmaker): database sessionmaker. session_maker (async_sessionmaker): database sessionmaker.
i18n (I18n): aiogram bot i18n object.
""" """
dispatcher.update.outer_middleware( dispatcher.update.outer_middleware(
DatabaseSessionMiddleware(session_maker=session_maker) DatabaseSessionMiddleware(session_maker=session_maker)
@ -31,3 +36,5 @@ def connect_middlewares(
dispatcher.update.outer_middleware(TelegramUserMiddleware()) dispatcher.update.outer_middleware(TelegramUserMiddleware())
dispatcher.update.outer_middleware(RegistrationMiddleware()) dispatcher.update.outer_middleware(RegistrationMiddleware())
dispatcher.update.middleware(I18nMiddleware(i18n=i18n))

View file

@ -31,6 +31,10 @@ class Settings(BaseSettings):
Enable SQLAlchemy engine echo. Enable SQLAlchemy engine echo.
Defaults to True. Defaults to True.
bot_i18n_domain (str):
The bot locales i18n domain.
Defaults to "messages".
redis_host (str): redis_host (str):
Redis host name. Redis host name.
Defaults to "redis" Defaults to "redis"
@ -70,6 +74,8 @@ class Settings(BaseSettings):
f"{self.postgres_port}/{self.postgres_name}" f"{self.postgres_port}/{self.postgres_name}"
) )
bot_i18n_domain: str = Field(frozen=True, default="messages")
redis_host: str = Field(frozen=True, default="redis") redis_host: str = Field(frozen=True, default="redis")
redis_port: int = Field(frozen=True, default=6379) redis_port: int = Field(frozen=True, default=6379)

View file

@ -34,9 +34,7 @@ async def process_args() -> None:
args = parser.parse_args() args = parser.parse_args()
loguru_logger.debug( loguru_logger.debug(f"List of arguments passed to the program: {args}")
f"List of arguments passed to the program: {args}"
)
match args.db: match args.db:
case "create": case "create":
@ -48,9 +46,7 @@ async def process_args() -> None:
await drop_db(engine) await drop_db(engine)
exit(0) exit(0)
case "migrate": case "migrate":
loguru_logger.debug( loguru_logger.debug("Attempt to make database migrations...")
"Attempt to make database migrations..."
)
exit(0) exit(0)
@ -71,6 +67,7 @@ async def main() -> None:
bot_token=settings.bot_token, bot_token=settings.bot_token,
redis_protocol=redis_protocol, redis_protocol=redis_protocol,
session_maker=session_maker, session_maker=session_maker,
i18n_domain=settings.bot_i18n_domain,
) )