Определение языка: Динамическая поддержка многоязычности
Эта статья объясняет, как мы автоматически определяем и предоставляем контент на предпочитаемом пользователем языке.
Проблема: Обслуживание глобальных пользователей
Пользователи приходят из разных стран и говорят на разных языках:
-
Индия: хинди, бенгали, тамильский, телугу, гуджарати, маратхи, каннада, малаялам, панджаби, урду
-
Европа: немецкий, французский, испанский, итальянский, португальский, русский
-
Азия: японский, корейский, китайский
Нам необходимо определить их языковые предпочтения и автоматически предоставлять переведенный контент.
Приоритет определения
Мы проверяем несколько источников в порядке очередности:
1. Параметр URL (?lang=hi)
2. Сессия (сохраняется после первого определения)
3. Cookie (translation_lang или lang)
4. Заголовок Accept-Language браузера (в будущем)
5. Язык по умолчанию (английский)
Почему такой порядок?
Параметр URL первый: Позволяет явно переключать язык
Сессия вторая: Сохраняется во время сеанса просмотра
Cookie третьи: Сохраняются между сеансами (30 дней)
По умолчанию последний: Запасной вариант для новых пользователей
Реализация
def get_locale():
# 1. Проверяем параметр URL
lang_param = request.args.get("lang")
if lang_param in valid_langs:
return lang_param
# 2. Проверяем сессию
if "translation_lang" in session:
return session["translation_lang"]
# 3. Проверяем cookie
# ... (детали реализации опущены)
Переключение языка
Пользователи могут переключать язык через URL:
/p/Treo-N100-8-256?lang=hi
Это запускает:
1. Установку сессии: session["translation_lang"] = "hi"
2. Установку cookie: translation_lang=hi; Max-Age=2592000 (30 дней)
3. Перенаправление: Удаление параметра lang из URL
Преимущество: Чистые URL после выбора языка
Поддерживаемые языки
Мы поддерживаем 20 языков:
Индийские языки (10):
-
Хинди (hi)
-
Бенгали (bn)
-
Тамильский (ta)
-
Телугу (te)
-
Гуджарати (gu)
-
Маратхи (mr)
-
Каннада (kn)
-
Малаялам (ml)
-
Панджаби (pa)
-
Урду (ur)
Европейские языки (7):
-
Немецкий (de)
-
Французский (fr)
-
Испанский (es)
-
Итальянский (it)
-
Португальский (pt)
-
Русский (ru)
Азиатские языки (3):
-
Японский (ja)
-
Корейский (ko)
-
Китайский (zh)
Перевод контента
Разные типы контента используют разные методы перевода:
Статические шаблоны (Flask-Babel)
Навигация, кнопки, метки переводятся через .po файлы:
{{ _('Add to Cart') }} → "कार्ट में जोड़ें" (Хинди)
Динамический контент (TranslationManager)
Названия продуктов, характеристики переводятся через таблицы фраз:
"Mini PC" → "मिनी पीसी" (Хинди)
Длинный контент (DeepSeek AI)
Описания продуктов, статьи переводятся с помощью ИИ:
"Compact office computer..." → "कॉम्पैक्ट ऑफिस कंप्यूटर..." (Хинди)
Смотрите: Система перевода для подробностей
Региональное форматирование
Выбор языка также влияет на форматирование:
Формат чисел
Английский: 1,234.56
Европейский: 1.234,56 (обратные разделители)
Индийский: 1,23,456 (группировка по lakhs/crores)
Формат даты
Английский: Feb 18, 2026
Европейский: 18.02.2026
Индийский: 18/02/2026
Валюта
Английский: ₹1,234
Европейский: €1.234
Международный: $1,234
Интерфейс выбора языка
Пользователи могут переключать язык через выпадающий список:
Расположение: Верхняя панель навигации
Отображение: Иконка флага + название языка
Поведение: Перезагрузка страницы с ?lang=<code>
SEO-соображения
Структура URL
Мы используем единый URL для всех языков (без префиксов /hi/, /de/):
Преимущество: Более простая архитектура, нет проблем с дублирующимся контентом
Компромисс: Меньше SEO-ценности для каждого языка
Теги Hreflang
Мы добавляем ссылки на альтернативные языки:
<link rel="alternate" hreflang="en" href="https://www.thinvent.in/p/Treo-N100">
<link rel="alternate" hreflang="hi" href="https://www.thinvent.in/p/Treo-N100?lang=hi">
<link rel="alternate" hreflang="de" href="https://www.thinvent.in/p/Treo-N100?lang=de">
Преимущество: Google знает, какую языковую версию показывать
Стратегия отката
Если перевод для выбранного языка отсутствует:
1. Пробуем английский: Большая часть контента имеет английскую версию
2. Показываем оригинал: Лучше, чем ничего
3. Ставим в очередь на перевод: Добавляем в очередь перевода для пакетной обработки
Производительность
Кэширование
Переводы кэшируются в памяти:
Таблицы фраз: Загружаются один раз при запуске
ИИ-переводы: Кэшируются в базе данных
Преимущество: Нет накладных расходов на перевод для каждого запроса
Ленивая загрузка
Переводы загружаются только при необходимости:
Описания продуктов: Загружаются при просмотре страницы продукта
Контент страницы запроса: Загружается при просмотре страницы запроса
Преимущество: Более быстрая начальная загрузка страницы
Ссылки
Технические концепции
-
Интернационализация (i18n) - Википедия
-
Согласование содержимого - Википедия
Библиотеки
-
Flask-Babel - Перевод шаблонов
-
Babel - Библиотека интернационализации
Связанные статьи
-
Система перевода - Гибридный подход с тремя технологиями
-
Генерация контента с помощью ИИ - Переводы DeepSeek
Резюме
Определение языка использует систему приоритетов:
Порядок определения:
-
✅ Параметр URL (
?lang=hi) -
✅ Сессия (во время просмотра)
-
✅ Cookie (30 дней)
-
✅ По умолчанию (английский)
Поддерживается:
-
✅ 20 языков (10 индийских, 7 европейских, 3 азиатских)
-
✅ Региональное форматирование (числа, даты, валюта)
-
✅ SEO теги hreflang
Методы перевода:
-
✅ Flask-Babel (статические шаблоны)
-
✅ TranslationManager (названия продуктов, характеристики)
-
✅ DeepSeek AI (описания, статьи)
Производительность:
-
✅ Кэширование в памяти
-
✅ Ленивая загрузка
-
✅ Кэширование в базе данных для ИИ-переводов
Это обеспечивает автоматическое определение языка и бесшовный многоязычный опыт.