Решили: регистр текста задаётся своим USS-свойством --gm-text-case: upper, а применяет его контрол (PlateButton, Chip); в разметке и локализации строка остаётся человеческой — «Отмена», не «ОТМЕНА».

Почему: text-transform в UI Toolkit отсутствует, и до этой правки капитель набирали сами буквы в разметке. Решением это не было: в дереве одновременно жили «ОТМЕНА» и «Отмена», «НАСТРОЙКИ» и «Настройки», «СОХРАНИТЬ» и «Сохранить» — регистр был случайностью каждой отдельной строки, а не свойством роли. Держать капс в лок-ключе значит принимать решение о ВИДЕ там, где хранится СМЫСЛ, и умножать его на число локалей; та же строка «Отмена» в подсказке обязана остаться строчной. Отвергли третий путь — апперкейс в коде вью по месту: он вернул бы то же самое разнобойное решение, только рассыпанное по восьми экранам вместо разметки.

Сказано: «И лучше разве не брать из ЛОКАЛИЗАЦИИ - капс, а сделать это как стиль, чтобы легко и удобно его добавлять, не меняя локализацию, разве нет?» (06.08.2026, сессия e32de921). Решение пришло от Макса; я в тот момент заводила под капс поле в реестре — оно оказалось не нужно вовсе, потому что образец витрины теперь получает регистр оттуда же, откуда игра.

Грабли: custom-свойства USS в UI Toolkit НЕ НАСЛЕДУЮТСЯ. В CSS --var с родителя доходит до любого потомка; здесь каждый элемент получает только назначенное ЕМУ. Поэтому --gm-text-case на .gm-button виден кнопке, но не её подписи — до подписи капс доходит не по наследству, а потому что контрол применяет его к своему Label сам. Поймал это контактный лист: образец роли «подпись действия» был собран контейнером с классом .gm-button (так он собирался с тех пор, как роль стала меряться вместе с предком) и показал «Начать забег» строчными там, где игра произносит прописными. Образец роли, у которой есть свой контрол, обязан быть этим контролом.

Вторая: ToUpper берётся по текущей культуре, а не инвариантно. В турецком заглавная от «i» — «İ», и ToUpperInvariant дал бы там другую букву. Языков у нас два, но ошибка из тех, что всплывают через год и выглядят необъяснимо.

Владелец правды: UiTextCase, PlateButton.text, components/button.uss, components/tab.uss, тест UiTextToneGateTests.Регистр_объявлен_только_известным_значением.