Тексты темы и языки
Где лежат надписи темы, как сделать их переводимыми и как написать текст со склонением по числу.
На этой странице
Надписи темы — «В корзину», «Нет в наличии», «Показать ещё» — не пишутся прямо в
разметке. Они лежат в файлах темы, по одному на язык, и выводятся тегом
{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 это просто строка с точками, а не путь.
Ключи, начинающиеся с //, считаются комментариями и в надписи не попадают —
удобно, чтобы объяснить соседу по коду, что за раздел ниже.
Где магазин ищет надпись
- в файле вашей темы для текущего языка;
- если ключа там нет — в надписях самого магазина;
- не нашлось нигде — выводится сам ключ.
Третий случай не роняет страницу, но в вёрстке будет висеть 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) товара и категории один на все языки — меняется только языковой префикс. Подробности — на странице Адреса разделов и языки.
Длина надписи — часть вёрстки
Одна и та же кнопка на трёх языках занимает разную ширину: украинские и немецкие подписи заметно длиннее русских, английские короче. Кнопка фиксированной ширины, собранная на русском тексте, на украинском порвётся.
Проверять это нужно переключением языка на живой витрине, а не прикидкой — отдельный пункт в проверке перед выпуском.
Надписи дополнений — не ваша забота
Дополнение везёт свои надписи в себе. Если оно выводит что-то на витрине, его шаблон приезжает в вашу тему вместе с переводами — вам остаётся оформить блок, а не переводить его.