Локализация и интернационализация: gettext, datetime, locale

🌍 Почему локализация — это важно?

Представь: твой код работает у пользователей из 50 стран, но все видят ошибки на английском, даты в непонятном формате, а числа выглядят странно. 😱 Локализация и интернационализация (i18n/l10n) решают эту проблему! Сегодня разберём:

  • Как переводить текст с gettext
  • Форматирование дат и времени под локаль
  • Работу с региональными настройками через locale

📚 gettext: переводы текста в Python

gettext — стандартный модуль для перевода строк. Вот как его использовать:

import gettext

# Создаём переводы (обычно хранятся в .po/.mo файлах)
translation = gettext.translation(
    'myapp',  # имя домена
    localedir='locales',  # папка с переводами
    languages=['ru']  # язык
)
translation.install()

# Теперь _() будет переводить строки
print(_("Hello, world!"))  # Привет, мир!

🔍 Как это работает?

  1. Создаёшь файлы .po с переводами (например, через Poedit)
  2. Компилируешь в .mo — бинарный формат gettext
  3. Загружаешь перевод в коде как показано выше

💡 Совет: Используй gettext вместе с f-strings для динамического контента:

user = "Данила"
print(_(f"Hello, {user}!")  # Привет, Данила!

⏰ datetime и локализация дат

Даты в США MM/DD/YYYY, в России DD.MM.YYYY — как не запутаться? Используй strftime с локалью!

from datetime import datetime
import locale

# Устанавливаем локаль (например, русскую)
locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8')

now = datetime.now()
print(now.strftime("%d %B %Y"))  # "24 июля 2023" (формат для России)

🎛 Основные плейсхолдеры strftime:

  • %d — день месяца (01-31)
  • %B — полное название месяца (июль)
  • %Y — год (2023)
  • %A — день недели (понедельник)

⚠️ Важно: Локализация дат требует, чтобы нужная локаль была установлена в системе!


🔢 locale: числа, валюты и региональные настройки

Хочешь автоматически форматировать числа и валюты по правилам страны? locale поможет!

import locale

# Устанавливаем немецкую локаль
locale.setlocale(locale.LC_ALL, 'de_DE.UTF-8')

number = 1234567.89
print(locale.format_string("%.2f", number))  # "1.234.567,89" (разделители как в Германии)

💰 Форматирование валют:

print(locale.currency(2999.99))  # "2.999,99 €" для de_DE

🔧 Настройка локали: - locale.setlocale(locale.LC_ALL, '') — берёт локаль из системы - Проверяй доступные локали через locale.locale_alias


🛠 Комбинируем инструменты: практический пример

Создадим функцию, которая выводит локализованное приветствие с датой и суммой:

def localized_greeting(name: str, amount: float, lang: str = 'ru'):
    # Настройка локали
    locale.setlocale(locale.LC_ALL, f'{lang}_RU.UTF-8' if lang == 'ru' else 'en_US.UTF-8')

    # Установка перевода
    trans = gettext.translation('greetings', localedir='locales', languages=[lang])
    trans.install()

    date_str = datetime.now().strftime(_("%d %B %Y"))  # Локализованная дата
    amount_str = locale.currency(amount, grouping=True)

    print(_("Hello {name}! Today is {date}. Your balance: {amount}").format(
        name=name,
        date=date_str,
        amount=amount_str
    ))

# Использование:
localized_greeting("Анна", 12500.50)  # На русском
localized_greeting("John", 12500.50, 'en')  # На английском

💡 Главные выводы

  1. gettext — стандарт для переводов, интегрируется с IDE и инструментами перевода
  2. datetime + locale = корректное отображение дат в любой стране
  3. locale управляет не только датами, но и форматами чисел/валют
  4. Всегда тестируй локализацию с реальными пользователями из разных регионов
Скрыть рекламу навсегда

🎥 YouTube: программирование простым языком

Канал, где я спокойно и по шагам объясняю сложные темы — без заумных терминов и лишней теории.

Подходит, если раньше «не заходило», но хочется наконец понять.

▶️ Смотреть курсы на YouTube