y83 code / инструмент

Язык

Инструмент «Язык» переключает язык интерфейса приложения: системный, русский или английский. Это надстройка над системным выбором языка Android, а не замена ему: на Android 13+ выбор дублируется в системный LocaleManager, поэтому работает и экран приложения, и штатный «Язык приложения» в настройках системы.

раздел реестра
Приложение
код
136 строк в 1 файлах
документ
33-language.md
Раздел: 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: Системный / Русский / EnglishLanguageSection
Строка «Текущий язык»Дублирует выбор текстом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):

  1. пишет ключ ui_language в SharedPreferences;
  2. на API 33+ (TIRAMISU) выставляет LocaleManager.applicationLocales — пустой LocaleList для «системного», иначе LocaleList.forLanguageTags(code);
  3. выставляет Locale.setDefault(effective(ctx));
  4. пересоздаёт активность (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_languageAppLocale.setAppLocale.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_languageApp.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 — правило паритета.

Источник: docs/project/hub/33-language.md · Приложение · 136 строк в 1 файлах. Страница собирается из документации проекта при сборке сайта.