Интернационализация Python-проектов modern-i18n

от автора

modern-i18n — это легковесная библиотека для интернационализации Python-проектов. Она позволяет легко управлять переводами, использовать параметризованные строки для форматирования текста. Подходит для небольших и крупных проектов.

Для кого это статья?

Статья предназначена для разработчиков проектов на Python, которые хотят внедрить в свой проект интернационализацию (поддержку нескольких языков).

Введение

В современных приложениях, особенно тех, что используются в международной среде, поддержка нескольких языков (интернационализация — i18n) является критически важным аспектом. Modern-i18n — это библиотека для Python, которая упрощает и делает процесс локализации более эффективным и понятным. Она предлагает удобный API, поддерживает JSON-формат для хранения переводов и обеспечивает гибкость настройки.

Почему я разработал собственный i18n?

Основные причины:

  • Упрощение работы с переводами

    Многие популярные библиотеки i18n требуют сложной настройки и обладают избыточным API. Я хотел создать решение, которое будет простым, понятным и удобным для использования.

  • Минимизация зависимостей

    Некоторые библиотеки i18n требуют установки дополнительных пакетов, что может усложнять развертывание. Modern-i18n работает без них.

  • Легкость и производительность

    Библиотека modern-i18n не зависит от сторонних библиотек и легко интегрируется в любой проект. Она загружает только необходимые данные и использует механизм кэширования для повышения скорости работы.

  • Гибкость

    Библиотека может использоваться как в чистых проектах на Python, так и с web-фреймворками (Flask, Django и др.).

  • Самостоятельность и контроль

    Создавая собственную реализацию, я получил возможность полностью контролировать её поведение, улучшать её по мере необходимости и адаптировать под конкретные задачи проекта.

Установка

Для установки библиотеки воспользуйтесь пакетным менеджером pip:

pip install modern-i18n

Структура проекта

Для внедрения i18n необходимо создать в свой проект новые папки и файлы. Пример типовой структуры проекта после настройки библиотеки modern-i18n:

project/ ├── i18n/              # 📁 Модуль интернационализации │   └── config.py      # 📄 Конфигурационный файл: язык по умолчанию, путь к переводам и т.д. │ ├── locale/            # 📁 Директория с переводами (локализациями) │   ├── en/            # 📁 Английская локаль │   │   └── translation.json  # 📄 Файл с переводами на английский язык │   └── ru/            # 📁 Русская локаль │       └── translation.json  # 📄 Файл с переводами на русский язык │ └── example.py         # 📄 Пример использования функции перевода

Конфигурация

Все настройки библиотеки находятся в файле i18n/config.py. Пример базовой конфигурации:

