.qwen/skills/localization/SKILL.md
Правильно работай с локализацией в Android-проекте. Используй этот навык при добавлении новых строковых ресурсов, работе с plurals, форматировании дат и текстов.
npx skillsauth add easydev991/Jetpack-WorkoutApp localizationInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Основные правила:
res/values/strings.xml (русский) и res/values-en/strings.xml (английский)name в нижнем регистре с подчеркиваниямиПример добавления строки:
<!-- res/values/strings.xml -->
<string name="welcome_message">Добро пожаловать!</string>
<!-- res/values-en/strings.xml -->
<string name="welcome_message">Welcome!</string>
Использование в коде:
context.getString(R.string.welcome_message)
// или в XML
android:text="@string/welcome_message"
Когда использовать:
Правило для русского языка:
one - 1, 21, 31, 41...few - 2-4, 22-24, 32-34...many - 0, 5-20, 25-30, 35-40...other - для всех остальных случаев (обычно не используется в русском)Пример:
<!-- res/values/strings.xml -->
<plurals name="days_count">
<item quantity="one">%d день</item>
<item quantity="few">%d дня</item>
<item quantity="many">%d дней</item>
<item quantity="other">%d дней</item>
</plurals>
<!-- res/values-en/strings.xml -->
<plurals name="days_count">
<item quantity="one">%d day</item>
<item quantity="other">%d days</item>
</plurals>
Использование в коде:
val days = 5
val text = resources.getQuantityString(R.plurals.days_count, days, days)
// Результат: "5 дней" (ru) или "5 days" (en)
Основные инструменты:
String.format() - для форматирования строк с подстановкамиMessageFormat - для сложного форматирования (если нужен)DateFormat - для дат с учетом локали пользователяПример форматирования строки:
<!-- res/values/strings.xml -->
<string name="items_count_format">Найдено %d элементов</string>
<!-- res/values-en/strings.xml -->
<string name="items_count_format">Found %d items</string>
Использование в коде:
val count = 42
val text = getString(R.string.items_count_format, count)
// Результат: "Найдено 42 элементов"
Пример форматирования даты:
val date = LocalDate.now()
val formatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM)
val formattedDate = date.format(formatter)
// Результат зависит от локали устройства
Важное правило: Все логи в коде пишутся на русском языке независимо от локализации приложения
// ✅ Правильно
Log.e(TAG, "Ошибка загрузки данных: ${error.message}")
Log.i(TAG, "Загружено $count элементов")
// ❌ Неправильно
Log.e(TAG, "Error loading data: ${error.message}")
Группировка строк:
auth_, parks_, events_)Пример группировки:
<!-- Авторизация -->
<string name="auth_login">Войти</string>
<string name="auth_password">Пароль</string>
<string name="auth_forgot_password">Забыли пароль?</string>
<!-- Площадки -->
<string name="parks_title">Площадки</string>
<string name="parks_empty">Нет площадок</string>
<string name="parks_filter">Фильтр</string>
Правила:
%1$s, %2$d) для строк с несколькими подстановкамиПример с несколькими параметрами:
<!-- res/values/strings.xml -->
<string name="user_profile">%1$s, %2$d лет</string>
<!-- res/values-en/strings.xml -->
<string name="user_profile">%1$s, %2$d years old</string>
Использование:
val name = "Иван"
val age = 25
val text = getString(R.string.user_profile, name, age)
// Результат: "Иван, 25 лет"
Локализованные сообщения об ошибках:
<!-- Ошибки сети -->
<string name="error_network">Ошибка сети. Проверьте подключение к интернету.</string>
<string name="error_timeout">Время ожидания истекло. Попробуйте еще раз.</string>
<!-- Ошибки авторизации -->
<string name="error_invalid_credentials">Неверный логин или пароль</string>
<string name="error_unauthorized">Необходима авторизация</string>
<!-- Ошибки данных -->
<string name="error_not_found">Данные не найдены</string>
<string name="error_invalid_data">Неверные данные</string>
Использование в коде:
try {
loadData()
} catch (e: IOException) {
Log.e(TAG, "Ошибка сети: ${e.message}")
showError(getString(R.string.error_network))
}
Более подробные примеры см. в файле references/EXAMPLES.md.
res/values/strings.xml (русский)res/values-en/strings.xml (английский)name уникален и соответствует конвенции именованияtesting
Пиши тесты в андроид-проекте правильно. Используй этот навык при написании любых типов тестов (unit, integration, UI), тестировании бизнес-логики, сетевых функций и компонентов UI.
tools
Реализуй pull-to-refresh в Jetpack Compose с использованием Material 3 PullToRefreshBox. Используй этот навык при добавлении возможности обновления данных на экранах со списками или карточками.
tools
Блокировка UI контента экрана во время загрузки данных или выполнения асинхронных операций с отображением индикатора загрузки. Используй этот навык при разработке экранов с сетевыми запросами, операциями CRUD и других асинхронных действий.
tools
Корректная обработка безопасных зон в Jetpack Compose приложениях для Android. Используй при работе с TopAppBar, Scaffold и безопасными зонами экранов в Jetpack-WorkoutApp.