feat: localisation with lyricist

This commit is contained in:
2026-06-06 11:52:03 +02:00
parent 8ef2d80901
commit c80edafbd4
3 changed files with 332 additions and 1 deletions
@@ -0,0 +1,310 @@
package com.bitcointxoko.gudariwallet.i18n
import cafe.adriel.lyricist.LyricistStrings
@LyricistStrings(languageTag = "eu")
val EuStrings = AppStrings(
// ── WalletScreen ──────────────────────────────────────────────────────────
tabReceive = "Jaso",
tabSend = "Bidali",
scanContentDescription = "Eskaneatu",
dismissContentDescription = "Itxi",
clipboardInvoiceDetected = "Faktura arbelean aurkitu da",
clipboardLnurlDetected = "LNURL arbelean aurkitu da",
clipboardAddressDetected = "Lightning helbidea arbelean aurkitu da",
clipboardPaymentDetected = "Ordainketa arbelean aurkitu da",
clipboardTapToOpen = "Sakatu irekitzeko",
clipboardTapToPay = "Sakatu ordaintzeko",
nfcInvoiceDetected = "Faktura NFC bidez aurkitu da",
nfcLnurlDetected = "LNURL NFC bidez aurkitu da",
nfcAddressDetected = "Lightning helbidea NFC bidez aurkitu da",
nfcPaymentDetected = "Ordainketa NFC bidez aurkitu da",
nfcTapToOpen = "Sakatu irekitzeko",
nfcTapToPay = "Sakatu ordaintzeko",
// ── HomeTab ───────────────────────────────────────────────────────────────
loadingBalance = "Saldoa kargatzen…",
sats = "sat",
hideBalance = "Ezkutatu saldoa",
revealBalance = "Erakutsi saldoa",
changeCurrency = "Aldatu moneta",
showFiat = "+ Erakutsi fiat",
updatedAt = { label -> "Eguneratua $label" },
justNow = "orain bertan",
minAgo = { min -> "duela $min minutu" },
atTime = { time -> "$time-etan" },
viewHistory = "Ikusi historia",
selectCurrency = "Hautatu moneta",
currencyNone = "Bat ere ez",
hideFiatEquivalent = "Ezkutatu fiat baliokidea",
selected = "Hautatuta",
search = "Bilatu…",
noCurrenciesAvailable = "Ez dago monetarik erabilgarri",
noCurrenciesMatch = { query -> "Ez dago \"$query\" batekin bat datorren monetarik" },
couldNotRefresh = "Ezin izan da freskatu — arrastatu behera berriro saiatzeko",
couldNotLoadBalance = "Ezin izan da saldoa kargatu — arrastatu behera berriro saiatzeko",
// ── Shared ────────────────────────────────────────────────────────────────
cancel = "Utzi",
tryAgain = "Saiatu berriro",
amount = "Zenbatekoa",
next = "Hurrengoa",
back = "← Atzera",
done = "Eginda",
details = "Xehetasunak",
enterValidAmount = "Sartu zenbateko baliogarri bat",
satsUnit = { sats -> "$sats sat" },
// ── ReceiveScreen — general ───────────────────────────────────────────────
receive = "Jaso",
// ── ReceiveScreen — error ─────────────────────────────────────────────────
receiveError = "Errorea",
// ── ReceiveScreen — QR / share ────────────────────────────────────────────
lightningAddressQrCode = "Lightning helbidearen QR kodea",
lightningAddressLabel = "Lightning helbidea",
shareLightningAddress = "Partekatu Lightning helbidea",
lightningInvoiceQrCode = "Lightning fakturaren QR kodea",
invoiceLabel = "Faktura",
shareInvoice = "Partekatu faktura",
// ── ReceiveScreen — amount step ───────────────────────────────────────────
amountInSats = "Zenbatekoa (sat)",
satsRange = { min, max -> "$min $max sat" },
// ── ReceiveScreen — memo step ─────────────────────────────────────────────
memoOptional = "Oharra (aukerakoa)",
memoPlaceholder = "Zertarako da hau?",
creatingInvoice = "Faktura sortzen…",
createInvoice = "Sortu faktura",
// ── ReceiveScreen — invoice ready ─────────────────────────────────────────
waiting = "Zain…",
invoiceExpired = "Faktura iraungita",
newInvoice = "Faktura berria",
// ── ReceiveScreen — lnurl withdraw ────────────────────────────────────────
withdrawFrom = "Atera hemendik:",
minimumSats = { min -> "Gutxienekoa $min sat da" },
maximumSats = { max -> "Gehienekoa $max sat da" },
withdrawButton = "Atera",
withdrawButtonAmount = { amount -> "Atera $amount sat" },
// ── ReceiveScreen — success ───────────────────────────────────────────────
paymentReceived = "Ordainketa jasota!",
// ── AmountDisplay ─────────────────────────────────────────────────────────
amountDisplaySats = { amount -> "$amount sat" },
// ── BrightnessToggleButton & QrDisplayCard ────────────────────────────────
brightnessReduce = "Murriztu distira",
brightnessBoost = "Handitu distira",
qrShare = "Partekatu",
qrCopy = "Kopiatu",
qrNfcStop = "Gelditu NFC partekatzea",
qrNfcStart = "Partekatu NFC bidez",
// ── ReceiveViewModel ──────────────────────────────────────────────────────
receiveVmFailedToCreateInvoice = "Ezin izan da faktura sortu",
receiveVmWithdrawRejected = "Ateratzeko zerbitzuak faktura baztertu du",
receiveVmWithdrawFailed = "Ateratzeak huts egin du",
// ── SendScreen — general ──────────────────────────────────────────────────
send = "Bidali",
paste = "Itsatsi",
continueButton = "Jarraitu",
clear = "Garbitu",
sendAnother = "Bidali beste bat",
// ── SendScreen — input field ──────────────────────────────────────────────
sendInputLabel = "Faktura, LNURL edo Lightning helbidea",
sendInputPlaceholder = "lnbc… / lnurl1… / erabiltzailea@domeinua.com",
tapNfcHint = "Ukitu NFC gailua faktura jasotzeko",
// ── SendScreen — states ───────────────────────────────────────────────────
resolving = "Ebazten…",
sendingPayment = "Ordainketa bidaltzen…",
// ── SendScreen — payment sent ─────────────────────────────────────────────
paymentSent = "Ordainketa bidalita!",
amountSats = { sats -> "$sats sat" },
fiatEquivalent = { fiatStr -> "$fiatStr" },
noFees = "Komisiorik gabe",
routingFee = { sats, ppmSuffix -> "Bideratze-komisioa: $sats sat$ppmSuffix" },
// ── ConfirmCard ───────────────────────────────────────────────────────────
invoiceDetails = "Fakturaren xehetasunak",
payingTo = { label -> "Ordaintzen: $label" },
confirmAmount = { sats -> "$sats sat" },
confirmAmountWithFiat = { sats, fiat -> "$sats sat · $fiat" },
memo = "Oharra",
destination = "Helmuga",
created = "Sortua",
expiresIn = "Iraungitzen da",
hash = "Hash",
invoice = "Faktura",
expiryExpired = "Iraungita",
expirySeconds = { s -> "${s}s" },
expiryMinutes = { m, s -> "${m}m ${s}s" },
expiryHours = { h, m -> "${h}h ${m}m" },
createdToday = { time -> "Gaur, $time" },
createdYesterday = { time -> "Atzo, $time" },
payButton = { sats -> "Ordaindu $sats sat" },
payButtonWithFiat = { sats, fiat -> "Ordaindu $sats sat · $fiat" },
sendBiometricPrompt = { sats -> "Bidali $sats sat" },
sendBiometricPromptTo = { sats, label -> "Bidali $sats sat $label-i" },
// ── LnurlPayForm ──────────────────────────────────────────────────────────
lnurlAmountError = { min, max -> "Sartu $min eta $max sat arteko zenbatekoa" },
lnurlFiatRange = { minFiat, maxFiat -> "$minFiat $maxFiat" },
lnurlSatsAndFiatRange = { min, max, minFiat, maxFiat -> "$min $max sat · $minFiat $maxFiat" },
commentOptional = { max -> "Iruzkina (aukerakoa, gehienez $max karaktere)" },
commentCounter = { current, max -> "$current/$max" },
lnurlPayButton = { sats -> "Ordaindu $sats sat" },
lnurlPayButtonWithFiat = { sats, fiat -> "Ordaindu $sats sat · $fiat" },
// ── RouteHintWarning ──────────────────────────────────────────────────────
routeHintHighFees = "Bideratze-komisio altuak fakturan",
routeHintElevatedFees = "Bideratze-komisio igoak fakturan",
routeHintForcedChannel = { node -> "Faktura honek ordainketa $node-k kudeatutako kanal pribatu baten bidez behartu du." },
routeHintFeeRate = { effectivePpm, worstPpm -> "Komisio-tasa efektiboa: $effectivePpm ppm ($worstPpm ppm)" },
routeHintFeeRateBase = { effectivePpm, worstPpm, baseLabel -> "Komisio-tasa efektiboa: $effectivePpm ppm ($worstPpm ppm + $baseLabel oinarria)" },
routeHintEstimatedFee = { sats -> "Ordainketa honetako komisio gehigarri estimatua: ~$sats sat" },
routeHintShowDetails = "Ikusi xehetasunak ▾",
routeHintHideDetails = "Ezkutatu xehetasunak ▴",
routeHintHopsHeader = "Ibilbide-aholku pribatuko salto-puntuak",
routeHintHopFees = { ppm, baseLabel -> "$ppm ppm · $baseLabel oinarria" },
// ── SendViewModel ─────────────────────────────────────────────────────────
sendVmLnurlAuthNotSupported = "Lightning Saio-hasiera (LNURL-auth) oraindik ez da onartzen",
sendVmUnrecognisedInput = "Sarrera ezezaguna — itsatsi BOLT-11 faktura, LNURL edo Lightning helbide bat",
sendVmPaymentFailed = "Ordainketak huts egin du",
sendVmCouldNotFetchInvoice = "Ezin izan da faktura hartzailearengandik eskuratu",
sendVmCouldNotDecodeInvoice = "Ezin izan da faktura deskodetu",
sendVmAuthFailed = { msg -> "Autentifikazioak huts egin du: $msg" },
sendVmOnChainNotSupported = "Bitcoin kate-barneko ordainketak ez dira onartzen — partekatu BIP-21 URI bat lightning= parametroarekin",
sendVmChannelRequestNotSupported = "Kanal-eskaerak (lnurlc) ez dira onartzen",
sendVmCouldNotResolveAddress = "Ezin izan da helbidea ebatzi",
sendVmEmptyResponse = "Zerbitzariaren erantzuna hutsik dago",
sendVmUnsupportedType = { tag -> "Mota onartzen ez dena: $tag" },
sendVmPaymentFailedRescan = "Ordainketak huts egin du — ezin izan da helbidea berriro eskuratu",
// ── 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 ───────────────────────────────────────────────────
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",
// ── OnboardingScreen ──────────────────────────────────────────────────────
onboardingTitle = "Konektatu LNbits-era",
onboardingSubtitle = "Sartu zure LNbits zerbitzariaren URLa eta API gakoak.",
onboardingServerUrl = "Zerbitzariaren URLa",
onboardingServerUrlHint = "https://bitcointxoko.org",
onboardingInvoiceKey = "Faktura-gakoa (irakurtzeko soilik)",
onboardingAdminKey = "Administrazio-gakoa (bidaltzeko)",
onboardingHideAdminKey = "Ezkutatu",
onboardingShowAdminKey = "Erakutsi",
onboardingFieldsRequired = "Eremu guztiak beharrezkoak dira.",
onboardingConnect = "Konektatu",
)
@@ -46,7 +46,7 @@ fun HomeTab(
val balanceHidden by vm.balanceHidden.collectAsState()
// ── NEW: language switcher state ──────────────────────────────────────────
val supportedTags = remember { listOf("en", "es") } // 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
|| (balanceState as? BalanceState.Success)?.isRefreshing == true
@@ -296,6 +296,7 @@ private fun LanguageSwitcherButton(
when (tag) {
"en" -> "English"
"es" -> "Español"
"eu" -> "Euskara"
else -> tag.uppercase()
}
}
+20
View File
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- NotificationHelper -->
<string name="notif_channel_payments_name">Ordainketak</string>
<string name="notif_channel_payments_desc">Lightning sarrerako eta irteerako ordainketen alertak</string>
<string name="notif_channel_service_name">Zorro-monitorea</string>
<string name="notif_channel_service_desc">Sarrerako ordainketak kontrolatzeko atzeko planoko zerbitzua</string>
<string name="notif_payment_received_title">Ordainketa jasota · +%1$d sat</string>
<string name="notif_payment_received_no_memo">Oharrik gabe</string>
<string name="notif_payment_received_summary">+%1$d sat</string>
<string name="notif_payment_sent_title">Ordainketa bidalita</string>
<string name="notif_payment_sent_text">%1$d sat</string>
<string name="notif_service_title">Gudari Wallet</string>
<string name="notif_service_text">Sarrerako ordainketak kontrolatzen</string>
</resources>