diff --git a/src/bot/__init__.py b/src/bot/__init__.py index ec331db..ee72106 100644 --- a/src/bot/__init__.py +++ b/src/bot/__init__.py @@ -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.") diff --git a/src/bot/middlewares/__init__.py b/src/bot/middlewares/__init__.py index e35d46d..5777346 100644 --- a/src/bot/middlewares/__init__.py +++ b/src/bot/middlewares/__init__.py @@ -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)) diff --git a/src/config/settings.py b/src/config/settings.py index 6ebcf88..e016906 100644 --- a/src/config/settings.py +++ b/src/config/settings.py @@ -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) diff --git a/src/main.py b/src/main.py index 3302862..565a9fa 100644 --- a/src/main.py +++ b/src/main.py @@ -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, )