refactor: i18n HistoryStrings

This commit is contained in:
2026-06-11 23:34:48 +02:00
parent b053da6a05
commit 868869fd88
11 changed files with 980 additions and 535 deletions
@@ -141,117 +141,117 @@ val EnHomeStrings = AppStrings(
sendVmUnsupportedType = { tag -> "Unsupported type: $tag" }, sendVmUnsupportedType = { tag -> "Unsupported type: $tag" },
sendVmPaymentFailedRescan = "Payment failed — could not re-fetch address", sendVmPaymentFailedRescan = "Payment failed — could not re-fetch address",
// ── HistoryScreen ───────────────────────────────────────────────────────── // // ── HistoryScreen ─────────────────────────────────────────────────────────
historyTitle = "Activity", // historyTitle = "Activity",
historyClose = "Close", // historyClose = "Close",
historySearchPayments = "Search payments", // historySearchPayments = "Search payments",
historyFilterPayments = "Filter payments", // historyFilterPayments = "Filter payments",
historyRetry = "Retry", // historyRetry = "Retry",
historyNoPayments = "No payments yet.", // historyNoPayments = "No payments yet.",
historySearchPlaceholder = "Search transactions", // historySearchPlaceholder = "Search transactions",
historySearchHelp = "Search help", // historySearchHelp = "Search help",
historySearchPaste = "Paste", // historySearchPaste = "Paste",
historySearchClear = "Clear search", // historySearchClear = "Clear search",
historySearchChip = { tail -> "search: …$tail" }, // historySearchChip = { tail -> "search: …$tail" },
historyClearSearch = "Clear search", // historyClearSearch = "Clear search",
filterDirectionOutgoing = "Outgoing", // filterDirectionOutgoing = "Outgoing",
filterDirectionIncoming = "Incoming", // filterDirectionIncoming = "Incoming",
filterClearDirection = "Clear direction filter", // filterClearDirection = "Clear direction filter",
filterStatusCompleted = "Completed", // filterStatusCompleted = "Completed",
filterStatusPending = "Pending", // filterStatusPending = "Pending",
filterStatusFailed = "Failed", // filterStatusFailed = "Failed",
filterRemoveStatus = "Remove status filter", // filterRemoveStatus = "Remove status filter",
filterRemoveType = "Remove type filter", // filterRemoveType = "Remove type filter",
filterAmountRange = { min, max -> "$min$max sats" }, // filterAmountRange = { min, max -> "$min$max sats" },
filterAmountMin = { min -> "$min sats" }, // filterAmountMin = { min -> "≥ $min sats" },
filterAmountMax = { max -> "$max sats" }, // filterAmountMax = { max -> "≤ $max sats" },
filterClearAmount = "Clear amount filter", // filterClearAmount = "Clear amount filter",
filterDateThisWeek = "This week", // filterDateThisWeek = "This week",
filterDateThisMonth = "This month", // filterDateThisMonth = "This month",
filterDateThisYear = "This year", // filterDateThisYear = "This year",
filterDateRange = { from, to -> "$from$to" }, // filterDateRange = { from, to -> "$from$to" },
filterDateFrom = { from -> "From $from" }, // filterDateFrom = { from -> "From $from" },
filterDateUntil = { until -> "Until $until" }, // filterDateUntil = { until -> "Until $until" },
filterClearDate = "Clear date filter", // filterClearDate = "Clear date filter",
//
// ── FilterBottomSheet ───────────────────────────────────────────────────── // // ── FilterBottomSheet ─────────────────────────────────────────────────────
filterSheetTitle = "Filter payments", // filterSheetTitle = "Filter payments",
filterSectionDirection = "Direction", // filterSectionDirection = "Direction",
filterDirectionAll = "All", // filterDirectionAll = "All",
filterSectionStatus = "Status", // filterSectionStatus = "Status",
filterSectionType = "Type", // filterSectionType = "Type",
filterSectionAmount = "Amount (sats)", // filterSectionAmount = "Amount (sats)",
filterAmountMin_label = "Min", // filterAmountMin_label = "Min",
filterAmountMax_label = "Max", // filterAmountMax_label = "Max",
filterAmountSuffix = "sats", // filterAmountSuffix = "sats",
filterSectionDate = "Date", // filterSectionDate = "Date",
filterDateFrom_label = "From", // filterDateFrom_label = "From",
filterDateTo_label = "To", // filterDateTo_label = "To",
filterDialogOk = "OK", // filterDialogOk = "OK",
filterDialogCancel = "Cancel", // filterDialogCancel = "Cancel",
//
// ── SearchInfoSheet ─────────────────────────────────────────────────────── // // ── SearchInfoSheet ───────────────────────────────────────────────────────
searchInfoTitle = "What can I search for?", // searchInfoTitle = "What can I search for?",
searchInfoSubtitle = "Type any part of the following to find a payment:", // searchInfoSubtitle = "Type any part of the following to find a payment:",
searchInfoMemoTitle = "Memo", // searchInfoMemoTitle = "Memo",
searchInfoMemoDesc = "The message or description attached to a payment. " + // searchInfoMemoDesc = "The message or description attached to a payment. " +
"For example, \"coffee\" or \"rent March\".", // "For example, \"coffee\" or \"rent March\".",
searchInfoInvoiceTitle = "Invoice", // searchInfoInvoiceTitle = "Invoice",
searchInfoInvoiceDesc = "The payment request you scanned or pasted to send a payment. " + // searchInfoInvoiceDesc = "The payment request you scanned or pasted to send a payment. " +
"It usually starts with \"lnbc…\". " + // "It usually starts with \"lnbc…\". " +
"You can paste just the first or last few characters.", // "You can paste just the first or last few characters.",
searchInfoHashTitle = "Hash", // searchInfoHashTitle = "Hash",
searchInfoHashDesc = "A unique code that identifies this payment on the " + // searchInfoHashDesc = "A unique code that identifies this payment on the " +
"Lightning Network. Useful if someone asks you to " + // "Lightning Network. Useful if someone asks you to " +
"confirm a specific transaction.", // "confirm a specific transaction.",
searchInfoPreimageTitle = "Preimage", // searchInfoPreimageTitle = "Preimage",
searchInfoPreimageDesc = "A secret code that proves a payment was received. " + // searchInfoPreimageDesc = "A secret code that proves a payment was received. " +
"Only available after a payment completes successfully.", // "Only available after a payment completes successfully.",
searchInfoNodeAliasTitle = "Node alias", // searchInfoNodeAliasTitle = "Node alias",
searchInfoNodeAliasDesc = "The name of the Lightning node you sent a payment to. " + // searchInfoNodeAliasDesc = "The name of the Lightning node you sent a payment to. " +
"For example, \"ACINQ\" or \"Wallet of Satoshi\". " + // "For example, \"ACINQ\" or \"Wallet of Satoshi\". " +
"Aliases are resolved automatically for outgoing payments.", // "Aliases are resolved automatically for outgoing payments.",
searchInfoNodeIdTitle = "Node ID (pubkey)", // searchInfoNodeIdTitle = "Node ID (pubkey)",
searchInfoNodeIdDesc = "The public key of the destination node. " + // searchInfoNodeIdDesc = "The public key of the destination node. " +
"A 66-character hex string — you can paste just the first few characters.", // "A 66-character hex string — you can paste just the first few characters.",
searchInfoFooter = "You can paste a full value or search with just a few characters — " + // searchInfoFooter = "You can paste a full value or search with just a few characters — " +
"partial matches work too.", // "partial matches work too.",
//
// ── PaymentDetailScreen ─────────────────────────────────────────────────── // // ── PaymentDetailScreen ───────────────────────────────────────────────────
statusSuccess = "Success", // e.g. "Success" // statusSuccess = "Success", // e.g. "Success"
statusPending = "Pending", // e.g. "Pending" // statusPending = "Pending", // e.g. "Pending"
statusFailed = "Failed", // e.g. "Failed" // statusFailed = "Failed", // e.g. "Failed"
statusUnknown = "Unknown", // e.g. "Unknown" // statusUnknown = "Unknown", // e.g. "Unknown"
detailOutgoingTitle = "Outgoing payment", // detailOutgoingTitle = "Outgoing payment",
detailIncomingTitle = "Incoming payment", // detailIncomingTitle = "Incoming payment",
detailBack = "Back", // detailBack = "Back",
detailCouldNotLoad = "Could not load full details", // detailCouldNotLoad = "Could not load full details",
detailFeeLabel = { feeSat, fiatPart, ppmPart -> // detailFeeLabel = { feeSat, fiatPart, ppmPart ->
"Fee: $feeSat sats$fiatPart$ppmPart" // "Fee: $feeSat sats$fiatPart$ppmPart"
}, // },
detailSectionDetails = "Details", // detailSectionDetails = "Details",
detailRowDate = "Date", // detailRowDate = "Date",
detailRowMemo = "Memo", // detailRowMemo = "Memo",
detailRowMemoEmpty = "", // detailRowMemoEmpty = "—",
detailRowType = "Type", // detailRowType = "Type",
detailRowComment = "Comment", // detailRowComment = "Comment",
detailSectionSuccessAction = "Success Action", // detailSectionSuccessAction = "Success Action",
detailSuccessMessage = "Message", // detailSuccessMessage = "Message",
detailSuccessUrl = "URL", // detailSuccessUrl = "URL",
detailSuccessDescription = "Description", // detailSuccessDescription = "Description",
detailSectionTechnical = "Technical", // detailSectionTechnical = "Technical",
detailRowPaymentHash = "Hash", // detailRowPaymentHash = "Hash",
detailRowPreimage = "Preimage", // detailRowPreimage = "Preimage",
detailRowDestination = "Destination", // detailRowDestination = "Destination",
detailCopyNodeId = "Copy node ID", // detailCopyNodeId = "Copy node ID",
detailRowBolt11 = "BOLT11", // detailRowBolt11 = "BOLT11",
//
// ── PaymentRow ──────────────────────────────────────────────────────────── // // ── PaymentRow ────────────────────────────────────────────────────────────
paymentRowSentCD = "Sent", // paymentRowSentCD = "Sent",
paymentRowReceivedCD = "Received", // paymentRowReceivedCD = "Received",
paymentRowNoMemo = "No memo", // paymentRowNoMemo = "No memo",
paymentRowPending = "Pending", // paymentRowPending = "Pending",
paymentRowFailed = "Failed", // paymentRowFailed = "Failed",
onboarding = OnboardingStrings( onboarding = OnboardingStrings(
back = "Back", back = "Back",
@@ -359,6 +359,120 @@ val EnHomeStrings = AppStrings(
receiveVmWithdrawFailed = "Withdraw failed", receiveVmWithdrawFailed = "Withdraw failed",
), ),
history = HistoryStrings(
// ── HistoryScreen ─────────────────────────────────────────────────────────
historyTitle = "Activity",
historyClose = "Close",
historySearchPayments = "Search payments",
historyFilterPayments = "Filter payments",
historyRetry = "Retry",
historyNoPayments = "No payments yet.",
historySearchPlaceholder = "Search transactions",
historySearchHelp = "Search help",
historySearchPaste = "Paste",
historySearchClear = "Clear search",
historySearchChip = { tail -> "search: …$tail" },
historyClearSearch = "Clear search",
filterDirectionOutgoing = "Outgoing",
filterDirectionIncoming = "Incoming",
filterClearDirection = "Clear direction filter",
filterStatusCompleted = "Completed",
filterStatusPending = "Pending",
filterStatusFailed = "Failed",
filterRemoveStatus = "Remove status filter",
filterRemoveType = "Remove type filter",
filterAmountRange = { min, max -> "$min$max sats" },
filterAmountMin = { min -> "$min sats" },
filterAmountMax = { max -> "$max sats" },
filterClearAmount = "Clear amount filter",
filterDateThisWeek = "This week",
filterDateThisMonth = "This month",
filterDateThisYear = "This year",
filterDateRange = { from, to -> "$from$to" },
filterDateFrom = { from -> "From $from" },
filterDateUntil = { until -> "Until $until" },
filterClearDate = "Clear date filter",
// ── FilterBottomSheet ─────────────────────────────────────────────────────
filterSheetTitle = "Filter payments",
filterSectionDirection = "Direction",
filterDirectionAll = "All",
filterSectionStatus = "Status",
filterSectionType = "Type",
filterSectionAmount = "Amount (sats)",
filterAmountMin_label = "Min",
filterAmountMax_label = "Max",
filterAmountSuffix = "sats",
filterSectionDate = "Date",
filterDateFrom_label = "From",
filterDateTo_label = "To",
filterDialogOk = "OK",
filterDialogCancel = "Cancel",
// ── SearchInfoSheet ───────────────────────────────────────────────────────
searchInfoTitle = "What can I search for?",
searchInfoSubtitle = "Type any part of the following to find a payment:",
searchInfoMemoTitle = "Memo",
searchInfoMemoDesc = "The message or description attached to a payment. " +
"For example, \"coffee\" or \"rent March\".",
searchInfoInvoiceTitle = "Invoice",
searchInfoInvoiceDesc = "The payment request you scanned or pasted to send a payment. " +
"It usually starts with \"lnbc…\". " +
"You can paste just the first or last few characters.",
searchInfoHashTitle = "Hash",
searchInfoHashDesc = "A unique code that identifies this payment on the " +
"Lightning Network. Useful if someone asks you to " +
"confirm a specific transaction.",
searchInfoPreimageTitle = "Preimage",
searchInfoPreimageDesc = "A secret code that proves a payment was received. " +
"Only available after a payment completes successfully.",
searchInfoNodeAliasTitle = "Node alias",
searchInfoNodeAliasDesc = "The name of the Lightning node you sent a payment to. " +
"For example, \"ACINQ\" or \"Wallet of Satoshi\". " +
"Aliases are resolved automatically for outgoing payments.",
searchInfoNodeIdTitle = "Node ID (pubkey)",
searchInfoNodeIdDesc = "The public key of the destination node. " +
"A 66-character hex string — you can paste just the first few characters.",
searchInfoFooter = "You can paste a full value or search with just a few characters — " +
"partial matches work too.",
// ── PaymentDetailScreen ───────────────────────────────────────────────────
statusSuccess = "Success", // e.g. "Success"
statusPending = "Pending", // e.g. "Pending"
statusFailed = "Failed", // e.g. "Failed"
statusUnknown = "Unknown", // e.g. "Unknown"
detailOutgoingTitle = "Outgoing payment",
detailIncomingTitle = "Incoming payment",
detailBack = "Back",
detailCouldNotLoad = "Could not load full details",
detailFeeLabel = { feeSat, fiatPart, ppmPart ->
"Fee: $feeSat sats$fiatPart$ppmPart"
},
detailSectionDetails = "Details",
detailRowDate = "Date",
detailRowMemo = "Memo",
detailRowMemoEmpty = "",
detailRowType = "Type",
detailRowComment = "Comment",
detailSectionSuccessAction = "Success Action",
detailSuccessMessage = "Message",
detailSuccessUrl = "URL",
detailSuccessDescription = "Description",
detailSectionTechnical = "Technical",
detailRowPaymentHash = "Hash",
detailRowPreimage = "Preimage",
detailRowDestination = "Destination",
detailCopyNodeId = "Copy node ID",
detailRowBolt11 = "BOLT11",
// ── PaymentRow ────────────────────────────────────────────────────────────
paymentRowSentCD = "Sent",
paymentRowReceivedCD = "Received",
paymentRowNoMemo = "No memo",
paymentRowPending = "Pending",
paymentRowFailed = "Failed",
),
nwc = NwcStrings( nwc = NwcStrings(
back = "Back", back = "Back",
next = "Next", next = "Next",
@@ -141,117 +141,117 @@ val EsHomeStrings = AppStrings(
sendVmUnsupportedType = { tag -> "Tipo no compatible: $tag" }, sendVmUnsupportedType = { tag -> "Tipo no compatible: $tag" },
sendVmPaymentFailedRescan = "Pago fallido — no se pudo volver a obtener la dirección", sendVmPaymentFailedRescan = "Pago fallido — no se pudo volver a obtener la dirección",
// ── HistoryScreen ───────────────────────────────────────────────────────── //// ── HistoryScreen ─────────────────────────────────────────────────────────
historyTitle = "Historial", // historyTitle = "Historial",
historyClose = "Cerrar", // historyClose = "Cerrar",
historySearchPayments = "Buscar pagos", // historySearchPayments = "Buscar pagos",
historyFilterPayments = "Filtrar pagos", // historyFilterPayments = "Filtrar pagos",
historyRetry = "Reintentar", // historyRetry = "Reintentar",
historyNoPayments = "Aún no hay pagos.", // historyNoPayments = "Aún no hay pagos.",
historySearchPlaceholder = "Buscar transacciones", // historySearchPlaceholder = "Buscar transacciones",
historySearchHelp = "Ayuda de búsqueda", // historySearchHelp = "Ayuda de búsqueda",
historySearchPaste = "Pegar", // historySearchPaste = "Pegar",
historySearchClear = "Limpiar búsqueda", // historySearchClear = "Limpiar búsqueda",
historySearchChip = { tail -> "búsqueda: …$tail" }, // historySearchChip = { tail -> "búsqueda: …$tail" },
historyClearSearch = "Limpiar búsqueda", // historyClearSearch = "Limpiar búsqueda",
filterDirectionOutgoing = "Salientes", // filterDirectionOutgoing = "Salientes",
filterDirectionIncoming = "Entrantes", // filterDirectionIncoming = "Entrantes",
filterClearDirection = "Quitar filtro de dirección", // filterClearDirection = "Quitar filtro de dirección",
filterStatusCompleted = "Completado", // filterStatusCompleted = "Completado",
filterStatusPending = "Pendiente", // filterStatusPending = "Pendiente",
filterStatusFailed = "Fallido", // filterStatusFailed = "Fallido",
filterRemoveStatus = "Quitar filtro de estado", // filterRemoveStatus = "Quitar filtro de estado",
filterRemoveType = "Quitar filtro de tipo", // filterRemoveType = "Quitar filtro de tipo",
filterAmountRange = { min, max -> "$min$max sats" }, // filterAmountRange = { min, max -> "$min$max sats" },
filterAmountMin = { min -> "$min sats" }, // filterAmountMin = { min -> "≥ $min sats" },
filterAmountMax = { max -> "$max sats" }, // filterAmountMax = { max -> "≤ $max sats" },
filterClearAmount = "Quitar filtro de cantidad", // filterClearAmount = "Quitar filtro de cantidad",
filterDateThisWeek = "Esta semana", // filterDateThisWeek = "Esta semana",
filterDateThisMonth = "Este mes", // filterDateThisMonth = "Este mes",
filterDateThisYear = "Este año", // filterDateThisYear = "Este año",
filterDateRange = { from, to -> "$from$to" }, // filterDateRange = { from, to -> "$from$to" },
filterDateFrom = { from -> "Desde $from" }, // filterDateFrom = { from -> "Desde $from" },
filterDateUntil = { until -> "Hasta $until" }, // filterDateUntil = { until -> "Hasta $until" },
filterClearDate = "Quitar filtro de fecha", // filterClearDate = "Quitar filtro de fecha",
//
// ── FilterBottomSheet ───────────────────────────────────────────────────── // // ── FilterBottomSheet ─────────────────────────────────────────────────────
filterSheetTitle = "Filtrar pagos", // filterSheetTitle = "Filtrar pagos",
filterSectionDirection = "Dirección", // filterSectionDirection = "Dirección",
filterDirectionAll = "Todos", // filterDirectionAll = "Todos",
filterSectionStatus = "Estado", // filterSectionStatus = "Estado",
filterSectionType = "Tipo", // filterSectionType = "Tipo",
filterSectionAmount = "Cantidad (sats)", // filterSectionAmount = "Cantidad (sats)",
filterAmountMin_label = "Mín.", // filterAmountMin_label = "Mín.",
filterAmountMax_label = "Máx.", // filterAmountMax_label = "Máx.",
filterAmountSuffix = "sats", // filterAmountSuffix = "sats",
filterSectionDate = "Fecha", // filterSectionDate = "Fecha",
filterDateFrom_label = "Desde", // filterDateFrom_label = "Desde",
filterDateTo_label = "Hasta", // filterDateTo_label = "Hasta",
filterDialogOk = "Aceptar", // filterDialogOk = "Aceptar",
filterDialogCancel = "Cancelar", // filterDialogCancel = "Cancelar",
//
// ── SearchInfoSheet ─────────────────────────────────────────────────────── // // ── SearchInfoSheet ───────────────────────────────────────────────────────
searchInfoTitle = "¿Qué puedo buscar?", // searchInfoTitle = "¿Qué puedo buscar?",
searchInfoSubtitle = "Escribe cualquier parte de lo siguiente para encontrar un pago:", // searchInfoSubtitle = "Escribe cualquier parte de lo siguiente para encontrar un pago:",
searchInfoMemoTitle = "Nota", // searchInfoMemoTitle = "Nota",
searchInfoMemoDesc = "El mensaje o descripción adjunto a un pago. " + // searchInfoMemoDesc = "El mensaje o descripción adjunto a un pago. " +
"Por ejemplo, \"café\" o \"alquiler marzo\".", // "Por ejemplo, \"café\" o \"alquiler marzo\".",
searchInfoInvoiceTitle = "Factura", // searchInfoInvoiceTitle = "Factura",
searchInfoInvoiceDesc = "La solicitud de pago que escaneaste o pegaste para enviar un pago. " + // searchInfoInvoiceDesc = "La solicitud de pago que escaneaste o pegaste para enviar un pago. " +
"Normalmente empieza por \"lnbc…\". " + // "Normalmente empieza por \"lnbc…\". " +
"Puedes pegar solo los primeros o últimos caracteres.", // "Puedes pegar solo los primeros o últimos caracteres.",
searchInfoHashTitle = "Hash", // searchInfoHashTitle = "Hash",
searchInfoHashDesc = "Un código único que identifica este pago en la " + // searchInfoHashDesc = "Un código único que identifica este pago en la " +
"red Lightning. Útil si alguien te pide que " + // "red Lightning. Útil si alguien te pide que " +
"confirmes una transacción específica.", // "confirmes una transacción específica.",
searchInfoPreimageTitle = "Preimagen", // searchInfoPreimageTitle = "Preimagen",
searchInfoPreimageDesc = "Un código secreto que demuestra que se recibió un pago. " + // searchInfoPreimageDesc = "Un código secreto que demuestra que se recibió un pago. " +
"Solo disponible después de que un pago se complete correctamente.", // "Solo disponible después de que un pago se complete correctamente.",
searchInfoNodeAliasTitle = "Alias del nodo", // searchInfoNodeAliasTitle = "Alias del nodo",
searchInfoNodeAliasDesc = "El nombre del nodo Lightning al que enviaste un pago. " + // searchInfoNodeAliasDesc = "El nombre del nodo Lightning al que enviaste un pago. " +
"Por ejemplo, \"ACINQ\" o \"Wallet of Satoshi\". " + // "Por ejemplo, \"ACINQ\" o \"Wallet of Satoshi\". " +
"Los alias se resuelven automáticamente para pagos salientes.", // "Los alias se resuelven automáticamente para pagos salientes.",
searchInfoNodeIdTitle = "ID del nodo (clave pública)", // searchInfoNodeIdTitle = "ID del nodo (clave pública)",
searchInfoNodeIdDesc = "La clave pública del nodo de destino. " + // searchInfoNodeIdDesc = "La clave pública del nodo de destino. " +
"Una cadena hexadecimal de 66 caracteres — puedes pegar solo los primeros.", // "Una cadena hexadecimal de 66 caracteres — puedes pegar solo los primeros.",
searchInfoFooter = "Puedes pegar un valor completo o buscar con solo unos pocos caracteres — " + // searchInfoFooter = "Puedes pegar un valor completo o buscar con solo unos pocos caracteres — " +
"las coincidencias parciales también funcionan.", // "las coincidencias parciales también funcionan.",
//
// ── PaymentDetailScreen ─────────────────────────────────────────────────── // // ── PaymentDetailScreen ───────────────────────────────────────────────────
statusSuccess = "Completado", // statusSuccess = "Completado",
statusPending = "Pendiente", // statusPending = "Pendiente",
statusFailed = "Fallido", // statusFailed = "Fallido",
statusUnknown = "Desconocido", // statusUnknown = "Desconocido",
detailOutgoingTitle = "Pago saliente", // detailOutgoingTitle = "Pago saliente",
detailIncomingTitle = "Pago entrante", // detailIncomingTitle = "Pago entrante",
detailBack = "Atrás", // detailBack = "Atrás",
detailCouldNotLoad = "No se pudieron cargar los detalles completos", // detailCouldNotLoad = "No se pudieron cargar los detalles completos",
detailFeeLabel = { feeSat, fiatPart, ppmPart -> // detailFeeLabel = { feeSat, fiatPart, ppmPart ->
"Comisión: $feeSat sats$fiatPart$ppmPart" // "Comisión: $feeSat sats$fiatPart$ppmPart"
}, // },
detailSectionDetails = "Detalles", // detailSectionDetails = "Detalles",
detailRowDate = "Fecha", // detailRowDate = "Fecha",
detailRowMemo = "Nota", // detailRowMemo = "Nota",
detailRowMemoEmpty = "", // detailRowMemoEmpty = "—",
detailRowType = "Tipo", // detailRowType = "Tipo",
detailRowComment = "Comentario", // detailRowComment = "Comentario",
detailSectionSuccessAction = "Acción de éxito", // detailSectionSuccessAction = "Acción de éxito",
detailSuccessMessage = "Mensaje", // detailSuccessMessage = "Mensaje",
detailSuccessUrl = "URL", // detailSuccessUrl = "URL",
detailSuccessDescription = "Descripción", // detailSuccessDescription = "Descripción",
detailSectionTechnical = "Técnico", // detailSectionTechnical = "Técnico",
detailRowPaymentHash = "Hash", // detailRowPaymentHash = "Hash",
detailRowPreimage = "Preimagen", // detailRowPreimage = "Preimagen",
detailRowDestination = "Destino", // detailRowDestination = "Destino",
detailCopyNodeId = "Copiar ID del nodo", // detailCopyNodeId = "Copiar ID del nodo",
detailRowBolt11 = "BOLT11", // detailRowBolt11 = "BOLT11",
//
// ── PaymentRow ──────────────────────────────────────────────────────────── // // ── PaymentRow ────────────────────────────────────────────────────────────
paymentRowSentCD = "Enviado", // paymentRowSentCD = "Enviado",
paymentRowReceivedCD = "Recibido", // paymentRowReceivedCD = "Recibido",
paymentRowNoMemo = "Sin nota", // paymentRowNoMemo = "Sin nota",
paymentRowPending = "Pendiente", // paymentRowPending = "Pendiente",
paymentRowFailed = "Fallido", // paymentRowFailed = "Fallido",
onboarding = OnboardingStrings( onboarding = OnboardingStrings(
@@ -360,6 +360,120 @@ val EsHomeStrings = AppStrings(
receiveVmWithdrawFailed = "Error al retirar", receiveVmWithdrawFailed = "Error al retirar",
), ),
history = HistoryStrings(
// ── HistoryScreen ─────────────────────────────────────────────────────────
historyTitle = "Historial",
historyClose = "Cerrar",
historySearchPayments = "Buscar pagos",
historyFilterPayments = "Filtrar pagos",
historyRetry = "Reintentar",
historyNoPayments = "Aún no hay pagos.",
historySearchPlaceholder = "Buscar transacciones",
historySearchHelp = "Ayuda de búsqueda",
historySearchPaste = "Pegar",
historySearchClear = "Limpiar búsqueda",
historySearchChip = { tail -> "búsqueda: …$tail" },
historyClearSearch = "Limpiar búsqueda",
filterDirectionOutgoing = "Salientes",
filterDirectionIncoming = "Entrantes",
filterClearDirection = "Quitar filtro de dirección",
filterStatusCompleted = "Completado",
filterStatusPending = "Pendiente",
filterStatusFailed = "Fallido",
filterRemoveStatus = "Quitar filtro de estado",
filterRemoveType = "Quitar filtro de tipo",
filterAmountRange = { min, max -> "$min$max sats" },
filterAmountMin = { min -> "$min sats" },
filterAmountMax = { max -> "$max sats" },
filterClearAmount = "Quitar filtro de cantidad",
filterDateThisWeek = "Esta semana",
filterDateThisMonth = "Este mes",
filterDateThisYear = "Este año",
filterDateRange = { from, to -> "$from$to" },
filterDateFrom = { from -> "Desde $from" },
filterDateUntil = { until -> "Hasta $until" },
filterClearDate = "Quitar filtro de fecha",
// ── FilterBottomSheet ─────────────────────────────────────────────────────
filterSheetTitle = "Filtrar pagos",
filterSectionDirection = "Dirección",
filterDirectionAll = "Todos",
filterSectionStatus = "Estado",
filterSectionType = "Tipo",
filterSectionAmount = "Cantidad (sats)",
filterAmountMin_label = "Mín.",
filterAmountMax_label = "Máx.",
filterAmountSuffix = "sats",
filterSectionDate = "Fecha",
filterDateFrom_label = "Desde",
filterDateTo_label = "Hasta",
filterDialogOk = "Aceptar",
filterDialogCancel = "Cancelar",
// ── SearchInfoSheet ───────────────────────────────────────────────────────
searchInfoTitle = "¿Qué puedo buscar?",
searchInfoSubtitle = "Escribe cualquier parte de lo siguiente para encontrar un pago:",
searchInfoMemoTitle = "Nota",
searchInfoMemoDesc = "El mensaje o descripción adjunto a un pago. " +
"Por ejemplo, \"café\" o \"alquiler marzo\".",
searchInfoInvoiceTitle = "Factura",
searchInfoInvoiceDesc = "La solicitud de pago que escaneaste o pegaste para enviar un pago. " +
"Normalmente empieza por \"lnbc…\". " +
"Puedes pegar solo los primeros o últimos caracteres.",
searchInfoHashTitle = "Hash",
searchInfoHashDesc = "Un código único que identifica este pago en la " +
"red Lightning. Útil si alguien te pide que " +
"confirmes una transacción específica.",
searchInfoPreimageTitle = "Preimagen",
searchInfoPreimageDesc = "Un código secreto que demuestra que se recibió un pago. " +
"Solo disponible después de que un pago se complete correctamente.",
searchInfoNodeAliasTitle = "Alias del nodo",
searchInfoNodeAliasDesc = "El nombre del nodo Lightning al que enviaste un pago. " +
"Por ejemplo, \"ACINQ\" o \"Wallet of Satoshi\". " +
"Los alias se resuelven automáticamente para pagos salientes.",
searchInfoNodeIdTitle = "ID del nodo (clave pública)",
searchInfoNodeIdDesc = "La clave pública del nodo de destino. " +
"Una cadena hexadecimal de 66 caracteres — puedes pegar solo los primeros.",
searchInfoFooter = "Puedes pegar un valor completo o buscar con solo unos pocos caracteres — " +
"las coincidencias parciales también funcionan.",
// ── PaymentDetailScreen ───────────────────────────────────────────────────
statusSuccess = "Completado",
statusPending = "Pendiente",
statusFailed = "Fallido",
statusUnknown = "Desconocido",
detailOutgoingTitle = "Pago saliente",
detailIncomingTitle = "Pago entrante",
detailBack = "Atrás",
detailCouldNotLoad = "No se pudieron cargar los detalles completos",
detailFeeLabel = { feeSat, fiatPart, ppmPart ->
"Comisión: $feeSat sats$fiatPart$ppmPart"
},
detailSectionDetails = "Detalles",
detailRowDate = "Fecha",
detailRowMemo = "Nota",
detailRowMemoEmpty = "",
detailRowType = "Tipo",
detailRowComment = "Comentario",
detailSectionSuccessAction = "Acción de éxito",
detailSuccessMessage = "Mensaje",
detailSuccessUrl = "URL",
detailSuccessDescription = "Descripción",
detailSectionTechnical = "Técnico",
detailRowPaymentHash = "Hash",
detailRowPreimage = "Preimagen",
detailRowDestination = "Destino",
detailCopyNodeId = "Copiar ID del nodo",
detailRowBolt11 = "BOLT11",
// ── PaymentRow ────────────────────────────────────────────────────────────
paymentRowSentCD = "Enviado",
paymentRowReceivedCD = "Recibido",
paymentRowNoMemo = "Sin nota",
paymentRowPending = "Pendiente",
paymentRowFailed = "Fallido",
),
nwc = NwcStrings( nwc = NwcStrings(
// ── Shared ──────────────────────────────────────────────────────────────── // ── Shared ────────────────────────────────────────────────────────────────
back = "Atrás", back = "Atrás",
@@ -141,116 +141,116 @@ val EuStrings = AppStrings(
sendVmUnsupportedType = { tag -> "Mota onartzen ez dena: $tag" }, sendVmUnsupportedType = { tag -> "Mota onartzen ez dena: $tag" },
sendVmPaymentFailedRescan = "Ordainketak huts egin du — ezin izan da helbidea berriro eskuratu", sendVmPaymentFailedRescan = "Ordainketak huts egin du — ezin izan da helbidea berriro eskuratu",
// ── HistoryScreen ───────────────────────────────────────────────────────── // // ── HistoryScreen ─────────────────────────────────────────────────────────
historyTitle = "Historia", // historyTitle = "Historia",
historyClose = "Itxi", // historyClose = "Itxi",
historySearchPayments = "Bilatu ordainketak", // historySearchPayments = "Bilatu ordainketak",
historyFilterPayments = "Iragazi ordainketak", // historyFilterPayments = "Iragazi ordainketak",
historyRetry = "Saiatu berriro", // historyRetry = "Saiatu berriro",
historyNoPayments = "Oraindik ez dago ordainketarik.", // historyNoPayments = "Oraindik ez dago ordainketarik.",
historySearchPlaceholder = "Bilatu transakzioak", // historySearchPlaceholder = "Bilatu transakzioak",
historySearchHelp = "Bilaketa-laguntza", // historySearchHelp = "Bilaketa-laguntza",
historySearchPaste = "Itsatsi", // historySearchPaste = "Itsatsi",
historySearchClear = "Garbitu bilaketa", // historySearchClear = "Garbitu bilaketa",
historySearchChip = { tail -> "bilaketa: …$tail" }, // historySearchChip = { tail -> "bilaketa: …$tail" },
historyClearSearch = "Garbitu bilaketa", // historyClearSearch = "Garbitu bilaketa",
filterDirectionOutgoing = "Irteerako", // filterDirectionOutgoing = "Irteerako",
filterDirectionIncoming = "Sarrerako", // filterDirectionIncoming = "Sarrerako",
filterClearDirection = "Garbitu norabide-iragazkia", // filterClearDirection = "Garbitu norabide-iragazkia",
filterStatusCompleted = "Osatuta", // filterStatusCompleted = "Osatuta",
filterStatusPending = "Zain", // filterStatusPending = "Zain",
filterStatusFailed = "Huts eginda", // filterStatusFailed = "Huts eginda",
filterRemoveStatus = "Kendu egoera-iragazkia", // filterRemoveStatus = "Kendu egoera-iragazkia",
filterRemoveType = "Kendu mota-iragazkia", // filterRemoveType = "Kendu mota-iragazkia",
filterAmountRange = { min, max -> "$min$max sat" }, // filterAmountRange = { min, max -> "$min$max sat" },
filterAmountMin = { min -> "$min sat" }, // filterAmountMin = { min -> "≥ $min sat" },
filterAmountMax = { max -> "$max sat" }, // filterAmountMax = { max -> "≤ $max sat" },
filterClearAmount = "Garbitu zenbateko-iragazkia", // filterClearAmount = "Garbitu zenbateko-iragazkia",
filterDateThisWeek = "Aste honetan", // filterDateThisWeek = "Aste honetan",
filterDateThisMonth = "Hilabete honetan", // filterDateThisMonth = "Hilabete honetan",
filterDateThisYear = "Urte honetan", // filterDateThisYear = "Urte honetan",
filterDateRange = { from, to -> "$from$to" }, // filterDateRange = { from, to -> "$from$to" },
filterDateFrom = { from -> "$from-tik" }, // filterDateFrom = { from -> "$from-tik" },
filterDateUntil = { until -> "$until arte" }, // filterDateUntil = { until -> "$until arte" },
filterClearDate = "Garbitu data-iragazkia", // filterClearDate = "Garbitu data-iragazkia",
//
// ── FilterBottomSheet ───────────────────────────────────────────────────── // // ── FilterBottomSheet ─────────────────────────────────────────────────────
filterSheetTitle = "Iragazi ordainketak", // filterSheetTitle = "Iragazi ordainketak",
filterSectionDirection = "Norabidea", // filterSectionDirection = "Norabidea",
filterDirectionAll = "Guztiak", // filterDirectionAll = "Guztiak",
filterSectionStatus = "Egoera", // filterSectionStatus = "Egoera",
filterSectionType = "Mota", // filterSectionType = "Mota",
filterSectionAmount = "Zenbatekoa (sat)", // filterSectionAmount = "Zenbatekoa (sat)",
filterAmountMin_label = "Gutxienekoa", // filterAmountMin_label = "Gutxienekoa",
filterAmountMax_label = "Gehienekoa", // filterAmountMax_label = "Gehienekoa",
filterAmountSuffix = "sat", // filterAmountSuffix = "sat",
filterSectionDate = "Data", // filterSectionDate = "Data",
filterDateFrom_label = "Nondik", // filterDateFrom_label = "Nondik",
filterDateTo_label = "Nora arte", // filterDateTo_label = "Nora arte",
filterDialogOk = "Ados", // filterDialogOk = "Ados",
filterDialogCancel = "Utzi", // filterDialogCancel = "Utzi",
//
// ── SearchInfoSheet ─────────────────────────────────────────────────────── // // ── SearchInfoSheet ───────────────────────────────────────────────────────
searchInfoTitle = "Zer bila dezaket?", // searchInfoTitle = "Zer bila dezaket?",
searchInfoSubtitle = "Idatzi hurrengoetako edozein zati ordainketa bat aurkitzeko:", // searchInfoSubtitle = "Idatzi hurrengoetako edozein zati ordainketa bat aurkitzeko:",
searchInfoMemoTitle = "Oharra", // searchInfoMemoTitle = "Oharra",
searchInfoMemoDesc = "Ordainketa bati erantsitako mezua edo deskribapena. " + // searchInfoMemoDesc = "Ordainketa bati erantsitako mezua edo deskribapena. " +
"Adibidez, \"kafea\" edo \"martxoko alokairua\".", // "Adibidez, \"kafea\" edo \"martxoko alokairua\".",
searchInfoInvoiceTitle = "Faktura", // searchInfoInvoiceTitle = "Faktura",
searchInfoInvoiceDesc = "Ordainketa bat bidaltzeko eskaneatu edo itsatsi zenuen ordainketa-eskaera. " + // searchInfoInvoiceDesc = "Ordainketa bat bidaltzeko eskaneatu edo itsatsi zenuen ordainketa-eskaera. " +
"Normalean \"lnbc…\" hasierarekin dator. " + // "Normalean \"lnbc…\" hasierarekin dator. " +
"Lehen edo azken karaktere batzuk bakarrik itsats ditzakezu.", // "Lehen edo azken karaktere batzuk bakarrik itsats ditzakezu.",
searchInfoHashTitle = "Hash", // searchInfoHashTitle = "Hash",
searchInfoHashDesc = "Ordainketa hau Lightning Sarean identifikatzen duen kode bakarra. " + // searchInfoHashDesc = "Ordainketa hau Lightning Sarean identifikatzen duen kode bakarra. " +
"Erabilgarria norbaitek transakzio zehatz bat berresteko eskatzen dizunean.", // "Erabilgarria norbaitek transakzio zehatz bat berresteko eskatzen dizunean.",
searchInfoPreimageTitle = "Aurre-irudia", // searchInfoPreimageTitle = "Aurre-irudia",
searchInfoPreimageDesc = "Ordainketa bat jaso dela frogatzen duen kode sekretua. " + // searchInfoPreimageDesc = "Ordainketa bat jaso dela frogatzen duen kode sekretua. " +
"Ordainketa arrakastaz osatu ondoren bakarrik dago erabilgarri.", // "Ordainketa arrakastaz osatu ondoren bakarrik dago erabilgarri.",
searchInfoNodeAliasTitle = "Nodo-izengoitia", // searchInfoNodeAliasTitle = "Nodo-izengoitia",
searchInfoNodeAliasDesc = "Ordainketa bidali zenion Lightning nodoaren izena. " + // searchInfoNodeAliasDesc = "Ordainketa bidali zenion Lightning nodoaren izena. " +
"Adibidez, \"ACINQ\" edo \"Wallet of Satoshi\". " + // "Adibidez, \"ACINQ\" edo \"Wallet of Satoshi\". " +
"Izengoitiak automatikoki ebazten dira irteerako ordainketetan.", // "Izengoitiak automatikoki ebazten dira irteerako ordainketetan.",
searchInfoNodeIdTitle = "Nodo IDa (gako publikoa)", // searchInfoNodeIdTitle = "Nodo IDa (gako publikoa)",
searchInfoNodeIdDesc = "Helmuga-nodoaren gako publikoa. " + // searchInfoNodeIdDesc = "Helmuga-nodoaren gako publikoa. " +
"66 karaktereko hex katea — lehen karaktere batzuk bakarrik itsats ditzakezu.", // "66 karaktereko hex katea — lehen karaktere batzuk bakarrik itsats ditzakezu.",
searchInfoFooter = "Balio osoa itsatsi dezakezu edo karaktere gutxi batzuekin bilatu — " + // searchInfoFooter = "Balio osoa itsatsi dezakezu edo karaktere gutxi batzuekin bilatu — " +
"zati-bat datozenak ere funtzionatzen dute.", // "zati-bat datozenak ere funtzionatzen dute.",
//
// ── PaymentDetailScreen ─────────────────────────────────────────────────── // // ── PaymentDetailScreen ───────────────────────────────────────────────────
statusSuccess = "Osatuta", // statusSuccess = "Osatuta",
statusPending = "Zain", // statusPending = "Zain",
statusFailed = "Huts eginda", // statusFailed = "Huts eginda",
statusUnknown = "Ezezaguna", // statusUnknown = "Ezezaguna",
detailOutgoingTitle = "Irteerako ordainketa", // detailOutgoingTitle = "Irteerako ordainketa",
detailIncomingTitle = "Sarrerako ordainketa", // detailIncomingTitle = "Sarrerako ordainketa",
detailBack = "Atzera", // detailBack = "Atzera",
detailCouldNotLoad = "Ezin izan dira xehetasun osoak kargatu", // detailCouldNotLoad = "Ezin izan dira xehetasun osoak kargatu",
detailFeeLabel = { feeSat, fiatPart, ppmPart -> // detailFeeLabel = { feeSat, fiatPart, ppmPart ->
"Komisioa: $feeSat sat$fiatPart$ppmPart" // "Komisioa: $feeSat sat$fiatPart$ppmPart"
}, // },
detailSectionDetails = "Xehetasunak", // detailSectionDetails = "Xehetasunak",
detailRowDate = "Data", // detailRowDate = "Data",
detailRowMemo = "Oharra", // detailRowMemo = "Oharra",
detailRowMemoEmpty = "", // detailRowMemoEmpty = "—",
detailRowType = "Mota", // detailRowType = "Mota",
detailRowComment = "Iruzkina", // detailRowComment = "Iruzkina",
detailSectionSuccessAction = "Arrakasta-ekintza", // detailSectionSuccessAction = "Arrakasta-ekintza",
detailSuccessMessage = "Mezua", // detailSuccessMessage = "Mezua",
detailSuccessUrl = "URLa", // detailSuccessUrl = "URLa",
detailSuccessDescription = "Deskribapena", // detailSuccessDescription = "Deskribapena",
detailSectionTechnical = "Teknikoa", // detailSectionTechnical = "Teknikoa",
detailRowPaymentHash = "Hash", // detailRowPaymentHash = "Hash",
detailRowPreimage = "Aurre-irudia", // detailRowPreimage = "Aurre-irudia",
detailRowDestination = "Helmuga", // detailRowDestination = "Helmuga",
detailCopyNodeId = "Kopiatu nodo IDa", // detailCopyNodeId = "Kopiatu nodo IDa",
detailRowBolt11 = "BOLT11", // detailRowBolt11 = "BOLT11",
//
// ── PaymentRow ──────────────────────────────────────────────────────────── // // ── PaymentRow ────────────────────────────────────────────────────────────
paymentRowSentCD = "Bidalita", // paymentRowSentCD = "Bidalita",
paymentRowReceivedCD = "Jasota", // paymentRowReceivedCD = "Jasota",
paymentRowNoMemo = "Oharrik gabe", // paymentRowNoMemo = "Oharrik gabe",
paymentRowPending = "Zain", // paymentRowPending = "Zain",
paymentRowFailed = "Huts eginda", // paymentRowFailed = "Huts eginda",
onboarding = OnboardingStrings( onboarding = OnboardingStrings(
@@ -358,6 +358,120 @@ val EuStrings = AppStrings(
receiveVmWithdrawRejected = "Ateratzeko zerbitzuak faktura baztertu du", receiveVmWithdrawRejected = "Ateratzeko zerbitzuak faktura baztertu du",
receiveVmWithdrawFailed = "Ateratzeak huts egin du", receiveVmWithdrawFailed = "Ateratzeak huts egin du",
), ),
history = HistoryStrings(
// ── HistoryScreen ─────────────────────────────────────────────────────────
historyTitle = "Historia",
historyClose = "Itxi",
historySearchPayments = "Bilatu ordainketak",
historyFilterPayments = "Iragazi ordainketak",
historyRetry = "Saiatu berriro",
historyNoPayments = "Oraindik ez dago ordainketarik.",
historySearchPlaceholder = "Bilatu transakzioak",
historySearchHelp = "Bilaketa-laguntza",
historySearchPaste = "Itsatsi",
historySearchClear = "Garbitu bilaketa",
historySearchChip = { tail -> "bilaketa: …$tail" },
historyClearSearch = "Garbitu bilaketa",
filterDirectionOutgoing = "Irteerako",
filterDirectionIncoming = "Sarrerako",
filterClearDirection = "Garbitu norabide-iragazkia",
filterStatusCompleted = "Osatuta",
filterStatusPending = "Zain",
filterStatusFailed = "Huts eginda",
filterRemoveStatus = "Kendu egoera-iragazkia",
filterRemoveType = "Kendu mota-iragazkia",
filterAmountRange = { min, max -> "$min$max sat" },
filterAmountMin = { min -> "$min sat" },
filterAmountMax = { max -> "$max sat" },
filterClearAmount = "Garbitu zenbateko-iragazkia",
filterDateThisWeek = "Aste honetan",
filterDateThisMonth = "Hilabete honetan",
filterDateThisYear = "Urte honetan",
filterDateRange = { from, to -> "$from$to" },
filterDateFrom = { from -> "$from-tik" },
filterDateUntil = { until -> "$until arte" },
filterClearDate = "Garbitu data-iragazkia",
// ── FilterBottomSheet ─────────────────────────────────────────────────────
filterSheetTitle = "Iragazi ordainketak",
filterSectionDirection = "Norabidea",
filterDirectionAll = "Guztiak",
filterSectionStatus = "Egoera",
filterSectionType = "Mota",
filterSectionAmount = "Zenbatekoa (sat)",
filterAmountMin_label = "Gutxienekoa",
filterAmountMax_label = "Gehienekoa",
filterAmountSuffix = "sat",
filterSectionDate = "Data",
filterDateFrom_label = "Nondik",
filterDateTo_label = "Nora arte",
filterDialogOk = "Ados",
filterDialogCancel = "Utzi",
// ── SearchInfoSheet ───────────────────────────────────────────────────────
searchInfoTitle = "Zer bila dezaket?",
searchInfoSubtitle = "Idatzi hurrengoetako edozein zati ordainketa bat aurkitzeko:",
searchInfoMemoTitle = "Oharra",
searchInfoMemoDesc = "Ordainketa bati erantsitako mezua edo deskribapena. " +
"Adibidez, \"kafea\" edo \"martxoko alokairua\".",
searchInfoInvoiceTitle = "Faktura",
searchInfoInvoiceDesc = "Ordainketa bat bidaltzeko eskaneatu edo itsatsi zenuen ordainketa-eskaera. " +
"Normalean \"lnbc…\" hasierarekin dator. " +
"Lehen edo azken karaktere batzuk bakarrik itsats ditzakezu.",
searchInfoHashTitle = "Hash",
searchInfoHashDesc = "Ordainketa hau Lightning Sarean identifikatzen duen kode bakarra. " +
"Erabilgarria norbaitek transakzio zehatz bat berresteko eskatzen dizunean.",
searchInfoPreimageTitle = "Aurre-irudia",
searchInfoPreimageDesc = "Ordainketa bat jaso dela frogatzen duen kode sekretua. " +
"Ordainketa arrakastaz osatu ondoren bakarrik dago erabilgarri.",
searchInfoNodeAliasTitle = "Nodo-izengoitia",
searchInfoNodeAliasDesc = "Ordainketa bidali zenion Lightning nodoaren izena. " +
"Adibidez, \"ACINQ\" edo \"Wallet of Satoshi\". " +
"Izengoitiak automatikoki ebazten dira irteerako ordainketetan.",
searchInfoNodeIdTitle = "Nodo IDa (gako publikoa)",
searchInfoNodeIdDesc = "Helmuga-nodoaren gako publikoa. " +
"66 karaktereko hex katea — lehen karaktere batzuk bakarrik itsats ditzakezu.",
searchInfoFooter = "Balio osoa itsatsi dezakezu edo karaktere gutxi batzuekin bilatu — " +
"zati-bat datozenak ere funtzionatzen dute.",
// ── PaymentDetailScreen ───────────────────────────────────────────────────
statusSuccess = "Osatuta",
statusPending = "Zain",
statusFailed = "Huts eginda",
statusUnknown = "Ezezaguna",
detailOutgoingTitle = "Irteerako ordainketa",
detailIncomingTitle = "Sarrerako ordainketa",
detailBack = "Atzera",
detailCouldNotLoad = "Ezin izan dira xehetasun osoak kargatu",
detailFeeLabel = { feeSat, fiatPart, ppmPart ->
"Komisioa: $feeSat sat$fiatPart$ppmPart"
},
detailSectionDetails = "Xehetasunak",
detailRowDate = "Data",
detailRowMemo = "Oharra",
detailRowMemoEmpty = "",
detailRowType = "Mota",
detailRowComment = "Iruzkina",
detailSectionSuccessAction = "Arrakasta-ekintza",
detailSuccessMessage = "Mezua",
detailSuccessUrl = "URLa",
detailSuccessDescription = "Deskribapena",
detailSectionTechnical = "Teknikoa",
detailRowPaymentHash = "Hash",
detailRowPreimage = "Aurre-irudia",
detailRowDestination = "Helmuga",
detailCopyNodeId = "Kopiatu nodo IDa",
detailRowBolt11 = "BOLT11",
// ── PaymentRow ────────────────────────────────────────────────────────────
paymentRowSentCD = "Bidalita",
paymentRowReceivedCD = "Jasota",
paymentRowNoMemo = "Oharrik gabe",
paymentRowPending = "Zain",
paymentRowFailed = "Huts eginda",
),
nwc = NwcStrings( nwc = NwcStrings(
// ── Shared ──────────────────────────────────────────────────────────────── // ── Shared ────────────────────────────────────────────────────────────────
back = "Atzera", back = "Atzera",
@@ -149,108 +149,109 @@ data class AppStrings(
val sendVmUnsupportedType : (tag: String) -> String, val sendVmUnsupportedType : (tag: String) -> String,
val sendVmPaymentFailedRescan : String, val sendVmPaymentFailedRescan : String,
// ── HistoryScreen ───────────────────────────────────────────────────────── // // ── HistoryScreen ─────────────────────────────────────────────────────────
val historyTitle : String, // val historyTitle : String,
val historyClose : String, // val historyClose : String,
val historySearchPayments : String, // val historySearchPayments : String,
val historyFilterPayments : String, // val historyFilterPayments : String,
val historyRetry : String, // val historyRetry : String,
val historyNoPayments : String, // val historyNoPayments : String,
val historySearchPlaceholder : String, // val historySearchPlaceholder : String,
val historySearchHelp : String, // val historySearchHelp : String,
val historySearchPaste : String, // val historySearchPaste : String,
val historySearchClear : String, // val historySearchClear : String,
val historySearchChip : (tail: String) -> String, // val historySearchChip : (tail: String) -> String,
val historyClearSearch : String, // val historyClearSearch : String,
val filterDirectionOutgoing : String, // val filterDirectionOutgoing : String,
val filterDirectionIncoming : String, // val filterDirectionIncoming : String,
val filterClearDirection : String, // val filterClearDirection : String,
val filterStatusCompleted : String, // val filterStatusCompleted : String,
val filterStatusPending : String, // val filterStatusPending : String,
val filterStatusFailed : String, // val filterStatusFailed : String,
val filterRemoveStatus : String, // val filterRemoveStatus : String,
val filterRemoveType : String, // val filterRemoveType : String,
val filterAmountRange : (min: Long, max: Long) -> String, // val filterAmountRange : (min: Long, max: Long) -> String,
val filterAmountMin : (min: Long) -> String, // val filterAmountMin : (min: Long) -> String,
val filterAmountMax : (max: Long) -> String, // val filterAmountMax : (max: Long) -> String,
val filterClearAmount : String, // val filterClearAmount : String,
val filterDateThisWeek : String, // val filterDateThisWeek : String,
val filterDateThisMonth : String, // val filterDateThisMonth : String,
val filterDateThisYear : String, // val filterDateThisYear : String,
val filterDateRange : (from: String, to: String) -> String, // val filterDateRange : (from: String, to: String) -> String,
val filterDateFrom : (from: String) -> String, // val filterDateFrom : (from: String) -> String,
val filterDateUntil : (until: String) -> String, // val filterDateUntil : (until: String) -> String,
val filterClearDate : String, // val filterClearDate : String,
//
// ── FilterBottomSheet ───────────────────────────────────────────────────── // // ── FilterBottomSheet ─────────────────────────────────────────────────────
val filterSheetTitle : String, // val filterSheetTitle : String,
val filterSectionDirection : String, // val filterSectionDirection : String,
val filterDirectionAll : String, // val filterDirectionAll : String,
val filterSectionStatus : String, // val filterSectionStatus : String,
val filterSectionType : String, // val filterSectionType : String,
val filterSectionAmount : String, // val filterSectionAmount : String,
val filterAmountMin_label : String, // val filterAmountMin_label : String,
val filterAmountMax_label : String, // val filterAmountMax_label : String,
val filterAmountSuffix : String, // val filterAmountSuffix : String,
val filterSectionDate : String, // val filterSectionDate : String,
val filterDateFrom_label : String, // val filterDateFrom_label : String,
val filterDateTo_label : String, // val filterDateTo_label : String,
val filterDialogOk : String, // val filterDialogOk : String,
val filterDialogCancel : String, // val filterDialogCancel : String,
//
// ── SearchInfoSheet ─────────────────────────────────────────────────────── // // ── SearchInfoSheet ───────────────────────────────────────────────────────
val searchInfoTitle : String, // val searchInfoTitle : String,
val searchInfoSubtitle : String, // val searchInfoSubtitle : String,
val searchInfoMemoTitle : String, // val searchInfoMemoTitle : String,
val searchInfoMemoDesc : String, // val searchInfoMemoDesc : String,
val searchInfoInvoiceTitle : String, // val searchInfoInvoiceTitle : String,
val searchInfoInvoiceDesc : String, // val searchInfoInvoiceDesc : String,
val searchInfoHashTitle : String, // val searchInfoHashTitle : String,
val searchInfoHashDesc : String, // val searchInfoHashDesc : String,
val searchInfoPreimageTitle : String, // val searchInfoPreimageTitle : String,
val searchInfoPreimageDesc : String, // val searchInfoPreimageDesc : String,
val searchInfoNodeAliasTitle : String, // val searchInfoNodeAliasTitle : String,
val searchInfoNodeAliasDesc : String, // val searchInfoNodeAliasDesc : String,
val searchInfoNodeIdTitle : String, // val searchInfoNodeIdTitle : String,
val searchInfoNodeIdDesc : String, // val searchInfoNodeIdDesc : String,
val searchInfoFooter : String, // val searchInfoFooter : String,
//
// ── PaymentDetailScreen ─────────────────────────────────────────────────── // // ── PaymentDetailScreen ───────────────────────────────────────────────────
val statusSuccess : String, // e.g. "Success" // val statusSuccess : String, // e.g. "Success"
val statusPending : String, // e.g. "Pending" // val statusPending : String, // e.g. "Pending"
val statusFailed : String, // e.g. "Failed" // val statusFailed : String, // e.g. "Failed"
val statusUnknown : String, // e.g. "Unknown" // val statusUnknown : String, // e.g. "Unknown"
val detailOutgoingTitle : String, // val detailOutgoingTitle : String,
val detailIncomingTitle : String, // val detailIncomingTitle : String,
val detailBack : String, // val detailBack : String,
val detailCouldNotLoad : String, // val detailCouldNotLoad : String,
val detailFeeLabel : (feeSat: Long, fiatPart: String, ppmPart: String) -> String, // val detailFeeLabel : (feeSat: Long, fiatPart: String, ppmPart: String) -> String,
val detailSectionDetails : String, // val detailSectionDetails : String,
val detailRowDate : String, // val detailRowDate : String,
val detailRowMemo : String, // val detailRowMemo : String,
val detailRowMemoEmpty : String, // val detailRowMemoEmpty : String,
val detailRowType : String, // val detailRowType : String,
val detailRowComment : String, // val detailRowComment : String,
val detailSectionSuccessAction: String, // val detailSectionSuccessAction: String,
val detailSuccessMessage : String, // val detailSuccessMessage : String,
val detailSuccessUrl : String, // val detailSuccessUrl : String,
val detailSuccessDescription : String, // val detailSuccessDescription : String,
val detailSectionTechnical : String, // val detailSectionTechnical : String,
val detailRowPaymentHash : String, // val detailRowPaymentHash : String,
val detailRowPreimage : String, // val detailRowPreimage : String,
val detailRowDestination : String, // val detailRowDestination : String,
val detailCopyNodeId : String, // val detailCopyNodeId : String,
val detailRowBolt11 : String, // val detailRowBolt11 : String,
//
// ── PaymentRow ──────────────────────────────────────────────────────────── // // ── PaymentRow ────────────────────────────────────────────────────────────
val paymentRowSentCD : String, // val paymentRowSentCD : String,
val paymentRowReceivedCD : String, // val paymentRowReceivedCD : String,
val paymentRowNoMemo : String, // val paymentRowNoMemo : String,
val paymentRowPending : String, // val paymentRowPending : String,
val paymentRowFailed : String, // val paymentRowFailed : String,
val onboarding: OnboardingStrings, val onboarding: OnboardingStrings,
val receive: ReceiveStrings, val receive: ReceiveStrings,
val history: HistoryStrings,
val nwc: NwcStrings val nwc: NwcStrings
) )
@@ -360,6 +361,108 @@ data class ReceiveStrings(
val receiveVmWithdrawFailed : String, val receiveVmWithdrawFailed : String,
) )
data class HistoryStrings(
// ── HistoryScreen ─────────────────────────────────────────────────────────
val historyTitle : String,
val historyClose : String,
val historySearchPayments : String,
val historyFilterPayments : String,
val historyRetry : String,
val historyNoPayments : String,
val historySearchPlaceholder : String,
val historySearchHelp : String,
val historySearchPaste : String,
val historySearchClear : String,
val historySearchChip : (tail: String) -> String,
val historyClearSearch : String,
val filterDirectionOutgoing : String,
val filterDirectionIncoming : String,
val filterClearDirection : String,
val filterStatusCompleted : String,
val filterStatusPending : String,
val filterStatusFailed : String,
val filterRemoveStatus : String,
val filterRemoveType : String,
val filterAmountRange : (min: Long, max: Long) -> String,
val filterAmountMin : (min: Long) -> String,
val filterAmountMax : (max: Long) -> String,
val filterClearAmount : String,
val filterDateThisWeek : String,
val filterDateThisMonth : String,
val filterDateThisYear : String,
val filterDateRange : (from: String, to: String) -> String,
val filterDateFrom : (from: String) -> String,
val filterDateUntil : (until: String) -> String,
val filterClearDate : String,
// ── FilterBottomSheet ─────────────────────────────────────────────────────
val filterSheetTitle : String,
val filterSectionDirection : String,
val filterDirectionAll : String,
val filterSectionStatus : String,
val filterSectionType : String,
val filterSectionAmount : String,
val filterAmountMin_label : String,
val filterAmountMax_label : String,
val filterAmountSuffix : String,
val filterSectionDate : String,
val filterDateFrom_label : String,
val filterDateTo_label : String,
val filterDialogOk : String,
val filterDialogCancel : String,
// ── SearchInfoSheet ───────────────────────────────────────────────────────
val searchInfoTitle : String,
val searchInfoSubtitle : String,
val searchInfoMemoTitle : String,
val searchInfoMemoDesc : String,
val searchInfoInvoiceTitle : String,
val searchInfoInvoiceDesc : String,
val searchInfoHashTitle : String,
val searchInfoHashDesc : String,
val searchInfoPreimageTitle : String,
val searchInfoPreimageDesc : String,
val searchInfoNodeAliasTitle : String,
val searchInfoNodeAliasDesc : String,
val searchInfoNodeIdTitle : String,
val searchInfoNodeIdDesc : String,
val searchInfoFooter : String,
// ── 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 detailIncomingTitle : String,
val detailBack : String,
val detailCouldNotLoad : String,
val detailFeeLabel : (feeSat: Long, fiatPart: String, ppmPart: String) -> String,
val detailSectionDetails : String,
val detailRowDate : String,
val detailRowMemo : String,
val detailRowMemoEmpty : String,
val detailRowType : String,
val detailRowComment : String,
val detailSectionSuccessAction: String,
val detailSuccessMessage : String,
val detailSuccessUrl : String,
val detailSuccessDescription : String,
val detailSectionTechnical : String,
val detailRowPaymentHash : String,
val detailRowPreimage : String,
val detailRowDestination : String,
val detailCopyNodeId : String,
val detailRowBolt11 : String,
// ── PaymentRow ────────────────────────────────────────────────────────────
val paymentRowSentCD : String,
val paymentRowReceivedCD : String,
val paymentRowNoMemo : String,
val paymentRowPending : String,
val paymentRowFailed : String,
)
data class NwcStrings( data class NwcStrings(
// ── Shared / navigation ─────────────────────────────────────────────────── // ── Shared / navigation ───────────────────────────────────────────────────
@@ -1,8 +1,8 @@
package com.bitcointxoko.gudariwallet.i18n package com.bitcointxoko.gudariwallet.i18n
fun AppStrings.paymentStatusLabel(status: String): String = when (status.lowercase()) { fun AppStrings.paymentStatusLabel(status: String): String = when (status.lowercase()) {
"success" -> statusSuccess "success" -> history.statusSuccess
"pending" -> statusPending "pending" -> history.statusPending
"failed" -> statusFailed "failed" -> history.statusFailed
else -> statusUnknown else -> history.statusUnknown
} }
@@ -24,18 +24,18 @@ internal fun StatusChip(status: String) {
val style = when (status.lowercase()) { val style = when (status.lowercase()) {
"success", "complete", "paid" -> ChipStyle( "success", "complete", "paid" -> ChipStyle(
semantic.successContainer, semantic.onSuccessContainer, strings.statusSuccess semantic.successContainer, semantic.onSuccessContainer, strings.history.statusSuccess
) )
"pending", "in_flight", "inflight" -> ChipStyle( "pending", "in_flight", "inflight" -> ChipStyle(
semantic.warningContainer, semantic.onWarningContainer, strings.statusPending semantic.warningContainer, semantic.onWarningContainer, strings.history.statusPending
) )
"failed", "error", "expired" -> ChipStyle( "failed", "error", "expired" -> ChipStyle(
semantic.errorContainer, semantic.onErrorContainer, strings.statusFailed semantic.errorContainer, semantic.onErrorContainer, strings.history.statusFailed
) )
else -> ChipStyle( else -> ChipStyle(
MaterialTheme.colorScheme.surfaceVariant, MaterialTheme.colorScheme.surfaceVariant,
MaterialTheme.colorScheme.onSurfaceVariant, MaterialTheme.colorScheme.onSurfaceVariant,
strings.statusUnknown, strings.history.statusUnknown,
) )
} }
@@ -62,14 +62,14 @@ internal fun FilterBottomSheet(
) { ) {
// ── Sheet title ─────────────────────────────────────────────────── // ── Sheet title ───────────────────────────────────────────────────
Text( Text(
text = strings.filterSheetTitle, // ← "Filter payments" text = strings.history.filterSheetTitle, // ← "Filter payments"
style = MaterialTheme.typography.titleMedium style = MaterialTheme.typography.titleMedium
) )
Spacer(Modifier.height(20.dp)) Spacer(Modifier.height(20.dp))
// ── Direction ───────────────────────────────────────────────────── // ── Direction ─────────────────────────────────────────────────────
Text( Text(
text = strings.filterSectionDirection, // ← "Direction" text = strings.history.filterSectionDirection, // ← "Direction"
style = MaterialTheme.typography.labelMedium, style = MaterialTheme.typography.labelMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onSurfaceVariant
) )
@@ -77,9 +77,9 @@ internal fun FilterBottomSheet(
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
DirectionFilter.entries.forEach { option -> DirectionFilter.entries.forEach { option ->
val label = when (option) { val label = when (option) {
DirectionFilter.ALL -> strings.filterDirectionAll // ← "All" DirectionFilter.ALL -> strings.history.filterDirectionAll // ← "All"
DirectionFilter.OUTGOING -> strings.filterDirectionOutgoing // ← "Outgoing" DirectionFilter.OUTGOING -> strings.history.filterDirectionOutgoing // ← "Outgoing"
DirectionFilter.INCOMING -> strings.filterDirectionIncoming // ← "Incoming" DirectionFilter.INCOMING -> strings.history.filterDirectionIncoming // ← "Incoming"
} }
FilterChip( FilterChip(
selected = currentFilter.direction == option, selected = currentFilter.direction == option,
@@ -92,7 +92,7 @@ internal fun FilterBottomSheet(
// ── Status ──────────────────────────────────────────────────────── // ── Status ────────────────────────────────────────────────────────
Text( Text(
text = strings.filterSectionStatus, // ← "Status" text = strings.history.filterSectionStatus, // ← "Status"
style = MaterialTheme.typography.labelMedium, style = MaterialTheme.typography.labelMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onSurfaceVariant
) )
@@ -105,9 +105,9 @@ internal fun FilterBottomSheet(
label = { label = {
Text( Text(
when (option) { when (option) {
StatusFilter.COMPLETED -> strings.filterStatusCompleted // ← "Completed" StatusFilter.COMPLETED -> strings.history.filterStatusCompleted // ← "Completed"
StatusFilter.PENDING -> strings.filterStatusPending // ← "Pending" StatusFilter.PENDING -> strings.history.filterStatusPending // ← "Pending"
StatusFilter.FAILED -> strings.filterStatusFailed // ← "Failed" StatusFilter.FAILED -> strings.history.filterStatusFailed // ← "Failed"
} }
) )
} }
@@ -119,7 +119,7 @@ internal fun FilterBottomSheet(
if (availableTypes.isNotEmpty()) { if (availableTypes.isNotEmpty()) {
Spacer(Modifier.height(20.dp)) Spacer(Modifier.height(20.dp))
Text( Text(
text = strings.filterSectionType, // ← "Type" text = strings.history.filterSectionType, // ← "Type"
style = MaterialTheme.typography.labelMedium, style = MaterialTheme.typography.labelMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onSurfaceVariant
) )
@@ -138,7 +138,7 @@ internal fun FilterBottomSheet(
// ── Amount (sats) ───────────────────────────────────────────────── // ── Amount (sats) ─────────────────────────────────────────────────
Text( Text(
text = strings.filterSectionAmount, // ← "Amount (sats)" text = strings.history.filterSectionAmount, // ← "Amount (sats)"
style = MaterialTheme.typography.labelMedium, style = MaterialTheme.typography.labelMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onSurfaceVariant
) )
@@ -159,8 +159,8 @@ internal fun FilterBottomSheet(
OutlinedTextField( OutlinedTextField(
value = minText, value = minText,
onValueChange = { minText = it.filter(Char::isDigit); commitAmount() }, onValueChange = { minText = it.filter(Char::isDigit); commitAmount() },
label = { Text(strings.filterAmountMin_label) }, // ← "Min" label = { Text(strings.history.filterAmountMin_label) }, // ← "Min"
suffix = { Text(strings.filterAmountSuffix) }, // ← "sats" suffix = { Text(strings.history.filterAmountSuffix) }, // ← "sats"
singleLine = true, singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
modifier = Modifier.weight(1f) modifier = Modifier.weight(1f)
@@ -169,8 +169,8 @@ internal fun FilterBottomSheet(
OutlinedTextField( OutlinedTextField(
value = maxText, value = maxText,
onValueChange = { maxText = it.filter(Char::isDigit); commitAmount() }, onValueChange = { maxText = it.filter(Char::isDigit); commitAmount() },
label = { Text(strings.filterAmountMax_label) }, // ← "Max" label = { Text(strings.history.filterAmountMax_label) }, // ← "Max"
suffix = { Text(strings.filterAmountSuffix) }, // ← "sats" suffix = { Text(strings.history.filterAmountSuffix) }, // ← "sats"
singleLine = true, singleLine = true,
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
modifier = Modifier.weight(1f) modifier = Modifier.weight(1f)
@@ -180,7 +180,7 @@ internal fun FilterBottomSheet(
// ── Date ────────────────────────────────────────────────────────── // ── Date ──────────────────────────────────────────────────────────
Text( Text(
text = strings.filterSectionDate, // ← "Date" text = strings.history.filterSectionDate, // ← "Date"
style = MaterialTheme.typography.labelMedium, style = MaterialTheme.typography.labelMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onSurfaceVariant
) )
@@ -190,9 +190,9 @@ internal fun FilterBottomSheet(
Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) {
DatePreset.entries.forEach { preset -> DatePreset.entries.forEach { preset ->
val label = when (preset) { val label = when (preset) {
DatePreset.THIS_WEEK -> strings.filterDateThisWeek // ← "This week" DatePreset.THIS_WEEK -> strings.history.filterDateThisWeek // ← "This week"
DatePreset.THIS_MONTH -> strings.filterDateThisMonth // ← "This month" DatePreset.THIS_MONTH -> strings.history.filterDateThisMonth // ← "This month"
DatePreset.THIS_YEAR -> strings.filterDateThisYear // ← "This year" DatePreset.THIS_YEAR -> strings.history.filterDateThisYear // ← "This year"
} }
FilterChip( FilterChip(
selected = currentFilter.datePreset == preset, selected = currentFilter.datePreset == preset,
@@ -221,7 +221,7 @@ internal fun FilterBottomSheet(
Text( Text(
currentFilter.minCreatedAt currentFilter.minCreatedAt
?.let { formatEpochShort(it) } ?.let { formatEpochShort(it) }
?: strings.filterDateFrom_label // ← "From" ?: strings.history.filterDateFrom_label // ← "From"
) )
} }
Text("", style = MaterialTheme.typography.bodyLarge) Text("", style = MaterialTheme.typography.bodyLarge)
@@ -232,7 +232,7 @@ internal fun FilterBottomSheet(
Text( Text(
currentFilter.maxCreatedAt currentFilter.maxCreatedAt
?.let { formatEpochShort(it) } ?.let { formatEpochShort(it) }
?: strings.filterDateTo_label // ← "To" ?: strings.history.filterDateTo_label // ← "To"
) )
} }
} }
@@ -248,11 +248,11 @@ internal fun FilterBottomSheet(
val epochSec = pickerState.selectedDateMillis?.div(1000) val epochSec = pickerState.selectedDateMillis?.div(1000)
onDateFilterSet(epochSec, currentFilter.maxCreatedAt) onDateFilterSet(epochSec, currentFilter.maxCreatedAt)
showFromPicker = false showFromPicker = false
}) { Text(strings.filterDialogOk) } // ← "OK" }) { Text(strings.history.filterDialogOk) } // ← "OK"
}, },
dismissButton = { dismissButton = {
TextButton(onClick = { showFromPicker = false }) { TextButton(onClick = { showFromPicker = false }) {
Text(strings.filterDialogCancel) // ← "Cancel" Text(strings.history.filterDialogCancel) // ← "Cancel"
} }
} }
) { DatePicker(state = pickerState) } ) { DatePicker(state = pickerState) }
@@ -270,11 +270,11 @@ internal fun FilterBottomSheet(
val epochSec = pickerState.selectedDateMillis?.div(1000)?.let { it + 86399L } val epochSec = pickerState.selectedDateMillis?.div(1000)?.let { it + 86399L }
onDateFilterSet(currentFilter.minCreatedAt, epochSec) onDateFilterSet(currentFilter.minCreatedAt, epochSec)
showToPicker = false showToPicker = false
}) { Text(strings.filterDialogOk) } // ← "OK" }) { Text(strings.history.filterDialogOk) } // ← "OK"
}, },
dismissButton = { dismissButton = {
TextButton(onClick = { showToPicker = false }) { TextButton(onClick = { showToPicker = false }) {
Text(strings.filterDialogCancel) // ← "Cancel" Text(strings.history.filterDialogCancel) // ← "Cancel"
} }
} }
) { DatePicker(state = pickerState) } ) { DatePicker(state = pickerState) }
@@ -89,12 +89,12 @@ fun HistoryScreen(
Scaffold( Scaffold(
topBar = { topBar = {
TopAppBar( TopAppBar(
title = { Text(strings.historyTitle) }, // ← "History" title = { Text(strings.history.historyTitle) }, // ← "History"
navigationIcon = { navigationIcon = {
IconButton(onClick = onClose) { IconButton(onClick = onClose) {
Icon( Icon(
imageVector = Icons.Default.Close, imageVector = Icons.Default.Close,
contentDescription = strings.historyClose // ← "Close" contentDescription = strings.history.historyClose // ← "Close"
) )
} }
}, },
@@ -108,7 +108,7 @@ fun HistoryScreen(
}) { }) {
Icon( Icon(
imageVector = Icons.Default.Search, imageVector = Icons.Default.Search,
contentDescription = strings.historySearchPayments // ← "Search payments" contentDescription = strings.history.historySearchPayments // ← "Search payments"
) )
} }
} }
@@ -118,7 +118,7 @@ fun HistoryScreen(
IconButton(onClick = { filterSheetVisible = true }) { IconButton(onClick = { filterSheetVisible = true }) {
Icon( Icon(
imageVector = Icons.Default.FilterList, imageVector = Icons.Default.FilterList,
contentDescription = strings.historyFilterPayments // ← "Filter payments" contentDescription = strings.history.historyFilterPayments // ← "Filter payments"
) )
} }
} }
@@ -191,7 +191,7 @@ fun HistoryScreen(
) )
Spacer(Modifier.height(12.dp)) Spacer(Modifier.height(12.dp))
Button(onClick = { vm.refresh() }) { Button(onClick = { vm.refresh() }) {
Text(strings.historyRetry) // ← "Retry" Text(strings.history.historyRetry) // ← "Retry"
} }
} }
} }
@@ -210,7 +210,7 @@ fun HistoryScreen(
if (s.payments.isEmpty()) { if (s.payments.isEmpty()) {
Text( Text(
text = strings.historyNoPayments, // ← "No payments yet." text = strings.history.historyNoPayments, // ← "No payments yet."
modifier = Modifier.align(Alignment.Center), modifier = Modifier.align(Alignment.Center),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onSurfaceVariant
@@ -310,13 +310,13 @@ private fun SearchBar(
IconButton(onClick = onInfoClick) { IconButton(onClick = onInfoClick) {
Icon( Icon(
imageVector = Icons.Default.Info, imageVector = Icons.Default.Info,
contentDescription = strings.historySearchHelp // ← "Search help" contentDescription = strings.history.historySearchHelp // ← "Search help"
) )
} }
TextField( TextField(
value = query, value = query,
onValueChange = onQueryChange, onValueChange = onQueryChange,
placeholder = { Text(strings.historySearchPlaceholder) }, // ← "Search transactions" placeholder = { Text(strings.history.historySearchPlaceholder) }, // ← "Search transactions"
singleLine = true, singleLine = true,
colors = TextFieldDefaults.colors( colors = TextFieldDefaults.colors(
focusedContainerColor = Color.Transparent, focusedContainerColor = Color.Transparent,
@@ -337,7 +337,7 @@ private fun SearchBar(
}) { }) {
Icon( Icon(
imageVector = Icons.Default.ContentPaste, imageVector = Icons.Default.ContentPaste,
contentDescription = strings.historySearchPaste // ← "Paste" contentDescription = strings.history.historySearchPaste // ← "Paste"
) )
} }
IconButton( IconButton(
@@ -346,7 +346,7 @@ private fun SearchBar(
) { ) {
Icon( Icon(
imageVector = Icons.Default.Close, imageVector = Icons.Default.Close,
contentDescription = strings.historySearchClear, // ← "Clear search" contentDescription = strings.history.historySearchClear, // ← "Clear search"
tint = if (query.isNotEmpty()) LocalContentColor.current tint = if (query.isNotEmpty()) LocalContentColor.current
else MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f) else MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f)
) )
@@ -382,15 +382,15 @@ private fun ActiveFilterChips(
label = { label = {
Text( Text(
when (filter.direction) { when (filter.direction) {
DirectionFilter.OUTGOING -> strings.filterDirectionOutgoing // ← "Outgoing" DirectionFilter.OUTGOING -> strings.history.filterDirectionOutgoing // ← "Outgoing"
else -> strings.filterDirectionIncoming // ← "Incoming" else -> strings.history.filterDirectionIncoming // ← "Incoming"
} }
) )
}, },
trailingIcon = { trailingIcon = {
Icon( Icon(
imageVector = Icons.Default.Close, imageVector = Icons.Default.Close,
contentDescription = strings.filterClearDirection, // ← "Clear direction filter" contentDescription = strings.history.filterClearDirection, // ← "Clear direction filter"
modifier = Modifier.size(16.dp) modifier = Modifier.size(16.dp)
) )
} }
@@ -403,16 +403,16 @@ private fun ActiveFilterChips(
label = { label = {
Text( Text(
when (s) { when (s) {
StatusFilter.COMPLETED -> strings.filterStatusCompleted // ← "Completed" StatusFilter.COMPLETED -> strings.history.filterStatusCompleted // ← "Completed"
StatusFilter.PENDING -> strings.filterStatusPending // ← "Pending" StatusFilter.PENDING -> strings.history.filterStatusPending // ← "Pending"
StatusFilter.FAILED -> strings.filterStatusFailed // ← "Failed" StatusFilter.FAILED -> strings.history.filterStatusFailed // ← "Failed"
} }
) )
}, },
trailingIcon = { trailingIcon = {
Icon( Icon(
imageVector = Icons.Default.Close, imageVector = Icons.Default.Close,
contentDescription = strings.filterRemoveStatus, // ← "Remove status filter" contentDescription = strings.history.filterRemoveStatus, // ← "Remove status filter"
modifier = Modifier.size(16.dp) modifier = Modifier.size(16.dp)
) )
} }
@@ -426,7 +426,7 @@ private fun ActiveFilterChips(
trailingIcon = { trailingIcon = {
Icon( Icon(
imageVector = Icons.Default.Close, imageVector = Icons.Default.Close,
contentDescription = strings.filterRemoveType, // ← "Remove type filter" contentDescription = strings.history.filterRemoveType, // ← "Remove type filter"
modifier = Modifier.size(16.dp) modifier = Modifier.size(16.dp)
) )
} }
@@ -435,11 +435,11 @@ private fun ActiveFilterChips(
if (filter.minAmountSat != null || filter.maxAmountSat != null) { if (filter.minAmountSat != null || filter.maxAmountSat != null) {
val label = when { val label = when {
filter.minAmountSat != null && filter.maxAmountSat != null -> filter.minAmountSat != null && filter.maxAmountSat != null ->
strings.filterAmountRange(filter.minAmountSat, filter.maxAmountSat) // ← "XY sats" strings.history.filterAmountRange(filter.minAmountSat, filter.maxAmountSat) // ← "XY sats"
filter.minAmountSat != null -> filter.minAmountSat != null ->
strings.filterAmountMin(filter.minAmountSat) // ← "≥ X sats" strings.history.filterAmountMin(filter.minAmountSat) // ← "≥ X sats"
else -> else ->
strings.filterAmountMax(filter.maxAmountSat!!) // ← "≤ X sats" strings.history.filterAmountMax(filter.maxAmountSat!!) // ← "≤ X sats"
} }
InputChip( InputChip(
selected = true, selected = true,
@@ -448,7 +448,7 @@ private fun ActiveFilterChips(
trailingIcon = { trailingIcon = {
Icon( Icon(
imageVector = Icons.Default.Close, imageVector = Icons.Default.Close,
contentDescription = strings.filterClearAmount, // ← "Clear amount filter" contentDescription = strings.history.filterClearAmount, // ← "Clear amount filter"
modifier = Modifier.size(16.dp) modifier = Modifier.size(16.dp)
) )
} }
@@ -458,19 +458,19 @@ private fun ActiveFilterChips(
val maxCreatedAt = filter.maxCreatedAt val maxCreatedAt = filter.maxCreatedAt
if (minCreatedAt != null || maxCreatedAt != null) { if (minCreatedAt != null || maxCreatedAt != null) {
val label = when (filter.datePreset) { val label = when (filter.datePreset) {
DatePreset.THIS_WEEK -> strings.filterDateThisWeek // ← "This week" DatePreset.THIS_WEEK -> strings.history.filterDateThisWeek // ← "This week"
DatePreset.THIS_MONTH -> strings.filterDateThisMonth // ← "This month" DatePreset.THIS_MONTH -> strings.history.filterDateThisMonth // ← "This month"
DatePreset.THIS_YEAR -> strings.filterDateThisYear // ← "This year" DatePreset.THIS_YEAR -> strings.history.filterDateThisYear // ← "This year"
null -> when { null -> when {
minCreatedAt != null && maxCreatedAt != null -> minCreatedAt != null && maxCreatedAt != null ->
strings.filterDateRange( // ← "XY" strings.history.filterDateRange( // ← "XY"
formatEpochShort(minCreatedAt), formatEpochShort(minCreatedAt),
formatEpochShort(maxCreatedAt) formatEpochShort(maxCreatedAt)
) )
minCreatedAt != null -> minCreatedAt != null ->
strings.filterDateFrom(formatEpochShort(minCreatedAt)) // ← "From X" strings.history.filterDateFrom(formatEpochShort(minCreatedAt)) // ← "From X"
else -> else ->
strings.filterDateUntil(formatEpochShort(maxCreatedAt!!)) // ← "Until X" strings.history.filterDateUntil(formatEpochShort(maxCreatedAt!!)) // ← "Until X"
} }
} }
InputChip( InputChip(
@@ -480,7 +480,7 @@ private fun ActiveFilterChips(
trailingIcon = { trailingIcon = {
Icon( Icon(
imageVector = Icons.Default.Close, imageVector = Icons.Default.Close,
contentDescription = strings.filterClearDate, // ← "Clear date filter" contentDescription = strings.history.filterClearDate, // ← "Clear date filter"
modifier = Modifier.size(16.dp) modifier = Modifier.size(16.dp)
) )
} }
@@ -490,11 +490,11 @@ private fun ActiveFilterChips(
InputChip( InputChip(
selected = true, selected = true,
onClick = onClearSearch, onClick = onClearSearch,
label = { Text(strings.historySearchChip(filter.searchQuery.takeLast(8))) }, // ← "search: …XXXXXXXX" label = { Text(strings.history.historySearchChip(filter.searchQuery.takeLast(8))) }, // ← "search: …XXXXXXXX"
trailingIcon = { trailingIcon = {
Icon( Icon(
imageVector = Icons.Default.Close, imageVector = Icons.Default.Close,
contentDescription = strings.historyClearSearch, // ← "Clear search" contentDescription = strings.history.historyClearSearch, // ← "Clear search"
modifier = Modifier.size(16.dp) modifier = Modifier.size(16.dp)
) )
} }
@@ -92,15 +92,15 @@ fun PaymentDetailScreen(
TopAppBar( TopAppBar(
title = { title = {
Text( Text(
if (payment.isOutgoing) strings.detailOutgoingTitle // ← "Outgoing payment" if (payment.isOutgoing) strings.history.detailOutgoingTitle // ← "Outgoing payment"
else strings.detailIncomingTitle // ← "Incoming payment" else strings.history.detailIncomingTitle // ← "Incoming payment"
) )
}, },
navigationIcon = { navigationIcon = {
IconButton(onClick = onBack) { IconButton(onClick = onBack) {
Icon( Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack, imageVector = Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = strings.detailBack // ← "Back" contentDescription = strings.history.detailBack // ← "Back"
) )
} }
} }
@@ -122,7 +122,7 @@ fun PaymentDetailScreen(
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text( Text(
text = strings.detailCouldNotLoad, // ← "Could not load full details" text = strings.history.detailCouldNotLoad, // ← "Could not load full details"
color = MaterialTheme.colorScheme.onErrorContainer, color = MaterialTheme.colorScheme.onErrorContainer,
style = MaterialTheme.typography.bodySmall, style = MaterialTheme.typography.bodySmall,
modifier = Modifier.padding(12.dp) modifier = Modifier.padding(12.dp)
@@ -215,7 +215,7 @@ private fun PaymentDetailContent(
// Build the optional parts separately so the lambda stays clean // Build the optional parts separately so the lambda stays clean
val fiatPart = if (feeFiat != null) " ($feeFiat)" else "" val fiatPart = if (feeFiat != null) " ($feeFiat)" else ""
val ppmPart = if (ppm != null) " · $ppm ppm" else "" val ppmPart = if (ppm != null) " · $ppm ppm" else ""
val feeLabel = strings.detailFeeLabel( // ← "Fee: X sats (fiat) · Y ppm" val feeLabel = strings.history.detailFeeLabel( // ← "Fee: X sats (fiat) · Y ppm"
payment.feeSat, fiatPart, ppmPart payment.feeSat, fiatPart, ppmPart
) )
Spacer(Modifier.height(4.dp)) Spacer(Modifier.height(4.dp))
@@ -233,17 +233,17 @@ private fun PaymentDetailContent(
// ── Basic info ─────────────────────────────────────────────────────── // ── Basic info ───────────────────────────────────────────────────────
item { item {
DetailSection(title = strings.detailSectionDetails) { // ← "Details" DetailSection(title = strings.history.detailSectionDetails) { // ← "Details"
DetailRow(strings.detailRowDate, formatTimestamp(payment.createdAt, payment.time)) // ← "Date" DetailRow(strings.history.detailRowDate, formatTimestamp(payment.createdAt, payment.time)) // ← "Date"
DetailRow( DetailRow(
strings.detailRowMemo, // ← "Memo" strings.history.detailRowMemo, // ← "Memo"
payment.memo?.takeIf { it.isNotBlank() } ?: strings.detailRowMemoEmpty // ← "—" payment.memo?.takeIf { it.isNotBlank() } ?: strings.history.detailRowMemoEmpty // ← "—"
) )
if (payment.extra?.tag != null) { if (payment.extra?.tag != null) {
DetailRow(strings.detailRowType, payment.extra.tag) // ← "Type" DetailRow(strings.history.detailRowType, payment.extra.tag) // ← "Type"
} }
if (payment.extra?.comment?.isNotBlank() == true) { if (payment.extra?.comment?.isNotBlank() == true) {
DetailRow(strings.detailRowComment, payment.extra.comment) // ← "Comment" DetailRow(strings.history.detailRowComment, payment.extra.comment) // ← "Comment"
} }
} }
} }
@@ -251,19 +251,19 @@ private fun PaymentDetailContent(
// ── Success action (LNURL) ─────────────────────────────────────────── // ── Success action (LNURL) ───────────────────────────────────────────
payment.extra?.successAction?.let { action -> payment.extra?.successAction?.let { action ->
item { item {
DetailSection(title = strings.detailSectionSuccessAction) { // ← "Success Action" DetailSection(title = strings.history.detailSectionSuccessAction) { // ← "Success Action"
action.message?.let { DetailRow(strings.detailSuccessMessage, it) } // ← "Message" action.message?.let { DetailRow(strings.history.detailSuccessMessage, it) } // ← "Message"
action.url?.let { DetailRow(strings.detailSuccessUrl, it) } // ← "URL" action.url?.let { DetailRow(strings.history.detailSuccessUrl, it) } // ← "URL"
action.description?.let { DetailRow(strings.detailSuccessDescription, it) } // ← "Description" action.description?.let { DetailRow(strings.history.detailSuccessDescription, it) } // ← "Description"
} }
} }
} }
// ── Technical ──────────────────────────────────────────────────────── // ── Technical ────────────────────────────────────────────────────────
item { item {
DetailSection(title = strings.detailSectionTechnical) { // ← "Technical" DetailSection(title = strings.history.detailSectionTechnical) { // ← "Technical"
DetailRow( DetailRow(
label = strings.detailRowPaymentHash, // ← "Payment Hash" label = strings.history.detailRowPaymentHash, // ← "Payment Hash"
value = payment.paymentHash, value = payment.paymentHash,
monospace = true, monospace = true,
copyable = true, copyable = true,
@@ -277,7 +277,7 @@ private fun PaymentDetailContent(
) )
if (!payment.preimage.isNullOrBlank() && payment.preimage != "0".repeat(64)) { if (!payment.preimage.isNullOrBlank() && payment.preimage != "0".repeat(64)) {
DetailRow( DetailRow(
label = strings.detailRowPreimage, // ← "Preimage" label = strings.history.detailRowPreimage, // ← "Preimage"
value = payment.preimage, value = payment.preimage,
monospace = true, monospace = true,
copyable = true, copyable = true,
@@ -294,7 +294,7 @@ private fun PaymentDetailContent(
val ambossUrl = "https://amboss.space/node/$pubkey" val ambossUrl = "https://amboss.space/node/$pubkey"
val label = alias ?: "${pubkey.take(8)}${pubkey.takeLast(8)}" val label = alias ?: "${pubkey.take(8)}${pubkey.takeLast(8)}"
DetailRow( DetailRow(
label = strings.detailRowDestination, // ← "Destination" label = strings.history.detailRowDestination, // ← "Destination"
value = label, value = label,
valueColor = MaterialTheme.colorScheme.primary, valueColor = MaterialTheme.colorScheme.primary,
textDecoration = androidx.compose.ui.text.style.TextDecoration.Underline, textDecoration = androidx.compose.ui.text.style.TextDecoration.Underline,
@@ -308,7 +308,7 @@ private fun PaymentDetailContent(
} }
if (!payment.bolt11.isNullOrBlank()) { if (!payment.bolt11.isNullOrBlank()) {
DetailRow( DetailRow(
label = strings.detailRowBolt11, // ← "BOLT11" label = strings.history.detailRowBolt11, // ← "BOLT11"
value = payment.bolt11, value = payment.bolt11,
monospace = true, monospace = true,
copyable = true, copyable = true,
@@ -61,8 +61,8 @@ internal fun PaymentRow(
) { ) {
Icon( Icon(
imageVector = icon, imageVector = icon,
contentDescription = if (payment.isOutgoing) strings.paymentRowSentCD // ← "Sent" contentDescription = if (payment.isOutgoing) strings.history.paymentRowSentCD // ← "Sent"
else strings.paymentRowReceivedCD, // ← "Received" else strings.history.paymentRowReceivedCD, // ← "Received"
tint = amountColor, tint = amountColor,
modifier = Modifier.size(20.dp) modifier = Modifier.size(20.dp)
) )
@@ -71,7 +71,7 @@ internal fun PaymentRow(
Column(modifier = Modifier.weight(1f)) { Column(modifier = Modifier.weight(1f)) {
Text( Text(
text = payment.memo?.takeIf { it.isNotBlank() } text = payment.memo?.takeIf { it.isNotBlank() }
?: strings.paymentRowNoMemo, // ← "No memo" ?: strings.history.paymentRowNoMemo, // ← "No memo"
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
maxLines = 1, maxLines = 1,
overflow = TextOverflow.Ellipsis overflow = TextOverflow.Ellipsis
@@ -86,8 +86,8 @@ internal fun PaymentRow(
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onSurfaceVariant
) )
val statusLabel = when { val statusLabel = when {
isPending -> strings.paymentRowPending isPending -> strings.history.paymentRowPending
isFailed -> strings.paymentRowFailed isFailed -> strings.history.paymentRowFailed
else -> null else -> null
} }
val statusColor = when { val statusColor = when {
@@ -33,45 +33,45 @@ internal fun SearchInfoSheet(visible: Boolean, onDismiss: () -> Unit) {
.padding(start = 24.dp, end = 24.dp, bottom = 40.dp) .padding(start = 24.dp, end = 24.dp, bottom = 40.dp)
) { ) {
Text( Text(
text = strings.searchInfoTitle, // ← "What can I search for?" text = strings.history.searchInfoTitle, // ← "What can I search for?"
style = MaterialTheme.typography.titleMedium style = MaterialTheme.typography.titleMedium
) )
Spacer(Modifier.height(8.dp)) Spacer(Modifier.height(8.dp))
Text( Text(
text = strings.searchInfoSubtitle, // ← "Type any part of the following…" text = strings.history.searchInfoSubtitle, // ← "Type any part of the following…"
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onSurfaceVariant
) )
Spacer(Modifier.height(20.dp)) Spacer(Modifier.height(20.dp))
SearchInfoItem( SearchInfoItem(
title = strings.searchInfoMemoTitle, // ← "Memo" title = strings.history.searchInfoMemoTitle, // ← "Memo"
description = strings.searchInfoMemoDesc description = strings.history.searchInfoMemoDesc
) )
SearchInfoItem( SearchInfoItem(
title = strings.searchInfoInvoiceTitle, // ← "Invoice" title = strings.history.searchInfoInvoiceTitle, // ← "Invoice"
description = strings.searchInfoInvoiceDesc description = strings.history.searchInfoInvoiceDesc
) )
SearchInfoItem( SearchInfoItem(
title = strings.searchInfoHashTitle, // ← "Hash" title = strings.history.searchInfoHashTitle, // ← "Hash"
description = strings.searchInfoHashDesc description = strings.history.searchInfoHashDesc
) )
SearchInfoItem( SearchInfoItem(
title = strings.searchInfoPreimageTitle, // ← "Preimage" title = strings.history.searchInfoPreimageTitle, // ← "Preimage"
description = strings.searchInfoPreimageDesc description = strings.history.searchInfoPreimageDesc
) )
SearchInfoItem( SearchInfoItem(
title = strings.searchInfoNodeAliasTitle, // ← "Node alias" title = strings.history.searchInfoNodeAliasTitle, // ← "Node alias"
description = strings.searchInfoNodeAliasDesc description = strings.history.searchInfoNodeAliasDesc
) )
SearchInfoItem( SearchInfoItem(
title = strings.searchInfoNodeIdTitle, // ← "Node ID (pubkey)" title = strings.history.searchInfoNodeIdTitle, // ← "Node ID (pubkey)"
description = strings.searchInfoNodeIdDesc description = strings.history.searchInfoNodeIdDesc
) )
Spacer(Modifier.height(16.dp)) Spacer(Modifier.height(16.dp))
Text( Text(
text = strings.searchInfoFooter, // ← "You can paste a full value…" text = strings.history.searchInfoFooter, // ← "You can paste a full value…"
style = MaterialTheme.typography.bodySmall, style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onSurfaceVariant
) )