Документация

Тексты темы и языки

Где лежат надписи темы, как сделать их переводимыми и как написать текст со склонением по числу.

На этой странице

Надписи темы — «В корзину», «Нет в наличии», «Показать ещё» — не пишутся прямо в разметке. Они лежат в файлах темы, по одному на язык, и выводятся тегом {trans}.

themes/ваша-тема/locale/
    ru.json
    uk.json
    en.json
{trans key="storefront.cart"}

Как устроен файл

Обычный список «ключ — надпись», без вложенности:

{
    "//": "Надписи темы. Ключи, начинающиеся с //, считаются комментариями.",

    "storefront.cart": "Корзина",
    "storefront.buy": "Купить",
    "storefront.in_cart": "В корзине:",
    "storefront.no_products": "Товаров не найдено",
    "storefront.search_placeholder": "Поиск товаров"
}

Список плоский. Вложенные объекты не поддерживаются — ключ вида storefront.cart это просто строка с точками, а не путь.

Ключи, начинающиеся с //, считаются комментариями и в надписи не попадают — удобно, чтобы объяснить соседу по коду, что за раздел ниже.

Где магазин ищет надпись

  1. в файле вашей темы для текущего языка;
  2. если ключа там нет — в надписях самого магазина;
  3. не нашлось нигде — выводится сам ключ.

Третий случай не роняет страницу, но в вёрстке будет висеть storefront.cart. Поэтому перед выкладкой каждый язык нужно пройти глазами — на странице Проверка перед выпуском это отдельный пункт.

Файла для языка нет вовсе — тема просто возьмёт надписи магазина. Так что тему можно выпустить с одним языком и добавить остальные позже.

Подстановки

Всё, что передано тегу кроме key, подставляется в строку:

{ "storefront.hello": "Здравствуйте, :name!" }
{trans key="storefront.hello" name=$customer.first_name}

Числа и склонение

Параметр count включает выбор формы по числу. Формы разделяются в файле знаком |, при необходимости с диапазонами:

{
    "storefront.products_count": "{0} нет товаров|[1,1] :count товар|[2,4] :count товара|[5,*] :count товаров",
    "storefront.reviews_count": "{0} отзывов пока нет|[1,1] :count отзыв|[2,4] :count отзыва|[5,*] :count отзывов"
}
{trans key="storefront.products_count" count=$total}
Запись Когда срабатывает
{0} ровно ноль
[1,1] ровно один
[2,4] от двух до четырёх
[5,*] пять и больше

:count внутри строки заменяется самим числом.

Правила для русского, украинского и английского уже есть — своего алгоритма писать не надо. Для английского двух форм достаточно:

{ "storefront.products_count": "{0} No products|[1,1] :count product|[2,*] :count products" }

Проверять склонение нужно именно числами, а не на глаз: 1 товар, 2 товара, 5 товаров, 21 товар, 22 товара. Последние два — самая частая ошибка.

Надписи, которые уезжают в браузер

Часть надписей магазин подставляет уже в браузере: подсказки живого поиска, сообщения оформления. Их передаёт тема — атрибутами, а не через файл переводов магазина:

<form data-live-search
      data-text-empty="{trans key='storefront.no_products'}"
      data-text-categories="{trans key='storefront.categories'}"
      …>

Так сделано намеренно: надписи принадлежат теме, и подсказки поиска говорят на её языке. Полный список таких атрибутов — на странице Атрибуты data-*.

⚠️ Не передали надпись — на её месте будет пустота. Ошибка тихая: страница работает, просто в выпадающем списке пустая строка.

Языки витрины

Какие языки включены, решает владелец магазина. Тема должна работать при любом наборе:

{foreach $shop->locales() as $l}
    <a href="{$l.url}"{if $l.active} class="is-active"{/if}>{$l.short}</a>
{/foreach}

Из коробки магазин знает русский, украинский и английский. Язык, которого нет в списке магазина, получит своим названием собственный код заглавными.

Что переводится, а что нет

Переводится содержимое: названия товаров и категорий, описания, SEO-поля, информационные страницы. Это делает владелец в панели, темы это не касается.

Не переводится адрес. Адрес (slug) товара и категории один на все языки — меняется только языковой префикс. Подробности — на странице Адреса разделов и языки.

Длина надписи — часть вёрстки

Одна и та же кнопка на трёх языках занимает разную ширину: украинские и немецкие подписи заметно длиннее русских, английские короче. Кнопка фиксированной ширины, собранная на русском тексте, на украинском порвётся.

Проверять это нужно переключением языка на живой витрине, а не прикидкой — отдельный пункт в проверке перед выпуском.

Надписи дополнений — не ваша забота

Дополнение везёт свои надписи в себе. Если оно выводит что-то на витрине, его шаблон приезжает в вашу тему вместе с переводами — вам остаётся оформить блок, а не переводить его.

Обновлено 24 августа 2026