import os from pathlib import Path  from modern_i18n.i18n import I18n  project_root = Path(__file__).resolve().parent.parent LOCALE_PATH = os.path.join(project_root, 'locale')  config = {     'locale_path': LOCALE_PATH,  # Путь к директории с переводами     'locales': ['ru', 'en'],  # Список доступных языков     'default_locale': 'ru',  # Язык по умолчанию     'default_encoding': 'UTF-8'  # Кодировка для файлов перевода по умолчанию 'UTF-8' }  i18n = I18n(config) t = i18n.translate
  • В файле i18n/config.py настраиваются основные параметры: список доступных языков, язык по умолчанию, путь к директории с переводами и дополнительные опции.

  • Все переводы хранятся в формате JSON внутри директории locale, где каждая локаль имеет свою собственную папку.

Формат переводов

Переводы хранятся в файлах translation.json, где каждый ключ — это оригинальная фраза, а значение — её перевод на нужный язык.

Пример для английского языка (locale/en/translation.json):

{   "Итого {a}+{b}={total}": "Total {a}+{b}={total}.",   "Количество языков на планете бесчисленное множество": "There are countless languages on the planet",   "Ограничение длины строки: {str:.6}": "String length limit: {str:.6}",   "Процент: {percent:.0%}": "Percentage: {percent:.0%}",   "Процент: {percent:.1%}": "Percentage: {percent:.1%}",   "Процент: {percent:.2%}": "Percentage: {percent:.2%}",   "Сегодня: {date:%A, %B %d, %Y}": "Today: {date:%A, %B %d, %Y}",   "Сегодня: {date:%d.%m.%Y}": "Today: {date:%d.%m.%Y}",   "Сегодня: {date}": "Today: {date}",   "Число с плавающей точкой: {number:.0f}": "Floating point number: {number:.0f}",   "Число с плавающей точкой: {number:.3f}": "Floating point number: {number:.3f}" }

Пример для русского языка (locale/ru/translation.json):

{   "Итого {a}+{b}={total}": "Итого {a}+{b}={total}.",   "Количество языков на планете бесчисленное множество": "Количество языков на планете бесчисленное множество",   "Ограничение длины строки: {str:.6}": "Ограничение длины строки: {str:.6}",   "Процент: {percent:.0%}": "Процент: {percent:.0%}",   "Процент: {percent:.1%}": "Процент: {percent:.1%}",   "Процент: {percent:.2%}": "Процент: {percent:.2%}",   "Сегодня: {date:%A, %B %d, %Y}": "Сегодня: {date:%A, %B %d, %Y}",   "Сегодня: {date:%d.%m.%Y}": "Сегодня: {date:%d.%m.%Y}",   "Сегодня: {date}": "Сегодня: {date}",   "Число с плавающей точкой: {number:.0f}": "Число с плавающей точкой: {number:.0f}",   "Число с плавающей точкой: {number:.3f}": "Число с плавающей точкой: {number:.3f}" }

⚠️ Важно: все ключи должны быть одинаковыми во всех файлах, чтобы обеспечить корректное сопоставление.

ℹ️ По моему опыту по внедрению i18n в большие проекты, в качестве ключей рекомендую использовать те названия, которые уже есть у Вас на проекте.

Например, у Вас есть строковые переменные, которые нужно интернационализировать.

До внедрения i18n:

s = 'Количество языков на планете бесчисленное множество'

Вы просто берете эту строку и оборачиваете ее в функцию t.

После внедрения i18n:

from i18n.config import t  s = t('Количество языков на планете бесчисленное множество', locale='en')

В результате получаете ту же читаемость кода, что и была. Плюс избавляет Вас от придумывания ключей, что сэкономит Вам много времени, особенно когда проект большой.

Использование библиотеки

После конфигурации вы можете использовать функцию t для получения перевода.

from i18n.config import t  print(t('Количество языков на планете бесчисленное множество'))  # -> Количество языков на планете бесчисленное множество # Перевод с указанием локали print(t('Количество языков на планете бесчисленное множество', locale='en'))  # -> There are countless languages on the planet

Перевод с параметрами

print(t('Итого {a}+{b}={total}', a=5, b=10, total=15))  # -> Итого 5+10=15. print(t('Итого {a}+{b}={total}', locale='en', a=5, b=10, total=15))  # -> Total 5+10=15.

Форматируемый перевод

Библиотека позволяет гибко форматировать строки, используя именованные аргументы, а также спецификаторы формата для чисел, строк и дат.

import datetime  # Число с плавающей точкой print(t("Число с плавающей точкой: {number:.3f}", locale='en', number=3.14159))  # -> Floating point number: 3.142 print(t("Число с плавающей точкой: {number:.0f}", locale='en', number=3.5))  # -> Floating point number: 4  # Проценты print(t("Процент: {percent:.2%}", locale='en', percent=0.736))  # -> Percentage: 73.60% print(t("Процент: {percent:.1%}", locale='en', percent=0.736))  # -> Percentage: 73.6% print(t("Процент: {percent:.0%}", locale='en', percent=0.736))  # -> Percentage: 74%  # Форматирование даты today = datetime.date.today() print(t("Сегодня: {date}", date=today))  # -> Сегодня: 2025-07-10 print(t("Сегодня: {date:%d.%m.%Y}", date=today))  # -> Сегодня: 10.07.2025 print(t("Сегодня: {date:%A, %B %d, %Y}", locale='en', date=today))  # -> Today: Thursday, July 10, 2025  # Ограничение длины строки print(t("Ограничение длины строки: {str:.6}", locale='en', str="Привет мир!"))  # -> String length limit: Привет

Обработка отсутствующих ключей

Если ключ не найден, библиотека выдаст предупреждение и вернёт исходную строку:

print(t('Ключ не существует'))  # Warning -> Ключ не существует

Заключение

Modern-i18n — это мощная и простая в использовании библиотека для интернационализации Python-проектов. Она позволяет быстро настраивать локализацию, поддерживает работу с несколькими языками и параметризованными строками. Благодаря своей гибкости и лёгкости, она станет отличным выбором для разработчиков, которым нужно создать многоязычное приложение без лишней сложности.

Эта библиотека используется в реальных проектах и продолжает развиваться. Если вы сталкиваетесь с задачей локализации в Python-приложениях, обязательно попробуйте modern-i18n — возможно, она станет вашим идеальным выбором.

Ссылка на библиотеку: https://pypi.org/project/modern-i18n/

Буду рад обратной связи. В комментариях напишите, а как Вы решаете данную задачу.


ссылка на оригинал статьи https://habr.com/ru/articles/926698/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *