Подстановка на витрине

Названия товаров

Переводятся как обычные элементы инфоблока: перевод лежит в языковом свойстве рядом с оригиналом. На витрине подставляется теми же хелперами, что и везде — см. catalog.element и catalog.section.

В корзине

Одна строка в шаблоне корзины:

IblockHelper::substituteBasket($arResult);

Она подменяет названия товаров переводом самого элемента и единицы измерения — переводом из словаря.

Название берётся из элемента, а не из строки корзины. Название в корзине — копия, снятая в момент добавления; товар могли переименовать, а копия останется прежней. Переводить её было бы нечем. См. sale.basket.basket.

Единицы измерения

Переводятся полное название и русское обозначение — «штука» и «шт».

Международное обозначение приходит из классификатора и одинаково на всех языках — переводить его не на что, и фразы для него нет.

Какое из двух рисует ваша витрина, решает шаблон каталога. Если международное — перевод единиц вам не нужен вовсе.

Одна тонкость про корзину

Ядро кладёт в строку корзины код единицы из классификатора, а фразы заведены по номеру записи справочника. Модуль переводит одно в другое по карте, читая справочник раз на запрос.

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

Свой код витрины

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

IblockHelper::measureName($id, $default, $symbol);

Третий аргумент у единиц — обозначение, а не название.

На базовом языке ничего не происходит

Все эти хелперы на базовом языке возвращают переданное значение и словарь не спрашивают вовсе.

Читают они словарь без автосоздания: классы зовутся на выводе, и незаведённый код создавался бы посреди отрисовки корзины — по записи в базу на каждое название. См. Lang::get и LANG_VAR.