diff --git a/app/src/main/java/com/m57/hermescontrol/ui/achievements/AchievementsScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/achievements/AchievementsScreen.kt
index 9ad5c8ff..95a83025 100644
--- a/app/src/main/java/com/m57/hermescontrol/ui/achievements/AchievementsScreen.kt
+++ b/app/src/main/java/com/m57/hermescontrol/ui/achievements/AchievementsScreen.kt
@@ -23,10 +23,12 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
+import com.m57.hermescontrol.R
import com.m57.hermescontrol.ui.common.EmptyState
import com.m57.hermescontrol.ui.common.ErrorState
import com.m57.hermescontrol.ui.common.HermesScaffold
@@ -45,7 +47,7 @@ fun AchievementsScreen(
}
HermesScaffold(
- title = { Text("Agent Achievements") },
+ title = { Text(stringResource(R.string.screen_achievements)) },
onOpenDrawer = onOpenDrawer,
isRefreshing = state.isLoading,
onRefresh = { viewModel.loadAchievements() },
@@ -65,8 +67,8 @@ fun AchievementsScreen(
state.achievements.isEmpty() -> {
EmptyState(
- title = "No achievements yet",
- subtitle = "Complete tasks to unlock achievements.",
+ title = stringResource(R.string.achievements_empty_title),
+ subtitle = stringResource(R.string.achievements_empty_desc),
icon = Icons.Filled.Refresh,
modifier = Modifier.padding(paddingValues),
)
@@ -156,8 +158,11 @@ fun AchievementsScreen(
) {
Text(
text =
- "Progress: ${achievement.progress?.toInt() ?: 0} / " +
- "${achievement.next_threshold?.toInt() ?: 0}",
+ stringResource(
+ R.string.achievements_label_progress,
+ achievement.progress?.toInt() ?: 0,
+ achievement.next_threshold?.toInt() ?: 0,
+ ),
style = MaterialTheme.typography.bodySmall,
)
Text(
diff --git a/app/src/main/java/com/m57/hermescontrol/ui/channels/ChannelsScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/channels/ChannelsScreen.kt
index d3df7f06..f5ff2403 100644
--- a/app/src/main/java/com/m57/hermescontrol/ui/channels/ChannelsScreen.kt
+++ b/app/src/main/java/com/m57/hermescontrol/ui/channels/ChannelsScreen.kt
@@ -29,9 +29,11 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
+import com.m57.hermescontrol.R
import com.m57.hermescontrol.data.model.MessagingPlatformUpdate
import com.m57.hermescontrol.ui.common.EmptyState
import com.m57.hermescontrol.ui.common.ErrorState
@@ -59,7 +61,7 @@ fun ChannelsScreen(
}
HermesScaffold(
- title = { Text("Messaging Channels") },
+ title = { Text(stringResource(R.string.screen_channels)) },
onOpenDrawer = onOpenDrawer,
isRefreshing = state.isLoading,
onRefresh = { viewModel.loadPlatforms() },
@@ -79,8 +81,8 @@ fun ChannelsScreen(
state.platforms.isEmpty() -> {
EmptyState(
- title = "No channels configured",
- subtitle = "Add messaging platforms in Hermes to see them here.",
+ title = stringResource(R.string.channels_empty_title),
+ subtitle = stringResource(R.string.channels_empty_desc),
modifier = Modifier.padding(paddingValues),
)
}
@@ -104,7 +106,14 @@ fun ChannelsScreen(
Column {
Text(text = platform.name, style = MaterialTheme.typography.titleLarge)
Text(
- text = if (platform.enabled) "Active" else "Disabled",
+ text =
+ if (platform.enabled) {
+ stringResource(
+ R.string.channels_status_active,
+ )
+ } else {
+ stringResource(R.string.channels_status_disabled)
+ },
color =
if (platform.enabled) {
MaterialTheme.colorScheme.primary
@@ -126,7 +135,15 @@ fun ChannelsScreen(
)
Spacer(modifier = Modifier.width(8.dp))
Button(onClick = { showConfigureForm = !showConfigureForm }) {
- Text(if (showConfigureForm) "Cancel" else "Configure")
+ Text(
+ if (showConfigureForm) {
+ stringResource(
+ R.string.action_cancel,
+ )
+ } else {
+ stringResource(R.string.channels_action_configure)
+ },
+ )
}
}
}
@@ -134,7 +151,7 @@ fun ChannelsScreen(
if (showConfigureForm) {
Spacer(modifier = Modifier.height(16.dp))
Text(
- text = "Configuration Settings",
+ text = stringResource(R.string.channels_sec_settings),
style = MaterialTheme.typography.titleMedium,
)
@@ -148,7 +165,7 @@ fun ChannelsScreen(
label = { Text(field.prompt ?: field.key) },
placeholder = {
if (field.isSet) {
- Text("******** (Already Configured)")
+ Text(stringResource(R.string.channels_placeholder_configured))
}
},
modifier = Modifier.fillMaxWidth(),
@@ -169,13 +186,16 @@ fun ChannelsScreen(
},
modifier = Modifier.align(Alignment.End),
) {
- Text("Save Settings")
+ Text(stringResource(R.string.channels_action_save_settings))
}
} else {
val envFields = platform.envVars.orEmpty()
if (envFields.isNotEmpty()) {
Spacer(modifier = Modifier.height(8.dp))
- Text(text = "Configured Keys:", style = MaterialTheme.typography.titleSmall)
+ Text(
+ text = stringResource(R.string.channels_sec_keys),
+ style = MaterialTheme.typography.titleSmall,
+ )
envFields.forEach { field ->
Row(
modifier = Modifier.fillMaxWidth(),
@@ -187,7 +207,14 @@ fun ChannelsScreen(
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
Text(
- text = if (field.isSet) "Configured" else "Not set",
+ text =
+ if (field.isSet) {
+ stringResource(
+ R.string.channels_status_configured,
+ )
+ } else {
+ stringResource(R.string.channels_status_not_set)
+ },
style = MaterialTheme.typography.bodyMedium,
color =
if (field.isSet) {
diff --git a/app/src/main/java/com/m57/hermescontrol/ui/cron/CronJobsScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/cron/CronJobsScreen.kt
index fbb4a9f3..0f168432 100644
--- a/app/src/main/java/com/m57/hermescontrol/ui/cron/CronJobsScreen.kt
+++ b/app/src/main/java/com/m57/hermescontrol/ui/cron/CronJobsScreen.kt
@@ -24,9 +24,11 @@ import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
+import com.m57.hermescontrol.R
import com.m57.hermescontrol.theme.LocalSpacing
import com.m57.hermescontrol.ui.common.EmptyState
import com.m57.hermescontrol.ui.common.ErrorState
@@ -60,7 +62,7 @@ fun CronJobsScreen(
}
HermesScaffold(
- title = { Text("Cron Jobs") },
+ title = { Text(stringResource(R.string.screen_cron)) },
onOpenDrawer = onOpenDrawer,
isRefreshing = state.isLoading,
onRefresh = { viewModel.loadCronJobs() },
@@ -79,8 +81,8 @@ fun CronJobsScreen(
state.jobs.isEmpty() -> {
EmptyState(
- title = "No cron jobs",
- subtitle = "Scheduled tasks from Hermes will appear here.",
+ title = stringResource(R.string.cron_empty_title),
+ subtitle = stringResource(R.string.cron_empty_desc),
icon = Icons.Filled.Schedule,
)
}
@@ -112,7 +114,14 @@ fun CronJobsScreen(
modifier = Modifier.weight(1f),
)
StatusBadge(
- text = if (job.state == "active") "Active" else "Paused",
+ text =
+ if (job.state == "active") {
+ stringResource(
+ R.string.cron_status_active,
+ )
+ } else {
+ stringResource(R.string.cron_status_paused)
+ },
status =
if (job.state == "active") {
StatusBadgeType.SUCCESS
@@ -143,21 +152,21 @@ fun CronJobsScreen(
onClick = { viewModel.pauseCronJob(job.id) },
modifier = Modifier.weight(1f),
) {
- Text("Pause")
+ Text(stringResource(R.string.cron_action_pause))
}
} else {
OutlinedButton(
onClick = { viewModel.resumeCronJob(job.id) },
modifier = Modifier.weight(1f),
) {
- Text("Resume")
+ Text(stringResource(R.string.cron_action_resume))
}
}
OutlinedButton(
onClick = { viewModel.triggerCronJob(job.id) },
modifier = Modifier.weight(1f),
) {
- Text("Run")
+ Text(stringResource(R.string.cron_action_run))
}
Button(
onClick = { viewModel.deleteCronJob(job.id) },
@@ -167,7 +176,7 @@ fun CronJobsScreen(
),
modifier = Modifier.weight(1f),
) {
- Text("Delete")
+ Text(stringResource(R.string.action_delete))
}
}
}
diff --git a/app/src/main/java/com/m57/hermescontrol/ui/gateway/GatewayScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/gateway/GatewayScreen.kt
index 1bb314ca..5c9e6641 100644
--- a/app/src/main/java/com/m57/hermescontrol/ui/gateway/GatewayScreen.kt
+++ b/app/src/main/java/com/m57/hermescontrol/ui/gateway/GatewayScreen.kt
@@ -32,10 +32,12 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
+import com.m57.hermescontrol.R
import com.m57.hermescontrol.ui.common.ErrorState
import com.m57.hermescontrol.ui.common.HermesScaffold
import com.m57.hermescontrol.ui.common.LoadingState
@@ -62,7 +64,7 @@ fun GatewayScreen(
}
HermesScaffold(
- title = { Text("Gateway Control") },
+ title = { Text(stringResource(R.string.screen_gateway)) },
onOpenDrawer = onOpenDrawer,
isRefreshing = state.isLoading,
onRefresh = { viewModel.loadStatus() },
@@ -96,7 +98,7 @@ fun GatewayScreen(
)
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = { viewModel.loadStatus() }) {
- Text("Retry")
+ Text(stringResource(R.string.action_retry))
}
}
} else {
@@ -132,7 +134,14 @@ fun GatewayScreen(
horizontalAlignment = Alignment.CenterHorizontally,
) {
Text(
- text = if (isRunning) "GATEWAY RUNNING" else "GATEWAY STOPPED",
+ text =
+ if (isRunning) {
+ stringResource(
+ R.string.gateway_status_running,
+ )
+ } else {
+ stringResource(R.string.gateway_status_stopped)
+ },
style = MaterialTheme.typography.headlineSmall,
fontWeight = FontWeight.Bold,
color =
@@ -145,7 +154,7 @@ fun GatewayScreen(
status?.version?.let {
Spacer(modifier = Modifier.height(4.dp))
Text(
- text = "Version: $it",
+ text = stringResource(R.string.gateway_label_version, it),
style = MaterialTheme.typography.bodySmall,
color =
if (isRunning) {
@@ -170,7 +179,7 @@ fun GatewayScreen(
verticalArrangement = Arrangement.spacedBy(12.dp),
) {
Text(
- text = "Controls",
+ text = stringResource(R.string.gateway_sec_controls),
style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.SemiBold,
)
@@ -191,7 +200,7 @@ fun GatewayScreen(
) {
Icon(imageVector = Icons.Filled.PlayArrow, contentDescription = null)
Spacer(modifier = Modifier.width(4.dp))
- Text("Start")
+ Text(stringResource(R.string.gateway_action_start))
}
Button(
@@ -204,7 +213,7 @@ fun GatewayScreen(
contentColor = Color.White,
),
) {
- Text("Stop")
+ Text(stringResource(R.string.gateway_action_stop))
}
}
@@ -219,7 +228,7 @@ fun GatewayScreen(
) {
Icon(imageVector = Icons.Filled.Refresh, contentDescription = null)
Spacer(modifier = Modifier.width(4.dp))
- Text("Restart")
+ Text(stringResource(R.string.gateway_action_restart))
}
if (state.isActionRunning) {
@@ -245,7 +254,7 @@ fun GatewayScreen(
verticalArrangement = Arrangement.spacedBy(8.dp),
) {
Text(
- text = "Active Platforms",
+ text = stringResource(R.string.gateway_sec_active_platforms),
style = MaterialTheme.typography.titleMedium,
fontWeight = FontWeight.SemiBold,
)
diff --git a/app/src/main/java/com/m57/hermescontrol/ui/keys/KeysScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/keys/KeysScreen.kt
index e56ccf50..b0060401 100644
--- a/app/src/main/java/com/m57/hermescontrol/ui/keys/KeysScreen.kt
+++ b/app/src/main/java/com/m57/hermescontrol/ui/keys/KeysScreen.kt
@@ -36,10 +36,12 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
+import com.m57.hermescontrol.R
import com.m57.hermescontrol.ui.common.EmptyState
import com.m57.hermescontrol.ui.common.ErrorState
import com.m57.hermescontrol.ui.common.HermesScaffold
@@ -67,7 +69,7 @@ fun KeysScreen(
}
HermesScaffold(
- title = { Text("Keys & Credentials") },
+ title = { Text(stringResource(R.string.screen_keys)) },
onOpenDrawer = onOpenDrawer,
isRefreshing = state.isLoading,
onRefresh = { viewModel.loadKeys() },
@@ -87,10 +89,10 @@ fun KeysScreen(
state.envVars.isEmpty() -> {
EmptyState(
- title = "No environment keys reported",
- subtitle = "Verify configuration or retry",
+ title = stringResource(R.string.keys_empty_title),
+ subtitle = stringResource(R.string.toolsets_empty_desc),
onAction = { viewModel.loadKeys() },
- actionLabel = "Refresh",
+ actionLabel = stringResource(R.string.content_desc_refresh),
modifier = Modifier.padding(paddingValues),
)
}
@@ -123,7 +125,7 @@ fun KeysScreen(
} else if (config.isSet) {
config.redactedValue ?: "********"
} else {
- "Not configured"
+ stringResource(R.string.keys_label_not_configured)
}
Card(modifier = Modifier.fillMaxWidth()) {
@@ -158,13 +160,13 @@ fun KeysScreen(
viewModel.updateKey(key, editedValue)
isEditing = false
}) {
- Text("Save")
+ Text(stringResource(R.string.action_save))
}
Spacer(modifier = Modifier.width(8.dp))
Button(onClick = {
isEditing = false
}) {
- Text("Cancel")
+ Text(stringResource(R.string.action_cancel))
}
}
} else {
@@ -196,7 +198,10 @@ fun KeysScreen(
} else {
Icons.Filled.Visibility
},
- contentDescription = "Toggle Visibility",
+ contentDescription =
+ stringResource(
+ R.string.keys_action_toggle_visibility,
+ ),
)
}
}
@@ -206,7 +211,10 @@ fun KeysScreen(
}) {
Icon(
imageVector = Icons.Filled.Edit,
- contentDescription = "Edit",
+ contentDescription =
+ stringResource(
+ R.string.nav_drawer_section_converse,
+ ),
)
}
}
diff --git a/app/src/main/java/com/m57/hermescontrol/ui/mcp/McpServersScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/mcp/McpServersScreen.kt
index acb2dc14..39da6410 100644
--- a/app/src/main/java/com/m57/hermescontrol/ui/mcp/McpServersScreen.kt
+++ b/app/src/main/java/com/m57/hermescontrol/ui/mcp/McpServersScreen.kt
@@ -28,11 +28,13 @@ import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
+import com.m57.hermescontrol.R
import com.m57.hermescontrol.ui.common.ErrorState
import com.m57.hermescontrol.ui.common.HermesScaffold
import com.m57.hermescontrol.ui.common.LoadingState
@@ -59,7 +61,7 @@ fun McpServersScreen(
}
HermesScaffold(
- title = { Text("MCP Servers") },
+ title = { Text(stringResource(R.string.screen_mcp_servers)) },
onOpenDrawer = onOpenDrawer,
isRefreshing = state.isLoading,
onRefresh = { viewModel.loadServers() },
@@ -89,7 +91,7 @@ fun McpServersScreen(
Text(text = state.errorMessage ?: "", color = MaterialTheme.colorScheme.error)
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = { viewModel.loadServers() }) {
- Text("Retry")
+ Text(stringResource(R.string.action_retry))
}
}
} else {
@@ -129,7 +131,11 @@ fun McpServersScreen(
fontWeight = FontWeight.Bold,
)
Text(
- text = "Transport: ${server.transport ?: "stdio"}",
+ text =
+ stringResource(
+ R.string.mcp_servers_label_transport,
+ server.transport ?: "stdio",
+ ),
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
@@ -145,7 +151,7 @@ fun McpServersScreen(
Spacer(modifier = Modifier.height(8.dp))
val fullCmd = "${server.command} ${server.args.orEmpty().joinToString(" ")}"
Text(
- text = "Command:",
+ text = stringResource(R.string.mcp_servers_label_command),
style = MaterialTheme.typography.bodySmall,
fontWeight = FontWeight.Bold,
)
@@ -168,13 +174,13 @@ fun McpServersScreen(
onClick = { viewModel.testServer(server.name) },
modifier = Modifier.padding(end = 8.dp),
) {
- Text("Test")
+ Text(stringResource(R.string.mcp_servers_action_test))
}
OutlinedButton(
onClick = { viewModel.deleteServer(server.name) },
) {
- Text("Delete")
+ Text(stringResource(R.string.action_delete))
}
}
}
diff --git a/app/src/main/java/com/m57/hermescontrol/ui/plugins/PluginsScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/plugins/PluginsScreen.kt
index bccbcb80..6b1d1db5 100644
--- a/app/src/main/java/com/m57/hermescontrol/ui/plugins/PluginsScreen.kt
+++ b/app/src/main/java/com/m57/hermescontrol/ui/plugins/PluginsScreen.kt
@@ -28,9 +28,11 @@ import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
+import com.m57.hermescontrol.R
import com.m57.hermescontrol.ui.common.EmptyState
import com.m57.hermescontrol.ui.common.ErrorState
import com.m57.hermescontrol.ui.common.HermesScaffold
@@ -58,7 +60,7 @@ fun PluginsScreen(
}
HermesScaffold(
- title = { Text("Plugins") },
+ title = { Text(stringResource(R.string.screen_plugins)) },
onOpenDrawer = onOpenDrawer,
isRefreshing = state.isLoading,
onRefresh = { viewModel.loadPlugins() },
@@ -78,10 +80,10 @@ fun PluginsScreen(
state.plugins.isEmpty() -> {
EmptyState(
- title = "No plugins found",
- subtitle = "Verify configuration or retry",
+ title = stringResource(R.string.plugins_empty_title),
+ subtitle = stringResource(R.string.plugins_empty_desc),
onAction = { viewModel.loadPlugins() },
- actionLabel = "Refresh",
+ actionLabel = stringResource(R.string.content_desc_refresh),
modifier = Modifier.padding(paddingValues),
)
}
@@ -129,7 +131,7 @@ fun PluginsScreen(
}
Spacer(modifier = Modifier.height(4.dp))
Text(
- text = plugin.description ?: "No description provided.",
+ text = plugin.description ?: stringResource(R.string.plugins_no_desc),
style = MaterialTheme.typography.bodyMedium,
)
Spacer(modifier = Modifier.height(8.dp))
@@ -139,7 +141,7 @@ fun PluginsScreen(
) {
if (plugin.installed) {
OutlinedButton(onClick = { viewModel.updatePlugin(plugin.name) }) {
- Text("Update")
+ Text(stringResource(R.string.plugins_action_update))
}
Spacer(modifier = Modifier.width(8.dp))
OutlinedButton(
@@ -149,11 +151,11 @@ fun PluginsScreen(
contentColor = MaterialTheme.colorScheme.error,
),
) {
- Text("Uninstall")
+ Text(stringResource(R.string.plugins_action_uninstall))
}
} else {
Button(onClick = { viewModel.installPlugin(plugin.name) }) {
- Text("Install")
+ Text(stringResource(R.string.plugins_action_install))
}
}
}
diff --git a/app/src/main/java/com/m57/hermescontrol/ui/profiles/ProfilesScreen.kt b/app/src/main/java/com/m57/hermescontrol/ui/profiles/ProfilesScreen.kt
index 00d8234b..52f846f8 100644
--- a/app/src/main/java/com/m57/hermescontrol/ui/profiles/ProfilesScreen.kt
+++ b/app/src/main/java/com/m57/hermescontrol/ui/profiles/ProfilesScreen.kt
@@ -35,10 +35,12 @@ import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.lifecycle.viewmodel.compose.viewModel
+import com.m57.hermescontrol.R
import com.m57.hermescontrol.ui.common.EmptyState
import com.m57.hermescontrol.ui.common.ErrorState
import com.m57.hermescontrol.ui.common.HermesScaffold
@@ -71,7 +73,7 @@ fun ProfilesScreen(
}
HermesScaffold(
- title = { Text("Profiles") },
+ title = { Text(stringResource(R.string.screen_profiles)) },
onOpenDrawer = onOpenDrawer,
isRefreshing = state.isLoading,
onRefresh = { viewModel.loadProfiles() },
@@ -91,10 +93,10 @@ fun ProfilesScreen(
state.profiles.isEmpty() -> {
EmptyState(
- title = "No profiles available",
- subtitle = "Verify configuration or retry",
+ title = stringResource(R.string.profiles_empty_title),
+ subtitle = stringResource(R.string.toolsets_empty_desc),
onAction = { viewModel.loadProfiles() },
- actionLabel = "Refresh",
+ actionLabel = stringResource(R.string.content_desc_refresh),
modifier = Modifier.padding(paddingValues),
)
}
@@ -111,7 +113,7 @@ fun ProfilesScreen(
Text(text = state.errorMessage ?: "", color = MaterialTheme.colorScheme.error)
Spacer(modifier = Modifier.height(16.dp))
Button(onClick = { viewModel.loadProfiles() }) {
- Text("Retry")
+ Text(stringResource(R.string.action_retry))
}
}
} else {
@@ -170,7 +172,10 @@ fun ProfilesScreen(
if (isActive) {
Icon(
imageVector = Icons.Filled.Check,
- contentDescription = "Active Profile",
+ contentDescription =
+ stringResource(
+ R.string.profiles_content_desc_active,
+ ),
tint = MaterialTheme.colorScheme.primary,
modifier = Modifier.padding(start = 8.dp),
)
@@ -186,11 +191,19 @@ fun ProfilesScreen(
) {
Column {
Text(
- text = "Model: ${profile.model ?: "None"}",
+ text =
+ stringResource(
+ R.string.profiles_label_model,
+ profile.model ?: "None",
+ ),
style = MaterialTheme.typography.bodyMedium,
)
Text(
- text = "Provider: ${profile.provider ?: "None"}",
+ text =
+ stringResource(
+ R.string.profiles_label_provider,
+ profile.provider ?: "None",
+ ),
style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant,
)
@@ -216,7 +229,7 @@ fun ProfilesScreen(
modifier = Modifier.width(16.dp),
)
Spacer(modifier = Modifier.width(4.dp))
- Text("Edit Soul")
+ Text(stringResource(R.string.profiles_action_edit_soul))
}
Button(
@@ -226,7 +239,7 @@ fun ProfilesScreen(
tempModelName = profile.model ?: ""
},
) {
- Text("Set Model")
+ Text(stringResource(R.string.profiles_action_set_model))
}
}
}
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 6006e65a..bec1d6a7 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -255,4 +255,67 @@
YAML Config...
Reset
Save Config
+
+
+ No profiles available
+ Model: %1$s
+ Provider: %1$s
+ Edit Soul
+ Set Model
+ Active Profile
+
+
+ No plugins found
+ Verify configuration or retry
+ No description provided.
+ Update
+ Uninstall
+ Install
+
+
+ Transport: %1$s
+ Command:
+ Test
+
+
+ GATEWAY RUNNING
+ GATEWAY STOPPED
+ Version: %1$s
+ Controls
+ Start
+ Stop
+ Restart
+ Active Platforms
+
+
+ No cron jobs
+ Scheduled tasks from Hermes will appear here.
+ Active
+ Paused
+ Pause
+ Resume
+ Run
+
+
+ No achievements yet
+ Complete tasks to unlock achievements.
+ Progress: %1$d / %2$d
+
+
+ No environment keys reported
+ Not configured
+ Toggle Visibility
+
+
+ No channels configured
+ Add messaging platforms in Hermes to see them here.
+ Active
+ Disabled
+ Configure
+ Configuration Settings
+ ******** (Already Configured)
+ Save Settings
+ Configured Keys:
+ Configured
+ Not set
\ No newline at end of file