Решили: регистр текста задаётся своим 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.Регистр_объявлен_только_известным_значением.