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

cyvaqqii  于 2023-05-27  发布在  Python
关注(0)|答案(1)|浏览(204)

无法在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'`
xoshrz7s

xoshrz7s1#

我认为这是因为你没有在gettext函数中指定语言(_)
设法做

await m.answer(_("Не флуди :) Одне повідомлення в секунду", locale=get_lang))

而不是

await m.answer(_("Не флуди :) Одне повідомлення в секунду"))

并在每个gettext函数中以这种方式重写它,因为如果没有指定语言,gettext总是返回默认语言文本

相关问题