Locale — это язык, на котором могут выводиться экраны входа, сообщения с одноразовым кодом и экран согласия. Экран Locales хранит список языков, помечает один из них языком по умолчанию и включает или отключает остальные. Активировать язык можно, только когда есть все нужные ему тексты.
Прежде чем начать
Locales находится в боковом меню в группе GLOBAL и действует для всех тенантов. Чтобы увидеть экран, нужно разрешение locales:read, чтобы менять — locales:manage. Прежде чем активировать новый язык, добавьте его тексты в записи из раздела Активация языка.
Список

| Поле | Значение |
|---|---|
| Код языка | Код из фиксированного списка, например en или ru. Показан в первой колонке. |
| Название | Название языка, подставляется по коду. |
| Default | Язык, который применяется, когда ничего другого не подошло. Ровно один. Он должен быть активным. |
| Active / Inactive | Предлагает ли auth этот язык. Используются только активные языки. |
В новой установке есть en (по умолчанию) и ru, оба активны.
Правка списка
Нажмите Edit. Страница превратится в форму, которую вы сохраняете целиком.

- Чтобы добавить язык, выберите его в списке Language и нажмите Add. Он добавляется как Inactive.
- Нажмите Inactive в строке, чтобы активировать язык, или Active, чтобы отключить.
- Нажмите Set default в активной строке, которая ещё не является языком по умолчанию, чтобы сделать его таким.
- Нажмите крестик в строке, чтобы удалить язык.
- Нажмите Save. Если сохранить не удалось, причина появится рядом с кнопкой.
Удаление языка стирает его тексты во всех формах и в шаблонах сообщений OTP и пароля. Описания scope и названия клиентов на этом языке не удаляются. Если добавить язык снова, переводы форм не вернутся.
Активация языка
Активация ещё не активного языка завершится ошибкой, пока во всех этих записях нет непустого текста на нём:
| Запись | Что проверяется |
|---|---|
| Клиенты | Название каждого клиента. |
| Scope | Описание каждого scope и описание каждого claim в нём. См. Scope. |
| Формы | Каждая строка активной версии каждой формы. См. Forms. |
| Шаблоны | Каждый шаблон OTP и временного пароля. |
Тогда консоль покажет Locale ru is incomplete. Missing: и список недостающего, например scope 'payments_read' description или form 'otp' v1. Заполните тексты и сохраните снова. Проверка выполняется только при активации. Уже активный язык при сохранении других изменений заново не проверяется.
Как выбирается язык
ui_locales — параметр запроса OIDC: список кодов языков через пробел, самый предпочтительный первым. Это подсказка. Клиент может передать её в /authorize, и непригодное значение запрос не отклоняет.
В /authorize auth оставляет из ui_locales те коды, которые активны на этом экране, в том порядке, в каком их прислал клиент. Сравнение идёт по точному коду: en-US не совпадает с en. Если ничего не осталось, auth берёт язык по умолчанию. Затем каждый текст выбирается по одному правилу:
- Форма берёт первый язык из списка, который есть в переводах этой формы. Строки, которых нет на этом языке, берутся из языка по умолчанию. В собственном меню языков форма показывает свои языки, которые активны.
- Сообщения с одноразовым кодом и временным паролем берут первый язык из списка, для которого есть текст шаблона, затем язык по умолчанию.
- На экране согласия описания scope и claim берут первый язык из списка, для которого есть текст, затем язык по умолчанию. Если у scope нет описания, экран показывает сам ID scope.
Заголовок Accept-Language в /authorize язык не выбирает. auth читает его только на странице аккаунта (форма auth-settings) и только когда в запросе нет параметра ui_locales. Там теги берутся в порядке заголовка, а их веса q игнорируются.