Настройка мультиязычности и мультивалютности PrestaShop
PrestaShop спроектирован с мультиязычностью как core-функцией: таблицы _lang существуют для большинства сущностей (Product, Category, CMS-страницы, атрибуты). Мультивалютность реализована через систему конвертации относительно базовой валюты. Обе функции поддерживаются нативно без сторонних модулей.
Добавление языков
Языки в PrestaShop соответствуют локалям PHP и поставляются с языковыми пакетами (переводы back-office + front-office):
# Установка русского языка через CLI
php bin/console prestashop:language:install ru-RU
# Или через объект Language
$language = new Language();
$language->name = 'Русский';
$language->iso_code = 'ru';
$language->locale = 'ru-RU';
$language->language_code = 'ru-RU';
$language->date_format_lite = 'd.m.Y';
$language->date_format_full = 'd.m.Y H:i:s';
$language->is_rtl = false;
$language->active = true;
$language->add();
Структура хранения переводов:
-- Пример: переводы товаров
SELECT p.id_product, pl.name, pl.description_short, l.iso_code
FROM ps_product p
JOIN ps_product_lang pl ON pl.id_product = p.id_product
JOIN ps_lang l ON l.id_lang = pl.id_lang
WHERE p.id_product = 42;
URL-структура для SEO
PrestaShop поддерживает несколько URL-стратегий для мультиязычных сайтов:
| Стратегия | URL | Конфигурация |
|---|---|---|
| GET-параметр | /product?id_lang=2 |
По умолчанию, не рекомендуется |
| Языковый префикс | /ru/product |
PS_LANGUAGE_DETECTION + .htaccess |
| Поддомен | ru.example.com |
Multishop |
| Отдельный домен | example.ru |
Multishop |
Настройка языкового префикса в app/config/parameters.php и через Admin → International → Localization:
// В .htaccess PrestaShop добавляет правила автоматически
// Для ручного управления в Nginx:
location / {
rewrite ^/ru/(.*)$ /$1?id_lang=2 last;
rewrite ^/en/(.*)$ /$1?id_lang=1 last;
try_files $uri $uri/ /index.php$is_args$args;
}
hreflang в PrestaShop добавляется через хук displayHeader в кастомном модуле:
public function hookDisplayHeader(): string
{
$languages = Language::getLanguages(true);
$currentController = $this->context->controller;
$hreflangs = [];
foreach ($languages as $lang) {
$url = $this->context->link->getLanguageLink($lang['id_lang']);
$hreflangs[] = sprintf(
'<link rel="alternate" hreflang="%s" href="%s">',
$lang['language_code'],
$url
);
}
$hreflangs[] = '<link rel="alternate" hreflang="x-default" href="' .
$this->context->link->getLanguageLink(Configuration::get('PS_LANG_DEFAULT')) . '">';
return implode("\n", $hreflangs);
}
Настройка валют
PrestaShop хранит все цены в базовой валюте (конфигурируется в Admin → International → Currencies → Default currency). Конвертация происходит автоматически при отображении.
// Добавление валюты программно
$currency = new Currency();
$currency->name = 'Польский злотый';
$currency->iso_code = 'PLN';
$currency->iso_code_num = '985';
$currency->sign = 'zł';
$currency->conversion_rate = 0.21; // относительно базовой (EUR)
$currency->decimals = 2;
$currency->active = true;
$currency->add();
Автоматическое обновление курсов
PrestaShop поддерживает несколько провайдеров через интерфейс CurrencyRateProviderInterface:
// Кастомный провайдер курсов (например, ЦБ РФ)
namespace MyModule\Provider;
use PrestaShop\PrestaShop\Core\Currency\ExchangeRateProvider\AbstractApiExchangeRateProvider;
class CbRfExchangeRateProvider extends AbstractApiExchangeRateProvider
{
const API_URL = 'https://www.cbr.ru/scripts/XML_daily.asp';
public function getRates(array $currencyIsoCodes): array
{
$xml = simplexml_load_file(self::API_URL);
$rates = [];
foreach ($xml->Valute as $valute) {
$isoCode = (string) $valute->CharCode;
if (in_array($isoCode, $currencyIsoCodes)) {
$nominal = (float) str_replace(',', '.', (string) $valute->Nominal);
$value = (float) str_replace(',', '.', (string) $valute->Value);
$rates[$isoCode] = $value / $nominal;
}
}
return $rates;
}
}
Cron для обновления курсов:
# Обновление курсов каждые 6 часов
0 */6 * * * www-data php /var/www/prestashop/bin/console prestashop:currencies:update-exchange-rates
Переводы контента каталога
Массовый перевод через импорт CSV (формат PrestaShop):
ID;Active (0/1);Name *;Short description;Description;Meta title;Meta description;URL rewritten
42;1;Куртка зимняя;"Тёплая куртка для зимы";"Полное описание куртки...";"Купить куртку зимнюю";"Куртка зимняя — купить в магазине";kurtka-zimnyaya
# Импорт через веб-интерфейс: Admin → Advanced Parameters → Import
# Или через модуль Webkul/другой импортёр с API
# Прямое обновление через SQL для массовых операций:
UPDATE ps_product_lang
SET name = 'Куртка зимняя',
description_short = 'Тёплая куртка',
link_rewrite = 'kurtka-zimnyaya'
WHERE id_lang = 2 -- id русского языка
AND id_product IN (42, 43, 44);
Форматирование цен и чисел по локали
Каждая валюта имеет собственное форматирование через CurrencyFormatter:
use PrestaShop\PrestaShop\Core\Localization\Locale\Repository as LocaleRepository;
$locale = $localeRepository->getLocale('ru-RU');
$formattedPrice = $locale->formatPrice(1299.99, 'RUB');
// → "1 299,99 ₽"
$formattedPrice = $locale->formatPrice(99.99, 'EUR');
// → "99,99 €" (для ru-RU локали)
Сроки настройки
- Добавление 1–2 языков + переводы back-office: 1 день
- Настройка 3–5 валют + автообновление курсов: 1 день
- SEO-конфигурация hreflang + URL-структура: 1–2 дня
- Перевод каталога 1 000–10 000 товаров (с проверкой качества): 3–7 дней







