Как настроить локализацию сайта на русский язык?
Локализация под русскоязычную аудиторию — не только перевод текста. Без правильной обработки падежей, числительных, дат и кодировки пользователь видит кракозябры или некорректные данные. Например, формы заказа ломаются из-за склонения: «1 товаров» вместо «1 товар». Клиенты жалуются на странные окончания в корзине, а менеджеры теряют лиды из-за неверного формата телефона. На одном проекте интернет-магазина из-за отсутствия локализации падала конверсия на 15% — пользователи бросали корзину, видя «1 товаров». После настройки plural-правил конверсия восстановилась. Мы решаем эти проблемы под ключ, экономя бизнесу до 200 000 рублей на каждом этапе перевода.
Что включает локализация под русскую аудиторию?
Склонение числительных — русский требует трёх форм для одного числа. Без этого в корзине увидишь «2 товаров» или «11 товар». Форматирование дат — пользователи ждут «28 марта 2026 г.», а не «2026-03-28». Телефонные номера — единый формат +7 (XXX) XXX-XX-XX при вводе. Кодировка базы данных — неверная collation порождает иероглифы. SEO — мета-теги с lang="ru", Open Graph для ВК, карточки товаров с правильными hreflang. Мультиязычность сайта требует согласованных переводов интерфейса и поддержки кириллицы. Неправильная локализация стоит бизнесу до 300 000 рублей в месяц из-за потери лидов.
Как мы это делаем
Настройка локали в Laravel
// config/app.php 'locale' => 'ru', 'fallback_locale' => 'en', 'faker_locale' => 'ru_RU', // resources/lang/ru/validation.php return [ 'required' => 'Поле «:attribute» обязательно.', 'email' => 'Введите корректный email.', 'min' => [ 'string' => 'Поле «:attribute» должно содержать не менее :min символов.', ], 'unique' => 'Такое значение поля «:attribute» уже существует.', 'attributes' => [ 'email' => 'email', 'password' => 'пароль', 'name' => 'имя', 'phone' => 'телефон', ], ]; Склонение числительных
Русские plural rules: 1 — одна форма, 2–4 — другая, 5–20 — третья, 21+ — повтор. На сервере используем хелпер:
function plural(int $n, string $one, string $few, string $many): string { $abs = abs($n); $mod10 = $abs % 10; $mod100 = $abs % 100; if ($mod100 >= 11 && $mod100 <= 19) return "$n $many"; if ($mod10 === 1) return "$n $one"; if ($mod10 >= 2 && $mod10 <= 4) return "$n $few"; return "$n $many"; } echo plural(1, 'товар', 'товара', 'товаров'); // 1 товар echo plural(3, 'товар', 'товара', 'товаров'); // 3 товара echo plural(11, 'товар', 'товара', 'товаров'); // 11 товаров На фронтенде — Intl.PluralRules из MDN:
const rules = new Intl.PluralRules('ru') const forms: Record<string, string> = { one: 'товар', few: 'товара', many: 'товаров', other: 'товаров', } function pluralize(n: number): string { return `${n} ${forms[rules.select(n)]}` } pluralize(1) // "1 товар" pluralize(22) // "22 товара" pluralize(100) // "100 товаров" Intl.PluralRules автоматически подхватывает локаль браузера, не нужно прописывать исключения для 11–19. На сервере же хелпер даёт полный контроль. Мы используем оба подхода.
Сравнение подходов:
| Аспект | PHP-хелпер | Intl.PluralRules |
|---|---|---|
| Зависимость от локали | Ручная настройка | Автоматическая, берёт из браузера |
| Поддержка исключений (11–19) | Да, в коде | Да, встроена |
| Производительность | Очень быстро | Легковесно |
| Гибкость | Полный контроль | Стандарт ECMAScript |
Intl.PluralRules лучше для клиента (единый источник), хелпер — для сервера, где ECMAScript недоступен.
Форматирование дат и чисел
const dateFormatter = new Intl.DateTimeFormat('ru-RU', { day: 'numeric', month: 'long', year: 'numeric', }) dateFormatter.format(new Date()) // "28 марта 2026 г." new Intl.DateTimeFormat('ru-RU').format(new Date()) // "28.03.2026" const rtf = new Intl.RelativeTimeFormat('ru', { numeric: 'auto' }) rtf.format(-2, 'day') // "позавчера" rtf.format(-5, 'day') // "5 дней назад" new Intl.NumberFormat('ru-RU', { style: 'currency', currency: 'RUB', maximumFractionDigits: 0, }).format(14990) // "14 990 ₽" Телефонные номера
Неверный формат — потерянные лиды. Пользователи ожидают +7 (XXX) XXX-XX-XX. Если номер вводится через дефис, маска его поправит.
function formatRuPhone(value: string): string { const digits = value.replace(/\D/g, '') const normalized = digits.startsWith('8') ? '7' + digits.slice(1) : digits if (normalized.length !== 11 || !normalized.startsWith('7')) return value return `+7 (${normalized.slice(1, 4)}) ${normalized.slice(4, 7)}-${normalized.slice(7, 9)}-${normalized.slice(9)}` } formatRuPhone('89161234567') // "+7 (916) 123-45-67" База данных: кодировка
Проверьте, что база данных использует UTF-8. Для MySQL: SHOW VARIABLES LIKE 'character_set%' — character_set_database и character_set_server должны быть utf8mb4. В Laravel .env добавляем:
DB_CHARSET=utf8mb4 DB_COLLATION=utf8mb4_unicode_ci Для PostgreSQL: SHOW server_encoding — должно быть UTF8.
Типичные ошибки при локализации
| Ошибка | Последствия | Решение |
|---|---|---|
| Забывают про три формы числительных | «1 товаров», «2 товар» | Реализовать plural-хелпер |
| Дата с годом пишут с маленькой буквы | «28 марта 2026 г.» выглядит неграмотно | Использовать Intl.DateTimeFormat |
| Телефон не маскируется при вводе | Пользователь вводит 8-916-123-45-67, теряется единый формат | Маска +7 (XXX) XXX-XX-XX |
| Кодировка БД — latin1 вместо UTF-8 | Кракозябры в тексте | Переключить на utf8mb4 |
| на русской версии | SEO-проблемы, неправильный hreflang | Установить lang="ru" |
Что входит в работу
- Настройка locale в конфиге приложения.
- Перевод всех validation messages на русский.
- Реализация plural-хелпера на сервере и клиенте.
- Форматирование дат, чисел, валют через Intl.
- Маска телефонного номера +7 (XXX) XXX-XX-XX.
- Проверка кодировки БД (UTF-8).
- SEO-метатеги: , Open Graph.
- Тестирование на реальных данных.
- Документация по донастройке.
Процесс работы
- Аналитика — ревью текущей локализации, выявление ошибок.
- Проектирование — выбор подхода (Intl vs хелперы), согласование стиля переводов.
- Реализация — код по пунктам выше.
- Тестирование — проверка на 10+ сценариях (разные числа, даты, телефоны).
- Деплой — развёртывание с CI/CD, мониторинг.
Сроки
Базовая настройка — от 1 до 3 рабочих дней. Сложные проекты (много языков, кастомные plural rules) — до 5 дней. Стоимость рассчитывается индивидуально после аудита.
Опираемся на опыт более 100 проектов, 5+ лет на рынке. Даём гарантию на корректную работу всех локальных форматов. Если что-то пошло не так — поправим в рамках поддержки.
Закажите русскую локализацию — свяжитесь с нами для оценки вашего проекта. Получите консультацию бесплатно.







