Раздел: App
Идентификатор:language· Экран:ui/settings/LanguageSettingsScreen.kt
Снимок: 2026-10-11
1. Зачем и что это
В приложении два языка ресурсов: русский — дефолт (res/values), английский — res/values-en. Никаких других языков в сборке нет, поэтому «системный» на любом не-русском телефоне даёт английский.
2. Как попасть
Хаб инструментов → секция App → карточка «Язык» (hub_language_title, подпись «Язык интерфейса: системный, русский или английский»).
| Откуда ещё | Путь |
|---|---|
| Главная | тайл «Язык» (если не скрыт в Настройках главной) |
| Мост | app_navigate с screen: "language" |
Маршрут: Screen.kt:145 ("language" -> Screen.LanguageSettings) → MainRouter.kt:187 (LanguageSettingsScreen(onBack = …)).
3. Экран: элементы и действия
| Элемент | Что делает | Где в коде |
|---|---|---|
Шапка y83@language :~$ | Терминальная шапка, кнопка «назад», в meta — текущий язык | LanguageSettingsScreen |
| Секция выбора | Три чипа SelectChip: Системный / Русский / English | LanguageSection |
| Строка «Текущий язык» | Дублирует выбор текстом | LanguageSettingsScreen |
| Подсказка внизу | Пояснение, что это надстройка над системным языком | R.string.settings_language_hint |
Чипы реализованы компонентом SelectChip (ui/components/SelectChip.kt) — по правилам проекта выбор всегда на бирюзовом бордере primary 2.dp, без secondaryContainer. Подпись чипа для конкретного языка берётся самоназванием на языке текущего интерфейса (languageLabel), «Системный» — из ресурсов.
4. Возможности подробно
Варианты
AppLocale.options = listOf(SYSTEM, RU, EN) — порядок чипов на экране.
| Код | Что означает |
|---|---|
system | ресурсы по локали телефона |
ru | русский, res/values |
en | английский, res/values-en |
Применение
Тап по чипу делает две вещи (AppLocale.set + AppLocale.restart):
- пишет ключ
ui_languageвSharedPreferences; - на API 33+ (
TIRAMISU) выставляетLocaleManager.applicationLocales— пустойLocaleListдля «системного», иначеLocaleList.forLanguageTags(code); - выставляет
Locale.setDefault(effective(ctx)); - пересоздаёт активность (
App.currentActivity?.recreate()), чтобы строки и раскладка перечитались из новой конфигурации.
Системный режим
Для system возвращается базовый контекст без обёртки (AppLocale.wrap), иначе конфигурация заменяется через createConfigurationContext. Это позволяет штатному выбору языка Android работать и дальше.
Что локализовано
Требование проекта: русский текст живёт только в res/values*, в коде — stringResource (Compose) или ResText.get (VM и логика). Стадия i18n ворот (tools/i18n.py) храповит отсутствие хардкода и требует паритет RU/EN, а тронутый файл обязан быть чистым — подробности в docs/tech/i18n.md.
5. Данные: БД, файлы, настройки
| Что | Где лежит | Как меняется | Кто читает |
|---|---|---|---|
| Выбранный язык | SharedPreferences, ключ ui_language | AppLocale.set | AppLocale.current при старте каждой Activity |
| Системная локаль (API 33+) | LocaleManager.applicationLocales | Тот же вызов | Система Android |
6. Backend: REST/роуты
Неприменимо: локальная настройка, сеть не используется.
7. Мост и MCP
| Что | Как | Примечание |
|---|---|---|
| Открыть экран | app_navigate с screen: "language" | BridgeScreenCatalog.kt |
Отдельной команды моста для чтения/смены языка в коде не найдено.
8. Настройки, конфиг, квоты и лимиты
| Параметр | Значение | Где задаётся |
|---|---|---|
| Число языков | 3 варианта | AppLocale.options |
| Каталоги ресурсов | values (RU), values-en (EN) | app/src/main/res/ |
| Ключ настройки | ui_language | App.PREF_LANGUAGE |
9. Ловушки и ограничения
- Навигация сбрасывается.
restart()пересоздаёт активность, стек экранов не сохраняется — после смены языка пользователь оказывается на главном экране. Это указано в KDoc экрана и является ожидаемым поведением. - Подпись в шапке не всегда совпадает с интерфейсом.
metaпоказывает код локали (en/ru), а не подпись «English»/«Русский». - Только два языка. Любой код, добавленный в
AppLocale.optionsбез каталогаvalues-xx, даст английский текст вместо перевода. - Правка в ресурсах без RU/EN-паритета ломает стадию
i18nворот. - Системная локаль Android может перебить выбор при API 33+, если телефон позже изменит язык приложения в системных настройках.
10. Источники правды
app/src/main/java/com/y83/ws/ui/settings/LanguageSettingsScreen.kt— экран.app/src/main/java/com/y83/ws/util/AppLocale.kt— опции,set,wrap,restart.app/src/main/java/com/y83/ws/App.kt—PREF_LANGUAGE,currentActivity.app/src/main/res/values/иvalues-en/— каталоги ресурсов.app/src/main/res/values/strings_hub.xml— подписи карточки хаба.tools/i18n.py,docs/tech/i18n.md— правило паритета.