Определение языка: Динамическая поддержка многоязычности

Эта статья объясняет, как мы автоматически определяем и предоставляем контент на предпочитаемом пользователем языке.

Проблема: Обслуживание глобальных пользователей

Пользователи приходят из разных стран и говорят на разных языках:

  • Индия: хинди, бенгали, тамильский, телугу, гуджарати, маратхи, каннада, малаялам, панджаби, урду

  • Европа: немецкий, французский, испанский, итальянский, португальский, русский

  • Азия: японский, корейский, китайский

Нам необходимо определить их языковые предпочтения и автоматически предоставлять переведенный контент.

Приоритет определения

Мы проверяем несколько источников в порядке очередности:

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. Ставим в очередь на перевод: Добавляем в очередь перевода для пакетной обработки

Производительность

Кэширование

Переводы кэшируются в памяти:

Таблицы фраз: Загружаются один раз при запуске

ИИ-переводы: Кэшируются в базе данных

Преимущество: Нет накладных расходов на перевод для каждого запроса

Ленивая загрузка

Переводы загружаются только при необходимости:

Описания продуктов: Загружаются при просмотре страницы продукта

Контент страницы запроса: Загружается при просмотре страницы запроса

Преимущество: Более быстрая начальная загрузка страницы

Ссылки

Технические концепции

Библиотеки

  • Flask-Babel - Перевод шаблонов

  • Babel - Библиотека интернационализации

Связанные статьи

Резюме

Определение языка использует систему приоритетов:

Порядок определения:

  • ✅ Параметр URL (?lang=hi)

  • ✅ Сессия (во время просмотра)

  • ✅ Cookie (30 дней)

  • ✅ По умолчанию (английский)

Поддерживается:

  • ✅ 20 языков (10 индийских, 7 европейских, 3 азиатских)

  • ✅ Региональное форматирование (числа, даты, валюта)

  • ✅ SEO теги hreflang

Методы перевода:

  • ✅ Flask-Babel (статические шаблоны)

  • ✅ TranslationManager (названия продуктов, характеристики)

  • ✅ DeepSeek AI (описания, статьи)

Производительность:

  • ✅ Кэширование в памяти

  • ✅ Ленивая загрузка

  • ✅ Кэширование в базе данных для ИИ-переводов

Это обеспечивает автоматическое определение языка и бесшовный многоязычный опыт.


← Назад к указателю документации