From 585ae0eb5f0e7094a96bece3b0fe94a63f37850b Mon Sep 17 00:00:00 2001 From: busya Date: Sun, 10 Aug 2025 12:28:01 +0300 Subject: [PATCH] l18n added --- GEMINI.md | 31 +++++++++++++++++++ .../ui/screen/dashboard/DashboardScreen.kt | 2 +- .../lens/ui/screen/setup/SetupScreen.kt | 14 ++++----- app/src/main/res/values-en/strings.xml | 8 +++++ app/src/main/res/values/strings.xml | 8 +++++ tech_spec/tech_spec.txt | 2 +- 6 files changed, 56 insertions(+), 9 deletions(-) diff --git a/GEMINI.md b/GEMINI.md index feba5e8..b0ea732 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -61,6 +61,37 @@ Рефакторинг с сохранением всех контрактных гарантий. + + Принципы для обеспечения компилируемости и совместимости генерируемого кода в Android/Gradle/Kotlin проектах. + + Всегда включай полные импорты в начале файла (e.g., import androidx.navigation.NavGraph). Проверяй на unresolved references перед финальной генерацией. + + + Для библиотек вроде Moshi всегда указывай полные аннотации, e.g., @JsonClass(generateAdapter = true). Избегай ошибок missing default value. + + + Используй только Hilt для DI. Избегай Koin или дубликатов: используй @HiltViewModel и hiltViewModel(). При генерации проверяй на конфликты. + + + Убедись в一致ности JVM targets: устанавливай kotlinOptions.jvmTarget = "21" и javaToolchain.languageVersion = JavaLanguageVersion.of(21) в build.gradle.kts. Проверяй на inconsistent compatibility errors. + + + KDoc-теги (@param, @receiver, @invariant и т.д.) — это метаданные, не пути к файлам. Не интерпретируй их как импорты или директории, чтобы избежать ENOENT ошибок в CLI. + + + Перед обновлением ТЗ/структуры проверяй на дубликаты (e.g., logging в TECHNICAL_DECISIONS). Если дубли — объединяй. Для SECURITY_SPEC избегай повторений с ERROR_HANDLING. + + + После генерации кода симулируй компиляцию: перечисли возможные unresolved references, проверь импорты и аннотации. Если ошибки — итеративно исправляй до coherence. + + + + + + Проверь код на компилируемость: импорты, аннотации, JVM-совместимость. + Избежать unresolved references и Gradle-ошибок перед обновлением blueprint. + + Традиционные "Best Practices" как потенциальные анти-паттерны на этапе начальной генерации (Фаза 1). diff --git a/app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt b/app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt index a139801..7798ada 100644 --- a/app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt +++ b/app/src/main/java/com/homebox/lens/ui/screen/dashboard/DashboardScreen.kt @@ -236,7 +236,7 @@ private fun LocationsSection(locations: List, onLocationClick: locations.forEach { location -> SuggestionChip( onClick = { onLocationClick(location) }, - label = { Text("${location.name} (${location.itemCount})") } + label = { Text(stringResource(id = R.string.location_chip_label, location.name, location.itemCount)) } ) } } diff --git a/app/src/main/java/com/homebox/lens/ui/screen/setup/SetupScreen.kt b/app/src/main/java/com/homebox/lens/ui/screen/setup/SetupScreen.kt index 05811aa..6da987f 100644 --- a/app/src/main/java/com/homebox/lens/ui/screen/setup/SetupScreen.kt +++ b/app/src/main/java/com/homebox/lens/ui/screen/setup/SetupScreen.kt @@ -13,8 +13,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.hilt.navigation.compose.hiltViewModel +import androidx.compose.ui.res.stringResource +import com.homebox.lens.R // [FIX] Opt-in for experimental Material 3 APIs @OptIn(ExperimentalMaterial3Api::class) @@ -52,7 +52,7 @@ private fun SetupScreenContent( ) { Scaffold( topBar = { - TopAppBar(title = { Text("Server Setup") }) + TopAppBar(title = { Text(stringResource(id = R.string.setup_title)) }) } ) { paddingValues -> Column( @@ -66,21 +66,21 @@ private fun SetupScreenContent( OutlinedTextField( value = uiState.serverUrl, onValueChange = onServerUrlChange, - label = { Text("Server URL") }, + label = { Text(stringResource(id = R.string.setup_server_url_label)) }, modifier = Modifier.fillMaxWidth() ) Spacer(modifier = Modifier.height(8.dp)) OutlinedTextField( value = uiState.username, onValueChange = onUsernameChange, - label = { Text("Username") }, + label = { Text(stringResource(id = R.string.setup_username_label)) }, modifier = Modifier.fillMaxWidth() ) Spacer(modifier = Modifier.height(8.dp)) OutlinedTextField( value = uiState.password, onValueChange = onPasswordChange, - label = { Text("Password") }, + label = { Text(stringResource(id = R.string.setup_password_label)) }, visualTransformation = PasswordVisualTransformation(), modifier = Modifier.fillMaxWidth() ) @@ -93,7 +93,7 @@ private fun SetupScreenContent( if (uiState.isLoading) { CircularProgressIndicator(modifier = Modifier.size(24.dp)) } else { - Text("Connect") + Text(stringResource(id = R.string.setup_connect_button)) } } uiState.error?.let { diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 0540c94..9f30274 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -22,6 +22,7 @@ Recently Added Locations Labels + %1$s (%2$d) Total Items @@ -33,4 +34,11 @@ Locations Labels + + Server Setup + Server URL + Username + Password + Connect + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index addea58..cc19c67 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -22,6 +22,7 @@ Недавно добавлено Места хранения Метки + %1$s (%2$d) Всего вещей @@ -33,4 +34,11 @@ Локации Метки + + Настройка сервера + URL сервера + Имя пользователя + Пароль + Подключиться + \ No newline at end of file diff --git a/tech_spec/tech_spec.txt b/tech_spec/tech_spec.txt index cbb2740..02b79f7 100644 --- a/tech_spec/tech_spec.txt +++ b/tech_spec/tech_spec.txt @@ -10,7 +10,7 @@ Библиотека логирования В проекте используется Timber (timber.log.Timber) для всех целей логирования. Он предоставляет простой и расширяемый API для логирования. - + Интернационализация (Мультиязычность) Приложение должно поддерживать несколько языков для обеспечения доступности для глобальной аудитории.