Хотел перевести своего бота на английский язык, но в интернете нашел только эту статью. Информация взята с:
https://robotvasya.github.io/i18n-l10n-tutorial-aiogram/chapter_04.html
Если вы не знаете основы Aiogram3, router, клавиатуры то вам сюда:
https://mastergroosha.github.io/aiogram-3-guide/
Остальные поехали!
Устанавливаем библиотеки в ваш проект
pip install aiogram_i18n
pip install fluent_compiler
pip install fluent.runtimeЭтап 1
Создаем главный файл bot.py с одним хэндлером start. Начинаем с малого.
Разбор кода сразу после. Поехали!
import asyncio
import logging
from aiogram import Bot, Dispatcher, types
from aiogram.filters.command import Command
from aiogram_i18n import I18nContext
from aiogram_i18n import I18nMiddleware
from aiogram_i18n.cores.fluent_runtime_core import FluentRuntimeCore
# Включаем логирование, чтобы не пропустить важные сообщения
logging.basicConfig(level=logging.INFO)
# Объект бота
bot = Bot(token="Ваш токен")
# Диспетчер
dp = Dispatcher()
# Хэндлер на команду /start
@dp.message(Command("start"))
async def cmd_start(message: types.Message, i18n: I18nContext):
await message.answer(i18n.get("Hello"))
# Запуск процесса поллинга новых апдейтов
async def main():
i18n_middleware = I18nMiddleware(
core=FluentRuntimeCore(
path="locales/{locale}/LC_MESSAGES",
),
default_locale="ru")
i18n_middleware.setup(dispatcher=dp)
# пропускаем все накопленные входящие
await bot.delete_webhook(drop_pending_updates=True)
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())Строка 5-7: импортируем нужные библиотеки.
Строка 17-19 (хэндлер start): передаем новую переменную в функцию (i18n: I18nContext) и вместо поля text пишем (i18n.get("Hello"). Fluent будет искать значение переменной "Hello" в папках локали, которые мы создадим позже.
Строка 23-28: подключаем движок перевода: назначаем путь до папки локали, задаем локаль по умолчанию, подключаем к диспетчеру.
Создаем папку локалей (ru, en), как на картинке внизу (locales - en - LC_MESSAGES - my_bot.ftl)

Открываем файл my_bot.ftl (назвать можно как угодно, главное чтобы формат был ftl) для русской локали и записываем:
Hello = Привет! Это бот для проверки смены языка.Без кавычек и как напишите, так и увидите. Также для en локали.
Hello = Hello! This is a bot for checking language changes.Попробуйте запустить бота (меняя в функции main переменную default_locale меняется и язык).
Если всё работает, переходим к этапу 2.
Этап 2
Сделаем команду /language, которая выводит клавиатуру с выбором языка. И после выбора пользователя, меняется язык всего приложения (бота).
Создаем файл choice_language.py в папке handlers (это больше для чистоты приложения, можете где хотите создать файл).
from aiogram import types, F, Router
from aiogram.filters.command import Command
from aiogram_i18n import I18nContext
router = Router()
#клавиатура с выбором языка
keyboard = types.ReplyKeyboardMarkup(
keyboard=[
[types.KeyboardButton(text="English")],
[types.KeyboardButton(text="Русский")]
], resize_keyboard=True)
@router.message(Command("language"))
async def cmd_start(message: types.Message):
await message.answer("Выбери язык (choice language):", reply_markup=keyboard)
@router.message(F.text == "English")
async def switch_to_en(message: types.Message, i18n: I18nContext):
await switch_language(message, i18n,"en")
@router.message(F.text == "Русский")
async def switch_to_en(message: types.Message, i18n: I18nContext):
await switch_language(message, i18n,"ru")
async def switch_language(message: types.Message, i18n: I18nContext, locale_code: str):
await i18n.set_locale(locale_code)
await message.answer(i18n.get("lang-is-switched"), reply_markup=types.ReplyKeyboardRemove())Не забудьте подключить роутер к диспетчеру. Мы создаем клавиатуру с выбором языка.
Дальше создаем команду /language, которая выводит клавиатуру.
Дальше хэндлер принимает ввод
(если выбран English, то будет выбран хэндлер с F.text == "English") и вызывает функцию switch_language с аргументом locale_code (если English, то передается "en").
И в строке 29 меняется locale_code.
Остался последний вопрос: что делать с клавиатурами?
В файле choice_language.py мы создали клавиатуру с заранее известным текстом. Теперь попробуем создать клавиатуру с текстом, который берется с локали.
Импортируем модули:
from aiogram_i18n import LazyProxy
from aiogram_i18n.types import (
ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardButton, InlineKeyboardMarkup
# you should import mutable objects from here if you want to use LazyProxy in them
)То есть клавиатуру создаем через модуль aiogram_18n.
def main_keyboard():
buttons = [
[KeyboardButton(text=LazyProxy('donat_button'))],
[KeyboardButton(text=LazyProxy('support_button'))]
]
keyboard = ReplyKeyboardMarkup(keyboard=buttons, resize_keyboard=True)
return keyboardТакже в файлах перевода переведите данные переменные
(support_button = Группа тех. поддержки...).
Еще можно прокидывать переменные в перевод. Например:
await message.answer(text=i18n.get("you-have-coin", value=n)you-have-coin = У пользователя { $user } { $value ->
[0] совсем нет монет
[one] имеется одна монета
[few] { $value } монеты
*[many] есть { $value } монет
}!От значения value будет выбран нужный селектор
(если value = 1, то вывод: "имеется одна монета")
И конечно ссылка на репозиторий:
https://github.com/TheStupidBear/Aiogram_fluent_tutorial
Спасибо за внимание.
