Настройка локализации сайта на русский язык
Локализация на русский — не только перевод текста. Это правильная обработка падежей и числительных, форматирование дат, валюты, телефонных номеров по российским стандартам, и корректная работа с кодировкой в базе данных.
Серверная локализация: Laravel
// config/app.php
'locale' => 'ru',
'fallback_locale' => 'en',
'faker_locale' => 'ru_RU',
// resources/lang/ru/validation.php — переопределение сообщений валидации
return [
'required' => 'Поле «:attribute» обязательно для заполнения.',
'email' => 'Поле «:attribute» должно содержать корректный e-mail адрес.',
'min' => [
'string' => 'Поле «:attribute» должно содержать не менее :min символов.',
],
'unique' => 'Такое значение поля «:attribute» уже существует.',
// ...
'attributes' => [
'email' => 'email',
'password' => 'пароль',
'name' => 'имя',
'phone' => 'телефон',
],
];
Склонение числительных
Русский язык требует трёх форм: «1 товар», «2 товара», «5 товаров».
// Хелпер для склонения
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 товаров
echo plural(21, 'товар', 'товара', 'товаров'); // 21 товар
На фронтенде то же самое через Intl.PluralRules:
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 товаров"
Форматирование дат и чисел
// Дата по-русски
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 дней назад"
rtf.format(1, 'hour') // "через 1 час"
// Валюта
new Intl.NumberFormat('ru-RU', {
style: 'currency',
currency: 'RUB',
maximumFractionDigits: 0,
}).format(14990) // "14 990 ₽"
Телефонные номера
// Маска для российских номеров
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"
База данных: кодировка
PostgreSQL и MySQL должны использовать UTF-8. Проверка:
-- PostgreSQL
SHOW server_encoding; -- UTF8
SHOW client_encoding; -- UTF8
SELECT datcollate FROM pg_database WHERE datname = current_database();
-- ru_RU.UTF-8 или en_US.UTF-8 (оба корректны для кириллицы)
-- MySQL
SHOW VARIABLES LIKE 'character_set%';
-- character_set_database: utf8mb4
-- character_set_server: utf8mb4
Laravel .env для MySQL:
DB_CHARSET=utf8mb4
DB_COLLATION=utf8mb4_unicode_ci
Meta-теги и HTML
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="description" content="...">
<!-- Open Graph для социальных сетей ВКонтакте, Одноклассники -->
<meta property="og:locale" content="ru_RU">
</head>
Сроки
Настройка locale, переводы валидации, форматирование — 1 рабочий день.







