This commit is contained in:
2026-06-06 22:45:31 +02:00
parent 54f291033c
commit 644119377d
8 changed files with 65 additions and 28 deletions
@@ -1,6 +1,7 @@
package com.bitcointxoko.gudariwallet.i18n package com.bitcointxoko.gudariwallet.i18n
import cafe.adriel.lyricist.LyricistStrings import cafe.adriel.lyricist.LyricistStrings
import kotlin.String
@LyricistStrings(languageTag = "en", default = true) @LyricistStrings(languageTag = "en", default = true)
val EnHomeStrings = AppStrings( val EnHomeStrings = AppStrings(
@@ -31,9 +32,9 @@ val EnHomeStrings = AppStrings(
showFiat = "+ Show fiat", showFiat = "+ Show fiat",
updatedAt = { label -> "Updated $label" }, updatedAt = { label -> "Updated $label" },
justNow = "just now", justNow = "just now",
minAgo = {min -> "$min ago"}, minAgo = {min -> "$min min ago"},
atTime = {time -> "at $time"}, atTime = {time -> "at $time"},
viewHistory = "View History", viewHistory = "Activity",
selectCurrency = "Select currency", selectCurrency = "Select currency",
currencyNone = "None", currencyNone = "None",
hideFiatEquivalent = "Hide fiat equivalent", hideFiatEquivalent = "Hide fiat equivalent",
@@ -196,7 +197,7 @@ val EnHomeStrings = AppStrings(
sendVmPaymentFailedRescan = "Payment failed — could not re-fetch address", sendVmPaymentFailedRescan = "Payment failed — could not re-fetch address",
// ── HistoryScreen ───────────────────────────────────────────────────────── // ── HistoryScreen ─────────────────────────────────────────────────────────
historyTitle = "History", historyTitle = "Activity",
historyClose = "Close", historyClose = "Close",
historySearchPayments = "Search payments", historySearchPayments = "Search payments",
historyFilterPayments = "Filter payments", historyFilterPayments = "Filter payments",
@@ -272,6 +273,10 @@ val EnHomeStrings = AppStrings(
"partial matches work too.", "partial matches work too.",
// ── PaymentDetailScreen ─────────────────────────────────────────────────── // ── PaymentDetailScreen ───────────────────────────────────────────────────
statusSuccess = "Success", // e.g. "Success"
statusPending = "Pending", // e.g. "Pending"
statusFailed = "Failed", // e.g. "Failed"
statusUnknown = "Unknown", // e.g. "Unknown"
detailOutgoingTitle = "Outgoing payment", detailOutgoingTitle = "Outgoing payment",
detailIncomingTitle = "Incoming payment", detailIncomingTitle = "Incoming payment",
detailBack = "Back", detailBack = "Back",
@@ -33,7 +33,7 @@ val EsHomeStrings = AppStrings(
justNow = "justo ahora", justNow = "justo ahora",
minAgo = {min -> "hace $min min"}, minAgo = {min -> "hace $min min"},
atTime = {time -> "a las $time"}, atTime = {time -> "a las $time"},
viewHistory = "Ver historial", viewHistory = "Historial",
selectCurrency = "Seleccionar moneda", selectCurrency = "Seleccionar moneda",
currencyNone = "Ninguna", currencyNone = "Ninguna",
hideFiatEquivalent = "Ocultar equivalente fiat", hideFiatEquivalent = "Ocultar equivalente fiat",
@@ -272,6 +272,10 @@ val EsHomeStrings = AppStrings(
"las coincidencias parciales también funcionan.", "las coincidencias parciales también funcionan.",
// ── PaymentDetailScreen ─────────────────────────────────────────────────── // ── PaymentDetailScreen ───────────────────────────────────────────────────
statusSuccess = "Completado",
statusPending = "Pendiente",
statusFailed = "Fallido",
statusUnknown = "Desconocido",
detailOutgoingTitle = "Pago saliente", detailOutgoingTitle = "Pago saliente",
detailIncomingTitle = "Pago entrante", detailIncomingTitle = "Pago entrante",
detailBack = "Atrás", detailBack = "Atrás",
@@ -33,7 +33,7 @@ val EuStrings = AppStrings(
justNow = "orain bertan", justNow = "orain bertan",
minAgo = { min -> "duela $min minutu" }, minAgo = { min -> "duela $min minutu" },
atTime = { time -> "$time-etan" }, atTime = { time -> "$time-etan" },
viewHistory = "Ikusi historia", viewHistory = "Historia",
selectCurrency = "Hautatu moneta", selectCurrency = "Hautatu moneta",
currencyNone = "Bat ere ez", currencyNone = "Bat ere ez",
hideFiatEquivalent = "Ezkutatu fiat baliokidea", hideFiatEquivalent = "Ezkutatu fiat baliokidea",
@@ -272,6 +272,10 @@ val EuStrings = AppStrings(
"zati-bat datozenak ere funtzionatzen dute.", "zati-bat datozenak ere funtzionatzen dute.",
// ── PaymentDetailScreen ─────────────────────────────────────────────────── // ── PaymentDetailScreen ───────────────────────────────────────────────────
statusSuccess = "Osatuta",
statusPending = "Zain",
statusFailed = "Huts eginda",
statusUnknown = "Ezezaguna",
detailOutgoingTitle = "Irteerako ordainketa", detailOutgoingTitle = "Irteerako ordainketa",
detailIncomingTitle = "Sarrerako ordainketa", detailIncomingTitle = "Sarrerako ordainketa",
detailBack = "Atzera", detailBack = "Atzera",
@@ -271,6 +271,10 @@ data class AppStrings(
val searchInfoFooter : String, val searchInfoFooter : String,
// ── PaymentDetailScreen ─────────────────────────────────────────────────── // ── PaymentDetailScreen ───────────────────────────────────────────────────
val statusSuccess : String, // e.g. "Success"
val statusPending : String, // e.g. "Pending"
val statusFailed : String, // e.g. "Failed"
val statusUnknown : String, // e.g. "Unknown"
val detailOutgoingTitle : String, val detailOutgoingTitle : String,
val detailIncomingTitle : String, val detailIncomingTitle : String,
val detailBack : String, val detailBack : String,
@@ -0,0 +1,8 @@
package com.bitcointxoko.gudariwallet.i18n
fun AppStrings.paymentStatusLabel(status: String): String = when (status.lowercase()) {
"success" -> statusSuccess
"pending" -> statusPending
"failed" -> statusFailed
else -> statusUnknown
}
@@ -45,8 +45,8 @@ fun HomeTab(
val balanceState by vm.balanceState.collectAsState() val balanceState by vm.balanceState.collectAsState()
val balanceHidden by vm.balanceHidden.collectAsState() val balanceHidden by vm.balanceHidden.collectAsState()
// ── NEW: language switcher state ────────────────────────────────────────── // ── Language switcher state ──────────────────────────────────────────
val supportedTags = remember { listOf("en", "es", "eu") } // add more as you add locale files // val supportedTags = remember { listOf("en", "es", "eu") } // add more as you add locale files
val isRefreshing = balanceState is BalanceState.Loading val isRefreshing = balanceState is BalanceState.Loading
|| (balanceState as? BalanceState.Success)?.isRefreshing == true || (balanceState as? BalanceState.Success)?.isRefreshing == true
@@ -222,12 +222,12 @@ fun HomeTab(
} }
// ── NEW: Language switcher ───────────────────────────────── // ── NEW: Language switcher ─────────────────────────────────
Spacer(Modifier.height(8.dp)) // Spacer(Modifier.height(8.dp))
LanguageSwitcherButton( // LanguageSwitcherButton(
currentTag = lyricist.languageTag, // currentTag = lyricist.languageTag,
supportedTags = supportedTags, // supportedTags = supportedTags,
onSelect = { tag -> lyricist.languageTag = tag } // onSelect = { tag -> lyricist.languageTag = tag }
) // )
// ────────────────────────────────────────────────────────── // ──────────────────────────────────────────────────────────
if (showCurrencyPicker) { if (showCurrencyPicker) {
@@ -27,6 +27,7 @@ import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.style.TextDecoration import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.bitcointxoko.gudariwallet.LocalAppStrings
import com.bitcointxoko.gudariwallet.ui.theme.semanticColors import com.bitcointxoko.gudariwallet.ui.theme.semanticColors
// ── Amount + fiat column ───────────────────────────────────────────────────── // ── Amount + fiat column ─────────────────────────────────────────────────────
@@ -63,31 +64,45 @@ internal fun AmountWithFiatColumn(
@Composable @Composable
internal fun StatusChip(status: String) { internal fun StatusChip(status: String) {
val semantic = semanticColors() val semantic = semanticColors()
val strings = LocalAppStrings.current // or however you access Lyricist strings
val (containerColor, contentColor) = when (status.lowercase()) { data class ChipStyle(
"success", "complete", "paid" -> val containerColor: Color,
semantic.successContainer to semantic.onSuccessContainer val contentColor: Color,
"pending", "in_flight", "inflight" -> val label: String,
semantic.warningContainer to semantic.onWarningContainer )
"failed", "error", "expired" ->
semantic.errorContainer to semantic.onErrorContainer val style = when (status.lowercase()) {
else -> "success", "complete", "paid" -> ChipStyle(
MaterialTheme.colorScheme.surfaceVariant to MaterialTheme.colorScheme.onSurfaceVariant semantic.successContainer, semantic.onSuccessContainer, strings.statusSuccess
)
"pending", "in_flight", "inflight" -> ChipStyle(
semantic.warningContainer, semantic.onWarningContainer, strings.statusPending
)
"failed", "error", "expired" -> ChipStyle(
semantic.errorContainer, semantic.onErrorContainer, strings.statusFailed
)
else -> ChipStyle(
MaterialTheme.colorScheme.surfaceVariant,
MaterialTheme.colorScheme.onSurfaceVariant,
strings.statusUnknown,
)
} }
Surface( Surface(
shape = MaterialTheme.shapes.small, shape = MaterialTheme.shapes.small,
color = containerColor, color = style.containerColor,
contentColor = contentColor contentColor = style.contentColor,
) { ) {
Text( Text(
text = status.replaceFirstChar { it.uppercase() }, text = style.label,
style = MaterialTheme.typography.labelSmall, style = MaterialTheme.typography.labelSmall,
modifier = Modifier.padding(horizontal = 10.dp, vertical = 4.dp) modifier = Modifier.padding(horizontal = 10.dp, vertical = 4.dp)
) )
} }
} }
// ── Section card wrapper ───────────────────────────────────────────────────── // ── Section card wrapper ─────────────────────────────────────────────────────
@Composable @Composable
@@ -232,9 +232,6 @@ fun SendScreen(
Spacer(Modifier.height(8.dp)) Spacer(Modifier.height(8.dp))
Text( Text(
text = strings.paymentTakingLongDetail, text = strings.paymentTakingLongDetail,
// "Your payment is still on its way. This may be a hold invoice
// that settles when the recipient is ready. You'll get a
// notification when it completes — you can safely leave this screen."
style = MaterialTheme.typography.bodySmall, style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant, color = MaterialTheme.colorScheme.onSurfaceVariant,
textAlign = TextAlign.Center textAlign = TextAlign.Center