Add [localization]: connect i18n middleware to the bot

This commit is contained in:
Kirill Samoylenkov 2025-11-08 17:57:16 +05:00
parent 6b980d8017
commit 8320ab805e
4 changed files with 26 additions and 9 deletions

View file

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

View file

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

View file

@ -31,6 +31,10 @@ class Settings(BaseSettings):
Enable SQLAlchemy engine echo.
Defaults to True.
bot_i18n_domain (str):
The bot locales i18n domain.
Defaults to "messages".
redis_host (str):
Redis host name.
Defaults to "redis"
@ -70,6 +74,8 @@ class Settings(BaseSettings):
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_port: int = Field(frozen=True, default=6379)

View file

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