Локализация и интернационализация: 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!")) # Привет, мир!
🔍 Как это работает?
- Создаёшь файлы
.poс переводами (например, через Poedit) - Компилируешь в
.mo— бинарный формат gettext - Загружаешь перевод в коде как показано выше
💡 Совет: Используй 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') # На английском
💡 Главные выводы
- gettext — стандарт для переводов, интегрируется с IDE и инструментами перевода
- datetime + locale = корректное отображение дат в любой стране
- locale управляет не только датами, но и форматами чисел/валют
- Всегда тестируй локализацию с реальными пользователями из разных регионов