Подстановка на витрине
Названия товаров
Переводятся как обычные элементы инфоблока: перевод лежит в языковом свойстве рядом с оригиналом. На витрине подставляется теми же хелперами, что и везде — см. catalog.element и catalog.section.
В корзине
Одна строка в шаблоне корзины:
IblockHelper::substituteBasket($arResult);
Она подменяет названия товаров переводом самого элемента и единицы измерения — переводом из словаря.
Название берётся из элемента, а не из строки корзины. Название в корзине — копия, снятая в момент добавления; товар могли переименовать, а копия останется прежней. Переводить её было бы нечем. См. sale.basket.basket.
Единицы измерения
Переводятся полное название и русское обозначение — «штука» и «шт».
Международное обозначение приходит из классификатора и одинаково на всех языках — переводить его не на что, и фразы для него нет.
Какое из двух рисует ваша витрина, решает шаблон каталога. Если международное — перевод единиц вам не нужен вовсе.
Одна тонкость про корзину
Ядро кладёт в строку корзины код единицы из классификатора, а фразы заведены по номеру записи справочника. Модуль переводит одно в другое по карте, читая справочник раз на запрос.
Подставлять код напрямую значило бы промахиваться всегда, а иногда попадать в чужую единицу: номера записей мелкие и с кодами пересекаются.
Свой код витрины
Если каталог собирается не штатными компонентами, названия отдают хелперы фасада. Каждый принимает идентификатор и значение по умолчанию:
IblockHelper::measureName($id, $default, $symbol);
Третий аргумент у единиц — обозначение, а не название.
На базовом языке ничего не происходит
Все эти хелперы на базовом языке возвращают переданное значение и словарь не спрашивают вовсе.
Читают они словарь без автосоздания: классы зовутся на выводе, и незаведённый код создавался бы посреди отрисовки корзины — по записи в базу на каждое название. См. Lang::get и LANG_VAR.