From a98ce19e5992c1fbc2ebe23aeed37dbf7dd26538 Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Sun, 12 Jul 2026 11:13:29 +0200 Subject: [PATCH] fix(android): localize skill workshop statuses --- .../app/ui/SkillWorkshopSettingsScreen.kt | 17 +++++++++++++++-- .../ai/openclaw/app/ui/ShellScreenLogicTest.kt | 11 +++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/apps/android/app/src/main/java/ai/openclaw/app/ui/SkillWorkshopSettingsScreen.kt b/apps/android/app/src/main/java/ai/openclaw/app/ui/SkillWorkshopSettingsScreen.kt index 1ffda7a8195b..36fb1d3241eb 100644 --- a/apps/android/app/src/main/java/ai/openclaw/app/ui/SkillWorkshopSettingsScreen.kt +++ b/apps/android/app/src/main/java/ai/openclaw/app/ui/SkillWorkshopSettingsScreen.kt @@ -442,7 +442,7 @@ private fun SkillWorkshopProposalRow( } Column(horizontalAlignment = Alignment.End, verticalArrangement = Arrangement.spacedBy(4.dp)) { ClawStatusPill( - text = if (busy) "loading" else proposal.status, + text = skillWorkshopStatusLabel(if (busy) "loading" else proposal.status), status = skillWorkshopStatusPill(proposal.status), ) Text( @@ -497,7 +497,10 @@ private fun SkillWorkshopProposalDetail( overflow = TextOverflow.Ellipsis, ) } - ClawStatusPill(text = proposal.status, status = skillWorkshopStatusPill(proposal.status)) + ClawStatusPill( + text = skillWorkshopStatusLabel(proposal.status), + status = skillWorkshopStatusPill(proposal.status), + ) } proposal.description?.let { description -> Text(text = description, style = ClawTheme.type.body, color = ClawTheme.colors.textMuted) @@ -656,6 +659,16 @@ internal fun skillWorkshopProposalActionEnabled( status: String, ): Boolean = isConnected && operatorAdminScopeAvailable && !busy && status == "pending" +internal fun skillWorkshopStatusLabel(status: String): String = + when (status) { + "pending" -> nativeString("Pending") + "quarantined", "stale" -> nativeString("Held") + "applied" -> nativeString("Applied") + "rejected" -> nativeString("Rejected") + "loading" -> nativeString("Loading") + else -> status + } + private fun skillWorkshopFilterLabel(filter: String): String = when (filter) { "pending" -> nativeString("Pending") diff --git a/apps/android/app/src/test/java/ai/openclaw/app/ui/ShellScreenLogicTest.kt b/apps/android/app/src/test/java/ai/openclaw/app/ui/ShellScreenLogicTest.kt index 732c723b3c1c..f2047543a63a 100644 --- a/apps/android/app/src/test/java/ai/openclaw/app/ui/ShellScreenLogicTest.kt +++ b/apps/android/app/src/test/java/ai/openclaw/app/ui/ShellScreenLogicTest.kt @@ -291,6 +291,17 @@ class ShellScreenLogicTest { assertFalse(skillWorkshopStatusMatchesFilter("applied", "held")) } + @Test + fun skillWorkshopStatusLabelsMapKnownCodesAndPreserveUnknownValues() { + assertEquals("Pending", skillWorkshopStatusLabel("pending")) + assertEquals("Held", skillWorkshopStatusLabel("quarantined")) + assertEquals("Held", skillWorkshopStatusLabel("stale")) + assertEquals("Applied", skillWorkshopStatusLabel("applied")) + assertEquals("Rejected", skillWorkshopStatusLabel("rejected")) + assertEquals("Loading", skillWorkshopStatusLabel("loading")) + assertEquals("future_status", skillWorkshopStatusLabel("future_status")) + } + @Test fun skillWorkshopVisibleProposalsAreKeyedBySelectedAgentScope() { val mainProposal = skillWorkshopProposal("main-proposal", "pending")