Сайт с интернационализацией, поддерживающий русский (ru), английский (en) и арабский (ar) языки с региональным контентом и поддержкой RTL/LTR направления текста. Сделано в рамках ШРИ Яндекса 2025 с любовью ❤️
- Поддержка нескольких языков: русский (ru), английский (en), арабский (ar)
- Региональные локали: ru-RU, ru-BY, ru-KZ
- Динамическая загрузка контента: переводы загружаются по страницам
- Подход Code First: использование react-intl с Format.JS
- Статическое извлечение сообщений: Babel плагин для оптимизации продакшена
- Определение региона: моковый геосервис с возможностью переопределения в разработке
- Автоматические редиректы: на основе региона и языковых предпочтений пользователя
- Сохранение в куки: выбор языка сохраняется в куки
- Определение языка браузера: fallback на язык браузера
- Локаль в URL: локаль в пути URL (например,
/ru-RU/,/en/,/ar/)
- Поддержка RTL/LTR: автоматическое направление текста на основе локали
- Селектор языка: выпадающий список с переключением языков
- Региональные статьи: контент, адаптированный под регион пользователя
- Адаптивный дизайн: работает на всех размерах устройств
- Современный UI: чистый, доступный интерфейс
- React 19 с TypeScript
- React Router DOM для роутинга с учетом локали
- React Intl для интернационализации
- Format.JS для форматирования сообщений
- Vite для сборки
- Babel с плагином formatjs для оптимизации
- ESLint с правилами formatjs для качества кода
src/
├── components/ # Переиспользуемые UI компоненты
│ ├── lang-select/ # Компонент выбора языка
│ └── layout/ # Основной layout компонент
├── constants/ # Константы и конфигурации приложения
├── hooks/ # Пользовательские React хуки
│ └── useLocale.ts # Хук управления локалью
├── lib/ # Утилитарные библиотеки
│ ├── geo-service.ts # Сервис определения региона
│ └── i18n.ts # Утилиты интернационализации
├── pages/ # Компоненты страниц
│ ├── home/ # Главная страница
│ └── article-*/ # Страницы статей
├── providers/ # React контекст провайдеры
│ └── IntlProvider.tsx # React Intl провайдер
└── types/ # TypeScript определения типов
- Node.js 18+
- npm или yarn
npm installnpm run devnpm run buildnpm run previewnpm run lintПриложение поддерживает следующие локали:
ru- русский (регион по умолчанию: RU)ru-RU- русский (Россия)ru-BY- русский (Беларусь)ru-KZ- русский (Казахстан)en- английскийar- арабский
Геосервис предоставляет определение региона со следующим приоритетом:
- Query параметр URL
devOverrideRegion(для разработки) - Регион по умолчанию (RU)
- Локаль в пути URL
- Предпочтение в куки
- Язык браузера
- Локаль по умолчанию (en)
Пользователи могут переключать языки с помощью селектора языка в заголовке. Выбор сохраняется в куки и сохраняется между сессиями.
На главной странице отображаются региональные статьи на основе определенного региона пользователя:
- Россия (RU): статья о русской локализации
- Беларусь (BY): статья о двуязычном интерфейсе
- Казахстан (KZ): статья о русско-казахской локализации
- Арабские регионы: статья об арабской локализации
- Другие регионы: статья об английском как универсальном языке
/- редирект на локаль по умолчанию/{locale}/- главная страница в определенной локали/{locale}/article/{article-name}- страницы статей
Для тестирования разных регионов во время разработки добавьте query параметр:
http://localhost:3000/?devOverrideRegion=BY
translations.json- основной файл переводов со всеми поддерживаемыми языками- Статические ID сообщений для совместимости с babel-plugin-formatjs
{
"message.id": {
"ru": "Русский текст",
"en": "English text",
"ar": "النص العربي"
}
}import { FormattedMessage } from 'react-intl';
<FormattedMessage
id="message.id"
defaultMessage="Текст по умолчанию"
values={{ variable: "значение" }}
/>Направление текста автоматически устанавливается на основе локали:
- Арабские локали: RTL (справа налево)
- Другие локали: LTR (слева направо)
- Переводы компилируются и оптимизируются
- Русские исходные тексты удаляются из продакшен бандла
- Разделение кода для vendor и intl библиотек
- Оптимизация статических ресурсов
babel-plugin-formatjs настроен для:
- Извлечения ID сообщений с SHA512 хешированием
- Генерации AST для оптимизированного рантайма
- Удаления исходных сообщений в продакшене
- Добавьте локаль в
SUPPORTED_LOCALESвsrc/constants/index.ts - Добавьте название бренда в
BRAND_NAMESвsrc/constants/brand-names.ts - Добавьте переводы в
translations.json - Обновите маппинг направления текста при необходимости
- Создайте компонент статьи в
src/pages/article-{name}/ - Добавьте роут в
src/App.tsx - Добавьте переводы для контента статьи
- Обновите маппинг региональных статей при необходимости
– Cursor AI
Этот проект лицензирован под MIT License.