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 для логирования.
-
+
Интернационализация (Мультиязычность)
Приложение должно поддерживать несколько языков для обеспечения доступности для глобальной аудитории.