tg bot i18n aiogram 2.25 的本地化不起作用

问题描述 投票:0回答:0

无法在 aiogram 2.25 上使用 i18n 实现消息到其他语言的翻译

整个机器人都可以工作,只是没有翻译,而是使用常用语言。

这是存储库的链接,也许有人可以提供帮助,我已经坐了一个星期了:

我也会在这里留下几个主要文件。 *** 如果有任何帮助,我将不胜感激 ***:

client.py:

import smtplib
from email.mime.text import MIMEText

from aiogram import types
from aiogram.dispatcher import FSMContext

from db_api import db_quick_commands as db_commands
from db_api.schemas.users import Users_model as users
from config import dp, bot, _
import keyboards as kb
import handlers.states as states
import callback.quick_callback


from language_middleware import get_lang
from settings import session


async def anti_flood(*args, **kwargs):
    m = args[0]
    await m.answer(_("Не флуди :) Одне повідомлення в секунду"))



@dp.message_handler(commands=["start"])
@dp.throttled(anti_flood, rate=1)
async def start_handler(message: types.Message):
    if message.chat.type == 'private':
        try:
            if (not await db_commands.select_user(message.from_user.id)):
                db_commands.register_user(message)
                await message.answer(_('🔝 <b>Головне Меню</b>'), parse_mode='html', reply_markup=kb.markup_start)
                await message.answer(_('🤔 Оберіть ваш варіант 💭'))
            else:
                await message.answer(_('🔝 <b>Головне Меню</b>'), parse_mode='html', reply_markup=kb.markup_start)
                await message.answer(_('🤔 Оберіть ваш варіант 💭'))
        except:
            await message.answer(_('❗ Бот розроблений для кожного особисто, не можна його добавляти в групи. Поспілкуйтесь з ним самі: \nЯкщо у вас виникли інші проблеми, звертайтесь до нашого менеджера: '))
    else:
        await message.answer(_('❗ Бот розроблений для кожного особисто, не можна його добавляти в групи. Поспілкуйтесь з ним самі: \nЯкщо у вас виникли інші проблеми, звертайтесь до нашого менеджера:'))


@dp.message_handler(content_types=['text'])
@dp.throttled(anti_flood, rate=1)
async def text_message(message: types.Message):
    ban_mod = await users.query.where(users.user_id == message.from_user.id).gino.first()
    ban = ban_mod.ban
    if ban == 0:
        if (message.text == "🆘 Тех. Підтримка") or (message.text == "🆘 Тех. Поддержка") or (message.text == "🆘 Support"):
            markup = types.InlineKeyboardMarkup(row_width=1)
            change_language = types.InlineKeyboardButton('🔄 \n\nПоміняти мову | Сменить язык | Change the language', callback_data="change_language")
            up_button = types.InlineKeyboardButton("📺 Зв'язатись із тех. підтримкою", url="https://t.me/Ch")
            markup.add(change_language, up_button)
            photo = open('img/what-is-bot-management.png', 'rb')
            await bot.send_photo(message.from_user.id, photo, caption='При будь-яких питаннях звертайтесь до нашого менеджера: ', reply_markup=markup, parse_mode='html')

language_middware.py:

from typing import Tuple, Any

from aiogram import types
from aiogram.contrib.middlewares.i18n import I18nMiddleware
from settings import I18N_DOMAIN, LOCALES_DIR
from db_api.db_quick_commands import DBCommands_middleware

db = DBCommands_middleware()

async def get_lang(user_id):
    # Делаем запрос к базе, узнаем установленный язык
    user = await db.get_user(user_id)
    if user:
        # Если пользователь найден - возвращаем его
        return user.user_language


class ACLMiddleware(I18nMiddleware):
    async def get_user_locale(self, action: str, args: Tuple[Any]) -> str:
        user = types.User.get_current()
        return await get_lang(user.id) or user.locale



def setup_middleware(dp):
    i18n = ACLMiddleware(I18N_DOMAIN, LOCALES_DIR)
    dp.middleware.setup(i18n)
    return i18n

config.py

from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram import Bot, Dispatcher
from language_middleware import setup_middleware


API_TOKEN = "TOKEN_HERE"


storage = MemoryStorage()


bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot, storage=storage)


i18n = setup_middleware(dp)
_ = i18n.gettext

settings.py:

from aiogram.contrib.fsm_storage.memory import MemoryStorage
from dotenv import load_dotenv
from pathlib import Path
from gino import Gino
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base


storage = MemoryStorage()


db = Gino()

I18N_DOMAIN = 'tg_bot'
BASE_DIR = Path(__file__).resolve().parent
LOCALES_DIR = BASE_DIR/'locales'
ENV_PATH = BASE_DIR.joinpath(".env")


load_dotenv(dotenv_path=ENV_PATH)



DATABASE = {
    "NAME": "NAME",
    "USER": "USER",
    "PASSWORD": "PASSWORD",
    "HOST": "HOST",
}

# База данных тип postgresql, mysql
`
DATABASE_TYPE = "postgresql"
DATABASE_STR = ""

if DATABASE_TYPE == "postgresql":
    DATABASE_STR = (
        f"postgresql://{DATABASE['USER']}:{DATABASE['PASSWORD']}"
        f"@{DATABASE['HOST']}/{DATABASE['NAME']}"
    )


engine = create_engine(f"postgresql+psycopg2://postgres:{DATABASE['PASSWORD']}@{DATABASE['HOST']}/{DATABASE['NAME']}")
session = scoped_session(sessionmaker(bind=engine))
Base = declarative_base()
Base.query = session.query_property()


DEFAULT_LOCALE = 'en'
UK_LOCALE = 'uk'
RU_LOCALE = 'ru'`
python postgresql internationalization telegram-bot aiogram
© www.soinside.com 2019 - 2024. All rights reserved.