无法在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'`
1条答案
按热度按时间xoshrz7s1#
我认为这是因为你没有在gettext函数中指定语言(_)
设法做
而不是
并在每个gettext函数中以这种方式重写它,因为如果没有指定语言,gettext总是返回默认语言文本