From 1a63d56bfdd091cc7aefdf1e25f3a074bfdf5e0e Mon Sep 17 00:00:00 2001 From: Sebastian Date: Wed, 16 Nov 2022 16:04:52 -0300 Subject: fix #7411, also making the backup payment visible --- packages/taler-util/src/punycode.ts | 2 +- packages/taler-util/src/wallet-types.ts | 8 +- .../workers/synchronousWorkerFactoryPlain.ts | 4 +- .../src/operations/backup/index.ts | 166 +- .../src/operations/pay-merchant.ts | 2 +- packages/taler-wallet-core/src/wallet-api-types.ts | 3 +- packages/taler-wallet-core/src/wallet.ts | 9 +- .../src/NavigationBar.tsx | 32 +- .../src/components/QR.stories.tsx | 31 + .../src/components/QR.tsx | 2 +- .../src/components/TermsOfService/index.ts | 2 +- .../src/components/TermsOfService/state.ts | 19 +- .../src/components/index.stories.tsx | 3 +- .../src/context/devContext.ts | 7 +- .../src/cta/InvoiceCreate/state.ts | 87 +- .../src/cta/InvoicePay/index.ts | 2 +- .../src/cta/InvoicePay/state.ts | 26 +- .../src/cta/Payment/index.ts | 6 +- .../src/cta/Payment/state.ts | 26 +- .../src/cta/Payment/test.ts | 396 +- .../src/cta/Recovery/state.ts | 4 +- .../src/cta/Refund/index.ts | 2 +- .../src/cta/Refund/state.ts | 14 +- .../src/cta/Refund/test.ts | 61 +- .../taler-wallet-webextension/src/cta/Tip/index.ts | 2 +- .../taler-wallet-webextension/src/cta/Tip/state.ts | 8 +- .../taler-wallet-webextension/src/cta/Tip/test.ts | 23 +- .../src/cta/TransferCreate/state.ts | 80 +- .../src/cta/TransferPickup/index.ts | 2 +- .../src/cta/TransferPickup/state.ts | 16 +- .../src/cta/Withdraw/index.ts | 2 +- .../src/cta/Withdraw/state.ts | 63 +- .../src/cta/Withdraw/test.ts | 137 +- .../src/hooks/useAutoOpenPermissions.ts | 4 +- .../src/hooks/useBackupDeviceName.ts | 9 +- .../src/hooks/useClipboardPermissions.ts | 4 +- .../src/hooks/useProviderStatus.ts | 9 +- .../src/hooks/useWalletDevMode.ts | 6 +- .../taler-wallet-webextension/src/i18n/strings.ts | 10979 ++++++------------- .../taler-wallet-webextension/src/stories.test.ts | 2 +- .../taler-wallet-webextension/src/test-utils.ts | 126 +- .../taler-wallet-webextension/src/utils/index.ts | 7 +- .../src/wallet/AddBackupProvider/index.ts | 95 + .../src/wallet/AddBackupProvider/state.ts | 260 + .../src/wallet/AddBackupProvider/stories.tsx | 109 + .../src/wallet/AddBackupProvider/test.ts | 79 + .../src/wallet/AddBackupProvider/views.tsx | 172 + .../src/wallet/Application.tsx | 9 +- .../src/wallet/DepositPage/index.ts | 4 +- .../src/wallet/DepositPage/state.ts | 42 +- .../src/wallet/ExchangeSelection/index.ts | 4 +- .../src/wallet/ExchangeSelection/state.ts | 19 +- .../src/wallet/ExchangeSelection/views.tsx | 7 +- .../src/wallet/ManageAccount/index.ts | 8 +- .../src/wallet/ManageAccount/state.ts | 34 +- .../src/wallet/QrReader.stories.tsx | 2 +- .../src/wallet/index.stories.tsx | 4 +- packages/taler-wallet-webextension/src/wxApi.ts | 26 +- 58 files changed, 4721 insertions(+), 8546 deletions(-) create mode 100644 packages/taler-wallet-webextension/src/components/QR.stories.tsx create mode 100644 packages/taler-wallet-webextension/src/wallet/AddBackupProvider/index.ts create mode 100644 packages/taler-wallet-webextension/src/wallet/AddBackupProvider/state.ts create mode 100644 packages/taler-wallet-webextension/src/wallet/AddBackupProvider/stories.tsx create mode 100644 packages/taler-wallet-webextension/src/wallet/AddBackupProvider/test.ts create mode 100644 packages/taler-wallet-webextension/src/wallet/AddBackupProvider/views.tsx diff --git a/packages/taler-util/src/punycode.ts b/packages/taler-util/src/punycode.ts index 353e3bf25..acb8ce911 100644 --- a/packages/taler-util/src/punycode.ts +++ b/packages/taler-util/src/punycode.ts @@ -465,4 +465,4 @@ export const punycode = { encode: encode, toASCII: toASCII, toUnicode: toUnicode, -}; \ No newline at end of file +}; diff --git a/packages/taler-util/src/wallet-types.ts b/packages/taler-util/src/wallet-types.ts index 4e1563e27..900fb7407 100644 --- a/packages/taler-util/src/wallet-types.ts +++ b/packages/taler-util/src/wallet-types.ts @@ -241,12 +241,18 @@ export interface ConfirmPayResultPending { lastError: TalerErrorDetail | undefined; } +export const codecForTalerErrorDetail = (): Codec => + buildCodecForObject() + .property("code", codecForNumber()) + .property("hint", codecOptional(codecForString())) + .build("TalerErrorDetail"); + export type ConfirmPayResult = ConfirmPayResultDone | ConfirmPayResultPending; export const codecForConfirmPayResultPending = (): Codec => buildCodecForObject() - .property("lastError", codecForAny()) + .property("lastError", codecOptional(codecForTalerErrorDetail())) .property("transactionId", codecForString()) .property("type", codecForConstString(ConfirmPayResultType.Pending)) .build("ConfirmPayResultPending"); diff --git a/packages/taler-wallet-core/src/crypto/workers/synchronousWorkerFactoryPlain.ts b/packages/taler-wallet-core/src/crypto/workers/synchronousWorkerFactoryPlain.ts index 7662b41f5..d0c8e4b3a 100644 --- a/packages/taler-wallet-core/src/crypto/workers/synchronousWorkerFactoryPlain.ts +++ b/packages/taler-wallet-core/src/crypto/workers/synchronousWorkerFactoryPlain.ts @@ -25,7 +25,9 @@ import { SynchronousCryptoWorkerPlain } from "./synchronousWorkerPlain.js"; * The synchronous crypto worker produced by this factory doesn't run in the * background, but actually blocks the caller until the operation is done. */ -export class SynchronousCryptoWorkerFactoryPlain implements CryptoWorkerFactory { +export class SynchronousCryptoWorkerFactoryPlain + implements CryptoWorkerFactory +{ startWorker(): CryptoWorker { return new SynchronousCryptoWorkerPlain(); } diff --git a/packages/taler-wallet-core/src/operations/backup/index.ts b/packages/taler-wallet-core/src/operations/backup/index.ts index 080adf1cd..aed37b865 100644 --- a/packages/taler-wallet-core/src/operations/backup/index.ts +++ b/packages/taler-wallet-core/src/operations/backup/index.ts @@ -29,15 +29,18 @@ import { AmountString, BackupRecovery, buildCodecForObject, + buildCodecForUnion, bytesToString, canonicalizeBaseUrl, canonicalJson, Codec, codecForAmountString, codecForBoolean, + codecForConstString, codecForList, codecForNumber, codecForString, + codecForTalerErrorDetail, codecOptional, ConfirmPayResultType, decodeCrock, @@ -78,6 +81,7 @@ import { WalletBackupConfState, } from "../../db.js"; import { InternalWalletState } from "../../internal-wallet-state.js"; +import { assertUnreachable } from "../../util/assertUnreachable.js"; import { readSuccessResponseJsonOrThrow, readTalerErrorResponse, @@ -232,12 +236,6 @@ function deriveBlobSecret(bc: WalletBackupConfState): Uint8Array { interface BackupForProviderArgs { backupProviderBaseUrl: string; - - /** - * Should we attempt one more upload after trying - * to pay? - */ - retryAfterPayment: boolean; } function getNextBackupTimestamp(): TalerProtocolTimestamp { @@ -253,7 +251,7 @@ function getNextBackupTimestamp(): TalerProtocolTimestamp { async function runBackupCycleForProvider( ws: InternalWalletState, args: BackupForProviderArgs, -): Promise { +): Promise> { const provider = await ws.db .mktx((x) => [x.backupProviders]) .runReadOnly(async (tx) => { @@ -339,57 +337,34 @@ async function runBackupCycleForProvider( if (!talerUri) { throw Error("no taler URI available to pay provider"); } - const res = await preparePayForUri(ws, talerUri); - let proposalId = res.proposalId; - let doPay = false; - switch (res.status) { - case PreparePayResultType.InsufficientBalance: - // FIXME: record in provider state! - logger.warn("insufficient balance to pay for backup provider"); - proposalId = res.proposalId; - break; - case PreparePayResultType.PaymentPossible: - doPay = true; - break; - case PreparePayResultType.AlreadyConfirmed: - break; - } - // FIXME: check if the provider is overcharging us! + //We can't delay downloading the proposal since we need the id + //FIXME: check download errors + + const res = await preparePayForUri(ws, talerUri); await ws.db .mktx((x) => [x.backupProviders, x.operationRetries]) .runReadWrite(async (tx) => { - const provRec = await tx.backupProviders.get(provider.baseUrl); - checkDbInvariant(!!provRec); - const ids = new Set(provRec.paymentProposalIds); - ids.add(proposalId); - provRec.paymentProposalIds = Array.from(ids).sort(); - provRec.currentPaymentProposalId = proposalId; - // FIXME: allocate error code for this! - await tx.backupProviders.put(provRec); - const opId = RetryTags.forBackup(provRec); + const prov = await tx.backupProviders.get(provider.baseUrl); + if (!prov) { + logger.warn("backup provider not found anymore"); + return; + } + const opId = RetryTags.forBackup(prov); await scheduleRetryInTx(ws, tx, opId); + prov.currentPaymentProposalId = res.proposalId; + prov.state = { + tag: BackupProviderStateTag.Retrying, + }; + await tx.backupProviders.put(prov); }); - if (doPay) { - const confirmRes = await confirmPay(ws, proposalId); - switch (confirmRes.type) { - case ConfirmPayResultType.Pending: - logger.warn("payment not yet finished yet"); - break; - } - } - - if (args.retryAfterPayment) { - return await runBackupCycleForProvider(ws, { - ...args, - retryAfterPayment: false, - }); - } return { type: OperationAttemptResultType.Pending, - result: undefined, + result: { + talerUri, + }, }; } @@ -442,10 +417,7 @@ async function runBackupCycleForProvider( }); logger.info("processed existing backup"); // Now upload our own, merged backup. - return await runBackupCycleForProvider(ws, { - ...args, - retryAfterPayment: false, - }); + return await runBackupCycleForProvider(ws, args); } // Some other response that we did not expect! @@ -477,7 +449,6 @@ export async function processBackupForProvider( return await runBackupCycleForProvider(ws, { backupProviderBaseUrl: provider.baseUrl, - retryAfterPayment: true, }); } @@ -540,12 +511,11 @@ export async function runBackupCycle( for (const provider of providers) { await runBackupCycleForProvider(ws, { backupProviderBaseUrl: provider.baseUrl, - retryAfterPayment: true, }); } } -interface SyncTermsOfServiceResponse { +export interface SyncTermsOfServiceResponse { // maximum backup size supported storage_limit_in_megabytes: number; @@ -557,7 +527,7 @@ interface SyncTermsOfServiceResponse { version: string; } -const codecForSyncTermsOfServiceResponse = +export const codecForSyncTermsOfServiceResponse = (): Codec => buildCodecForObject() .property("storage_limit_in_megabytes", codecForNumber()) @@ -584,10 +554,58 @@ export const codecForAddBackupProviderRequest = .property("activate", codecOptional(codecForBoolean())) .build("AddBackupProviderRequest"); +export type AddBackupProviderResponse = + | AddBackupProviderOk + | AddBackupProviderPaymentRequired + | AddBackupProviderError; + +interface AddBackupProviderOk { + status: "ok"; +} +interface AddBackupProviderPaymentRequired { + status: "payment-required"; + talerUri: string; +} +interface AddBackupProviderError { + status: "error"; + error: TalerErrorDetail; +} + +export const codecForAddBackupProviderOk = (): Codec => + buildCodecForObject() + .property("status", codecForConstString("ok")) + .build("AddBackupProviderOk"); + +export const codecForAddBackupProviderPaymenrRequired = + (): Codec => + buildCodecForObject() + .property("status", codecForConstString("payment-required")) + .property("talerUri", codecForString()) + .build("AddBackupProviderPaymentRequired"); + +export const codecForAddBackupProviderError = + (): Codec => + buildCodecForObject() + .property("status", codecForConstString("error")) + .property("error", codecForTalerErrorDetail()) + .build("AddBackupProviderError"); + +export const codecForAddBackupProviderResponse = + (): Codec => + buildCodecForUnion() + .discriminateOn("status") + .alternative("ok", codecForAddBackupProviderOk()) + .alternative( + "payment-required", + codecForAddBackupProviderPaymenrRequired(), + ) + .alternative("error", codecForAddBackupProviderError()) + .build("AddBackupProviderResponse"); + export async function addBackupProvider( ws: InternalWalletState, req: AddBackupProviderRequest, -): Promise { +): Promise { logger.info(`adding backup provider ${j2s(req)}`); await provideBackupState(ws); const canonUrl = canonicalizeBaseUrl(req.backupProviderBaseUrl); @@ -618,6 +636,7 @@ export async function addBackupProvider( .mktx((x) => [x.backupProviders]) .runReadWrite(async (tx) => { let state: BackupProviderState; + //FIXME: what is the difference provisional and ready? if (req.activate) { state = { tag: BackupProviderStateTag.Ready, @@ -641,6 +660,39 @@ export async function addBackupProvider( uids: [encodeCrock(getRandomBytes(32))], }); }); + + return await runFirstBackupCycleForProvider(ws, { + backupProviderBaseUrl: canonUrl, + }); +} + +async function runFirstBackupCycleForProvider( + ws: InternalWalletState, + args: BackupForProviderArgs, +): Promise { + const resp = await runBackupCycleForProvider(ws, args); + switch (resp.type) { + case OperationAttemptResultType.Error: + return { + status: "error", + error: resp.errorDetail, + }; + case OperationAttemptResultType.Finished: + return { + status: "ok", + }; + case OperationAttemptResultType.Longpoll: + throw Error( + "unexpected runFirstBackupCycleForProvider result (longpoll)", + ); + case OperationAttemptResultType.Pending: + return { + status: "payment-required", + talerUri: resp.result.talerUri, + }; + default: + assertUnreachable(resp); + } } export async function restoreFromRecoverySecret(): Promise { diff --git a/packages/taler-wallet-core/src/operations/pay-merchant.ts b/packages/taler-wallet-core/src/operations/pay-merchant.ts index bb391d468..6246951ad 100644 --- a/packages/taler-wallet-core/src/operations/pay-merchant.ts +++ b/packages/taler-wallet-core/src/operations/pay-merchant.ts @@ -1584,7 +1584,7 @@ export async function runPayForConfirmPay( const numRetry = opRetry?.retryInfo.retryCounter ?? 0; if ( res.errorDetail.code === - TalerErrorCode.WALLET_PAY_MERCHANT_SERVER_ERROR && + TalerErrorCode.WALLET_PAY_MERCHANT_SERVER_ERROR && numRetry < maxRetry ) { // Pretend the operation is pending instead of reporting diff --git a/packages/taler-wallet-core/src/wallet-api-types.ts b/packages/taler-wallet-core/src/wallet-api-types.ts index b7d0ada3d..04c1bb6b4 100644 --- a/packages/taler-wallet-core/src/wallet-api-types.ts +++ b/packages/taler-wallet-core/src/wallet-api-types.ts @@ -106,6 +106,7 @@ import { import { WalletContractData } from "./db.js"; import { AddBackupProviderRequest, + AddBackupProviderResponse, BackupInfo, RemoveBackupProviderRequest, RunBackupCycleRequest, @@ -519,7 +520,7 @@ export type ExportBackupOp = { export type AddBackupProviderOp = { op: WalletApiOperation.AddBackupProvider; request: AddBackupProviderRequest; - response: EmptyObject; + response: AddBackupProviderResponse; }; export type RemoveBackupProviderOp = { diff --git a/packages/taler-wallet-core/src/wallet.ts b/packages/taler-wallet-core/src/wallet.ts index caaf6d410..9fa0e32ba 100644 --- a/packages/taler-wallet-core/src/wallet.ts +++ b/packages/taler-wallet-core/src/wallet.ts @@ -933,9 +933,9 @@ async function dumpCoins(ws: InternalWalletState): Promise { ageCommitmentProof: c.ageCommitmentProof, spend_allocation: c.spendAllocation ? { - amount: c.spendAllocation.amount, - id: c.spendAllocation.id, - } + amount: c.spendAllocation.amount, + id: c.spendAllocation.id, + } : undefined, }); } @@ -1215,8 +1215,7 @@ async function dispatchRequestInternal( } case WalletApiOperation.AddBackupProvider: { const req = codecForAddBackupProviderRequest().decode(payload); - await addBackupProvider(ws, req); - return {}; + return await addBackupProvider(ws, req); } case WalletApiOperation.RunBackupCycle: { const req = codecForRunBackupCycle().decode(payload); diff --git a/packages/taler-wallet-webextension/src/NavigationBar.tsx b/packages/taler-wallet-webextension/src/NavigationBar.tsx index b0a7a1016..ff2404800 100644 --- a/packages/taler-wallet-webextension/src/NavigationBar.tsx +++ b/packages/taler-wallet-webextension/src/NavigationBar.tsx @@ -25,7 +25,6 @@ * Imports. */ import { h, VNode } from "preact"; -import { JustInDevMode } from "./components/JustInDevMode.js"; import { NavigationHeader, NavigationHeaderHolder, @@ -138,14 +137,9 @@ export function PopupNavBar({ path = "" }: { path?: string }): VNode { > Balance - - - Backup - - + + Backup +
Balance - - - Backup - + + Backup + - - Dev - - + + Dev +
+ */ + +/** + * + * @author Sebastian Javier Marchano (sebasjm) + */ + +import { createExample } from "../test-utils.js"; +import { QR } from "./QR.js"; + +export default { + title: "wallet/qr", +}; + +export const Restore = createExample(QR, { + text: "taler://restore/6J0RZTJC6AV21WXK87BTE67WTHE9P2QSHF2BZXTP7PDZY2ARYBPG@sync1.demo.taler.net,sync2.demo.taler.net,sync1.demo.taler.net,sync3.demo.taler.net", +}); diff --git a/packages/taler-wallet-webextension/src/components/QR.tsx b/packages/taler-wallet-webextension/src/components/QR.tsx index b2257d24d..60710ab15 100644 --- a/packages/taler-wallet-webextension/src/components/QR.tsx +++ b/packages/taler-wallet-webextension/src/components/QR.tsx @@ -22,7 +22,7 @@ export function QR({ text }: { text: string }): VNode { const divRef = useRef(null); useEffect(() => { if (!divRef.current) return; - const qr = qrcode(0, "L"); + const qr = qrcode(0, "H"); qr.addData(text); qr.make(); divRef.current.innerHTML = qr.createSvgTag({ diff --git a/packages/taler-wallet-webextension/src/components/TermsOfService/index.ts b/packages/taler-wallet-webextension/src/components/TermsOfService/index.ts index 79778a595..4d2c4346e 100644 --- a/packages/taler-wallet-webextension/src/components/TermsOfService/index.ts +++ b/packages/taler-wallet-webextension/src/components/TermsOfService/index.ts @@ -26,7 +26,7 @@ import { LoadingUriView, ShowButtonsAcceptedTosView, ShowButtonsNonAcceptedTosView, - ShowTosContentView + ShowTosContentView, } from "./views.js"; export interface Props { diff --git a/packages/taler-wallet-webextension/src/components/TermsOfService/state.ts b/packages/taler-wallet-webextension/src/components/TermsOfService/state.ts index 3cad967ae..c5be71ef0 100644 --- a/packages/taler-wallet-webextension/src/components/TermsOfService/state.ts +++ b/packages/taler-wallet-webextension/src/components/TermsOfService/state.ts @@ -35,10 +35,13 @@ export function useComponentState( * For the exchange selected, bring the status of the terms of service */ const terms = useAsyncAsHook(async () => { - const exchangeTos = await api.wallet.call(WalletApiOperation.GetExchangeTos, { - exchangeBaseUrl: exchangeUrl, - acceptedFormat: ["text/xml"] - }) + const exchangeTos = await api.wallet.call( + WalletApiOperation.GetExchangeTos, + { + exchangeBaseUrl: exchangeUrl, + acceptedFormat: ["text/xml"], + }, + ); const state = buildTermsOfServiceState(exchangeTos); @@ -78,14 +81,14 @@ export function useComponentState( if (accepted) { api.wallet.call(WalletApiOperation.SetExchangeTosAccepted, { exchangeBaseUrl: exchangeUrl, - etag: state.version - }) + etag: state.version, + }); } else { // mark as not accepted api.wallet.call(WalletApiOperation.SetExchangeTosAccepted, { exchangeBaseUrl: exchangeUrl, - etag: undefined - }) + etag: undefined, + }); } // setAccepted(accepted); if (!readOnly) onChange(accepted); //external update diff --git a/packages/taler-wallet-webextension/src/components/index.stories.tsx b/packages/taler-wallet-webextension/src/components/index.stories.tsx index 0e1bc22b2..d71adf689 100644 --- a/packages/taler-wallet-webextension/src/components/index.stories.tsx +++ b/packages/taler-wallet-webextension/src/components/index.stories.tsx @@ -24,5 +24,6 @@ import * as a2 from "./PendingTransactions.stories.js"; import * as a3 from "./Amount.stories.js"; import * as a4 from "./ShowFullContractTermPopup.stories.js"; import * as a5 from "./TermsOfService/stories.js"; +import * as a6 from "./QR.stories"; -export default [a1, a2, a3, a4, a5]; +export default [a1, a2, a3, a4, a5, a6]; diff --git a/packages/taler-wallet-webextension/src/context/devContext.ts b/packages/taler-wallet-webextension/src/context/devContext.ts index c494b9403..99301df52 100644 --- a/packages/taler-wallet-webextension/src/context/devContext.ts +++ b/packages/taler-wallet-webextension/src/context/devContext.ts @@ -48,8 +48,9 @@ export const DevContextProviderForTesting = ({ value: { devMode: !!value, devModeToggle: { - value, button: {} - } + value, + button: {}, + }, }, children, }); @@ -57,7 +58,7 @@ export const DevContextProviderForTesting = ({ export const DevContextProvider = ({ children }: { children: any }): VNode => { const devModeToggle = useWalletDevMode(); - const value: Type = { devMode: !!devModeToggle.value, devModeToggle } + const value: Type = { devMode: !!devModeToggle.value, devModeToggle }; //support for function as children, useful for getting the value right away children = children.length === 1 && typeof children === "function" diff --git a/packages/taler-wallet-webextension/src/cta/InvoiceCreate/state.ts b/packages/taler-wallet-webextension/src/cta/InvoiceCreate/state.ts index 27f05ce03..4ce81dad8 100644 --- a/packages/taler-wallet-webextension/src/cta/InvoiceCreate/state.ts +++ b/packages/taler-wallet-webextension/src/cta/InvoiceCreate/state.ts @@ -15,7 +15,11 @@ */ /* eslint-disable react-hooks/rules-of-hooks */ -import { Amounts, TalerErrorDetail, TalerProtocolTimestamp } from "@gnu-taler/taler-util"; +import { + Amounts, + TalerErrorDetail, + TalerProtocolTimestamp, +} from "@gnu-taler/taler-util"; import { TalerError, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { isFuture, parse } from "date-fns"; import { useState } from "preact/hooks"; @@ -32,7 +36,9 @@ export function useComponentState( ): RecursiveState { const amount = Amounts.parseOrThrow(amountStr); - const hook = useAsyncAsHook(() => api.wallet.call(WalletApiOperation.ListExchanges, {})); + const hook = useAsyncAsHook(() => + api.wallet.call(WalletApiOperation.ListExchanges, {}), + ); if (!hook) { return { @@ -51,7 +57,7 @@ export function useComponentState( return () => { const [subject, setSubject] = useState(); - const [timestamp, setTimestamp] = useState() + const [timestamp, setTimestamp] = useState(); const [operationError, setOperationError] = useState< TalerErrorDetail | undefined @@ -70,45 +76,51 @@ export function useComponentState( const exchange = selectedExchange.selected; const hook = useAsyncAsHook(async () => { - const resp = await api.wallet.call(WalletApiOperation.PreparePeerPullPayment, { - amount: amountStr, - exchangeBaseUrl: exchange.exchangeBaseUrl, - }) - return resp - }) + const resp = await api.wallet.call( + WalletApiOperation.PreparePeerPullPayment, + { + amount: amountStr, + exchangeBaseUrl: exchange.exchangeBaseUrl, + }, + ); + return resp; + }); if (!hook) { return { status: "loading", - error: undefined - } + error: undefined, + }; } if (hook.hasError) { return { status: "loading-uri", - error: hook - } + error: hook, + }; } - const { amountEffective, amountRaw } = hook.response - const requestAmount = Amounts.parseOrThrow(amountRaw) - const toBeReceived = Amounts.parseOrThrow(amountEffective) + const { amountEffective, amountRaw } = hook.response; + const requestAmount = Amounts.parseOrThrow(amountRaw); + const toBeReceived = Amounts.parseOrThrow(amountEffective); - let purse_expiration: TalerProtocolTimestamp | undefined = undefined + let purse_expiration: TalerProtocolTimestamp | undefined = undefined; let timestampError: string | undefined = undefined; - const t = timestamp === undefined ? undefined : parse(timestamp, "dd/MM/yyyy", new Date()) + const t = + timestamp === undefined + ? undefined + : parse(timestamp, "dd/MM/yyyy", new Date()); if (t !== undefined) { if (Number.isNaN(t.getTime())) { - timestampError = 'Should have the format "dd/MM/yyyy"' + timestampError = 'Should have the format "dd/MM/yyyy"'; } else { if (!isFuture(t)) { - timestampError = 'Should be in the future' + timestampError = "Should be in the future"; } else { purse_expiration = { - t_s: t.getTime() / 1000 - } + t_s: t.getTime() / 1000, + }; } } } @@ -116,14 +128,17 @@ export function useComponentState( async function accept(): Promise { if (!subject || !purse_expiration) return; try { - const resp = await api.wallet.call(WalletApiOperation.InitiatePeerPullPayment, { - exchangeBaseUrl: exchange.exchangeBaseUrl, - partialContractTerms: { - amount: Amounts.stringify(amount), - summary: subject, - purse_expiration + const resp = await api.wallet.call( + WalletApiOperation.InitiatePeerPullPayment, + { + exchangeBaseUrl: exchange.exchangeBaseUrl, + partialContractTerms: { + amount: Amounts.stringify(amount), + summary: subject, + purse_expiration, + }, }, - }); + ); onSuccess(resp.transactionId); } catch (e) { @@ -134,12 +149,18 @@ export function useComponentState( throw Error("error trying to accept"); } } - const unableToCreate = !subject || Amounts.isZero(amount) || !purse_expiration + const unableToCreate = + !subject || Amounts.isZero(amount) || !purse_expiration; return { status: "ready", subject: { - error: subject === undefined ? undefined : !subject ? "Can't be empty" : undefined, + error: + subject === undefined + ? undefined + : !subject + ? "Can't be empty" + : undefined, value: subject ?? "", onInput: async (e) => setSubject(e), }, @@ -147,8 +168,8 @@ export function useComponentState( error: timestampError, value: timestamp === undefined ? "" : timestamp, onInput: async (e) => { - setTimestamp(e) - } + setTimestamp(e); + }, }, doSelectExchange: selectedExchange.doSelect, exchangeUrl: exchange.exchangeBaseUrl, diff --git a/packages/taler-wallet-webextension/src/cta/InvoicePay/index.ts b/packages/taler-wallet-webextension/src/cta/InvoicePay/index.ts index 693803587..6e16b528c 100644 --- a/packages/taler-wallet-webextension/src/cta/InvoicePay/index.ts +++ b/packages/taler-wallet-webextension/src/cta/InvoicePay/index.ts @@ -18,7 +18,7 @@ import { AbsoluteTime, AmountJson, PreparePayResult, - TalerErrorDetail + TalerErrorDetail, } from "@gnu-taler/taler-util"; import { Loading } from "../../components/Loading.js"; import { HookError } from "../../hooks/useAsyncAsHook.js"; diff --git a/packages/taler-wallet-webextension/src/cta/InvoicePay/state.ts b/packages/taler-wallet-webextension/src/cta/InvoicePay/state.ts index 457827127..1846794fc 100644 --- a/packages/taler-wallet-webextension/src/cta/InvoicePay/state.ts +++ b/packages/taler-wallet-webextension/src/cta/InvoicePay/state.ts @@ -21,7 +21,7 @@ import { PreparePayResult, PreparePayResultType, TalerErrorDetail, - TalerProtocolTimestamp + TalerProtocolTimestamp, } from "@gnu-taler/taler-util"; import { TalerError, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { useEffect, useState } from "preact/hooks"; @@ -41,10 +41,12 @@ export function useComponentState( return { p2p, balance }; }); - useEffect(() => api.listener.onUpdateNotification( - [NotificationType.CoinWithdrawn], - hook?.retry - )); + useEffect(() => + api.listener.onUpdateNotification( + [NotificationType.CoinWithdrawn], + hook?.retry, + ), + ); const [operationError, setOperationError] = useState< TalerErrorDetail | undefined @@ -63,10 +65,7 @@ export function useComponentState( }; } - const { - contractTerms, - peerPullPaymentIncomingId, - } = hook.response.p2p; + const { contractTerms, peerPullPaymentIncomingId } = hook.response.p2p; const amountStr: string = contractTerms?.amount; const amount = Amounts.parseOrThrow(amountStr); @@ -134,9 +133,12 @@ export function useComponentState( async function accept(): Promise { try { - const resp = await api.wallet.call(WalletApiOperation.AcceptPeerPullPayment, { - peerPullPaymentIncomingId, - }); + const resp = await api.wallet.call( + WalletApiOperation.AcceptPeerPullPayment, + { + peerPullPaymentIncomingId, + }, + ); onSuccess(resp.transactionId); } catch (e) { if (e instanceof TalerError) { diff --git a/packages/taler-wallet-webextension/src/cta/Payment/index.ts b/packages/taler-wallet-webextension/src/cta/Payment/index.ts index b4e59e666..f0270b96c 100644 --- a/packages/taler-wallet-webextension/src/cta/Payment/index.ts +++ b/packages/taler-wallet-webextension/src/cta/Payment/index.ts @@ -15,8 +15,10 @@ */ import { - AmountJson, PreparePayResult, - PreparePayResultAlreadyConfirmed, PreparePayResultPaymentPossible + AmountJson, + PreparePayResult, + PreparePayResultAlreadyConfirmed, + PreparePayResultPaymentPossible, } from "@gnu-taler/taler-util"; import { Loading } from "../../components/Loading.js"; import { HookError } from "../../hooks/useAsyncAsHook.js"; diff --git a/packages/taler-wallet-webextension/src/cta/Payment/state.ts b/packages/taler-wallet-webextension/src/cta/Payment/state.ts index 414bc2000..49d022320 100644 --- a/packages/taler-wallet-webextension/src/cta/Payment/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Payment/state.ts @@ -15,10 +15,11 @@ */ import { - Amounts, ConfirmPayResultType, + Amounts, + ConfirmPayResultType, NotificationType, PreparePayResultType, - TalerErrorCode + TalerErrorCode, } from "@gnu-taler/taler-util"; import { TalerError, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { useEffect, useState } from "preact/hooks"; @@ -35,17 +36,24 @@ export function useComponentState( const hook = useAsyncAsHook(async () => { if (!talerPayUri) throw Error("ERROR_NO-URI-FOR-PAYMENT"); - const payStatus = await api.wallet.call(WalletApiOperation.PreparePayForUri, { - talerPayUri: talerPayUri - }); + const payStatus = await api.wallet.call( + WalletApiOperation.PreparePayForUri, + { + talerPayUri: talerPayUri, + }, + ); const balance = await api.wallet.call(WalletApiOperation.GetBalances, {}); return { payStatus, balance, uri: talerPayUri }; }, []); - useEffect(() => api.listener.onUpdateNotification( - [NotificationType.CoinWithdrawn], - hook?.retry - ), [hook]); + useEffect( + () => + api.listener.onUpdateNotification( + [NotificationType.CoinWithdrawn], + hook?.retry, + ), + [hook], + ); const hookResponse = !hook || hook.hasError ? undefined : hook.response; diff --git a/packages/taler-wallet-webextension/src/cta/Payment/test.ts b/packages/taler-wallet-webextension/src/cta/Payment/test.ts index 8aa099fdc..b02ac6274 100644 --- a/packages/taler-wallet-webextension/src/cta/Payment/test.ts +++ b/packages/taler-wallet-webextension/src/cta/Payment/test.ts @@ -20,11 +20,13 @@ */ import { - Amounts, ConfirmPayResult, + Amounts, + ConfirmPayResult, ConfirmPayResultType, - NotificationType, PreparePayResultInsufficientBalance, + NotificationType, + PreparePayResultInsufficientBalance, PreparePayResultPaymentPossible, - PreparePayResultType + PreparePayResultType, } from "@gnu-taler/taler-util"; import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { expect } from "chai"; @@ -42,11 +44,9 @@ describe("Payment CTA states", () => { onSuccess: async () => { null; }, - } + }; const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = - mountHook(() => - useComponentState(props, mock), - ); + mountHook(() => useComponentState(props, mock)); { const { status, error } = pullLastResultOrThrow(); @@ -66,7 +66,7 @@ describe("Payment CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should response with no balance", async () => { @@ -78,18 +78,24 @@ describe("Payment CTA states", () => { onSuccess: async () => { null; }, - } + }; - handler.addWalletCallResponse(WalletApiOperation.PreparePayForUri, undefined, { - status: PreparePayResultType.InsufficientBalance, - amountRaw: "USD:10", - } as PreparePayResultInsufficientBalance) - handler.addWalletCallResponse(WalletApiOperation.GetBalances, {}, { balances: [] }) + handler.addWalletCallResponse( + WalletApiOperation.PreparePayForUri, + undefined, + { + status: PreparePayResultType.InsufficientBalance, + amountRaw: "USD:10", + } as PreparePayResultInsufficientBalance, + ); + handler.addWalletCallResponse( + WalletApiOperation.GetBalances, + {}, + { balances: [] }, + ); const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = - mountHook(() => - useComponentState(props, mock), - ); + mountHook(() => useComponentState(props, mock)); { const { status, error } = pullLastResultOrThrow(); @@ -102,7 +108,7 @@ describe("Payment CTA states", () => { { const r = pullLastResultOrThrow(); if (r.status !== "no-balance-for-currency") { - expect(r).eq({}) + expect(r).eq({}); return; } expect(r.balance).undefined; @@ -110,7 +116,7 @@ describe("Payment CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should not be able to pay if there is no enough balance", async () => { @@ -122,25 +128,33 @@ describe("Payment CTA states", () => { onSuccess: async () => { null; }, - } - handler.addWalletCallResponse(WalletApiOperation.PreparePayForUri, undefined, { - status: PreparePayResultType.InsufficientBalance, - amountRaw: "USD:10", - } as PreparePayResultInsufficientBalance) - handler.addWalletCallResponse(WalletApiOperation.GetBalances, {}, { - balances: [{ - available: "USD:5", - hasPendingTransactions: false, - pendingIncoming: "USD:0", - pendingOutgoing: "USD:0", - requiresUserInput: false, - }] - }) + }; + handler.addWalletCallResponse( + WalletApiOperation.PreparePayForUri, + undefined, + { + status: PreparePayResultType.InsufficientBalance, + amountRaw: "USD:10", + } as PreparePayResultInsufficientBalance, + ); + handler.addWalletCallResponse( + WalletApiOperation.GetBalances, + {}, + { + balances: [ + { + available: "USD:5", + hasPendingTransactions: false, + pendingIncoming: "USD:0", + pendingOutgoing: "USD:0", + requiresUserInput: false, + }, + ], + }, + ); const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = - mountHook(() => - useComponentState(props, mock), - ); + mountHook(() => useComponentState(props, mock)); { const { status, error } = pullLastResultOrThrow(); @@ -158,7 +172,7 @@ describe("Payment CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should be able to pay (without fee)", async () => { @@ -170,25 +184,33 @@ describe("Payment CTA states", () => { onSuccess: async () => { null; }, - } - handler.addWalletCallResponse(WalletApiOperation.PreparePayForUri, undefined, { - status: PreparePayResultType.PaymentPossible, - amountRaw: "USD:10", - amountEffective: "USD:10", - } as PreparePayResultPaymentPossible) - handler.addWalletCallResponse(WalletApiOperation.GetBalances, {}, { - balances: [{ - available: "USD:15", - hasPendingTransactions: false, - pendingIncoming: "USD:0", - pendingOutgoing: "USD:0", - requiresUserInput: false, - }] - }) + }; + handler.addWalletCallResponse( + WalletApiOperation.PreparePayForUri, + undefined, + { + status: PreparePayResultType.PaymentPossible, + amountRaw: "USD:10", + amountEffective: "USD:10", + } as PreparePayResultPaymentPossible, + ); + handler.addWalletCallResponse( + WalletApiOperation.GetBalances, + {}, + { + balances: [ + { + available: "USD:15", + hasPendingTransactions: false, + pendingIncoming: "USD:0", + pendingOutgoing: "USD:0", + requiresUserInput: false, + }, + ], + }, + ); const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = - mountHook(() => - useComponentState(props, mock), - ); + mountHook(() => useComponentState(props, mock)); { const { status, error } = pullLastResultOrThrow(); @@ -201,8 +223,8 @@ describe("Payment CTA states", () => { { const r = pullLastResultOrThrow(); if (r.status !== "ready") { - expect(r).eq({}) - return + expect(r).eq({}); + return; } expect(r.balance).deep.equal(Amounts.parseOrThrow("USD:15")); expect(r.amount).deep.equal(Amounts.parseOrThrow("USD:10")); @@ -210,7 +232,7 @@ describe("Payment CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should be able to pay (with fee)", async () => { @@ -222,29 +244,33 @@ describe("Payment CTA states", () => { onSuccess: async () => { null; }, - } - handler.addWalletCallResponse(WalletApiOperation.PreparePayForUri, undefined, { - status: PreparePayResultType.PaymentPossible, - amountRaw: "USD:9", - amountEffective: "USD:10", - } as PreparePayResultPaymentPossible) - handler.addWalletCallResponse(WalletApiOperation.GetBalances, {}, { - balances: [{ - available: "USD:15", - hasPendingTransactions: false, - pendingIncoming: "USD:0", - pendingOutgoing: "USD:0", - requiresUserInput: false, - }] - }) + }; + handler.addWalletCallResponse( + WalletApiOperation.PreparePayForUri, + undefined, + { + status: PreparePayResultType.PaymentPossible, + amountRaw: "USD:9", + amountEffective: "USD:10", + } as PreparePayResultPaymentPossible, + ); + handler.addWalletCallResponse( + WalletApiOperation.GetBalances, + {}, + { + balances: [ + { + available: "USD:15", + hasPendingTransactions: false, + pendingIncoming: "USD:0", + pendingOutgoing: "USD:0", + requiresUserInput: false, + }, + ], + }, + ); const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = - mountHook(() => - useComponentState( - props, - mock - - ), - ); + mountHook(() => useComponentState(props, mock)); { const { status, error } = pullLastResultOrThrow(); @@ -263,7 +289,7 @@ describe("Payment CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should get confirmation done after pay successfully", async () => { @@ -275,33 +301,39 @@ describe("Payment CTA states", () => { onSuccess: async () => { null; }, - } - handler.addWalletCallResponse(WalletApiOperation.PreparePayForUri, undefined, { - status: PreparePayResultType.PaymentPossible, - amountRaw: "USD:9", - amountEffective: "USD:10", - } as PreparePayResultPaymentPossible) - - handler.addWalletCallResponse(WalletApiOperation.GetBalances, {}, { - balances: [{ - available: "USD:15", - hasPendingTransactions: false, - pendingIncoming: "USD:0", - pendingOutgoing: "USD:0", - requiresUserInput: false, - }] - }) + }; + handler.addWalletCallResponse( + WalletApiOperation.PreparePayForUri, + undefined, + { + status: PreparePayResultType.PaymentPossible, + amountRaw: "USD:9", + amountEffective: "USD:10", + } as PreparePayResultPaymentPossible, + ); + + handler.addWalletCallResponse( + WalletApiOperation.GetBalances, + {}, + { + balances: [ + { + available: "USD:15", + hasPendingTransactions: false, + pendingIncoming: "USD:0", + pendingOutgoing: "USD:0", + requiresUserInput: false, + }, + ], + }, + ); handler.addWalletCallResponse(WalletApiOperation.ConfirmPay, undefined, { type: ConfirmPayResultType.Done, contractTerms: {}, - } as ConfirmPayResult) + } as ConfirmPayResult); const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = - mountHook(() => - useComponentState( - props, mock - ), - ); + mountHook(() => useComponentState(props, mock)); { const { status, error } = pullLastResultOrThrow(); @@ -314,7 +346,7 @@ describe("Payment CTA states", () => { { const r = pullLastResultOrThrow(); if (r.status !== "ready") { - expect(r).eq({}) + expect(r).eq({}); return; } expect(r.balance).deep.equal(Amounts.parseOrThrow("USD:15")); @@ -324,7 +356,7 @@ describe("Payment CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should not stay in ready state after pay with error", async () => { @@ -335,32 +367,38 @@ describe("Payment CTA states", () => { goToWalletManualWithdraw: nullFunction, onSuccess: nullFunction, }; - handler.addWalletCallResponse(WalletApiOperation.PreparePayForUri, undefined, { - status: PreparePayResultType.PaymentPossible, - amountRaw: "USD:9", - amountEffective: "USD:10", - } as PreparePayResultPaymentPossible) - - handler.addWalletCallResponse(WalletApiOperation.GetBalances, {}, { - balances: [{ - available: "USD:15", - hasPendingTransactions: false, - pendingIncoming: "USD:0", - pendingOutgoing: "USD:0", - requiresUserInput: false, - }] - }) + handler.addWalletCallResponse( + WalletApiOperation.PreparePayForUri, + undefined, + { + status: PreparePayResultType.PaymentPossible, + amountRaw: "USD:9", + amountEffective: "USD:10", + } as PreparePayResultPaymentPossible, + ); + + handler.addWalletCallResponse( + WalletApiOperation.GetBalances, + {}, + { + balances: [ + { + available: "USD:15", + hasPendingTransactions: false, + pendingIncoming: "USD:0", + pendingOutgoing: "USD:0", + requiresUserInput: false, + }, + ], + }, + ); handler.addWalletCallResponse(WalletApiOperation.ConfirmPay, undefined, { type: ConfirmPayResultType.Pending, lastError: { code: 1 }, - } as ConfirmPayResult) + } as ConfirmPayResult); const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = - mountHook(() => - useComponentState( - props, mock - ), - ); + mountHook(() => useComponentState(props, mock)); { const { status, error } = pullLastResultOrThrow(); @@ -368,7 +406,7 @@ describe("Payment CTA states", () => { expect(error).undefined; } - expect(await waitForStateUpdate()).true + expect(await waitForStateUpdate()).true; { const r = pullLastResultOrThrow(); @@ -380,7 +418,7 @@ describe("Payment CTA states", () => { r.payHandler.onClick(); } - expect(await waitForStateUpdate()).true + expect(await waitForStateUpdate()).true; { const r = pullLastResultOrThrow(); @@ -402,7 +440,7 @@ describe("Payment CTA states", () => { await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should update balance if a coins is withdraw", async () => { @@ -415,46 +453,62 @@ describe("Payment CTA states", () => { onSuccess: async () => { null; }, - } + }; - handler.addWalletCallResponse(WalletApiOperation.PreparePayForUri, undefined, { - status: PreparePayResultType.PaymentPossible, - amountRaw: "USD:9", - amountEffective: "USD:10", - } as PreparePayResultPaymentPossible) - - handler.addWalletCallResponse(WalletApiOperation.GetBalances, {}, { - balances: [{ - available: "USD:10", - hasPendingTransactions: false, - pendingIncoming: "USD:0", - pendingOutgoing: "USD:0", - requiresUserInput: false, - }] - }) - - handler.addWalletCallResponse(WalletApiOperation.PreparePayForUri, undefined, { - status: PreparePayResultType.PaymentPossible, - amountRaw: "USD:9", - amountEffective: "USD:10", - } as PreparePayResultPaymentPossible) - - handler.addWalletCallResponse(WalletApiOperation.GetBalances, {}, { - balances: [{ - available: "USD:15", - hasPendingTransactions: false, - pendingIncoming: "USD:0", - pendingOutgoing: "USD:0", - requiresUserInput: false, - }] - }) + handler.addWalletCallResponse( + WalletApiOperation.PreparePayForUri, + undefined, + { + status: PreparePayResultType.PaymentPossible, + amountRaw: "USD:9", + amountEffective: "USD:10", + } as PreparePayResultPaymentPossible, + ); + + handler.addWalletCallResponse( + WalletApiOperation.GetBalances, + {}, + { + balances: [ + { + available: "USD:10", + hasPendingTransactions: false, + pendingIncoming: "USD:0", + pendingOutgoing: "USD:0", + requiresUserInput: false, + }, + ], + }, + ); + + handler.addWalletCallResponse( + WalletApiOperation.PreparePayForUri, + undefined, + { + status: PreparePayResultType.PaymentPossible, + amountRaw: "USD:9", + amountEffective: "USD:10", + } as PreparePayResultPaymentPossible, + ); + + handler.addWalletCallResponse( + WalletApiOperation.GetBalances, + {}, + { + balances: [ + { + available: "USD:15", + hasPendingTransactions: false, + pendingIncoming: "USD:0", + pendingOutgoing: "USD:0", + requiresUserInput: false, + }, + ], + }, + ); const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = - mountHook(() => - useComponentState( - props, mock - ), - ); + mountHook(() => useComponentState(props, mock)); { const { status, error } = pullLastResultOrThrow(); @@ -467,8 +521,8 @@ describe("Payment CTA states", () => { { const r = pullLastResultOrThrow(); if (r.status !== "ready") { - expect(r).eq({}) - return + expect(r).eq({}); + return; } expect(r.balance).deep.equal(Amounts.parseOrThrow("USD:10")); expect(r.amount).deep.equal(Amounts.parseOrThrow("USD:9")); @@ -483,8 +537,8 @@ describe("Payment CTA states", () => { { const r = pullLastResultOrThrow(); if (r.status !== "ready") { - expect(r).eq({}) - return + expect(r).eq({}); + return; } expect(r.balance).deep.equal(Amounts.parseOrThrow("USD:15")); expect(r.amount).deep.equal(Amounts.parseOrThrow("USD:9")); @@ -493,6 +547,6 @@ describe("Payment CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); }); diff --git a/packages/taler-wallet-webextension/src/cta/Recovery/state.ts b/packages/taler-wallet-webextension/src/cta/Recovery/state.ts index 750fd22f7..3a5d94e2e 100644 --- a/packages/taler-wallet-webextension/src/cta/Recovery/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Recovery/state.ts @@ -48,7 +48,9 @@ export function useComponentState( const recovery = info; async function recoverBackup(): Promise { - await wxApi.wallet.call(WalletApiOperation.ImportBackupRecovery, { recovery }); + await wxApi.wallet.call(WalletApiOperation.ImportBackupRecovery, { + recovery, + }); onSuccess(); } diff --git a/packages/taler-wallet-webextension/src/cta/Refund/index.ts b/packages/taler-wallet-webextension/src/cta/Refund/index.ts index 6bd976aab..099f72919 100644 --- a/packages/taler-wallet-webextension/src/cta/Refund/index.ts +++ b/packages/taler-wallet-webextension/src/cta/Refund/index.ts @@ -25,7 +25,7 @@ import { IgnoredView, InProgressView, LoadingUriView, - ReadyView + ReadyView, } from "./views.js"; export interface Props { diff --git a/packages/taler-wallet-webextension/src/cta/Refund/state.ts b/packages/taler-wallet-webextension/src/cta/Refund/state.ts index 65a895fc3..94c5567d6 100644 --- a/packages/taler-wallet-webextension/src/cta/Refund/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Refund/state.ts @@ -29,13 +29,17 @@ export function useComponentState( const info = useAsyncAsHook(async () => { if (!talerRefundUri) throw Error("ERROR_NO-URI-FOR-REFUND"); - const refund = await api.wallet.call(WalletApiOperation.PrepareRefund, { talerRefundUri }); + const refund = await api.wallet.call(WalletApiOperation.PrepareRefund, { + talerRefundUri, + }); return { refund, uri: talerRefundUri }; }); - useEffect(() => api.listener.onUpdateNotification( - [NotificationType.RefreshMelted], - info?.retry) + useEffect(() => + api.listener.onUpdateNotification( + [NotificationType.RefreshMelted], + info?.retry, + ), ); if (!info) { @@ -52,7 +56,7 @@ export function useComponentState( const doAccept = async (): Promise => { const res = await api.wallet.call(WalletApiOperation.ApplyRefund, { - talerRefundUri: uri + talerRefundUri: uri, }); onSuccess(res.transactionId); diff --git a/packages/taler-wallet-webextension/src/cta/Refund/test.ts b/packages/taler-wallet-webextension/src/cta/Refund/test.ts index 41996c133..927c45981 100644 --- a/packages/taler-wallet-webextension/src/cta/Refund/test.ts +++ b/packages/taler-wallet-webextension/src/cta/Refund/test.ts @@ -21,7 +21,10 @@ import { AmountJson, - Amounts, NotificationType, OrderShortInfo, PrepareRefundResult + Amounts, + NotificationType, + OrderShortInfo, + PrepareRefundResult, } from "@gnu-taler/taler-util"; import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { expect } from "chai"; @@ -45,7 +48,7 @@ describe("Refund CTA states", () => { null; }, }, - mock + mock, // { // prepareRefund: async () => ({}), // applyRefund: async () => ({}), @@ -73,7 +76,7 @@ describe("Refund CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should be ready after loading", async () => { @@ -86,7 +89,7 @@ describe("Refund CTA states", () => { onSuccess: async () => { null; }, - } + }; handler.addWalletCallResponse(WalletApiOperation.PrepareRefund, undefined, { awaiting: "EUR:2", @@ -103,12 +106,13 @@ describe("Refund CTA states", () => { orderId: "orderId1", summary: "the summary", } as OrderShortInfo, - }) + }); const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = mountHook(() => useComponentState( - props, mock + props, + mock, // { // prepareRefund: async () => // ({ @@ -154,7 +158,7 @@ describe("Refund CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should be ignored after clicking the ignore button", async () => { @@ -167,7 +171,7 @@ describe("Refund CTA states", () => { onSuccess: async () => { null; }, - } + }; handler.addWalletCallResponse(WalletApiOperation.PrepareRefund, undefined, { awaiting: "EUR:2", @@ -184,7 +188,7 @@ describe("Refund CTA states", () => { orderId: "orderId1", summary: "the summary", } as OrderShortInfo, - }) + }); // handler.addWalletCall(WalletApiOperation.ApplyRefund) // handler.addWalletCall(WalletApiOperation.PrepareRefund, undefined, { // awaiting: "EUR:1", @@ -205,7 +209,8 @@ describe("Refund CTA states", () => { const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = mountHook(() => useComponentState( - props, mock + props, + mock, // { // prepareRefund: async () => // ({ @@ -242,11 +247,11 @@ describe("Refund CTA states", () => { const state = pullLastResultOrThrow(); if (state.status !== "ready") { - expect(state).eq({}) + expect(state).eq({}); return; } if (state.error) { - expect(state).eq({}) + expect(state).eq({}); return; } expect(state.accept.onClick).not.undefined; @@ -264,18 +269,18 @@ describe("Refund CTA states", () => { const state = pullLastResultOrThrow(); if (state.status !== "ignored") { - expect(state).eq({}) + expect(state).eq({}); return; } if (state.error) { - expect(state).eq({}) + expect(state).eq({}); return; } expect(state.merchantName).eq("the merchant name"); } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should be in progress when doing refresh", async () => { @@ -288,7 +293,7 @@ describe("Refund CTA states", () => { onSuccess: async () => { null; }, - } + }; handler.addWalletCallResponse(WalletApiOperation.PrepareRefund, undefined, { awaiting: "EUR:2", @@ -305,7 +310,7 @@ describe("Refund CTA states", () => { orderId: "orderId1", summary: "the summary", } as OrderShortInfo, - }) + }); handler.addWalletCallResponse(WalletApiOperation.PrepareRefund, undefined, { awaiting: "EUR:1", effectivePaid: "EUR:2", @@ -321,7 +326,7 @@ describe("Refund CTA states", () => { orderId: "orderId1", summary: "the summary", } as OrderShortInfo, - }) + }); handler.addWalletCallResponse(WalletApiOperation.PrepareRefund, undefined, { awaiting: "EUR:0", effectivePaid: "EUR:2", @@ -337,14 +342,10 @@ describe("Refund CTA states", () => { orderId: "orderId1", summary: "the summary", } as OrderShortInfo, - }) + }); const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = - mountHook(() => - useComponentState( - props, mock - ), - ); + mountHook(() => useComponentState(props, mock)); { const { status, error } = pullLastResultOrThrow(); @@ -358,7 +359,7 @@ describe("Refund CTA states", () => { const state = pullLastResultOrThrow(); if (state.status !== "in-progress") { - expect(state).eq({}) + expect(state).eq({}); return; } if (state.error) expect.fail(); @@ -367,7 +368,7 @@ describe("Refund CTA states", () => { expect(state.amount).deep.eq(Amounts.parseOrThrow("EUR:2")); // expect(state.progress).closeTo(1 / 3, 0.01) - handler.notifyEventFromWallet(NotificationType.RefreshMelted) + handler.notifyEventFromWallet(NotificationType.RefreshMelted); } expect(await waitForStateUpdate()).true; @@ -376,7 +377,7 @@ describe("Refund CTA states", () => { const state = pullLastResultOrThrow(); if (state.status !== "in-progress") { - expect(state).eq({}) + expect(state).eq({}); return; } if (state.error) expect.fail(); @@ -385,7 +386,7 @@ describe("Refund CTA states", () => { expect(state.amount).deep.eq(Amounts.parseOrThrow("EUR:2")); // expect(state.progress).closeTo(2 / 3, 0.01) - handler.notifyEventFromWallet(NotificationType.RefreshMelted) + handler.notifyEventFromWallet(NotificationType.RefreshMelted); } expect(await waitForStateUpdate()).true; @@ -394,7 +395,7 @@ describe("Refund CTA states", () => { const state = pullLastResultOrThrow(); if (state.status !== "ready") { - expect(state).eq({}) + expect(state).eq({}); return; } if (state.error) expect.fail(); @@ -404,6 +405,6 @@ describe("Refund CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); }); diff --git a/packages/taler-wallet-webextension/src/cta/Tip/index.ts b/packages/taler-wallet-webextension/src/cta/Tip/index.ts index 520d854f2..ff917008f 100644 --- a/packages/taler-wallet-webextension/src/cta/Tip/index.ts +++ b/packages/taler-wallet-webextension/src/cta/Tip/index.ts @@ -25,7 +25,7 @@ import { AcceptedView, IgnoredView, LoadingUriView, - ReadyView + ReadyView, } from "./views.js"; export interface Props { diff --git a/packages/taler-wallet-webextension/src/cta/Tip/state.ts b/packages/taler-wallet-webextension/src/cta/Tip/state.ts index 00e1fddad..ea9ba1b37 100644 --- a/packages/taler-wallet-webextension/src/cta/Tip/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Tip/state.ts @@ -26,7 +26,9 @@ export function useComponentState( ): State { const tipInfo = useAsyncAsHook(async () => { if (!talerTipUri) throw Error("ERROR_NO-URI-FOR-TIP"); - const tip = await api.wallet.call(WalletApiOperation.PrepareTip, { talerTipUri }); + const tip = await api.wallet.call(WalletApiOperation.PrepareTip, { + talerTipUri, + }); return { tip }; }); @@ -46,7 +48,9 @@ export function useComponentState( const { tip } = tipInfo.response; const doAccept = async (): Promise => { - const res = await api.wallet.call(WalletApiOperation.AcceptTip, { walletTipId: tip.walletTipId }); + const res = await api.wallet.call(WalletApiOperation.AcceptTip, { + walletTipId: tip.walletTipId, + }); //FIX: this may not be seen since we are moving to the success also tipInfo.retry(); diff --git a/packages/taler-wallet-webextension/src/cta/Tip/test.ts b/packages/taler-wallet-webextension/src/cta/Tip/test.ts index 69badbede..e57b9ec4d 100644 --- a/packages/taler-wallet-webextension/src/cta/Tip/test.ts +++ b/packages/taler-wallet-webextension/src/cta/Tip/test.ts @@ -65,11 +65,10 @@ describe("Tip CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should be ready for accepting the tip", async () => { - const { handler, mock } = createWalletApiMock(); handler.addWalletCallResponse(WalletApiOperation.PrepareTip, undefined, { @@ -79,9 +78,9 @@ describe("Tip CTA states", () => { tipAmountEffective: "EUR:1", walletTipId: "tip_id", expirationTimestamp: { - t_s: 1 + t_s: 1, }, - tipAmountRaw: "" + tipAmountRaw: "", }); const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = @@ -112,7 +111,7 @@ describe("Tip CTA states", () => { const state = pullLastResultOrThrow(); if (state.status !== "ready") { - expect(state).eq({ status: "ready" }) + expect(state).eq({ status: "ready" }); return; } if (state.error) expect.fail(); @@ -132,9 +131,9 @@ describe("Tip CTA states", () => { tipAmountEffective: "EUR:1", walletTipId: "tip_id", expirationTimestamp: { - t_s: 1 + t_s: 1, }, - tipAmountRaw: "" + tipAmountRaw: "", }); expect(await waitForStateUpdate()).true; @@ -142,7 +141,7 @@ describe("Tip CTA states", () => { const state = pullLastResultOrThrow(); if (state.status !== "accepted") { - expect(state).eq({ status: "accepted" }) + expect(state).eq({ status: "accepted" }); return; } if (state.error) expect.fail(); @@ -151,7 +150,7 @@ describe("Tip CTA states", () => { expect(state.exchangeBaseUrl).eq("exchange url"); } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should be ignored after clicking the ignore button", async () => { @@ -165,7 +164,7 @@ describe("Tip CTA states", () => { expirationTimestamp: { t_s: 1, }, - tipAmountRaw: "" + tipAmountRaw: "", }); const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = @@ -203,7 +202,7 @@ describe("Tip CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should render accepted if the tip has been used previously", async () => { @@ -255,6 +254,6 @@ describe("Tip CTA states", () => { expect(state.exchangeBaseUrl).eq("exchange url"); } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); }); diff --git a/packages/taler-wallet-webextension/src/cta/TransferCreate/state.ts b/packages/taler-wallet-webextension/src/cta/TransferCreate/state.ts index 089f46047..c5e143f42 100644 --- a/packages/taler-wallet-webextension/src/cta/TransferCreate/state.ts +++ b/packages/taler-wallet-webextension/src/cta/TransferCreate/state.ts @@ -14,7 +14,11 @@ GNU Taler; see the file COPYING. If not, see */ -import { Amounts, TalerErrorDetail, TalerProtocolTimestamp } from "@gnu-taler/taler-util"; +import { + Amounts, + TalerErrorDetail, + TalerProtocolTimestamp, +} from "@gnu-taler/taler-util"; import { TalerError, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { format, isFuture, parse } from "date-fns"; import { useState } from "preact/hooks"; @@ -29,52 +33,57 @@ export function useComponentState( const amount = Amounts.parseOrThrow(amountStr); const [subject, setSubject] = useState(); - const [timestamp, setTimestamp] = useState() + const [timestamp, setTimestamp] = useState(); const [operationError, setOperationError] = useState< TalerErrorDetail | undefined >(undefined); - const hook = useAsyncAsHook(async () => { - const resp = await api.wallet.call(WalletApiOperation.PreparePeerPushPayment, { - amount: amountStr - }) - return resp - }) + const resp = await api.wallet.call( + WalletApiOperation.PreparePeerPushPayment, + { + amount: amountStr, + }, + ); + return resp; + }); if (!hook) { return { status: "loading", - error: undefined - } + error: undefined, + }; } if (hook.hasError) { return { status: "loading-uri", - error: hook - } + error: hook, + }; } - const { amountEffective, amountRaw } = hook.response - const debitAmount = Amounts.parseOrThrow(amountRaw) - const toBeReceived = Amounts.parseOrThrow(amountEffective) + const { amountEffective, amountRaw } = hook.response; + const debitAmount = Amounts.parseOrThrow(amountRaw); + const toBeReceived = Amounts.parseOrThrow(amountEffective); - let purse_expiration: TalerProtocolTimestamp | undefined = undefined + let purse_expiration: TalerProtocolTimestamp | undefined = undefined; let timestampError: string | undefined = undefined; - const t = timestamp === undefined ? undefined : parse(timestamp, "dd/MM/yyyy", new Date()) + const t = + timestamp === undefined + ? undefined + : parse(timestamp, "dd/MM/yyyy", new Date()); if (t !== undefined) { if (Number.isNaN(t.getTime())) { - timestampError = 'Should have the format "dd/MM/yyyy"' + timestampError = 'Should have the format "dd/MM/yyyy"'; } else { if (!isFuture(t)) { - timestampError = 'Should be in the future' + timestampError = "Should be in the future"; } else { purse_expiration = { - t_s: t.getTime() / 1000 - } + t_s: t.getTime() / 1000, + }; } } } @@ -82,13 +91,16 @@ export function useComponentState( async function accept(): Promise { if (!subject || !purse_expiration) return; try { - const resp = await api.wallet.call(WalletApiOperation.InitiatePeerPushPayment, { - partialContractTerms: { - summary: subject, - amount: amountStr, - purse_expiration + const resp = await api.wallet.call( + WalletApiOperation.InitiatePeerPushPayment, + { + partialContractTerms: { + summary: subject, + amount: amountStr, + purse_expiration, + }, }, - }); + ); onSuccess(resp.transactionId); } catch (e) { if (e instanceof TalerError) { @@ -99,7 +111,8 @@ export function useComponentState( } } - const unableToCreate = !subject || Amounts.isZero(amount) || !purse_expiration + const unableToCreate = + !subject || Amounts.isZero(amount) || !purse_expiration; return { status: "ready", @@ -107,7 +120,12 @@ export function useComponentState( onClick: onClose, }, subject: { - error: subject === undefined ? undefined : !subject ? "Can't be empty" : undefined, + error: + subject === undefined + ? undefined + : !subject + ? "Can't be empty" + : undefined, value: subject ?? "", onInput: async (e) => setSubject(e), }, @@ -115,8 +133,8 @@ export function useComponentState( error: timestampError, value: timestamp === undefined ? "" : timestamp, onInput: async (e) => { - setTimestamp(e) - } + setTimestamp(e); + }, }, create: { onClick: unableToCreate ? undefined : accept, diff --git a/packages/taler-wallet-webextension/src/cta/TransferPickup/index.ts b/packages/taler-wallet-webextension/src/cta/TransferPickup/index.ts index 954243fe8..399f1e290 100644 --- a/packages/taler-wallet-webextension/src/cta/TransferPickup/index.ts +++ b/packages/taler-wallet-webextension/src/cta/TransferPickup/index.ts @@ -17,7 +17,7 @@ import { AbsoluteTime, AmountJson, - TalerErrorDetail + TalerErrorDetail, } from "@gnu-taler/taler-util"; import { Loading } from "../../components/Loading.js"; import { HookError } from "../../hooks/useAsyncAsHook.js"; diff --git a/packages/taler-wallet-webextension/src/cta/TransferPickup/state.ts b/packages/taler-wallet-webextension/src/cta/TransferPickup/state.ts index 4b860559e..e8fb99ab7 100644 --- a/packages/taler-wallet-webextension/src/cta/TransferPickup/state.ts +++ b/packages/taler-wallet-webextension/src/cta/TransferPickup/state.ts @@ -18,7 +18,7 @@ import { AbsoluteTime, Amounts, TalerErrorDetail, - TalerProtocolTimestamp + TalerProtocolTimestamp, } from "@gnu-taler/taler-util"; import { TalerError, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { useState } from "preact/hooks"; @@ -52,10 +52,7 @@ export function useComponentState( }; } - const { - contractTerms, - peerPushPaymentIncomingId, - } = hook.response; + const { contractTerms, peerPushPaymentIncomingId } = hook.response; const amount: string = contractTerms?.amount; const summary: string | undefined = contractTerms?.summary; @@ -64,9 +61,12 @@ export function useComponentState( async function accept(): Promise { try { - const resp = await api.wallet.call(WalletApiOperation.AcceptPeerPushPayment, { - peerPushPaymentIncomingId, - }); + const resp = await api.wallet.call( + WalletApiOperation.AcceptPeerPushPayment, + { + peerPushPaymentIncomingId, + }, + ); onSuccess(resp.transactionId); } catch (e) { if (e instanceof TalerError) { diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw/index.ts b/packages/taler-wallet-webextension/src/cta/Withdraw/index.ts index 9a7acf9f1..68b314c07 100644 --- a/packages/taler-wallet-webextension/src/cta/Withdraw/index.ts +++ b/packages/taler-wallet-webextension/src/cta/Withdraw/index.ts @@ -23,7 +23,7 @@ import { compose, StateViewMap } from "../../utils/index.js"; import { wxApi } from "../../wxApi.js"; import { useComponentStateFromParams, - useComponentStateFromURI + useComponentStateFromURI, } from "./state.js"; import { ExchangeSelectionPage } from "../../wallet/ExchangeSelection/index.js"; diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts b/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts index 704ef1ac3..016027163 100644 --- a/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts +++ b/packages/taler-wallet-webextension/src/cta/Withdraw/state.ts @@ -19,7 +19,7 @@ import { AmountJson, Amounts, ExchangeListItem, - ExchangeTosStatus + ExchangeTosStatus, } from "@gnu-taler/taler-util"; import { TalerError, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { useState } from "preact/hooks"; @@ -35,7 +35,10 @@ export function useComponentStateFromParams( api: typeof wxApi, ): RecursiveState { const uriInfoHook = useAsyncAsHook(async () => { - const exchanges = await api.wallet.call(WalletApiOperation.ListExchanges, {}); + const exchanges = await api.wallet.call( + WalletApiOperation.ListExchanges, + {}, + ); return { amount: Amounts.parseOrThrow(amount), exchanges }; }); @@ -58,11 +61,14 @@ export function useComponentStateFromParams( transactionId: string; confirmTransferUrl: string | undefined; }> { - const res = await api.wallet.call(WalletApiOperation.AcceptManualWithdrawal, { - exchangeBaseUrl: exchange, - amount: Amounts.stringify(chosenAmount), - restrictAge: ageRestricted, - }); + const res = await api.wallet.call( + WalletApiOperation.AcceptManualWithdrawal, + { + exchangeBaseUrl: exchange, + amount: Amounts.stringify(chosenAmount), + restrictAge: ageRestricted, + }, + ); return { confirmTransferUrl: undefined, transactionId: res.transactionId, @@ -93,9 +99,12 @@ export function useComponentStateFromURI( const uriInfoHook = useAsyncAsHook(async () => { if (!talerWithdrawUri) throw Error("ERROR_NO-URI-FOR-WITHDRAWAL"); - const uriInfo = await api.wallet.call(WalletApiOperation.GetWithdrawalDetailsForUri, { - talerWithdrawUri, - }); + const uriInfo = await api.wallet.call( + WalletApiOperation.GetWithdrawalDetailsForUri, + { + talerWithdrawUri, + }, + ); const { amount, defaultExchangeBaseUrl } = uriInfo; return { talerWithdrawUri, @@ -126,11 +135,14 @@ export function useComponentStateFromURI( transactionId: string; confirmTransferUrl: string | undefined; }> { - const res = await api.wallet.call(WalletApiOperation.AcceptBankIntegratedWithdrawal, { - exchangeBaseUrl: exchange, - talerWithdrawUri: uri, - restrictAge: ageRestricted - }); + const res = await api.wallet.call( + WalletApiOperation.AcceptBankIntegratedWithdrawal, + { + exchangeBaseUrl: exchange, + talerWithdrawUri: uri, + restrictAge: ageRestricted, + }, + ); return { confirmTransferUrl: res.confirmTransferUrl, transactionId: res.transactionId, @@ -189,11 +201,14 @@ function exchangeSelectionState( * about the withdrawal */ const amountHook = useAsyncAsHook(async () => { - const info = await api.wallet.call(WalletApiOperation.GetWithdrawalDetailsForAmount, { - exchangeBaseUrl: currentExchange.exchangeBaseUrl, - amount: Amounts.stringify(chosenAmount), - restrictAge: ageRestricted, - }); + const info = await api.wallet.call( + WalletApiOperation.GetWithdrawalDetailsForAmount, + { + exchangeBaseUrl: currentExchange.exchangeBaseUrl, + amount: Amounts.stringify(chosenAmount), + restrictAge: ageRestricted, + }, + ); const withdrawAmount = { raw: Amounts.parseOrThrow(info.amountRaw), @@ -264,10 +279,10 @@ function exchangeSelectionState( //TODO: calculate based on exchange info const ageRestriction = ageRestrictionEnabled ? { - list: ageRestrictionOptions, - value: String(ageRestricted), - onChange: async (v: string) => setAgeRestricted(parseInt(v, 10)), - } + list: ageRestrictionOptions, + value: String(ageRestricted), + onChange: async (v: string) => setAgeRestricted(parseInt(v, 10)), + } : undefined; return { diff --git a/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts b/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts index b4ba32f8a..7fd8188ce 100644 --- a/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts +++ b/packages/taler-wallet-webextension/src/cta/Withdraw/test.ts @@ -21,7 +21,9 @@ import { Amounts, - ExchangeEntryStatus, ExchangeListItem, ExchangeTosStatus + ExchangeEntryStatus, + ExchangeListItem, + ExchangeTosStatus, } from "@gnu-taler/taler-util"; import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { expect } from "chai"; @@ -70,13 +72,9 @@ describe("Withdraw CTA states", () => { onSuccess: async () => { null; }, - } + }; const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = - mountHook(() => - useComponentStateFromURI( - props, mock - ), - ); + mountHook(() => useComponentStateFromURI(props, mock)); { const { status } = pullLastResultOrThrow(); @@ -96,7 +94,7 @@ describe("Withdraw CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should tell the user that there is not known exchange", async () => { @@ -109,18 +107,18 @@ describe("Withdraw CTA states", () => { onSuccess: async () => { null; }, - } - handler.addWalletCallResponse(WalletApiOperation.GetWithdrawalDetailsForUri, undefined, { - amount: "EUR:2", - possibleExchanges: [], - }) + }; + handler.addWalletCallResponse( + WalletApiOperation.GetWithdrawalDetailsForUri, + undefined, + { + amount: "EUR:2", + possibleExchanges: [], + }, + ); const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = - mountHook(() => - useComponentStateFromURI( - props, mock - ), - ); + mountHook(() => useComponentStateFromURI(props, mock)); { const { status } = pullLastResultOrThrow(); @@ -138,7 +136,7 @@ describe("Withdraw CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should be able to withdraw if tos are ok", async () => { @@ -151,26 +149,30 @@ describe("Withdraw CTA states", () => { onSuccess: async () => { null; }, - } - handler.addWalletCallResponse(WalletApiOperation.GetWithdrawalDetailsForUri, undefined, { - amount: "ARS:2", - possibleExchanges: exchanges, - defaultExchangeBaseUrl: exchanges[0].exchangeBaseUrl - }) - handler.addWalletCallResponse(WalletApiOperation.GetWithdrawalDetailsForAmount, undefined, { - amountRaw: "ARS:2", - amountEffective: "ARS:2", - paytoUris: ["payto://"], - tosAccepted: true, - ageRestrictionOptions: [] - }) + }; + handler.addWalletCallResponse( + WalletApiOperation.GetWithdrawalDetailsForUri, + undefined, + { + amount: "ARS:2", + possibleExchanges: exchanges, + defaultExchangeBaseUrl: exchanges[0].exchangeBaseUrl, + }, + ); + handler.addWalletCallResponse( + WalletApiOperation.GetWithdrawalDetailsForAmount, + undefined, + { + amountRaw: "ARS:2", + amountEffective: "ARS:2", + paytoUris: ["payto://"], + tosAccepted: true, + ageRestrictionOptions: [], + }, + ); const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = - mountHook(() => - useComponentStateFromURI( - props, mock - ), - ); + mountHook(() => useComponentStateFromURI(props, mock)); { const { status, error } = pullLastResultOrThrow(); @@ -203,7 +205,7 @@ describe("Withdraw CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); it("should accept the tos before withdraw", async () => { @@ -216,38 +218,45 @@ describe("Withdraw CTA states", () => { onSuccess: async () => { null; }, - } + }; const exchangeWithNewTos = exchanges.map((e) => ({ ...e, tosStatus: ExchangeTosStatus.New, })); - handler.addWalletCallResponse(WalletApiOperation.GetWithdrawalDetailsForUri, undefined, { - amount: "ARS:2", - possibleExchanges: exchangeWithNewTos, - defaultExchangeBaseUrl: exchangeWithNewTos[0].exchangeBaseUrl - }) - handler.addWalletCallResponse(WalletApiOperation.GetWithdrawalDetailsForAmount, undefined, { - amountRaw: "ARS:2", - amountEffective: "ARS:2", - paytoUris: ["payto://"], - tosAccepted: false, - ageRestrictionOptions: [] - }) - - - handler.addWalletCallResponse(WalletApiOperation.GetWithdrawalDetailsForUri, undefined, { - amount: "ARS:2", - possibleExchanges: exchanges, - defaultExchangeBaseUrl: exchanges[0].exchangeBaseUrl - }) + handler.addWalletCallResponse( + WalletApiOperation.GetWithdrawalDetailsForUri, + undefined, + { + amount: "ARS:2", + possibleExchanges: exchangeWithNewTos, + defaultExchangeBaseUrl: exchangeWithNewTos[0].exchangeBaseUrl, + }, + ); + handler.addWalletCallResponse( + WalletApiOperation.GetWithdrawalDetailsForAmount, + undefined, + { + amountRaw: "ARS:2", + amountEffective: "ARS:2", + paytoUris: ["payto://"], + tosAccepted: false, + ageRestrictionOptions: [], + }, + ); + + handler.addWalletCallResponse( + WalletApiOperation.GetWithdrawalDetailsForUri, + undefined, + { + amount: "ARS:2", + possibleExchanges: exchanges, + defaultExchangeBaseUrl: exchanges[0].exchangeBaseUrl, + }, + ); const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = - mountHook(() => - useComponentStateFromURI( - props, mock - ), - ); + mountHook(() => useComponentStateFromURI(props, mock)); { const { status, error } = pullLastResultOrThrow(); @@ -297,6 +306,6 @@ describe("Withdraw CTA states", () => { } await assertNoPendingUpdate(); - expect(handler.getCallingQueueState()).eq("empty") + expect(handler.getCallingQueueState()).eq("empty"); }); }); diff --git a/packages/taler-wallet-webextension/src/hooks/useAutoOpenPermissions.ts b/packages/taler-wallet-webextension/src/hooks/useAutoOpenPermissions.ts index 5a0194db8..3361394a4 100644 --- a/packages/taler-wallet-webextension/src/hooks/useAutoOpenPermissions.ts +++ b/packages/taler-wallet-webextension/src/hooks/useAutoOpenPermissions.ts @@ -63,7 +63,9 @@ async function handleAutoOpenPerm( onChange(res.newValue); } else { try { - await wxApi.background.toggleHeaderListener(false).then((r) => onChange(r.newValue)); + await wxApi.background + .toggleHeaderListener(false) + .then((r) => onChange(r.newValue)); } catch (e) { console.log(e); } diff --git a/packages/taler-wallet-webextension/src/hooks/useBackupDeviceName.ts b/packages/taler-wallet-webextension/src/hooks/useBackupDeviceName.ts index 7339a876a..be81b7d7d 100644 --- a/packages/taler-wallet-webextension/src/hooks/useBackupDeviceName.ts +++ b/packages/taler-wallet-webextension/src/hooks/useBackupDeviceName.ts @@ -32,10 +32,15 @@ export function useBackupDeviceName(): BackupDeviceName { useEffect(() => { async function run(): Promise { //create a first list of backup info by currency - const status = await wxApi.wallet.call(WalletApiOperation.GetBackupInfo, {}); + const status = await wxApi.wallet.call( + WalletApiOperation.GetBackupInfo, + {}, + ); async function update(newName: string): Promise { - await wxApi.wallet.call(WalletApiOperation.SetWalletDeviceId, { walletDeviceId: newName }); + await wxApi.wallet.call(WalletApiOperation.SetWalletDeviceId, { + walletDeviceId: newName, + }); setStatus((old) => ({ ...old, name: newName })); } diff --git a/packages/taler-wallet-webextension/src/hooks/useClipboardPermissions.ts b/packages/taler-wallet-webextension/src/hooks/useClipboardPermissions.ts index 3d284fb5a..9b7d46ba7 100644 --- a/packages/taler-wallet-webextension/src/hooks/useClipboardPermissions.ts +++ b/packages/taler-wallet-webextension/src/hooks/useClipboardPermissions.ts @@ -66,7 +66,9 @@ async function handleClipboardPerm( onChange(granted); } else { try { - await wxApi.background.toggleHeaderListener(false).then((r) => onChange(r.newValue)); + await wxApi.background + .toggleHeaderListener(false) + .then((r) => onChange(r.newValue)); } catch (e) { console.log(e); } diff --git a/packages/taler-wallet-webextension/src/hooks/useProviderStatus.ts b/packages/taler-wallet-webextension/src/hooks/useProviderStatus.ts index b73c9fc16..e6473d1ec 100644 --- a/packages/taler-wallet-webextension/src/hooks/useProviderStatus.ts +++ b/packages/taler-wallet-webextension/src/hooks/useProviderStatus.ts @@ -30,7 +30,10 @@ export function useProviderStatus(url: string): ProviderStatus | undefined { useEffect(() => { async function run(): Promise { //create a first list of backup info by currency - const status = await wxApi.wallet.call(WalletApiOperation.GetBackupInfo, {}); + const status = await wxApi.wallet.call( + WalletApiOperation.GetBackupInfo, + {}, + ); const providers = status.providers.filter( (p) => p.syncProviderBaseUrl === url, @@ -40,7 +43,7 @@ export function useProviderStatus(url: string): ProviderStatus | undefined { async function sync(): Promise { if (info) { await wxApi.wallet.call(WalletApiOperation.RunBackupCycle, { - providers: [info.syncProviderBaseUrl] + providers: [info.syncProviderBaseUrl], }); } } @@ -48,7 +51,7 @@ export function useProviderStatus(url: string): ProviderStatus | undefined { async function remove(): Promise { if (info) { await wxApi.wallet.call(WalletApiOperation.RemoveBackupProvider, { - provider: info.syncProviderBaseUrl + provider: info.syncProviderBaseUrl, }); } } diff --git a/packages/taler-wallet-webextension/src/hooks/useWalletDevMode.ts b/packages/taler-wallet-webextension/src/hooks/useWalletDevMode.ts index 8d4921392..d5743eb2e 100644 --- a/packages/taler-wallet-webextension/src/hooks/useWalletDevMode.ts +++ b/packages/taler-wallet-webextension/src/hooks/useWalletDevMode.ts @@ -48,8 +48,10 @@ async function handleOpen( currentValue: undefined | boolean, onChange: (value: boolean) => void, ): Promise { - const nextValue = !currentValue - await wxApi.wallet.call(WalletApiOperation.SetDevMode, { devModeEnabled: nextValue }); + const nextValue = !currentValue; + await wxApi.wallet.call(WalletApiOperation.SetDevMode, { + devModeEnabled: nextValue, + }); onChange(nextValue); return; } diff --git a/packages/taler-wallet-webextension/src/i18n/strings.ts b/packages/taler-wallet-webextension/src/i18n/strings.ts index c6b4df89c..e5281bf54 100644 --- a/packages/taler-wallet-webextension/src/i18n/strings.ts +++ b/packages/taler-wallet-webextension/src/i18n/strings.ts @@ -1,8052 +1,3191 @@ export const strings: any = {}; -strings['de'] = { - "domain": "messages", - "locale_data": { - "messages": { +strings["de"] = { + domain: "messages", + locale_data: { + messages: { "": { - "domain": "messages", - "plural_forms": "nplurals=2; plural=n != 1;", - "lang": "de" + domain: "messages", + plural_forms: "nplurals=2; plural=n != 1;", + lang: "de", }, - "Balance": [ - "Guthaben" - ], - "Backup": [ - "Backup" - ], - "QR Reader and Taler URI": [ - "" - ], - "Settings": [ - "Einstellungen" - ], - "Dev": [ - "Dev" - ], - "%1$s": [ - "" - ], - "PENDING OPERATIONS": [ - "" - ], - "Loading": [ - "Lädt Daten" - ], - "Could not load backup providers": [ - "" - ], - "No backup providers configured": [ - "" - ], - "Add provider": [ - "" - ], - "Sync all backups": [ - "" - ], - "Sync now": [ - "" - ], - "Last synced": [ - "" - ], - "Not synced": [ - "" - ], - "Expires in": [ - "" - ], + Balance: ["Guthaben"], + Backup: ["Backup"], + "QR Reader and Taler URI": [""], + Settings: ["Einstellungen"], + Dev: ["Dev"], + "%1$s": [""], + "PENDING OPERATIONS": [""], + Loading: ["Lädt Daten"], + "Could not load backup providers": [""], + "No backup providers configured": [""], + "Add provider": [""], + "Sync all backups": [""], + "Sync now": [""], + "Last synced": [""], + "Not synced": [""], + "Expires in": [""], "There was an error loading the provider detail for " %1$s"": [ - "" - ], - "There is not known provider with url "%1$s".": [ - "" - ], - "See providers": [ - "" - ], - "Last backup": [ - "" - ], - "Back up": [ - "" - ], - "Provider fee": [ - "" - ], - "per year": [ - "" - ], - "Extend": [ - "" - ], - "terms has changed, extending the service will imply accepting the new terms of service": [ - "" - ], - "old": [ - "" - ], - "new": [ - "" - ], - "fee": [ - "" - ], - "storage": [ - "" - ], - "Remove provider": [ - "" - ], - "This provider has reported an error": [ - "" - ], - "There is conflict with another backup from %1$s": [ - "" - ], - "Backup is not readable": [ - "" - ], - "Unknown backup problem: %1$s": [ - "" - ], - "service paid": [ - "" - ], - "Backup valid until": [ - "" - ], - "Cancel": [ - "Abbrechen" - ], - "Open reserve page": [ - "Seite der Reserve aufrufen" - ], - "Open pay page": [ - "Seite für Zahlungen aufrufen" - ], - "Open refund page": [ - "Seite für Rückerstattungen aufrufen" - ], - "Open tip page": [ - "Seite der Aufwandsentschädigungen aufrufen" - ], - "Open withdraw page": [ - "Abhebeseite öffnen" - ], - "Get digital cash": [ - "Digitales Bargeld abheben" - ], - "Could not load balance page": [ - "Konnte die Umsatzanzeige nicht laden" - ], - "Add": [ - "" - ], - "Send %1$s": [ - "" - ], - "Taler Action": [ - "" - ], - "This page has pay action.": [ - "" - ], - "This page has a withdrawal action.": [ - "" - ], - "This page has a tip action.": [ - "" - ], - "This page has a notify reserve action.": [ - "" - ], - "Notify": [ - "" - ], - "This page has a refund action.": [ - "" - ], - "This page has a malformed taler uri.": [ - "" - ], - "Dismiss": [ - "" - ], - "this popup is being closed and you are being redirected to %1$s": [ - "" - ], + "", + ], + "There is not known provider with url "%1$s".": [""], + "See providers": [""], + "Last backup": [""], + "Back up": [""], + "Provider fee": [""], + "per year": [""], + Extend: [""], + "terms has changed, extending the service will imply accepting the new terms of service": + [""], + old: [""], + new: [""], + fee: [""], + storage: [""], + "Remove provider": [""], + "This provider has reported an error": [""], + "There is conflict with another backup from %1$s": [""], + "Backup is not readable": [""], + "Unknown backup problem: %1$s": [""], + "service paid": [""], + "Backup valid until": [""], + Cancel: ["Abbrechen"], + "Open reserve page": ["Seite der Reserve aufrufen"], + "Open pay page": ["Seite für Zahlungen aufrufen"], + "Open refund page": ["Seite für Rückerstattungen aufrufen"], + "Open tip page": ["Seite der Aufwandsentschädigungen aufrufen"], + "Open withdraw page": ["Abhebeseite öffnen"], + "Get digital cash": ["Digitales Bargeld abheben"], + "Could not load balance page": ["Konnte die Umsatzanzeige nicht laden"], + Add: [""], + "Send %1$s": [""], + "Taler Action": [""], + "This page has pay action.": [""], + "This page has a withdrawal action.": [""], + "This page has a tip action.": [""], + "This page has a notify reserve action.": [""], + Notify: [""], + "This page has a refund action.": [""], + "This page has a malformed taler uri.": [""], + Dismiss: [""], + "this popup is being closed and you are being redirected to %1$s": [""], "Could not load purchase proposal details": [ - "Konnte die Umsatzanzeige nicht laden" - ], - "Order Id": [ - "" - ], - "Summary": [ - "" - ], - "Amount": [ - "Betrag" - ], - "Merchant name": [ - "" - ], - "Merchant jurisdiction": [ - "" - ], - "Merchant address": [ - "" - ], - "Merchant logo": [ - "" - ], - "Merchant website": [ - "" - ], - "Merchant email": [ - "" - ], - "Merchant public key": [ - "" - ], - "Delivery date": [ - "" - ], - "Delivery location": [ - "" - ], - "Products": [ - "" - ], - "Created at": [ - "" - ], - "Refund deadline": [ - "" - ], - "Auto refund": [ - "" - ], - "Pay deadline": [ - "" - ], - "Fulfillment URL": [ - "" - ], - "Fulfillment message": [ - "" - ], - "Max deposit fee": [ - "" - ], - "Max fee": [ - "" - ], - "Minimum age": [ - "" - ], - "Wire fee amortization": [ - "" - ], - "Auditors": [ - "" - ], - "Exchanges": [ - "Exchange" - ], - "Bank account": [ - "" - ], - "Bitcoin address": [ - "" - ], - "IBAN": [ - "" - ], - "Could not load deposit status": [ - "Konnte die Umsatzanzeige nicht laden" - ], - "Digital cash deposit": [ - "" - ], - "Cost": [ - "" - ], - "Fee": [ - "" - ], - "To be received": [ - "" - ], - "Send   %1$s": [ - "" - ], - "Bitcoin transfer details": [ - "" - ], - "The exchange need a transaction with 3 output, one output is the exchange account and the other two are segwit fake address for metadata with an minimum amount.": [ - "" - ], - "In bitcoincore wallet use 'Add Recipient' button to add two additional recipient and copy addresses and amounts": [ - "" - ], - "Make sure the amount show %1$s BTC, else you have to change the base unit to BTC": [ - "" - ], - "Account": [ - "" - ], - "Bank host": [ - "" - ], - "Bank transfer details": [ - "" - ], - "Subject": [ - "Verwendungszweck" - ], - "Receiver name": [ - "" - ], - "Could not load the transaction information": [ - "" - ], - "There was an error trying to complete the transaction": [ - "" - ], - "This transaction is not completed": [ - "" - ], - "Send": [ - "" - ], - "Retry": [ - "Erneut versuchen" - ], - "Forget": [ - "" - ], - "Caution!": [ - "" - ], - "If you have already wired money to the exchange you will loose the chance to get the coins form it.": [ - "" - ], - "Confirm": [ - "Bestätigen" - ], - "Withdrawal": [ - "Abheben" - ], - "Make sure to use the correct subject, otherwise the money will not arrive in this wallet.": [ - "" - ], - "The bank did not yet confirmed the wire transfer. Go to the %1$s %2$s and check there is no pending step.": [ - "" - ], - "Bank has confirmed the wire transfer. Waiting for the exchange to send the coins": [ - "" - ], - "Details": [ - "" - ], - "Payment": [ - "Zahlung" - ], - "Refunds": [ - "" - ], + "Konnte die Umsatzanzeige nicht laden", + ], + "Order Id": [""], + Summary: [""], + Amount: ["Betrag"], + "Merchant name": [""], + "Merchant jurisdiction": [""], + "Merchant address": [""], + "Merchant logo": [""], + "Merchant website": [""], + "Merchant email": [""], + "Merchant public key": [""], + "Delivery date": [""], + "Delivery location": [""], + Products: [""], + "Created at": [""], + "Refund deadline": [""], + "Auto refund": [""], + "Pay deadline": [""], + "Fulfillment URL": [""], + "Fulfillment message": [""], + "Max deposit fee": [""], + "Max fee": [""], + "Minimum age": [""], + "Wire fee amortization": [""], + Auditors: [""], + Exchanges: ["Exchange"], + "Bank account": [""], + "Bitcoin address": [""], + IBAN: [""], + "Could not load deposit status": ["Konnte die Umsatzanzeige nicht laden"], + "Digital cash deposit": [""], + Cost: [""], + Fee: [""], + "To be received": [""], + "Send   %1$s": [""], + "Bitcoin transfer details": [""], + "The exchange need a transaction with 3 output, one output is the exchange account and the other two are segwit fake address for metadata with an minimum amount.": + [""], + "In bitcoincore wallet use 'Add Recipient' button to add two additional recipient and copy addresses and amounts": + [""], + "Make sure the amount show %1$s BTC, else you have to change the base unit to BTC": + [""], + Account: [""], + "Bank host": [""], + "Bank transfer details": [""], + Subject: ["Verwendungszweck"], + "Receiver name": [""], + "Could not load the transaction information": [""], + "There was an error trying to complete the transaction": [""], + "This transaction is not completed": [""], + Send: [""], + Retry: ["Erneut versuchen"], + Forget: [""], + "Caution!": [""], + "If you have already wired money to the exchange you will loose the chance to get the coins form it.": + [""], + Confirm: ["Bestätigen"], + Withdrawal: ["Abheben"], + "Make sure to use the correct subject, otherwise the money will not arrive in this wallet.": + [""], + "The bank did not yet confirmed the wire transfer. Go to the %1$s %2$s and check there is no pending step.": + [""], + "Bank has confirmed the wire transfer. Waiting for the exchange to send the coins": + [""], + Details: [""], + Payment: ["Zahlung"], + Refunds: [""], "%1$s %2$s on %3$s": [ - "%1$s\n möchte einen Vertrag über %2$s\n mit Ihnen abschließen." - ], - "Merchant created a refund for this order but was not automatically picked up.": [ - "" - ], - "Offer": [ - "" - ], - "Accept": [ - "" - ], - "Merchant": [ - "" - ], - "Invoice ID": [ - "" - ], - "Deposit": [ - "" - ], - "Refresh": [ - "" - ], - "Tip": [ - "" - ], - "Refund": [ - "" - ], - "Original order ID": [ - "" - ], - "Purchase summary": [ - "" - ], - "copy": [ - "" - ], - "hide qr": [ - "" - ], - "show qr": [ - "" - ], - "Credit": [ - "" - ], - "Invoice": [ - "" - ], - "Exchange": [ - "Exchange" - ], - "URI": [ - "" - ], - "Debit": [ - "" - ], - "Transfer": [ - "" - ], - "Country": [ - "Betrag" - ], - "Address lines": [ - "" - ], - "Building number": [ - "" - ], - "Building name": [ - "" - ], - "Street": [ - "" - ], - "Post code": [ - "" - ], - "Town location": [ - "" - ], - "Town": [ - "" - ], - "District": [ - "" - ], - "Country subdivision": [ - "" - ], - "Date": [ - "" - ], - "Transaction fees": [ - "" - ], - "Total": [ - "" - ], - "Withdraw": [ - "Abheben" - ], - "Price": [ - "" - ], - "Refunded": [ - "" - ], - "Delivery": [ - "" - ], - "Total transfer": [ - "Insgesamt abgehoben" - ], - "Could not load pay status": [ - "" - ], - "Digital cash payment": [ - "" - ], - "Purchase": [ - "" - ], - "Receipt": [ - "" - ], - "Valid until": [ - "" - ], - "List of products": [ - "" - ], - "free": [ - "" - ], - "Already paid, you are going to be redirected to %1$s": [ - "" - ], - "Already paid": [ - "" - ], - "Already claimed": [ - "" - ], - "Pay with a mobile phone": [ - "" - ], - "Hide QR": [ - "" - ], - "Scan the QR code or   %1$s": [ - "" - ], - "Pay   %1$s": [ - "" - ], + "%1$s\n möchte einen Vertrag über %2$s\n mit Ihnen abschließen.", + ], + "Merchant created a refund for this order but was not automatically picked up.": + [""], + Offer: [""], + Accept: [""], + Merchant: [""], + "Invoice ID": [""], + Deposit: [""], + Refresh: [""], + Tip: [""], + Refund: [""], + "Original order ID": [""], + "Purchase summary": [""], + copy: [""], + "hide qr": [""], + "show qr": [""], + Credit: [""], + Invoice: [""], + Exchange: ["Exchange"], + URI: [""], + Debit: [""], + Transfer: [""], + Country: ["Betrag"], + "Address lines": [""], + "Building number": [""], + "Building name": [""], + Street: [""], + "Post code": [""], + "Town location": [""], + Town: [""], + District: [""], + "Country subdivision": [""], + Date: [""], + "Transaction fees": [""], + Total: [""], + Withdraw: ["Abheben"], + Price: [""], + Refunded: [""], + Delivery: [""], + "Total transfer": ["Insgesamt abgehoben"], + "Could not load pay status": [""], + "Digital cash payment": [""], + Purchase: [""], + Receipt: [""], + "Valid until": [""], + "List of products": [""], + free: [""], + "Already paid, you are going to be redirected to %1$s": [""], + "Already paid": [""], + "Already claimed": [""], + "Pay with a mobile phone": [""], + "Hide QR": [""], + "Scan the QR code or   %1$s": [""], + "Pay   %1$s": [""], "You have no balance for this currency. Withdraw digital cash first.": [ - "" - ], - "Could not find enough coins to pay. Even if you have enough %1$s some restriction may apply.": [ - "" + "", ], + "Could not find enough coins to pay. Even if you have enough %1$s some restriction may apply.": + [""], "Your current balance is not enough.": [ - "Es gibt kein Guthaben anzuzeigen." - ], - "Merchant message": [ - "" - ], - "Could not load refund status": [ - "Konnte die Umsatzanzeige nicht laden" - ], - "Digital cash refund": [ - "" - ], - "You've ignored the tip.": [ - "" - ], - "The refund is in progress.": [ - "" - ], - "Total to refund": [ - "Insgesamt abgehoben" - ], + "Es gibt kein Guthaben anzuzeigen.", + ], + "Merchant message": [""], + "Could not load refund status": ["Konnte die Umsatzanzeige nicht laden"], + "Digital cash refund": [""], + "You've ignored the tip.": [""], + "The refund is in progress.": [""], + "Total to refund": ["Insgesamt abgehoben"], "The merchant "%1$s" is offering you a refund.": [ - "Der Händler %1$s bietet Ihnen eine Aufwandsentschädigung von %2$s durch den Exchange %3$s" - ], - "Order amount": [ - "" - ], - "Already refunded": [ - "" - ], - "Refund offered": [ - "" - ], - "Accept   %1$s": [ - "" - ], - "Could not load tip status": [ - "Konnte die Umsatzanzeige nicht laden" - ], - "Digital cash tip": [ - "" - ], + "Der Händler %1$s bietet Ihnen eine Aufwandsentschädigung von %2$s durch den Exchange %3$s", + ], + "Order amount": [""], + "Already refunded": [""], + "Refund offered": [""], + "Accept   %1$s": [""], + "Could not load tip status": ["Konnte die Umsatzanzeige nicht laden"], + "Digital cash tip": [""], "The merchant is offering you a tip": [ - "Der Händler %1$s bietet Ihnen eine Aufwandsentschädigung von %2$s durch den Exchange %3$s" - ], - "Merchant URL": [ - "" - ], - "Receive   %1$s": [ - "" - ], - "Tip from %1$s accepted. Check your transactions list for more details.": [ - "" - ], - "Select one option": [ - "" - ], - "Could not load": [ - "Konnte die Umsatzanzeige nicht laden" - ], - "Show terms of service": [ - "" - ], - "I accept the exchange terms of service": [ - "" - ], - "Exchange doesn't have terms of service": [ - "" - ], - "Review exchange terms of service": [ - "" - ], - "Review new version of terms of service": [ - "" - ], - "The exchange reply with a empty terms of service": [ - "" - ], - "Download Terms of Service": [ - "" - ], - "Hide terms of service": [ - "" - ], - "Could not load exchange fees": [ - "Konnte die Umsatzanzeige nicht laden" - ], - "Close": [ - "" - ], - "could not find any exchange": [ - "Konnte die Umsatzanzeige nicht laden" - ], - "could not find any exchange for the currency %1$s": [ - "" - ], - "Service fee description": [ - "" - ], - "Select %1$s exchange": [ - "" - ], - "Reset": [ - "" - ], - "Use this exchange": [ - "" - ], - "Doesn't have auditors": [ - "" - ], - "currency": [ - "" - ], - "Operations": [ - "" - ], - "Deposits": [ - "%1$s zahlen" - ], - "Denomination": [ - "" - ], - "Until": [ - "" - ], - "Withdrawals": [ - "Abheben" - ], - "Currency": [ - "" - ], - "Coin operations": [ - "" - ], - "Every operation in this section may be different by denomination value and is valid for a period of time. The exchange will charge the indicated amount every time a coin is used in such operation.": [ - "" - ], - "Transfer operations": [ - "" - ], - "Every operation in this section may be different by transfer type and is valid for a period of time. The exchange will charge the indicated amount every time a transfer is made.": [ - "" - ], - "Operation": [ - "" - ], - "Wallet operations": [ - "" - ], - "Feature": [ - "" - ], - "Could not get the info from the URI": [ - "" - ], - "Could not get info of withdrawal": [ - "" - ], - "Digital cash withdrawal": [ - "" - ], - "Could not finish the withdrawal operation": [ - "" - ], - "Age restriction": [ - "" - ], - "Withdraw   %1$s": [ - "Abheben bei %1$s" - ], - "Withdraw to a mobile phone": [ - "" - ], - "Digital invoice": [ - "" - ], - "Could not finish the invoice creation": [ - "" - ], - "Create": [ - "" - ], - "Could not finish the payment operation": [ - "" - ], - "Digital cash transfer": [ - "" - ], - "Could not finish the transfer creation": [ - "" - ], - "Could not finish the pickup operation": [ - "" - ], - "Manual Withdrawal for %1$s": [ - "Manuelles Abheben" - ], - "Choose a exchange from where the coins will be withdrawn. The exchange will send the coins to this wallet after receiving a wire transfer with the correct subject.": [ - "" - ], - "No exchange found for %1$s": [ - "" - ], - "Add Exchange": [ - "" - ], - "No exchange configured": [ - "" - ], - "Can't create the reserve": [ - "" - ], - "Start withdrawal": [ - "Abhebung beginnen" - ], + "Der Händler %1$s bietet Ihnen eine Aufwandsentschädigung von %2$s durch den Exchange %3$s", + ], + "Merchant URL": [""], + "Receive   %1$s": [""], + "Tip from %1$s accepted. Check your transactions list for more details.": + [""], + "Select one option": [""], + "Could not load": ["Konnte die Umsatzanzeige nicht laden"], + "Show terms of service": [""], + "I accept the exchange terms of service": [""], + "Exchange doesn't have terms of service": [""], + "Review exchange terms of service": [""], + "Review new version of terms of service": [""], + "The exchange reply with a empty terms of service": [""], + "Download Terms of Service": [""], + "Hide terms of service": [""], + "Could not load exchange fees": ["Konnte die Umsatzanzeige nicht laden"], + Close: [""], + "could not find any exchange": ["Konnte die Umsatzanzeige nicht laden"], + "could not find any exchange for the currency %1$s": [""], + "Service fee description": [""], + "Select %1$s exchange": [""], + Reset: [""], + "Use this exchange": [""], + "Doesn't have auditors": [""], + currency: [""], + Operations: [""], + Deposits: ["%1$s zahlen"], + Denomination: [""], + Until: [""], + Withdrawals: ["Abheben"], + Currency: [""], + "Coin operations": [""], + "Every operation in this section may be different by denomination value and is valid for a period of time. The exchange will charge the indicated amount every time a coin is used in such operation.": + [""], + "Transfer operations": [""], + "Every operation in this section may be different by transfer type and is valid for a period of time. The exchange will charge the indicated amount every time a transfer is made.": + [""], + Operation: [""], + "Wallet operations": [""], + Feature: [""], + "Could not get the info from the URI": [""], + "Could not get info of withdrawal": [""], + "Digital cash withdrawal": [""], + "Could not finish the withdrawal operation": [""], + "Age restriction": [""], + "Withdraw   %1$s": ["Abheben bei %1$s"], + "Withdraw to a mobile phone": [""], + "Digital invoice": [""], + "Could not finish the invoice creation": [""], + Create: [""], + "Could not finish the payment operation": [""], + "Digital cash transfer": [""], + "Could not finish the transfer creation": [""], + "Could not finish the pickup operation": [""], + "Manual Withdrawal for %1$s": ["Manuelles Abheben"], + "Choose a exchange from where the coins will be withdrawn. The exchange will send the coins to this wallet after receiving a wire transfer with the correct subject.": + [""], + "No exchange found for %1$s": [""], + "Add Exchange": [""], + "No exchange configured": [""], + "Can't create the reserve": [""], + "Start withdrawal": ["Abhebung beginnen"], "Could not load deposit balance": [ - "Konnte die Umsatzanzeige nicht laden" - ], - "A currency or an amount should be indicated": [ - "" - ], - "There is no enough balance to make a deposit for currency %1$s": [ - "" - ], - "Send %1$s to your account": [ - "" - ], - "There is no account to make a deposit for currency %1$s": [ - "" - ], - "Add account": [ - "" - ], - "Select account": [ - "" - ], - "Add another account": [ - "" - ], - "Deposit fee": [ - "" - ], - "Total deposit": [ - "" - ], - "Deposit %1$s %2$s": [ - "Einlösen %1$s %2$s" - ], - "Add bank account for %1$s": [ - "" - ], - "Enter the URL of an exchange you trust.": [ - "" - ], - "Unable add this account": [ - "" - ], - "Select account type": [ - "" - ], - "Review terms of service": [ - "" - ], - "Exchange URL": [ - "" - ], - "Add exchange": [ - "" - ], - "Add new exchange": [ - "" - ], - "Add exchange for %1$s": [ - "" - ], - "An exchange has been found! Review the information and click next": [ - "" - ], - "This exchange doesn't match the expected currency %1$s": [ - "" - ], - "Unable to verify this exchange": [ - "" - ], - "Unable to add this exchange": [ - "" - ], - "loading": [ - "" - ], - "Version": [ - "" - ], - "Next": [ - "" - ], - "Waiting for confirmation": [ - "" - ], - "PENDING": [ - "" - ], - "Could not load the list of transactions": [ - "" - ], - "Your transaction history is empty for this currency.": [ - "" - ], - "Add backup provider": [ - "" - ], - "Could not get provider information": [ - "" - ], - "Backup providers may charge for their service": [ - "" - ], - "URL": [ - "" - ], - "Name": [ - "" - ], - "Provider URL": [ - "" - ], - "Please review and accept this provider's terms of service": [ - "" - ], - "Pricing": [ - "" - ], - "free of charge": [ - "" - ], - "%1$s per year of service": [ - "" - ], - "Storage": [ - "" - ], - "%1$s megabytes of storage per year of service": [ - "" - ], - "Accept terms of service": [ - "" - ], - "Could not parse the payto URI": [ - "" - ], - "Please check the uri": [ - "" - ], - "Exchange is ready for withdrawal": [ - "" - ], - "To complete the process you need to wire%1$s %2$s to the exchange bank account": [ - "" - ], - "Alternative, you can also scan this QR code or open %1$s if you have a banking app installed that supports RFC 8905": [ - "" - ], - "Cancel withdrawal": [ - "" - ], - "Could not toggle auto-open": [ - "Konnte die Umsatzanzeige nicht laden" - ], - "Could not toggle clipboard": [ - "Konnte die Umsatzanzeige nicht laden" - ], - "Navigator": [ - "" - ], - "Automatically open wallet based on page content": [ - "" - ], - "Enabling this option below will make using the wallet faster, but requires more permissions from your browser.": [ - "" - ], - "Automatically check clipboard for Taler URI": [ - "" - ], - "Trust": [ - "" - ], - "No exchange yet": [ - "" - ], - "Term of Service": [ - "" - ], - "ok": [ - "" - ], - "changed": [ - "" - ], - "not accepted": [ - "" - ], - "unknown (exchange status should be updated)": [ - "" - ], - "Add an exchange": [ - "" - ], - "Troubleshooting": [ - "" - ], - "Developer mode": [ - "" - ], - "More options and information useful for debugging": [ - "" - ], - "Display": [ - "" - ], - "Current Language": [ - "" - ], - "Wallet Core": [ - "" - ], - "Web Extension": [ - "" - ], - "Exchange compatibility": [ - "" - ], - "Merchant compatibility": [ - "" - ], - "Bank compatibility": [ - "" - ], - "Browser Extension Installed!": [ - "" - ], - "You can open the GNU Taler Wallet using the combination %1$s .": [ - "" - ], - "Also pinning the GNU Taler Wallet to your Chrome browser allows you to quick access without keyboard:": [ - "" - ], - "Click the puzzle icon": [ - "" - ], - "Search for GNU Taler Wallet": [ - "" - ], - "Click the pin icon": [ - "" - ], - "Permissions": [ - "" - ], - "(Enabling this option below will make using the wallet faster, but requires more permissions from your browser.)": [ - "" - ], - "Next Steps": [ - "" - ], - "Try the demo": [ - "" - ], - "Learn how to top up your wallet balance": [ - "" - ], + "Konnte die Umsatzanzeige nicht laden", + ], + "A currency or an amount should be indicated": [""], + "There is no enough balance to make a deposit for currency %1$s": [""], + "Send %1$s to your account": [""], + "There is no account to make a deposit for currency %1$s": [""], + "Add account": [""], + "Select account": [""], + "Add another account": [""], + "Deposit fee": [""], + "Total deposit": [""], + "Deposit %1$s %2$s": ["Einlösen %1$s %2$s"], + "Add bank account for %1$s": [""], + "Enter the URL of an exchange you trust.": [""], + "Unable add this account": [""], + "Select account type": [""], + "Review terms of service": [""], + "Exchange URL": [""], + "Add exchange": [""], + "Add new exchange": [""], + "Add exchange for %1$s": [""], + "An exchange has been found! Review the information and click next": [""], + "This exchange doesn't match the expected currency %1$s": [""], + "Unable to verify this exchange": [""], + "Unable to add this exchange": [""], + loading: [""], + Version: [""], + Next: [""], + "Waiting for confirmation": [""], + PENDING: [""], + "Could not load the list of transactions": [""], + "Your transaction history is empty for this currency.": [""], + "Add backup provider": [""], + "Could not get provider information": [""], + "Backup providers may charge for their service": [""], + URL: [""], + Name: [""], + "Provider URL": [""], + "Please review and accept this provider's terms of service": [""], + Pricing: [""], + "free of charge": [""], + "%1$s per year of service": [""], + Storage: [""], + "%1$s megabytes of storage per year of service": [""], + "Accept terms of service": [""], + "Could not parse the payto URI": [""], + "Please check the uri": [""], + "Exchange is ready for withdrawal": [""], + "To complete the process you need to wire%1$s %2$s to the exchange bank account": + [""], + "Alternative, you can also scan this QR code or open %1$s if you have a banking app installed that supports RFC 8905": + [""], + "Cancel withdrawal": [""], + "Could not toggle auto-open": ["Konnte die Umsatzanzeige nicht laden"], + "Could not toggle clipboard": ["Konnte die Umsatzanzeige nicht laden"], + Navigator: [""], + "Automatically open wallet based on page content": [""], + "Enabling this option below will make using the wallet faster, but requires more permissions from your browser.": + [""], + "Automatically check clipboard for Taler URI": [""], + Trust: [""], + "No exchange yet": [""], + "Term of Service": [""], + ok: [""], + changed: [""], + "not accepted": [""], + "unknown (exchange status should be updated)": [""], + "Add an exchange": [""], + Troubleshooting: [""], + "Developer mode": [""], + "More options and information useful for debugging": [""], + Display: [""], + "Current Language": [""], + "Wallet Core": [""], + "Web Extension": [""], + "Exchange compatibility": [""], + "Merchant compatibility": [""], + "Bank compatibility": [""], + "Browser Extension Installed!": [""], + "You can open the GNU Taler Wallet using the combination %1$s .": [""], + "Also pinning the GNU Taler Wallet to your Chrome browser allows you to quick access without keyboard:": + [""], + "Click the puzzle icon": [""], + "Search for GNU Taler Wallet": [""], + "Click the pin icon": [""], + Permissions: [""], + "(Enabling this option below will make using the wallet faster, but requires more permissions from your browser.)": + [""], + "Next Steps": [""], + "Try the demo": [""], + "Learn how to top up your wallet balance": [""], "Diagnostics timed out. Could not talk to the wallet backend.": [ - "Die Diagnostik ist abgeschlossen. Es war keine Kommunikation mit dem Wallet-Backend möglich." - ], - "Problems detected:": [ - "Ein Problem wurde festgestellt:" - ], - "Please check in your %1$s settings that you have IndexedDB enabled (check the preference name %2$s).": [ - "Bitte prüfen Sie ihre %1$s Einstellungen, für die Sie IndexedDB verwenden (preference name %2$s prüfen)." - ], - "Your wallet database is outdated. Currently automatic migration is not supported. Please go %1$s to reset the wallet database.": [ - "Die Datenbank des Wallets ist veraltet. Aktuell wird jedoch keine Migration auf eine neue Version unterstützt. Bitte wählen Sie %1$s zum Zurücksetzen der Wallet-Datenbank." - ], - "Running diagnostics": [ - "Diagnostik wird durchgeführt" - ], - "Debug tools": [ - "Debugging-Tools" - ], - "Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?": [ - "" - ], - "reset": [ - "zurücksetzen" - ], - "TESTING: This may delete all your coin, proceed with caution": [ - "" - ], - "run gc": [ - "" - ], - "import database": [ - "" - ], - "export database": [ - "" - ], - "Database exported at %1$s %2$s to download": [ - "" - ], - "Coins": [ - "" - ], - "Pending operations": [ - "" - ], - "usable coins": [ - "" - ], - "id": [ - "" - ], - "denom": [ - "" - ], - "value": [ - "" - ], - "status": [ - "" - ], - "from refresh?": [ - "" - ], - "age key count": [ - "" - ], - "spent coins": [ - "" - ], - "click to show": [ - "" - ], - "Scan a QR code or enter taler:// URI below": [ - "" - ], - "Open": [ - "" - ], - "URI is not valid. Taler URI should start with `taler://`": [ - "" - ], - "Try another": [ - "" - ], + "Die Diagnostik ist abgeschlossen. Es war keine Kommunikation mit dem Wallet-Backend möglich.", + ], + "Problems detected:": ["Ein Problem wurde festgestellt:"], + "Please check in your %1$s settings that you have IndexedDB enabled (check the preference name %2$s).": + [ + "Bitte prüfen Sie ihre %1$s Einstellungen, für die Sie IndexedDB verwenden (preference name %2$s prüfen).", + ], + "Your wallet database is outdated. Currently automatic migration is not supported. Please go %1$s to reset the wallet database.": + [ + "Die Datenbank des Wallets ist veraltet. Aktuell wird jedoch keine Migration auf eine neue Version unterstützt. Bitte wählen Sie %1$s zum Zurücksetzen der Wallet-Datenbank.", + ], + "Running diagnostics": ["Diagnostik wird durchgeführt"], + "Debug tools": ["Debugging-Tools"], + "Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?": + [""], + reset: ["zurücksetzen"], + "TESTING: This may delete all your coin, proceed with caution": [""], + "run gc": [""], + "import database": [""], + "export database": [""], + "Database exported at %1$s %2$s to download": [""], + Coins: [""], + "Pending operations": [""], + "usable coins": [""], + id: [""], + denom: [""], + value: [""], + status: [""], + "from refresh?": [""], + "age key count": [""], + "spent coins": [""], + "click to show": [""], + "Scan a QR code or enter taler:// URI below": [""], + Open: [""], + "URI is not valid. Taler URI should start with `taler://`": [""], + "Try another": [""], "Could not load list of exchange": [ - "Konnte die Umsatzanzeige nicht laden" - ], - "Choose a currency to proceed or add another exchange": [ - "" - ], - "Known currencies": [ - "" - ], - "Specify the amount and the origin": [ - "" - ], - "Change currency": [ - "" - ], - "Use previous origins:": [ - "" - ], - "Or specify the origin of the money": [ - "" - ], - "Specify the origin of the money": [ - "" - ], - "From my bank account": [ - "" - ], - "From another wallet": [ - "" - ], - "currency not provided": [ - "" - ], - "Specify the amount and the destination": [ - "" - ], - "Use previous destinations:": [ - "" - ], - "Or specify the destination of the money": [ - "" - ], - "Specify the destination of the money": [ - "" - ], - "To my bank account": [ - "" - ], - "To another wallet": [ - "" - ], - "Could not load backup recovery information": [ - "Konnte die Umsatzanzeige nicht laden" - ], - "Digital wallet recovery": [ - "" - ], - "Import backup, show info": [ - "" - ], - "All done, your transaction is in progress": [ - "" - ], - "Edit": [ - "" - ], - "Could not load the list of known exchanges": [ - "" - ] - } - } -}; - -strings['es'] = { - "domain": "messages", - "locale_data": { - "messages": { - "": { - "domain": "messages", - "plural_forms": "nplurals=2; plural=n != 1;", - "lang": "es" - }, - "Balance": [ - "Balance" - ], - "Backup": [ - "Copia de seguridad" - ], - "QR Reader and Taler URI": [ - "Lector QR y Taler URI" - ], - "Settings": [ - "Configuración" - ], - "Dev": [ - "Dev" - ], - "%1$s": [ - "%1$s" - ], - "PENDING OPERATIONS": [ - "OPERACIONES PENDIENTES" - ], - "Loading": [ - "Cargando" - ], - "Could not load backup providers": [ - "No se pudo cargar los proveedores de copias de seguridad" - ], - "No backup providers configured": [ - "No hay proveedores de copias de seguridad configurados" - ], - "Add provider": [ - "Agregar proveedor" - ], - "Sync all backups": [ - "Sincronizar todas las copias de seguridad" - ], - "Sync now": [ - "Sincronizar ahora" - ], - "Last synced": [ - "Ultima vez sincronizado" - ], - "Not synced": [ - "No sincronizado" - ], - "Expires in": [ - "Expira en" - ], - "There was an error loading the provider detail for " %1$s"": [ - "Hubo un error cargando los detalles del proveedor para \"%1$s\"" - ], - "There is not known provider with url "%1$s".": [ - "No hay proveedor conocido con la URL \"%1$s\"." - ], - "See providers": [ - "Ver proveedores" - ], - "Last backup": [ - "Última copia de seguridad" - ], - "Back up": [ - "Copia de seguridad" - ], - "Provider fee": [ - "Tarifa del proveedor" - ], - "per year": [ - "por año" - ], - "Extend": [ - "Extender" - ], - "terms has changed, extending the service will imply accepting the new terms of service": [ - "los términos han cambiado, extender el servicio implicará aceptar los nuevos términos de servicio" - ], - "old": [ - "viejo" - ], - "new": [ - "nuevo" - ], - "fee": [ - "tarifa" - ], - "storage": [ - "almacenamiento" - ], - "Remove provider": [ - "Eliminar proveedor" - ], - "This provider has reported an error": [ - "Este proveedor ha reportado un error" - ], - "There is conflict with another backup from %1$s": [ - "Hay un conflicto con otra copia de seguridad de %1$s" - ], - "Backup is not readable": [ - "La copia de seguridad no es legible" - ], - "Unknown backup problem: %1$s": [ - "Problema de copia de seguridad desconocido: %1$s" - ], - "service paid": [ - "servicio pagado" - ], - "Backup valid until": [ - "Copia de seguridad válida hasta" - ], - "Cancel": [ - "Cancelar" - ], - "Open reserve page": [ - "Abrir página de reserva" - ], - "Open pay page": [ - "Abrir página de pago" - ], - "Open refund page": [ - "Abrir página de devolución" - ], - "Open tip page": [ - "Abrir página de propina" - ], - "Open withdraw page": [ - "Abrir página de retirada" - ], - "Get digital cash": [ - "Retirar dinero digital" - ], - "Could not load balance page": [ - "No se pudo cargar la página" - ], - "Add": [ - "Agregar" - ], - "Send %1$s": [ - "Envíar %1$s" - ], - "Taler Action": [ - "Acción Taler" - ], - "This page has pay action.": [ - "Esta página tiene una acción de pago." - ], - "This page has a withdrawal action.": [ - "Esta página tiene una acción de retirada." - ], - "This page has a tip action.": [ - "Esta página tiene una acción de propina." - ], - "This page has a notify reserve action.": [ - "Esta página tiene una acción de notificación de reserva." - ], - "Notify": [ - "Notificar" - ], - "This page has a refund action.": [ - "Esta página tiene una acción de devolución." - ], - "This page has a malformed taler uri.": [ - "Esta página tiene una URI de Taler malformada." - ], - "Dismiss": [ - "Descartar" - ], - "this popup is being closed and you are being redirected to %1$s": [ - "Este popup está siendo cerrado y estás siendo redirigido a %1$s" - ], - "Could not load purchase proposal details": [ - "No se pudo cargar el detalle de la propuesta" - ], - "Order Id": [ - "Id de orden" - ], - "Summary": [ - "Resumen" - ], - "Amount": [ - "Cantidad" - ], - "Merchant name": [ - "Comerciante" - ], - "Merchant jurisdiction": [ - "Jurisdicción" - ], - "Merchant address": [ - "Dirección del comerciante" - ], - "Merchant logo": [ - "Logo" - ], - "Merchant website": [ - "Siti web" - ], - "Merchant email": [ - "Correo electrónico" - ], - "Merchant public key": [ - "Clave pública" - ], - "Delivery date": [ - "Fecha de entrega" - ], - "Delivery location": [ - "Ubicación de entrega" - ], - "Products": [ - "Productos" - ], - "Created at": [ - "Creado en" - ], - "Refund deadline": [ - "Plazo de devolución" - ], - "Auto refund": [ - "Devolución automática" - ], - "Pay deadline": [ - "Plazo de pago" - ], - "Fulfillment URL": [ - "URL de éxito" - ], - "Fulfillment message": [ - "Mensaje de éxito" - ], - "Max deposit fee": [ - "Máxima comisión de depósito" - ], - "Max fee": [ - "Máxima comisión" - ], - "Minimum age": [ - "Edad mínima" - ], - "Wire fee amortization": [ - "Amortización de comisión de transferencia" - ], - "Auditors": [ - "Auditores" - ], - "Exchanges": [ - "Exchanges" - ], - "Bank account": [ - "Cuenta del banco" - ], - "Bitcoin address": [ - "Dirección de Bitcoin" - ], - "IBAN": [ - "IBAN" - ], - "Could not load deposit status": [ - "No se pudo cargar el estado del depósito" - ], - "Digital cash deposit": [ - "Depósito de dinero digital" - ], - "Cost": [ - "Costo" - ], - "Fee": [ - "Comisión" - ], - "To be received": [ - "A recibir" - ], - "Send   %1$s": [ - "Envíar %1$s" - ], - "Bitcoin transfer details": [ - "Detalle de transferencia Bitcoin" - ], - "The exchange need a transaction with 3 output, one output is the exchange account and the other two are segwit fake address for metadata with an minimum amount.": [ - "El exchange necesita una transacción con 3 salidas, una salida es hacia la cuenta del exchange y las otras dos son direcciones segwit falsas para metadata con el monto mínimo." - ], - "In bitcoincore wallet use 'Add Recipient' button to add two additional recipient and copy addresses and amounts": [ - "En la billetera bitcoincore usar el botón \"Agregar destinatario\" para agregar dos destinatarios y copiar las direcciones y montos" - ], - "Make sure the amount show %1$s BTC, else you have to change the base unit to BTC": [ - "Asegurarse de que el monto muestre %1$s BTC, sino tendrá que cambiar la unidad a BTC" - ], - "Account": [ - "Cuenta" - ], - "Bank host": [ - "Banco anfitrión" - ], - "Bank transfer details": [ - "Detalle de transferencia bancaria" - ], - "Subject": [ - "Asunto" - ], - "Receiver name": [ - "Nombre del receptor" - ], - "Could not load the transaction information": [ - "No se pudo cargar información de la transacción" - ], - "There was an error trying to complete the transaction": [ - "Hubo un error intentando completar la transacción" - ], - "This transaction is not completed": [ - "Esta transacción no está completada" - ], - "Send": [ - "Enviar" - ], - "Retry": [ - "Reintentar" - ], - "Forget": [ - "Olvidar" - ], - "Caution!": [ - "Cuidado!" - ], - "If you have already wired money to the exchange you will loose the chance to get the coins form it.": [ - "Si tú ya has transferido dinero al exchange, perderás la oportunidad de recibir las monedas desde este." - ], - "Confirm": [ - "Confirmar" - ], - "Withdrawal": [ - "Retirada" - ], - "Make sure to use the correct subject, otherwise the money will not arrive in this wallet.": [ - "Asegúrate de usar el asunto correcto, de lo contrario el dinero no llegará a esta billetera." - ], - "The bank did not yet confirmed the wire transfer. Go to the %1$s %2$s and check there is no pending step.": [ - "El banco todavía no confirmó la transferencia. Ir a %1$s %2$s y verificar que no hay pasos pendientes." - ], - "Bank has confirmed the wire transfer. Waiting for the exchange to send the coins": [ - "El banco confirmó la transferencia. Esperando que el exchange envíe las monedas" - ], - "Details": [ - "Detalles" - ], - "Payment": [ - "Pago" - ], - "Refunds": [ - "Devoluciones" - ], - "%1$s %2$s on %3$s": [ - "%1$s %2$s en %3$s" - ], - "Merchant created a refund for this order but was not automatically picked up.": [ - "El comerciante creó una devolución para esta orden pero no fue recogida automáticamente." - ], - "Offer": [ - "Oferta" - ], - "Accept": [ - "Aceptar" - ], - "Merchant": [ - "Comerciante" - ], - "Invoice ID": [ - "Id de factura" - ], - "Deposit": [ - "Depósito" - ], - "Refresh": [ - "Actualizar" - ], - "Tip": [ - "Propina" - ], - "Refund": [ - "Devolución" - ], - "Original order ID": [ - "Id de orden original" - ], - "Purchase summary": [ - "Resumen de compra" - ], - "copy": [ - "Copiar" - ], - "hide qr": [ - "Esconder QR" - ], - "show qr": [ - "Mostrar QR" - ], - "Credit": [ - "Crédito" - ], - "Invoice": [ - "Factura" - ], - "Exchange": [ - "Exchange" - ], - "URI": [ - "URI" - ], - "Debit": [ - "Débito" - ], - "Transfer": [ - "Transferencia" - ], - "Country": [ - "País" - ], - "Address lines": [ - "Detalle de dirección" - ], - "Building number": [ - "Número de edificio" - ], - "Building name": [ - "Nombre de edificio" - ], - "Street": [ - "Calle" - ], - "Post code": [ - "Código postal" - ], - "Town location": [ - "Ubicación de la ciudad" - ], - "Town": [ - "Ciudad" - ], - "District": [ - "Distrito" - ], - "Country subdivision": [ - "Subdivisión de país" - ], - "Date": [ - "Fecha" - ], - "Transaction fees": [ - "Comisiones de transacción" - ], - "Total": [ - "Total" - ], - "Withdraw": [ - "Retirar" - ], - "Price": [ - "Precio" - ], - "Refunded": [ - "Devuelto" - ], - "Delivery": [ - "Entrega" - ], - "Total transfer": [ - "Total transferido" - ], - "Could not load pay status": [ - "No se pudo cargar el estado del pago" - ], - "Digital cash payment": [ - "Pago con dinero digital" - ], - "Purchase": [ - "Compra" - ], - "Receipt": [ - "Recibo" - ], - "Valid until": [ - "Válido hasta" - ], - "List of products": [ - "Lista de productos" - ], - "free": [ - "Gratis" - ], - "Already paid, you are going to be redirected to %1$s": [ - "Ya pagado, estás siendo dirigido a %1$s" - ], - "Already paid": [ - "Ya pagado" - ], - "Already claimed": [ - "Ya reclamado" - ], - "Pay with a mobile phone": [ - "Pagar con un teléfono móbil" - ], - "Hide QR": [ - "Esconder QR" - ], - "Scan the QR code or   %1$s": [ - "Escanear el código QR o %1$s" - ], - "Pay   %1$s": [ - "Pagar %1$s" - ], - "You have no balance for this currency. Withdraw digital cash first.": [ - "No hay balance para esta divisa. Extraer dinero digital primero." - ], - "Could not find enough coins to pay. Even if you have enough %1$s some restriction may apply.": [ - "No se encontraron suficientes monedas para pagar. Incluso si tuviera suficiente %1$s algunas restricciones se podrían aplicar." - ], - "Your current balance is not enough.": [ - "Tu balance no es suficiente." - ], - "Merchant message": [ - "Mensaje del comerciante" - ], - "Could not load refund status": [ - "No se pudo cargar el estado de la devolución" - ], - "Digital cash refund": [ - "Devolución de dinero digital" - ], - "You've ignored the tip.": [ - "Has ignorado la propina." - ], - "The refund is in progress.": [ - "El proceso de devolución está en progreso." - ], - "Total to refund": [ - "Total para devolver" - ], - "The merchant "%1$s" is offering you a refund.": [ - "El comerciante \"%1$s\" te está ofreciendo una devolución." - ], - "Order amount": [ - "Monto de la orden" - ], - "Already refunded": [ - "Ya devuelto" - ], - "Refund offered": [ - "Devolución ofrecida" - ], - "Accept   %1$s": [ - "Aceptar %1$s" - ], - "Could not load tip status": [ - "No se pudo cargar el estado de la propina" - ], - "Digital cash tip": [ - "Propina con dinero digital" - ], - "The merchant is offering you a tip": [ - "El comerciante te ofrece una propina" - ], - "Merchant URL": [ - "URL del comerciante" - ], - "Receive   %1$s": [ - "Recibir %1$s" - ], - "Tip from %1$s accepted. Check your transactions list for more details.": [ - "Propina de %1$s aceptada. Revisa tu lista de transacciones para más detalle." - ], - "Select one option": [ - "Seleccione una opción" - ], - "Could not load": [ - "No se pudo cargar" - ], - "Show terms of service": [ - "Mostrar términos de servicio" - ], - "I accept the exchange terms of service": [ - "Yo acepto los términos de servicio del exchange" - ], - "Exchange doesn't have terms of service": [ - "El exchange no tiene los términos de servicio" - ], - "Review exchange terms of service": [ - "Revisar los términos de servicio" - ], - "Review new version of terms of service": [ - "Revisar los nuevos términos de servicio" - ], - "The exchange reply with a empty terms of service": [ - "El exchange respondió con unos términos de servicio vacíos" - ], - "Download Terms of Service": [ - "Descargar los términos de servicio" - ], - "Hide terms of service": [ - "Esconder los términos de servicio" - ], - "Could not load exchange fees": [ - "No se pudo cargar la comisión del exchange" - ], - "Close": [ - "Cerrar" - ], - "could not find any exchange": [ - "No se pudo encontrar ningún exchange" - ], - "could not find any exchange for the currency %1$s": [ - "No se pudo encontrar ningún exchange para la divisa %1$s" - ], - "Service fee description": [ - "Descripción de comisión de servicio" - ], - "Select %1$s exchange": [ - "Seleccionar exchange %1$s" - ], - "Reset": [ - "Reiniciar" - ], - "Use this exchange": [ - "Usar este exchange" - ], - "Doesn't have auditors": [ - "No tiene auditores" - ], - "currency": [ - "Divisa" - ], - "Operations": [ - "Operaciones" - ], - "Deposits": [ - "Depósitos" - ], - "Denomination": [ - "Operaciones" - ], - "Until": [ - "Hasta" - ], - "Withdrawals": [ - "Retiradas" - ], - "Currency": [ - "Divisa" - ], - "Coin operations": [ - "Operaciones de moneda" - ], - "Every operation in this section may be different by denomination value and is valid for a period of time. The exchange will charge the indicated amount every time a coin is used in such operation.": [ - "Toda operación en esta sección puede ser diferente por valor de denominación y es válida por un período. El exchange cobrará el monto indicado cada vez que una es usada en dicha operación." - ], - "Transfer operations": [ - "Operaciones de transferencia" - ], - "Every operation in this section may be different by transfer type and is valid for a period of time. The exchange will charge the indicated amount every time a transfer is made.": [ - "Toda operación en esta sección puede ser diferente por tipo de transacción y es válida por un período. El exchange cobrará el monto indicado cada vez que se haga una transferencia." - ], - "Operation": [ - "Operación" - ], - "Wallet operations": [ - "Operaciones de billetera" - ], - "Feature": [ - "Característica" - ], - "Could not get the info from the URI": [ - "No se pudo obtener la información desde la URI" - ], - "Could not get info of withdrawal": [ - "No se pudo obtener la información de retiro" - ], - "Digital cash withdrawal": [ - "Retirada de dinero digital" - ], - "Could not finish the withdrawal operation": [ - "No se pudo completar la operación de retirada" - ], - "Age restriction": [ - "Restricción etaria" - ], - "Withdraw   %1$s": [ - "Retirar %1$s" - ], - "Withdraw to a mobile phone": [ - "Retirar con un teléfono móvil" - ], - "Digital invoice": [ - "Factura digital" - ], - "Could not finish the invoice creation": [ - "No se pudo completar la creación de la factura" - ], - "Create": [ - "Crear" - ], - "Could not finish the payment operation": [ - "No se pudo completar la operación de pago" - ], - "Digital cash transfer": [ - "Transferencia de dinero digital" - ], - "Could not finish the transfer creation": [ - "No se pudo completar la operación de creación de transferencia" - ], - "Could not finish the pickup operation": [ - "No se pudo completar la operación de recolección" - ], - "Manual Withdrawal for %1$s": [ - "Retirada Manual para %1$s" - ], - "Choose a exchange from where the coins will be withdrawn. The exchange will send the coins to this wallet after receiving a wire transfer with the correct subject.": [ - "Elija un exchange desde donde las monedas serán retiradas. El exchange enviará las monedas a esta billetera después de recibir una transferencia bancaria con el asunto correcto." - ], - "No exchange found for %1$s": [ - "No se encontró exchange para %1$s" - ], - "Add Exchange": [ - "Agregar Exchange" - ], - "No exchange configured": [ - "Sin exchange configurado" - ], - "Can't create the reserve": [ - "No se pudo crear una reserva" - ], - "Start withdrawal": [ - "Comenzar la retirada" - ], - "Could not load deposit balance": [ - "No se pudo cargar el balance de depósito" - ], - "A currency or an amount should be indicated": [ - "Se debería especificar una divisa o un monto" - ], - "There is no enough balance to make a deposit for currency %1$s": [ - "No hay suficiente balance para hacer un depósito para la divisa %1$s" - ], - "Send %1$s to your account": [ - "Enviar %1$s a tu cuenta" - ], - "There is no account to make a deposit for currency %1$s": [ - "No hay una cuenta para hacer un depósito para la divisa %1$s" - ], - "Add account": [ - "Agregar cuenta" - ], - "Select account": [ - "Seleccionar cuenta" - ], - "Add another account": [ - "Agregar otra cuenta" - ], - "Deposit fee": [ - "Comisión de depósito" - ], - "Total deposit": [ - "Depósito total" - ], - "Deposit %1$s %2$s": [ - "Depositar %1$s %2$s" - ], - "Add bank account for %1$s": [ - "Agregar cuenta de banco para %1$s" - ], - "Enter the URL of an exchange you trust.": [ - "Ingresar la URL de un exchange en el que confíes." - ], - "Unable add this account": [ - "No fue posible agregar esta cuenta" - ], - "Select account type": [ - "Seleccione un tipo de cuenta" - ], - "Review terms of service": [ - "Revisar los términos de servicio" - ], - "Exchange URL": [ - "Exchange URL" - ], - "Add exchange": [ - "Agregar exchange" - ], - "Add new exchange": [ - "Agregar nuevo exchange" - ], - "Add exchange for %1$s": [ - "Agregar exchange para %1$s" - ], - "An exchange has been found! Review the information and click next": [ - "Un exchange ha sido encontrado! Revisa la información y haz clic en siguiente" - ], - "This exchange doesn't match the expected currency %1$s": [ - "Este exchange no coincide con la divisa %1$s esperada" - ], - "Unable to verify this exchange": [ - "No fue posible verificar este exchange" - ], - "Unable to add this exchange": [ - "No fue posible agregar este exchange" - ], - "loading": [ - "cargando" - ], - "Version": [ - "Versión" - ], - "Next": [ - "Siguiente" - ], - "Waiting for confirmation": [ - "Esperando confirmación" - ], - "PENDING": [ - "PENDIENTE" - ], - "Could not load the list of transactions": [ - "No se pudo cargar la lista de transacciones" - ], - "Your transaction history is empty for this currency.": [ - "No hay historial para esta divisa." - ], - "Add backup provider": [ - "Agregar proveedor de copias de seguridad" - ], - "Could not get provider information": [ - "No se pudo conseguir la información del proveedor" - ], - "Backup providers may charge for their service": [ - "Los proveedores de copias de seguridad pueden cobrarte por su servicio" - ], - "URL": [ - "URL" - ], - "Name": [ - "Nombre" - ], - "Provider URL": [ - "URL del proveedor" - ], - "Please review and accept this provider's terms of service": [ - "Por favor revisa y acepta los términos de servicio del proveedor" - ], - "Pricing": [ - "Precios" - ], - "free of charge": [ - "Gratis" - ], - "%1$s per year of service": [ - "%1$s por año de servicio" - ], - "Storage": [ - "Alamcenamiento" - ], - "%1$s megabytes of storage per year of service": [ - "%1$s megabytes de almacenamiento por año de servicio" - ], - "Accept terms of service": [ - "Aceptar los términos de servicio" - ], - "Could not parse the payto URI": [ - "No se pudo obtener la información de la URI payto" - ], - "Please check the uri": [ - "Revisar la URI" - ], - "Exchange is ready for withdrawal": [ - "El exchange está listo para la retirada" - ], - "To complete the process you need to wire%1$s %2$s to the exchange bank account": [ - "Para completar el proceso necesitas transferir %1$s %2$s a la cuenta bancaria del exchange" - ], - "Alternative, you can also scan this QR code or open %1$s if you have a banking app installed that supports RFC 8905": [ - "Alternativamente, también puedes escanear el código QR o abrir %1$s si tienes una App bancaria instalada que soporta RFC 8905" - ], - "Cancel withdrawal": [ - "Cancelar retirada" - ], - "Could not toggle auto-open": [ - "No se pudo cambiar el auto-open" - ], - "Could not toggle clipboard": [ - "No se pudo cambiar portapapeles" - ], - "Navigator": [ - "Navegador" - ], - "Automatically open wallet based on page content": [ - "Abrir automáticamente la billetera basada en el contenido de la página" - ], - "Enabling this option below will make using the wallet faster, but requires more permissions from your browser.": [ - "Habilitar la opción de debajo, hará que el uso de la billetera sea mas rápido, pero requiere más permisos de tu navegador." - ], - "Automatically check clipboard for Taler URI": [ - "Revisar el portapapeles automáticamente por Taler URI" - ], - "Trust": [ - "Confianza" - ], - "No exchange yet": [ - "No hay exchanges todavía" - ], - "Term of Service": [ - "Términos de servicio" - ], - "ok": [ - "ok" - ], - "changed": [ - "modificado" - ], - "not accepted": [ - "no aceptado" - ], - "unknown (exchange status should be updated)": [ - "desconocido (el estado del exchange debería actualizarse)" - ], - "Add an exchange": [ - "Agregar un exchange" - ], - "Troubleshooting": [ - "Solución de problemas" - ], - "Developer mode": [ - "Modo desarrollador" - ], - "More options and information useful for debugging": [ - "Más información y opciones útiles para depuración" - ], - "Display": [ - "Pantalla" - ], - "Current Language": [ - "Lenguaje actual" - ], - "Wallet Core": [ - "Wallet core" - ], - "Web Extension": [ - "Web Extension" - ], - "Exchange compatibility": [ - "Compatibilidad con Exchange" - ], - "Merchant compatibility": [ - "Compatibilidad con Merchant" - ], - "Bank compatibility": [ - "Compatibilidad con Bank" - ], - "Browser Extension Installed!": [ - "Extensión del navegador instalada!" - ], - "You can open the GNU Taler Wallet using the combination %1$s .": [ - "Puedes abrir GNU Taler Wallet usando la combinación %1$s." - ], - "Also pinning the GNU Taler Wallet to your Chrome browser allows you to quick access without keyboard:": [ - "También fijando GNU Taler Wallet a to navegador Chrome permite un acceso rápido sin el teclado:" - ], - "Click the puzzle icon": [ - "Haz click en el ícono de rompecabezas" - ], - "Search for GNU Taler Wallet": [ - "Busca \"GNU Taler Wallet\"" - ], - "Click the pin icon": [ - "Haz click en el ícono de fijar" - ], - "Permissions": [ - "Permisos" - ], - "(Enabling this option below will make using the wallet faster, but requires more permissions from your browser.)": [ - "(Habilitar esta opción de abajo hará el uso de la billetera mas rápido, pero requiere mas permisos de tu navegador)" - ], - "Next Steps": [ - "Próximos pasos" - ], - "Try the demo": [ - "Probar la demostración" - ], - "Learn how to top up your wallet balance": [ - "Aprender como llenar tu billetera" - ], - "Diagnostics timed out. Could not talk to the wallet backend.": [ - "El diagnóstico caducó. No nos pudimos comunicar con la billetera." - ], - "Problems detected:": [ - "Problemas detectados:" - ], - "Please check in your %1$s settings that you have IndexedDB enabled (check the preference name %2$s).": [ - "Por favor revisa en tu configuración %1$s que tienes IndexedDB habilitado (el nombre de la preferencia %2$s)." - ], - "Your wallet database is outdated. Currently automatic migration is not supported. Please go %1$s to reset the wallet database.": [ - "La base de datos de la billetera expiró. Por ahora la migración automática no está soportada. Por favor dirijasé a %1$s para reiniciar la base de datos de la billetera." - ], - "Running diagnostics": [ - "Ejecutando diagnósticos" - ], - "Debug tools": [ - "Herramientas de desarrollo" - ], - "Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?": [ - "Quieres DESTRUIR IRREVOCABLEMENTE todo dentro de tu billetera y PERDER TODAS TUS MONEDAS?" - ], - "reset": [ - "Reiniciar" - ], - "TESTING: This may delete all your coin, proceed with caution": [ - "TESTING: Esto puede borrar todas tus monedas, proceder con precaución" - ], - "run gc": [ - "Ejecutar GC" - ], - "import database": [ - "importar base de datos" - ], - "export database": [ - "exportar base de datos" - ], - "Database exported at %1$s %2$s to download": [ - "Base de datos exportada a %1$s %2$s para descargar" - ], - "Coins": [ - "Monedas" - ], - "Pending operations": [ - "Operaciones pendientes" - ], - "usable coins": [ - "monedas usables" - ], - "id": [ - "id" - ], - "denom": [ - "denominación" - ], - "value": [ - "valor" - ], - "status": [ - "estado" - ], - "from refresh?": [ - "desde refresco?" - ], - "age key count": [ - "cantidad de age key" - ], - "spent coins": [ - "monedas gastadas" - ], - "click to show": [ - "hacer clic para mostrar" - ], - "Scan a QR code or enter taler:// URI below": [ - "Escanear un código QR o ingresar taler:// URI debajo" - ], - "Open": [ - "Abrir" - ], - "URI is not valid. Taler URI should start with `taler://`": [ - "El URI no es válido. Taler URI debería comenzar con `taler://`" - ], - "Try another": [ - "Intentar otro" - ], - "Could not load list of exchange": [ - "No se pudo cargar la lista de exchange" - ], - "Choose a currency to proceed or add another exchange": [ - "Elija una divisa para proceder o agregue otro exchange" - ], - "Known currencies": [ - "Divisas conocidas" - ], - "Specify the amount and the origin": [ - "Indicar el monto y el origen" - ], - "Change currency": [ - "Cambiar divisa" - ], - "Use previous origins:": [ - "Usar un origen previo:" - ], - "Or specify the origin of the money": [ - "O especificar el origen del dinero" - ], - "Specify the origin of the money": [ - "Especificar el origen del dinero" - ], - "From my bank account": [ - "Desde mi cuenta de banco" - ], - "From another wallet": [ - "Desde otra billetera" - ], - "currency not provided": [ - "Divisa no provista" - ], - "Specify the amount and the destination": [ - "Especificar el monto y el destino" - ], - "Use previous destinations:": [ - "Usar destinos previos:" - ], - "Or specify the destination of the money": [ - "O especificar el destino del dinero" - ], - "Specify the destination of the money": [ - "Especificar el destino del dinero" - ], - "To my bank account": [ - "Hacia mi cuenta de banco" - ], - "To another wallet": [ - "Hacia otra billetera" - ], - "Could not load backup recovery information": [ - "No se pudo cargar la información de recuperación de copia de seguridad" - ], - "Digital wallet recovery": [ - "Recuperación de billetera digital" - ], - "Import backup, show info": [ - "Importar copia de seguridad, mostrar información" - ], - "All done, your transaction is in progress": [ - "Todo completo, su transacción está en progreso" - ], - "Edit": [ - "Editar" - ], - "Could not load the list of known exchanges": [ - "No se pudo cargar la lista de exchange conocidos" - ] - } - } -}; - -strings['fr'] = { - "domain": "messages", - "locale_data": { - "messages": { - "": { - "domain": "messages", - "plural_forms": "nplurals=2; plural=(n!=1);", - "lang": "fr" - }, - "Balance": [ - "" - ], - "Backup": [ - "" - ], - "QR Reader and Taler URI": [ - "" - ], - "Settings": [ - "" - ], - "Dev": [ - "" - ], - "%1$s": [ - "" - ], - "PENDING OPERATIONS": [ - "" - ], - "Loading": [ - "" - ], - "Could not load backup providers": [ - "" - ], - "No backup providers configured": [ - "" - ], - "Add provider": [ - "" - ], - "Sync all backups": [ - "" - ], - "Sync now": [ - "" - ], - "Last synced": [ - "" - ], - "Not synced": [ - "" - ], - "Expires in": [ - "" - ], - "There was an error loading the provider detail for " %1$s"": [ - "" - ], - "There is not known provider with url "%1$s".": [ - "" - ], - "See providers": [ - "" - ], - "Last backup": [ - "" - ], - "Back up": [ - "" - ], - "Provider fee": [ - "" - ], - "per year": [ - "" - ], - "Extend": [ - "" - ], - "terms has changed, extending the service will imply accepting the new terms of service": [ - "" - ], - "old": [ - "" - ], - "new": [ - "" - ], - "fee": [ - "" - ], - "storage": [ - "" - ], - "Remove provider": [ - "" - ], - "This provider has reported an error": [ - "" - ], - "There is conflict with another backup from %1$s": [ - "" - ], - "Backup is not readable": [ - "" - ], - "Unknown backup problem: %1$s": [ - "" - ], - "service paid": [ - "" - ], - "Backup valid until": [ - "" - ], - "Cancel": [ - "" - ], - "Open reserve page": [ - "" - ], - "Open pay page": [ - "" - ], - "Open refund page": [ - "" - ], - "Open tip page": [ - "" - ], - "Open withdraw page": [ - "" - ], - "Get digital cash": [ - "" - ], - "Could not load balance page": [ - "" - ], - "Add": [ - "" - ], - "Send %1$s": [ - "" - ], - "Taler Action": [ - "" - ], - "This page has pay action.": [ - "" - ], - "This page has a withdrawal action.": [ - "" - ], - "This page has a tip action.": [ - "" - ], - "This page has a notify reserve action.": [ - "" - ], - "Notify": [ - "" - ], - "This page has a refund action.": [ - "" - ], - "This page has a malformed taler uri.": [ - "" - ], - "Dismiss": [ - "" - ], - "this popup is being closed and you are being redirected to %1$s": [ - "" - ], - "Could not load purchase proposal details": [ - "" - ], - "Order Id": [ - "" - ], - "Summary": [ - "" - ], - "Amount": [ - "" - ], - "Merchant name": [ - "" - ], - "Merchant jurisdiction": [ - "" - ], - "Merchant address": [ - "" - ], - "Merchant logo": [ - "" - ], - "Merchant website": [ - "" - ], - "Merchant email": [ - "" - ], - "Merchant public key": [ - "" - ], - "Delivery date": [ - "" - ], - "Delivery location": [ - "" - ], - "Products": [ - "" - ], - "Created at": [ - "" - ], - "Refund deadline": [ - "" - ], - "Auto refund": [ - "" - ], - "Pay deadline": [ - "" - ], - "Fulfillment URL": [ - "" - ], - "Fulfillment message": [ - "" - ], - "Max deposit fee": [ - "" - ], - "Max fee": [ - "" - ], - "Minimum age": [ - "" - ], - "Wire fee amortization": [ - "" - ], - "Auditors": [ - "" - ], - "Exchanges": [ - "" - ], - "Bank account": [ - "" - ], - "Bitcoin address": [ - "" - ], - "IBAN": [ - "" - ], - "Could not load deposit status": [ - "" - ], - "Digital cash deposit": [ - "" - ], - "Cost": [ - "" - ], - "Fee": [ - "" - ], - "To be received": [ - "" - ], - "Send   %1$s": [ - "" - ], - "Bitcoin transfer details": [ - "" - ], - "The exchange need a transaction with 3 output, one output is the exchange account and the other two are segwit fake address for metadata with an minimum amount.": [ - "" - ], - "In bitcoincore wallet use 'Add Recipient' button to add two additional recipient and copy addresses and amounts": [ - "" - ], - "Make sure the amount show %1$s BTC, else you have to change the base unit to BTC": [ - "" - ], - "Account": [ - "" - ], - "Bank host": [ - "" - ], - "Bank transfer details": [ - "" - ], - "Subject": [ - "" - ], - "Receiver name": [ - "" - ], - "Could not load the transaction information": [ - "" - ], - "There was an error trying to complete the transaction": [ - "" - ], - "This transaction is not completed": [ - "" - ], - "Send": [ - "" - ], - "Retry": [ - "" - ], - "Forget": [ - "" - ], - "Caution!": [ - "" - ], - "If you have already wired money to the exchange you will loose the chance to get the coins form it.": [ - "" - ], - "Confirm": [ - "Confirmer" - ], - "Withdrawal": [ - "" - ], - "Make sure to use the correct subject, otherwise the money will not arrive in this wallet.": [ - "" - ], - "The bank did not yet confirmed the wire transfer. Go to the %1$s %2$s and check there is no pending step.": [ - "" - ], - "Bank has confirmed the wire transfer. Waiting for the exchange to send the coins": [ - "" - ], - "Details": [ - "" - ], - "Payment": [ - "" - ], - "Refunds": [ - "" - ], - "%1$s %2$s on %3$s": [ - "" - ], - "Merchant created a refund for this order but was not automatically picked up.": [ - "" - ], - "Offer": [ - "" - ], - "Accept": [ - "" - ], - "Merchant": [ - "" - ], - "Invoice ID": [ - "" - ], - "Deposit": [ - "" - ], - "Refresh": [ - "" - ], - "Tip": [ - "" - ], - "Refund": [ - "" - ], - "Original order ID": [ - "" - ], - "Purchase summary": [ - "" - ], - "copy": [ - "" - ], - "hide qr": [ - "" - ], - "show qr": [ - "" - ], - "Credit": [ - "" - ], - "Invoice": [ - "" - ], - "Exchange": [ - "" - ], - "URI": [ - "" - ], - "Debit": [ - "" - ], - "Transfer": [ - "" - ], - "Country": [ - "" - ], - "Address lines": [ - "" - ], - "Building number": [ - "" - ], - "Building name": [ - "" - ], - "Street": [ - "" - ], - "Post code": [ - "" - ], - "Town location": [ - "" - ], - "Town": [ - "" - ], - "District": [ - "" - ], - "Country subdivision": [ - "" - ], - "Date": [ - "" - ], - "Transaction fees": [ - "" - ], - "Total": [ - "" - ], - "Withdraw": [ - "" - ], - "Price": [ - "" - ], - "Refunded": [ - "" - ], - "Delivery": [ - "" - ], - "Total transfer": [ - "" - ], - "Could not load pay status": [ - "" - ], - "Digital cash payment": [ - "" - ], - "Purchase": [ - "" - ], - "Receipt": [ - "" - ], - "Valid until": [ - "" - ], - "List of products": [ - "" - ], - "free": [ - "" - ], - "Already paid, you are going to be redirected to %1$s": [ - "" - ], - "Already paid": [ - "" - ], - "Already claimed": [ - "" - ], - "Pay with a mobile phone": [ - "" - ], - "Hide QR": [ - "" - ], - "Scan the QR code or   %1$s": [ - "" - ], - "Pay   %1$s": [ - "" - ], - "You have no balance for this currency. Withdraw digital cash first.": [ - "" - ], - "Could not find enough coins to pay. Even if you have enough %1$s some restriction may apply.": [ - "" - ], - "Your current balance is not enough.": [ - "" - ], - "Merchant message": [ - "" - ], - "Could not load refund status": [ - "" - ], - "Digital cash refund": [ - "" - ], - "You've ignored the tip.": [ - "" - ], - "The refund is in progress.": [ - "" - ], - "Total to refund": [ - "" - ], - "The merchant "%1$s" is offering you a refund.": [ - "" - ], - "Order amount": [ - "" - ], - "Already refunded": [ - "" - ], - "Refund offered": [ - "" - ], - "Accept   %1$s": [ - "" - ], - "Could not load tip status": [ - "" - ], - "Digital cash tip": [ - "" - ], - "The merchant is offering you a tip": [ - "" - ], - "Merchant URL": [ - "" - ], - "Receive   %1$s": [ - "" - ], - "Tip from %1$s accepted. Check your transactions list for more details.": [ - "" - ], - "Select one option": [ - "" - ], - "Could not load": [ - "" - ], - "Show terms of service": [ - "" - ], - "I accept the exchange terms of service": [ - "" - ], - "Exchange doesn't have terms of service": [ - "" - ], - "Review exchange terms of service": [ - "" - ], - "Review new version of terms of service": [ - "" - ], - "The exchange reply with a empty terms of service": [ - "" - ], - "Download Terms of Service": [ - "" - ], - "Hide terms of service": [ - "" - ], - "Could not load exchange fees": [ - "" - ], - "Close": [ - "" - ], - "could not find any exchange": [ - "" - ], - "could not find any exchange for the currency %1$s": [ - "" - ], - "Service fee description": [ - "" - ], - "Select %1$s exchange": [ - "" - ], - "Reset": [ - "" - ], - "Use this exchange": [ - "" - ], - "Doesn't have auditors": [ - "" - ], - "currency": [ - "" - ], - "Operations": [ - "" - ], - "Deposits": [ - "" - ], - "Denomination": [ - "" - ], - "Until": [ - "" - ], - "Withdrawals": [ - "" - ], - "Currency": [ - "" - ], - "Coin operations": [ - "" - ], - "Every operation in this section may be different by denomination value and is valid for a period of time. The exchange will charge the indicated amount every time a coin is used in such operation.": [ - "" - ], - "Transfer operations": [ - "" - ], - "Every operation in this section may be different by transfer type and is valid for a period of time. The exchange will charge the indicated amount every time a transfer is made.": [ - "" - ], - "Operation": [ - "" - ], - "Wallet operations": [ - "" - ], - "Feature": [ - "" - ], - "Could not get the info from the URI": [ - "" - ], - "Could not get info of withdrawal": [ - "" - ], - "Digital cash withdrawal": [ - "" - ], - "Could not finish the withdrawal operation": [ - "" - ], - "Age restriction": [ - "" - ], - "Withdraw   %1$s": [ - "" - ], - "Withdraw to a mobile phone": [ - "" - ], - "Digital invoice": [ - "" - ], - "Could not finish the invoice creation": [ - "" - ], - "Create": [ - "" - ], - "Could not finish the payment operation": [ - "" - ], - "Digital cash transfer": [ - "" - ], - "Could not finish the transfer creation": [ - "" - ], - "Could not finish the pickup operation": [ - "" - ], - "Manual Withdrawal for %1$s": [ - "" - ], - "Choose a exchange from where the coins will be withdrawn. The exchange will send the coins to this wallet after receiving a wire transfer with the correct subject.": [ - "" - ], - "No exchange found for %1$s": [ - "" - ], - "Add Exchange": [ - "" - ], - "No exchange configured": [ - "" - ], - "Can't create the reserve": [ - "" - ], - "Start withdrawal": [ - "" - ], - "Could not load deposit balance": [ - "" - ], - "A currency or an amount should be indicated": [ - "" - ], - "There is no enough balance to make a deposit for currency %1$s": [ - "" - ], - "Send %1$s to your account": [ - "" - ], - "There is no account to make a deposit for currency %1$s": [ - "" - ], - "Add account": [ - "" - ], - "Select account": [ - "" - ], - "Add another account": [ - "" - ], - "Deposit fee": [ - "" - ], - "Total deposit": [ - "" - ], - "Deposit %1$s %2$s": [ - "" - ], - "Add bank account for %1$s": [ - "" - ], - "Enter the URL of an exchange you trust.": [ - "" - ], - "Unable add this account": [ - "" - ], - "Select account type": [ - "" - ], - "Review terms of service": [ - "" - ], - "Exchange URL": [ - "" - ], - "Add exchange": [ - "" - ], - "Add new exchange": [ - "" - ], - "Add exchange for %1$s": [ - "" - ], - "An exchange has been found! Review the information and click next": [ - "" - ], - "This exchange doesn't match the expected currency %1$s": [ - "" - ], - "Unable to verify this exchange": [ - "" - ], - "Unable to add this exchange": [ - "" - ], - "loading": [ - "" - ], - "Version": [ - "" - ], - "Next": [ - "" - ], - "Waiting for confirmation": [ - "" - ], - "PENDING": [ - "" - ], - "Could not load the list of transactions": [ - "" - ], - "Your transaction history is empty for this currency.": [ - "" - ], - "Add backup provider": [ - "" - ], - "Could not get provider information": [ - "" - ], - "Backup providers may charge for their service": [ - "" - ], - "URL": [ - "" - ], - "Name": [ - "" - ], - "Provider URL": [ - "" - ], - "Please review and accept this provider's terms of service": [ - "" - ], - "Pricing": [ - "" - ], - "free of charge": [ - "" - ], - "%1$s per year of service": [ - "" - ], - "Storage": [ - "" - ], - "%1$s megabytes of storage per year of service": [ - "" - ], - "Accept terms of service": [ - "" - ], - "Could not parse the payto URI": [ - "" - ], - "Please check the uri": [ - "" - ], - "Exchange is ready for withdrawal": [ - "" - ], - "To complete the process you need to wire%1$s %2$s to the exchange bank account": [ - "" - ], - "Alternative, you can also scan this QR code or open %1$s if you have a banking app installed that supports RFC 8905": [ - "" - ], - "Cancel withdrawal": [ - "" - ], - "Could not toggle auto-open": [ - "" - ], - "Could not toggle clipboard": [ - "" - ], - "Navigator": [ - "" - ], - "Automatically open wallet based on page content": [ - "" - ], - "Enabling this option below will make using the wallet faster, but requires more permissions from your browser.": [ - "" - ], - "Automatically check clipboard for Taler URI": [ - "" - ], - "Trust": [ - "" - ], - "No exchange yet": [ - "" - ], - "Term of Service": [ - "" - ], - "ok": [ - "" - ], - "changed": [ - "" - ], - "not accepted": [ - "" - ], - "unknown (exchange status should be updated)": [ - "" - ], - "Add an exchange": [ - "" - ], - "Troubleshooting": [ - "" - ], - "Developer mode": [ - "" - ], - "More options and information useful for debugging": [ - "" - ], - "Display": [ - "" - ], - "Current Language": [ - "" - ], - "Wallet Core": [ - "" - ], - "Web Extension": [ - "" - ], - "Exchange compatibility": [ - "" - ], - "Merchant compatibility": [ - "" - ], - "Bank compatibility": [ - "" - ], - "Browser Extension Installed!": [ - "" - ], - "You can open the GNU Taler Wallet using the combination %1$s .": [ - "" - ], - "Also pinning the GNU Taler Wallet to your Chrome browser allows you to quick access without keyboard:": [ - "" - ], - "Click the puzzle icon": [ - "" - ], - "Search for GNU Taler Wallet": [ - "" - ], - "Click the pin icon": [ - "" - ], - "Permissions": [ - "" - ], - "(Enabling this option below will make using the wallet faster, but requires more permissions from your browser.)": [ - "" - ], - "Next Steps": [ - "" - ], - "Try the demo": [ - "" - ], - "Learn how to top up your wallet balance": [ - "" - ], - "Diagnostics timed out. Could not talk to the wallet backend.": [ - "" - ], - "Problems detected:": [ - "" - ], - "Please check in your %1$s settings that you have IndexedDB enabled (check the preference name %2$s).": [ - "" - ], - "Your wallet database is outdated. Currently automatic migration is not supported. Please go %1$s to reset the wallet database.": [ - "" - ], - "Running diagnostics": [ - "" - ], - "Debug tools": [ - "" - ], - "Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?": [ - "" - ], - "reset": [ - "" - ], - "TESTING: This may delete all your coin, proceed with caution": [ - "" - ], - "run gc": [ - "" - ], - "import database": [ - "" - ], - "export database": [ - "" - ], - "Database exported at %1$s %2$s to download": [ - "" - ], - "Coins": [ - "" - ], - "Pending operations": [ - "" - ], - "usable coins": [ - "" - ], - "id": [ - "" - ], - "denom": [ - "" - ], - "value": [ - "" - ], - "status": [ - "" - ], - "from refresh?": [ - "" - ], - "age key count": [ - "" - ], - "spent coins": [ - "" - ], - "click to show": [ - "" - ], - "Scan a QR code or enter taler:// URI below": [ - "" - ], - "Open": [ - "" - ], - "URI is not valid. Taler URI should start with `taler://`": [ - "" - ], - "Try another": [ - "" - ], - "Could not load list of exchange": [ - "" - ], - "Choose a currency to proceed or add another exchange": [ - "" - ], - "Known currencies": [ - "" - ], - "Specify the amount and the origin": [ - "" - ], - "Change currency": [ - "" - ], - "Use previous origins:": [ - "" - ], - "Or specify the origin of the money": [ - "" - ], - "Specify the origin of the money": [ - "" - ], - "From my bank account": [ - "" - ], - "From another wallet": [ - "" - ], - "currency not provided": [ - "" - ], - "Specify the amount and the destination": [ - "" - ], - "Use previous destinations:": [ - "" - ], - "Or specify the destination of the money": [ - "" - ], - "Specify the destination of the money": [ - "" - ], - "To my bank account": [ - "" - ], - "To another wallet": [ - "" - ], - "Could not load backup recovery information": [ - "" - ], - "Digital wallet recovery": [ - "" - ], - "Import backup, show info": [ - "" - ], - "All done, your transaction is in progress": [ - "" - ], - "Edit": [ - "" - ], - "Could not load the list of known exchanges": [ - "" - ] - } - } -}; - -strings['it'] = { - "domain": "messages", - "locale_data": { - "messages": { - "": { - "domain": "messages", - "plural_forms": "nplurals=2; plural=n != 1;", - "lang": "it" - }, - "Balance": [ - "" - ], - "Backup": [ - "" - ], - "QR Reader and Taler URI": [ - "" - ], - "Settings": [ - "" - ], - "Dev": [ - "" - ], - "%1$s": [ - "" - ], - "PENDING OPERATIONS": [ - "" - ], - "Loading": [ - "" - ], - "Could not load backup providers": [ - "" - ], - "No backup providers configured": [ - "" - ], - "Add provider": [ - "" - ], - "Sync all backups": [ - "" - ], - "Sync now": [ - "" - ], - "Last synced": [ - "" - ], - "Not synced": [ - "" - ], - "Expires in": [ - "" - ], - "There was an error loading the provider detail for " %1$s"": [ - "" - ], - "There is not known provider with url "%1$s".": [ - "" - ], - "See providers": [ - "" - ], - "Last backup": [ - "" - ], - "Back up": [ - "" - ], - "Provider fee": [ - "" - ], - "per year": [ - "" - ], - "Extend": [ - "" - ], - "terms has changed, extending the service will imply accepting the new terms of service": [ - "" - ], - "old": [ - "" - ], - "new": [ - "" - ], - "fee": [ - "" - ], - "storage": [ - "" - ], - "Remove provider": [ - "" - ], - "This provider has reported an error": [ - "" - ], - "There is conflict with another backup from %1$s": [ - "" - ], - "Backup is not readable": [ - "" - ], - "Unknown backup problem: %1$s": [ - "" - ], - "service paid": [ - "" - ], - "Backup valid until": [ - "" - ], - "Cancel": [ - "" - ], - "Open reserve page": [ - "" - ], - "Open pay page": [ - "" - ], - "Open refund page": [ - "" - ], - "Open tip page": [ - "" - ], - "Open withdraw page": [ - "" - ], - "Get digital cash": [ - "" - ], - "Could not load balance page": [ - "" - ], - "Add": [ - "" - ], - "Send %1$s": [ - "" - ], - "Taler Action": [ - "" - ], - "This page has pay action.": [ - "" - ], - "This page has a withdrawal action.": [ - "" - ], - "This page has a tip action.": [ - "" - ], - "This page has a notify reserve action.": [ - "" - ], - "Notify": [ - "" - ], - "This page has a refund action.": [ - "" - ], - "This page has a malformed taler uri.": [ - "" - ], - "Dismiss": [ - "" - ], - "this popup is being closed and you are being redirected to %1$s": [ - "" - ], - "Could not load purchase proposal details": [ - "" - ], - "Order Id": [ - "" - ], - "Summary": [ - "" - ], - "Amount": [ - "" - ], - "Merchant name": [ - "" - ], - "Merchant jurisdiction": [ - "" - ], - "Merchant address": [ - "" - ], - "Merchant logo": [ - "" - ], - "Merchant website": [ - "" - ], - "Merchant email": [ - "" - ], - "Merchant public key": [ - "" - ], - "Delivery date": [ - "" - ], - "Delivery location": [ - "" - ], - "Products": [ - "" - ], - "Created at": [ - "" - ], - "Refund deadline": [ - "" - ], - "Auto refund": [ - "" - ], - "Pay deadline": [ - "" - ], - "Fulfillment URL": [ - "" - ], - "Fulfillment message": [ - "" - ], - "Max deposit fee": [ - "" - ], - "Max fee": [ - "" - ], - "Minimum age": [ - "" - ], - "Wire fee amortization": [ - "" - ], - "Auditors": [ - "" - ], - "Exchanges": [ - "" - ], - "Bank account": [ - "" - ], - "Bitcoin address": [ - "" - ], - "IBAN": [ - "" - ], - "Could not load deposit status": [ - "" - ], - "Digital cash deposit": [ - "" - ], - "Cost": [ - "" - ], - "Fee": [ - "" - ], - "To be received": [ - "" - ], - "Send   %1$s": [ - "" - ], - "Bitcoin transfer details": [ - "" - ], - "The exchange need a transaction with 3 output, one output is the exchange account and the other two are segwit fake address for metadata with an minimum amount.": [ - "" - ], - "In bitcoincore wallet use 'Add Recipient' button to add two additional recipient and copy addresses and amounts": [ - "" - ], - "Make sure the amount show %1$s BTC, else you have to change the base unit to BTC": [ - "" - ], - "Account": [ - "" - ], - "Bank host": [ - "" - ], - "Bank transfer details": [ - "" - ], - "Subject": [ - "" - ], - "Receiver name": [ - "" - ], - "Could not load the transaction information": [ - "" - ], - "There was an error trying to complete the transaction": [ - "" - ], - "This transaction is not completed": [ - "" - ], - "Send": [ - "" - ], - "Retry": [ - "" - ], - "Forget": [ - "" - ], - "Caution!": [ - "" - ], - "If you have already wired money to the exchange you will loose the chance to get the coins form it.": [ - "" - ], - "Confirm": [ - "Confermare" - ], - "Withdrawal": [ - "" - ], - "Make sure to use the correct subject, otherwise the money will not arrive in this wallet.": [ - "" - ], - "The bank did not yet confirmed the wire transfer. Go to the %1$s %2$s and check there is no pending step.": [ - "" - ], - "Bank has confirmed the wire transfer. Waiting for the exchange to send the coins": [ - "" - ], - "Details": [ - "" - ], - "Payment": [ - "" - ], - "Refunds": [ - "" - ], - "%1$s %2$s on %3$s": [ - "" - ], - "Merchant created a refund for this order but was not automatically picked up.": [ - "" - ], - "Offer": [ - "" - ], - "Accept": [ - "" - ], - "Merchant": [ - "" - ], - "Invoice ID": [ - "" - ], - "Deposit": [ - "" - ], - "Refresh": [ - "" - ], - "Tip": [ - "" - ], - "Refund": [ - "" - ], - "Original order ID": [ - "" - ], - "Purchase summary": [ - "" - ], - "copy": [ - "" - ], - "hide qr": [ - "" - ], - "show qr": [ - "" - ], - "Credit": [ - "" - ], - "Invoice": [ - "" - ], - "Exchange": [ - "" - ], - "URI": [ - "" - ], - "Debit": [ - "" - ], - "Transfer": [ - "" - ], - "Country": [ - "" - ], - "Address lines": [ - "" - ], - "Building number": [ - "" - ], - "Building name": [ - "" - ], - "Street": [ - "" - ], - "Post code": [ - "" - ], - "Town location": [ - "" - ], - "Town": [ - "" - ], - "District": [ - "" - ], - "Country subdivision": [ - "" - ], - "Date": [ - "" - ], - "Transaction fees": [ - "" - ], - "Total": [ - "" - ], - "Withdraw": [ - "" - ], - "Price": [ - "" - ], - "Refunded": [ - "" - ], - "Delivery": [ - "" - ], - "Total transfer": [ - "" - ], - "Could not load pay status": [ - "" - ], - "Digital cash payment": [ - "" - ], - "Purchase": [ - "" - ], - "Receipt": [ - "" - ], - "Valid until": [ - "" - ], - "List of products": [ - "" - ], - "free": [ - "" - ], - "Already paid, you are going to be redirected to %1$s": [ - "" - ], - "Already paid": [ - "" - ], - "Already claimed": [ - "" - ], - "Pay with a mobile phone": [ - "" - ], - "Hide QR": [ - "" - ], - "Scan the QR code or   %1$s": [ - "" - ], - "Pay   %1$s": [ - "" - ], - "You have no balance for this currency. Withdraw digital cash first.": [ - "" - ], - "Could not find enough coins to pay. Even if you have enough %1$s some restriction may apply.": [ - "" - ], - "Your current balance is not enough.": [ - "" - ], - "Merchant message": [ - "" - ], - "Could not load refund status": [ - "" - ], - "Digital cash refund": [ - "" - ], - "You've ignored the tip.": [ - "" - ], - "The refund is in progress.": [ - "" - ], - "Total to refund": [ - "" - ], - "The merchant "%1$s" is offering you a refund.": [ - "" - ], - "Order amount": [ - "" - ], - "Already refunded": [ - "" - ], - "Refund offered": [ - "" - ], - "Accept   %1$s": [ - "" - ], - "Could not load tip status": [ - "" - ], - "Digital cash tip": [ - "" - ], - "The merchant is offering you a tip": [ - "" - ], - "Merchant URL": [ - "" - ], - "Receive   %1$s": [ - "" - ], - "Tip from %1$s accepted. Check your transactions list for more details.": [ - "" - ], - "Select one option": [ - "" - ], - "Could not load": [ - "" - ], - "Show terms of service": [ - "" - ], - "I accept the exchange terms of service": [ - "" - ], - "Exchange doesn't have terms of service": [ - "" - ], - "Review exchange terms of service": [ - "" - ], - "Review new version of terms of service": [ - "" - ], - "The exchange reply with a empty terms of service": [ - "" - ], - "Download Terms of Service": [ - "" - ], - "Hide terms of service": [ - "" - ], - "Could not load exchange fees": [ - "" - ], - "Close": [ - "" - ], - "could not find any exchange": [ - "" - ], - "could not find any exchange for the currency %1$s": [ - "" - ], - "Service fee description": [ - "" - ], - "Select %1$s exchange": [ - "" - ], - "Reset": [ - "" - ], - "Use this exchange": [ - "" - ], - "Doesn't have auditors": [ - "" - ], - "currency": [ - "" - ], - "Operations": [ - "" - ], - "Deposits": [ - "" - ], - "Denomination": [ - "" - ], - "Until": [ - "" - ], - "Withdrawals": [ - "" - ], - "Currency": [ - "" - ], - "Coin operations": [ - "" - ], - "Every operation in this section may be different by denomination value and is valid for a period of time. The exchange will charge the indicated amount every time a coin is used in such operation.": [ - "" - ], - "Transfer operations": [ - "" - ], - "Every operation in this section may be different by transfer type and is valid for a period of time. The exchange will charge the indicated amount every time a transfer is made.": [ - "" - ], - "Operation": [ - "" - ], - "Wallet operations": [ - "" - ], - "Feature": [ - "" - ], - "Could not get the info from the URI": [ - "" - ], - "Could not get info of withdrawal": [ - "" - ], - "Digital cash withdrawal": [ - "" - ], - "Could not finish the withdrawal operation": [ - "" - ], - "Age restriction": [ - "" - ], - "Withdraw   %1$s": [ - "" - ], - "Withdraw to a mobile phone": [ - "" - ], - "Digital invoice": [ - "" - ], - "Could not finish the invoice creation": [ - "" - ], - "Create": [ - "" - ], - "Could not finish the payment operation": [ - "" - ], - "Digital cash transfer": [ - "" - ], - "Could not finish the transfer creation": [ - "" - ], - "Could not finish the pickup operation": [ - "" - ], - "Manual Withdrawal for %1$s": [ - "" - ], - "Choose a exchange from where the coins will be withdrawn. The exchange will send the coins to this wallet after receiving a wire transfer with the correct subject.": [ - "" - ], - "No exchange found for %1$s": [ - "" - ], - "Add Exchange": [ - "" - ], - "No exchange configured": [ - "" - ], - "Can't create the reserve": [ - "" - ], - "Start withdrawal": [ - "" - ], - "Could not load deposit balance": [ - "" - ], - "A currency or an amount should be indicated": [ - "" - ], - "There is no enough balance to make a deposit for currency %1$s": [ - "" - ], - "Send %1$s to your account": [ - "" - ], - "There is no account to make a deposit for currency %1$s": [ - "" - ], - "Add account": [ - "" - ], - "Select account": [ - "" - ], - "Add another account": [ - "" - ], - "Deposit fee": [ - "" - ], - "Total deposit": [ - "" - ], - "Deposit %1$s %2$s": [ - "" - ], - "Add bank account for %1$s": [ - "" - ], - "Enter the URL of an exchange you trust.": [ - "" - ], - "Unable add this account": [ - "" - ], - "Select account type": [ - "" - ], - "Review terms of service": [ - "" - ], - "Exchange URL": [ - "" - ], - "Add exchange": [ - "" - ], - "Add new exchange": [ - "" - ], - "Add exchange for %1$s": [ - "" - ], - "An exchange has been found! Review the information and click next": [ - "" - ], - "This exchange doesn't match the expected currency %1$s": [ - "" - ], - "Unable to verify this exchange": [ - "" - ], - "Unable to add this exchange": [ - "" - ], - "loading": [ - "" - ], - "Version": [ - "" - ], - "Next": [ - "" - ], - "Waiting for confirmation": [ - "" - ], - "PENDING": [ - "" - ], - "Could not load the list of transactions": [ - "" - ], - "Your transaction history is empty for this currency.": [ - "" - ], - "Add backup provider": [ - "" - ], - "Could not get provider information": [ - "" - ], - "Backup providers may charge for their service": [ - "" - ], - "URL": [ - "" - ], - "Name": [ - "" - ], - "Provider URL": [ - "" - ], - "Please review and accept this provider's terms of service": [ - "" - ], - "Pricing": [ - "" - ], - "free of charge": [ - "" - ], - "%1$s per year of service": [ - "" - ], - "Storage": [ - "" - ], - "%1$s megabytes of storage per year of service": [ - "" - ], - "Accept terms of service": [ - "" - ], - "Could not parse the payto URI": [ - "" - ], - "Please check the uri": [ - "" - ], - "Exchange is ready for withdrawal": [ - "" - ], - "To complete the process you need to wire%1$s %2$s to the exchange bank account": [ - "" - ], - "Alternative, you can also scan this QR code or open %1$s if you have a banking app installed that supports RFC 8905": [ - "" - ], - "Cancel withdrawal": [ - "" - ], - "Could not toggle auto-open": [ - "" - ], - "Could not toggle clipboard": [ - "" - ], - "Navigator": [ - "" - ], - "Automatically open wallet based on page content": [ - "" - ], - "Enabling this option below will make using the wallet faster, but requires more permissions from your browser.": [ - "" - ], - "Automatically check clipboard for Taler URI": [ - "" - ], - "Trust": [ - "" - ], - "No exchange yet": [ - "" - ], - "Term of Service": [ - "" - ], - "ok": [ - "" - ], - "changed": [ - "" - ], - "not accepted": [ - "" - ], - "unknown (exchange status should be updated)": [ - "" - ], - "Add an exchange": [ - "" - ], - "Troubleshooting": [ - "" - ], - "Developer mode": [ - "" - ], - "More options and information useful for debugging": [ - "" - ], - "Display": [ - "" - ], - "Current Language": [ - "" - ], - "Wallet Core": [ - "" - ], - "Web Extension": [ - "" - ], - "Exchange compatibility": [ - "" - ], - "Merchant compatibility": [ - "" - ], - "Bank compatibility": [ - "" - ], - "Browser Extension Installed!": [ - "" - ], - "You can open the GNU Taler Wallet using the combination %1$s .": [ - "" - ], - "Also pinning the GNU Taler Wallet to your Chrome browser allows you to quick access without keyboard:": [ - "" - ], - "Click the puzzle icon": [ - "" - ], - "Search for GNU Taler Wallet": [ - "" - ], - "Click the pin icon": [ - "" - ], - "Permissions": [ - "" - ], - "(Enabling this option below will make using the wallet faster, but requires more permissions from your browser.)": [ - "" - ], - "Next Steps": [ - "" - ], - "Try the demo": [ - "" - ], - "Learn how to top up your wallet balance": [ - "" - ], - "Diagnostics timed out. Could not talk to the wallet backend.": [ - "" - ], - "Problems detected:": [ - "" - ], - "Please check in your %1$s settings that you have IndexedDB enabled (check the preference name %2$s).": [ - "" - ], - "Your wallet database is outdated. Currently automatic migration is not supported. Please go %1$s to reset the wallet database.": [ - "" - ], - "Running diagnostics": [ - "" - ], - "Debug tools": [ - "" - ], - "Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?": [ - "" - ], - "reset": [ - "" - ], - "TESTING: This may delete all your coin, proceed with caution": [ - "" - ], - "run gc": [ - "" - ], - "import database": [ - "" - ], - "export database": [ - "" - ], - "Database exported at %1$s %2$s to download": [ - "" - ], - "Coins": [ - "" - ], - "Pending operations": [ - "" - ], - "usable coins": [ - "" - ], - "id": [ - "" - ], - "denom": [ - "" - ], - "value": [ - "" - ], - "status": [ - "" - ], - "from refresh?": [ - "" - ], - "age key count": [ - "" - ], - "spent coins": [ - "" - ], - "click to show": [ - "" - ], - "Scan a QR code or enter taler:// URI below": [ - "" - ], - "Open": [ - "" - ], - "URI is not valid. Taler URI should start with `taler://`": [ - "" - ], - "Try another": [ - "" - ], - "Could not load list of exchange": [ - "" - ], - "Choose a currency to proceed or add another exchange": [ - "" - ], - "Known currencies": [ - "" - ], - "Specify the amount and the origin": [ - "" - ], - "Change currency": [ - "" - ], - "Use previous origins:": [ - "" - ], - "Or specify the origin of the money": [ - "" - ], - "Specify the origin of the money": [ - "" - ], - "From my bank account": [ - "" - ], - "From another wallet": [ - "" - ], - "currency not provided": [ - "" - ], - "Specify the amount and the destination": [ - "" - ], - "Use previous destinations:": [ - "" - ], - "Or specify the destination of the money": [ - "" - ], - "Specify the destination of the money": [ - "" - ], - "To my bank account": [ - "" - ], - "To another wallet": [ - "" - ], - "Could not load backup recovery information": [ - "" - ], - "Digital wallet recovery": [ - "" - ], - "Import backup, show info": [ - "" - ], - "All done, your transaction is in progress": [ - "" - ], - "Edit": [ - "" - ], - "Could not load the list of known exchanges": [ - "" - ] - } - } -}; - -strings['ja'] = { - "domain": "messages", - "locale_data": { - "messages": { - "": { - "domain": "messages", - "plural_forms": "nplurals=2; plural=n != 1;", - "lang": "ja" - }, - "Balance": [ - "残高" - ], - "Backup": [ - "バックアップ" - ], - "QR Reader and Taler URI": [ - "" - ], - "Settings": [ - "設定" - ], - "Dev": [ - "" - ], - "%1$s": [ - "" - ], - "PENDING OPERATIONS": [ - "" - ], - "Loading": [ - "" - ], - "Could not load backup providers": [ - "" - ], - "No backup providers configured": [ - "" - ], - "Add provider": [ - "" - ], - "Sync all backups": [ - "" - ], - "Sync now": [ - "" - ], - "Last synced": [ - "" - ], - "Not synced": [ - "" - ], - "Expires in": [ - "" - ], - "There was an error loading the provider detail for " %1$s"": [ - "" - ], - "There is not known provider with url "%1$s".": [ - "" - ], - "See providers": [ - "" - ], - "Last backup": [ - "" - ], - "Back up": [ - "" - ], - "Provider fee": [ - "" - ], - "per year": [ - "" - ], - "Extend": [ - "" - ], - "terms has changed, extending the service will imply accepting the new terms of service": [ - "" - ], - "old": [ - "" - ], - "new": [ - "" - ], - "fee": [ - "" - ], - "storage": [ - "" - ], - "Remove provider": [ - "" - ], - "This provider has reported an error": [ - "" - ], - "There is conflict with another backup from %1$s": [ - "" - ], - "Backup is not readable": [ - "" - ], - "Unknown backup problem: %1$s": [ - "" - ], - "service paid": [ - "" - ], - "Backup valid until": [ - "" - ], - "Cancel": [ - "" - ], - "Open reserve page": [ - "" - ], - "Open pay page": [ - "" - ], - "Open refund page": [ - "" - ], - "Open tip page": [ - "" - ], - "Open withdraw page": [ - "" - ], - "Get digital cash": [ - "" - ], - "Could not load balance page": [ - "" - ], - "Add": [ - "" - ], - "Send %1$s": [ - "" - ], - "Taler Action": [ - "" - ], - "This page has pay action.": [ - "" - ], - "This page has a withdrawal action.": [ - "" - ], - "This page has a tip action.": [ - "" - ], - "This page has a notify reserve action.": [ - "" - ], - "Notify": [ - "" - ], - "This page has a refund action.": [ - "" - ], - "This page has a malformed taler uri.": [ - "" - ], - "Dismiss": [ - "" - ], - "this popup is being closed and you are being redirected to %1$s": [ - "" - ], - "Could not load purchase proposal details": [ - "" - ], - "Order Id": [ - "" - ], - "Summary": [ - "" - ], - "Amount": [ - "" - ], - "Merchant name": [ - "" - ], - "Merchant jurisdiction": [ - "" - ], - "Merchant address": [ - "" - ], - "Merchant logo": [ - "" - ], - "Merchant website": [ - "" - ], - "Merchant email": [ - "" - ], - "Merchant public key": [ - "" - ], - "Delivery date": [ - "" - ], - "Delivery location": [ - "" - ], - "Products": [ - "" - ], - "Created at": [ - "" - ], - "Refund deadline": [ - "" - ], - "Auto refund": [ - "" - ], - "Pay deadline": [ - "" - ], - "Fulfillment URL": [ - "" - ], - "Fulfillment message": [ - "" - ], - "Max deposit fee": [ - "" - ], - "Max fee": [ - "" - ], - "Minimum age": [ - "" - ], - "Wire fee amortization": [ - "" - ], - "Auditors": [ - "" - ], - "Exchanges": [ - "" - ], - "Bank account": [ - "" - ], - "Bitcoin address": [ - "" - ], - "IBAN": [ - "" - ], - "Could not load deposit status": [ - "" - ], - "Digital cash deposit": [ - "" - ], - "Cost": [ - "" - ], - "Fee": [ - "" - ], - "To be received": [ - "" - ], - "Send   %1$s": [ - "" - ], - "Bitcoin transfer details": [ - "" - ], - "The exchange need a transaction with 3 output, one output is the exchange account and the other two are segwit fake address for metadata with an minimum amount.": [ - "" - ], - "In bitcoincore wallet use 'Add Recipient' button to add two additional recipient and copy addresses and amounts": [ - "" - ], - "Make sure the amount show %1$s BTC, else you have to change the base unit to BTC": [ - "" - ], - "Account": [ - "" - ], - "Bank host": [ - "" - ], - "Bank transfer details": [ - "" - ], - "Subject": [ - "" - ], - "Receiver name": [ - "" - ], - "Could not load the transaction information": [ - "" - ], - "There was an error trying to complete the transaction": [ - "" - ], - "This transaction is not completed": [ - "" - ], - "Send": [ - "" - ], - "Retry": [ - "" - ], - "Forget": [ - "" - ], - "Caution!": [ - "" - ], - "If you have already wired money to the exchange you will loose the chance to get the coins form it.": [ - "" - ], - "Confirm": [ - "" - ], - "Withdrawal": [ - "" - ], - "Make sure to use the correct subject, otherwise the money will not arrive in this wallet.": [ - "" - ], - "The bank did not yet confirmed the wire transfer. Go to the %1$s %2$s and check there is no pending step.": [ - "" - ], - "Bank has confirmed the wire transfer. Waiting for the exchange to send the coins": [ - "" - ], - "Details": [ - "" - ], - "Payment": [ - "" - ], - "Refunds": [ - "" - ], - "%1$s %2$s on %3$s": [ - "" - ], - "Merchant created a refund for this order but was not automatically picked up.": [ - "" - ], - "Offer": [ - "" - ], - "Accept": [ - "" - ], - "Merchant": [ - "" - ], - "Invoice ID": [ - "" - ], - "Deposit": [ - "" - ], - "Refresh": [ - "" - ], - "Tip": [ - "" - ], - "Refund": [ - "" - ], - "Original order ID": [ - "" - ], - "Purchase summary": [ - "" - ], - "copy": [ - "" - ], - "hide qr": [ - "" - ], - "show qr": [ - "" - ], - "Credit": [ - "" - ], - "Invoice": [ - "" - ], - "Exchange": [ - "" - ], - "URI": [ - "" - ], - "Debit": [ - "" - ], - "Transfer": [ - "" - ], - "Country": [ - "" - ], - "Address lines": [ - "" - ], - "Building number": [ - "" - ], - "Building name": [ - "" - ], - "Street": [ - "" - ], - "Post code": [ - "" - ], - "Town location": [ - "" - ], - "Town": [ - "" - ], - "District": [ - "" - ], - "Country subdivision": [ - "" - ], - "Date": [ - "" - ], - "Transaction fees": [ - "" - ], - "Total": [ - "" - ], - "Withdraw": [ - "撤退" - ], - "Price": [ - "" - ], - "Refunded": [ - "" - ], - "Delivery": [ - "" - ], - "Total transfer": [ - "" - ], - "Could not load pay status": [ - "" - ], - "Digital cash payment": [ - "" - ], - "Purchase": [ - "" - ], - "Receipt": [ - "" - ], - "Valid until": [ - "" - ], - "List of products": [ - "" - ], - "free": [ - "" - ], - "Already paid, you are going to be redirected to %1$s": [ - "" - ], - "Already paid": [ - "" - ], - "Already claimed": [ - "" - ], - "Pay with a mobile phone": [ - "" - ], - "Hide QR": [ - "" - ], - "Scan the QR code or   %1$s": [ - "" - ], - "Pay   %1$s": [ - "" - ], - "You have no balance for this currency. Withdraw digital cash first.": [ - "" - ], - "Could not find enough coins to pay. Even if you have enough %1$s some restriction may apply.": [ - "" - ], - "Your current balance is not enough.": [ - "表示するバランスがありません" - ], - "Merchant message": [ - "" - ], - "Could not load refund status": [ - "" - ], - "Digital cash refund": [ - "" - ], - "You've ignored the tip.": [ - "" - ], - "The refund is in progress.": [ - "" - ], - "Total to refund": [ - "" - ], - "The merchant "%1$s" is offering you a refund.": [ - "" - ], - "Order amount": [ - "" - ], - "Already refunded": [ - "" - ], - "Refund offered": [ - "" - ], - "Accept   %1$s": [ - "" - ], - "Could not load tip status": [ - "" - ], - "Digital cash tip": [ - "" - ], - "The merchant is offering you a tip": [ - "" - ], - "Merchant URL": [ - "" - ], - "Receive   %1$s": [ - "" - ], - "Tip from %1$s accepted. Check your transactions list for more details.": [ - "" - ], - "Select one option": [ - "" - ], - "Could not load": [ - "" - ], - "Show terms of service": [ - "" - ], - "I accept the exchange terms of service": [ - "" - ], - "Exchange doesn't have terms of service": [ - "" - ], - "Review exchange terms of service": [ - "" - ], - "Review new version of terms of service": [ - "" - ], - "The exchange reply with a empty terms of service": [ - "" - ], - "Download Terms of Service": [ - "" - ], - "Hide terms of service": [ - "" - ], - "Could not load exchange fees": [ - "" - ], - "Close": [ - "" - ], - "could not find any exchange": [ - "" - ], - "could not find any exchange for the currency %1$s": [ - "" - ], - "Service fee description": [ - "" - ], - "Select %1$s exchange": [ - "" - ], - "Reset": [ - "" - ], - "Use this exchange": [ - "" - ], - "Doesn't have auditors": [ - "" - ], - "currency": [ - "" - ], - "Operations": [ - "" - ], - "Deposits": [ - "" - ], - "Denomination": [ - "" - ], - "Until": [ - "" - ], - "Withdrawals": [ - "撤退" - ], - "Currency": [ - "" - ], - "Coin operations": [ - "" - ], - "Every operation in this section may be different by denomination value and is valid for a period of time. The exchange will charge the indicated amount every time a coin is used in such operation.": [ - "" - ], - "Transfer operations": [ - "" - ], - "Every operation in this section may be different by transfer type and is valid for a period of time. The exchange will charge the indicated amount every time a transfer is made.": [ - "" - ], - "Operation": [ - "" - ], - "Wallet operations": [ - "" - ], - "Feature": [ - "" - ], - "Could not get the info from the URI": [ - "" - ], - "Could not get info of withdrawal": [ - "" - ], - "Digital cash withdrawal": [ - "" - ], - "Could not finish the withdrawal operation": [ - "" - ], - "Age restriction": [ - "" - ], - "Withdraw   %1$s": [ - "" - ], - "Withdraw to a mobile phone": [ - "" - ], - "Digital invoice": [ - "" - ], - "Could not finish the invoice creation": [ - "" - ], - "Create": [ - "" - ], - "Could not finish the payment operation": [ - "" - ], - "Digital cash transfer": [ - "" - ], - "Could not finish the transfer creation": [ - "" - ], - "Could not finish the pickup operation": [ - "" - ], - "Manual Withdrawal for %1$s": [ - "" - ], - "Choose a exchange from where the coins will be withdrawn. The exchange will send the coins to this wallet after receiving a wire transfer with the correct subject.": [ - "" - ], - "No exchange found for %1$s": [ - "" - ], - "Add Exchange": [ - "" - ], - "No exchange configured": [ - "" - ], - "Can't create the reserve": [ - "" - ], - "Start withdrawal": [ - "" - ], - "Could not load deposit balance": [ - "" - ], - "A currency or an amount should be indicated": [ - "" - ], - "There is no enough balance to make a deposit for currency %1$s": [ - "" - ], - "Send %1$s to your account": [ - "" - ], - "There is no account to make a deposit for currency %1$s": [ - "" - ], - "Add account": [ - "" - ], - "Select account": [ - "" - ], - "Add another account": [ - "" - ], - "Deposit fee": [ - "" - ], - "Total deposit": [ - "" - ], - "Deposit %1$s %2$s": [ - "" - ], - "Add bank account for %1$s": [ - "" - ], - "Enter the URL of an exchange you trust.": [ - "" - ], - "Unable add this account": [ - "" - ], - "Select account type": [ - "" - ], - "Review terms of service": [ - "" - ], - "Exchange URL": [ - "" - ], - "Add exchange": [ - "" - ], - "Add new exchange": [ - "" - ], - "Add exchange for %1$s": [ - "" - ], - "An exchange has been found! Review the information and click next": [ - "" - ], - "This exchange doesn't match the expected currency %1$s": [ - "" - ], - "Unable to verify this exchange": [ - "" - ], - "Unable to add this exchange": [ - "" - ], - "loading": [ - "" - ], - "Version": [ - "" - ], - "Next": [ - "" - ], - "Waiting for confirmation": [ - "" - ], - "PENDING": [ - "" - ], - "Could not load the list of transactions": [ - "" - ], - "Your transaction history is empty for this currency.": [ - "" - ], - "Add backup provider": [ - "" - ], - "Could not get provider information": [ - "" - ], - "Backup providers may charge for their service": [ - "" - ], - "URL": [ - "" - ], - "Name": [ - "" - ], - "Provider URL": [ - "" - ], - "Please review and accept this provider's terms of service": [ - "" - ], - "Pricing": [ - "" - ], - "free of charge": [ - "" - ], - "%1$s per year of service": [ - "" - ], - "Storage": [ - "" - ], - "%1$s megabytes of storage per year of service": [ - "" - ], - "Accept terms of service": [ - "" - ], - "Could not parse the payto URI": [ - "" - ], - "Please check the uri": [ - "" - ], - "Exchange is ready for withdrawal": [ - "" - ], - "To complete the process you need to wire%1$s %2$s to the exchange bank account": [ - "" - ], - "Alternative, you can also scan this QR code or open %1$s if you have a banking app installed that supports RFC 8905": [ - "" - ], - "Cancel withdrawal": [ - "" - ], - "Could not toggle auto-open": [ - "" - ], - "Could not toggle clipboard": [ - "" - ], - "Navigator": [ - "" - ], - "Automatically open wallet based on page content": [ - "" - ], - "Enabling this option below will make using the wallet faster, but requires more permissions from your browser.": [ - "" - ], - "Automatically check clipboard for Taler URI": [ - "" - ], - "Trust": [ - "" - ], - "No exchange yet": [ - "" - ], - "Term of Service": [ - "" - ], - "ok": [ - "" - ], - "changed": [ - "" - ], - "not accepted": [ - "" - ], - "unknown (exchange status should be updated)": [ - "" - ], - "Add an exchange": [ - "" - ], - "Troubleshooting": [ - "" - ], - "Developer mode": [ - "" - ], - "More options and information useful for debugging": [ - "" - ], - "Display": [ - "" - ], - "Current Language": [ - "" - ], - "Wallet Core": [ - "" - ], - "Web Extension": [ - "" - ], - "Exchange compatibility": [ - "" - ], - "Merchant compatibility": [ - "" - ], - "Bank compatibility": [ - "" - ], - "Browser Extension Installed!": [ - "" - ], - "You can open the GNU Taler Wallet using the combination %1$s .": [ - "" - ], - "Also pinning the GNU Taler Wallet to your Chrome browser allows you to quick access without keyboard:": [ - "" - ], - "Click the puzzle icon": [ - "" - ], - "Search for GNU Taler Wallet": [ - "" - ], - "Click the pin icon": [ - "" - ], - "Permissions": [ - "" - ], - "(Enabling this option below will make using the wallet faster, but requires more permissions from your browser.)": [ - "" - ], - "Next Steps": [ - "" - ], - "Try the demo": [ - "" - ], - "Learn how to top up your wallet balance": [ - "" - ], - "Diagnostics timed out. Could not talk to the wallet backend.": [ - "" - ], - "Problems detected:": [ - "" - ], - "Please check in your %1$s settings that you have IndexedDB enabled (check the preference name %2$s).": [ - "" - ], - "Your wallet database is outdated. Currently automatic migration is not supported. Please go %1$s to reset the wallet database.": [ - "" - ], - "Running diagnostics": [ - "" - ], - "Debug tools": [ - "" - ], - "Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?": [ - "" - ], - "reset": [ - "" - ], - "TESTING: This may delete all your coin, proceed with caution": [ - "" - ], - "run gc": [ - "" - ], - "import database": [ - "" - ], - "export database": [ - "" - ], - "Database exported at %1$s %2$s to download": [ - "" - ], - "Coins": [ - "" - ], - "Pending operations": [ - "" - ], - "usable coins": [ - "" - ], - "id": [ - "" - ], - "denom": [ - "" - ], - "value": [ - "" - ], - "status": [ - "" - ], - "from refresh?": [ - "" - ], - "age key count": [ - "" - ], - "spent coins": [ - "" - ], - "click to show": [ - "" - ], - "Scan a QR code or enter taler:// URI below": [ - "" - ], - "Open": [ - "" - ], - "URI is not valid. Taler URI should start with `taler://`": [ - "" - ], - "Try another": [ - "" - ], - "Could not load list of exchange": [ - "" - ], - "Choose a currency to proceed or add another exchange": [ - "" - ], - "Known currencies": [ - "" - ], - "Specify the amount and the origin": [ - "" - ], - "Change currency": [ - "" - ], - "Use previous origins:": [ - "" - ], - "Or specify the origin of the money": [ - "" - ], - "Specify the origin of the money": [ - "" - ], - "From my bank account": [ - "" - ], - "From another wallet": [ - "" - ], - "currency not provided": [ - "" - ], - "Specify the amount and the destination": [ - "" - ], - "Use previous destinations:": [ - "" - ], - "Or specify the destination of the money": [ - "" - ], - "Specify the destination of the money": [ - "" - ], - "To my bank account": [ - "" - ], - "To another wallet": [ - "" - ], - "Could not load backup recovery information": [ - "" - ], - "Digital wallet recovery": [ - "" - ], - "Import backup, show info": [ - "" - ], - "All done, your transaction is in progress": [ - "" - ], - "Edit": [ - "" - ], - "Could not load the list of known exchanges": [ - "" - ] - } - } -}; - -strings['sv'] = { - "domain": "messages", - "locale_data": { - "messages": { - "": { - "domain": "messages", - "plural_forms": "nplurals=2; plural=n != 1;", - "lang": "sv" - }, - "Balance": [ - "Balans" - ], - "Backup": [ - "" - ], - "QR Reader and Taler URI": [ - "" - ], - "Settings": [ - "" - ], - "Dev": [ - "" - ], - "%1$s": [ - "" - ], - "PENDING OPERATIONS": [ - "" - ], - "Loading": [ - "" - ], - "Could not load backup providers": [ - "" - ], - "No backup providers configured": [ - "" - ], - "Add provider": [ - "" - ], - "Sync all backups": [ - "" - ], - "Sync now": [ - "" - ], - "Last synced": [ - "" - ], - "Not synced": [ - "" - ], - "Expires in": [ - "" - ], - "There was an error loading the provider detail for " %1$s"": [ - "" - ], - "There is not known provider with url "%1$s".": [ - "" - ], - "See providers": [ - "" - ], - "Last backup": [ - "" - ], - "Back up": [ - "" - ], - "Provider fee": [ - "" - ], - "per year": [ - "" - ], - "Extend": [ - "" - ], - "terms has changed, extending the service will imply accepting the new terms of service": [ - "" - ], - "old": [ - "" - ], - "new": [ - "" - ], - "fee": [ - "" - ], - "storage": [ - "" - ], - "Remove provider": [ - "" - ], - "This provider has reported an error": [ - "" - ], - "There is conflict with another backup from %1$s": [ - "" - ], - "Backup is not readable": [ - "" - ], - "Unknown backup problem: %1$s": [ - "" - ], - "service paid": [ - "" - ], - "Backup valid until": [ - "" - ], - "Cancel": [ - "Avbryt" - ], - "Open reserve page": [ - "" - ], - "Open pay page": [ - "" - ], - "Open refund page": [ - "" - ], - "Open tip page": [ - "" - ], - "Open withdraw page": [ - "Utbetalnings avgift" - ], - "Get digital cash": [ - "Utbetalnings avgifter:" - ], - "Could not load balance page": [ - "" - ], - "Add": [ - "" - ], - "Send %1$s": [ - "Välj %1$s" - ], - "Taler Action": [ - "" - ], - "This page has pay action.": [ - "" - ], - "This page has a withdrawal action.": [ - "" - ], - "This page has a tip action.": [ - "" - ], - "This page has a notify reserve action.": [ - "" - ], - "Notify": [ - "" - ], - "This page has a refund action.": [ - "" - ], - "This page has a malformed taler uri.": [ - "" - ], - "Dismiss": [ - "" - ], - "this popup is being closed and you are being redirected to %1$s": [ - "" - ], - "Could not load purchase proposal details": [ - "" - ], - "Order Id": [ - "" - ], - "Summary": [ - "" - ], - "Amount": [ - "" - ], - "Merchant name": [ - "" - ], - "Merchant jurisdiction": [ - "" - ], - "Merchant address": [ - "" - ], - "Merchant logo": [ - "" - ], - "Merchant website": [ - "" - ], - "Merchant email": [ - "" - ], - "Merchant public key": [ - "" - ], - "Delivery date": [ - "" - ], - "Delivery location": [ - "" - ], - "Products": [ - "" - ], - "Created at": [ - "" - ], - "Refund deadline": [ - "" - ], - "Auto refund": [ - "" - ], - "Pay deadline": [ - "" - ], - "Fulfillment URL": [ - "" - ], - "Fulfillment message": [ - "" - ], - "Max deposit fee": [ - "Depostitions avgift" - ], - "Max fee": [ - "" - ], - "Minimum age": [ - "" - ], - "Wire fee amortization": [ - "" - ], - "Auditors": [ - "" - ], - "Exchanges": [ - "Accepterade tjänsteleverantörer:" - ], - "Bank account": [ - "Övervisa till bank konto" - ], - "Bitcoin address": [ - "" - ], - "IBAN": [ - "" - ], - "Could not load deposit status": [ - "" - ], - "Digital cash deposit": [ - "" - ], - "Cost": [ - "" - ], - "Fee": [ - "" - ], - "To be received": [ - "" - ], - "Send   %1$s": [ - "" - ], - "Bitcoin transfer details": [ - "" - ], - "The exchange need a transaction with 3 output, one output is the exchange account and the other two are segwit fake address for metadata with an minimum amount.": [ - "" - ], - "In bitcoincore wallet use 'Add Recipient' button to add two additional recipient and copy addresses and amounts": [ - "" - ], - "Make sure the amount show %1$s BTC, else you have to change the base unit to BTC": [ - "" - ], - "Account": [ - "" - ], - "Bank host": [ - "" - ], - "Bank transfer details": [ - "" - ], - "Subject": [ - "" - ], - "Receiver name": [ - "" - ], - "Could not load the transaction information": [ - "" - ], - "There was an error trying to complete the transaction": [ - "" - ], - "This transaction is not completed": [ - "" - ], - "Send": [ - "" - ], - "Retry": [ - "" - ], - "Forget": [ - "" - ], - "Caution!": [ - "" - ], - "If you have already wired money to the exchange you will loose the chance to get the coins form it.": [ - "" - ], - "Confirm": [ - "Bekräfta" - ], - "Withdrawal": [ - "Utbetalnings avgift" - ], - "Make sure to use the correct subject, otherwise the money will not arrive in this wallet.": [ - "" - ], - "The bank did not yet confirmed the wire transfer. Go to the %1$s %2$s and check there is no pending step.": [ - "" - ], - "Bank has confirmed the wire transfer. Waiting for the exchange to send the coins": [ - "" - ], - "Details": [ - "" - ], - "Payment": [ - "Godkän betalning" - ], - "Refunds": [ - "" - ], - "%1$s %2$s on %3$s": [ - "Säljaren %1$sgav en återbetalning på %2$s.\n" - ], - "Merchant created a refund for this order but was not automatically picked up.": [ - "" - ], - "Offer": [ - "" - ], - "Accept": [ - "" - ], - "Merchant": [ - "" - ], - "Invoice ID": [ - "" - ], - "Deposit": [ - "Depostitions avgift" - ], - "Refresh": [ - "Återhämtnings avgift" - ], - "Tip": [ - "" - ], - "Refund": [ - "" - ], - "Original order ID": [ - "" - ], - "Purchase summary": [ - "" - ], - "copy": [ - "" - ], - "hide qr": [ - "" - ], - "show qr": [ - "" - ], - "Credit": [ - "" - ], - "Invoice": [ - "" - ], - "Exchange": [ - "" - ], - "URI": [ - "" - ], - "Debit": [ - "" - ], - "Transfer": [ - "" - ], - "Country": [ - "" - ], - "Address lines": [ - "" - ], - "Building number": [ - "" - ], - "Building name": [ - "" - ], - "Street": [ - "" - ], - "Post code": [ - "" - ], - "Town location": [ - "" - ], - "Town": [ - "" - ], - "District": [ - "" - ], - "Country subdivision": [ - "" - ], - "Date": [ - "" - ], - "Transaction fees": [ - "" - ], - "Total": [ - "" - ], - "Withdraw": [ - "Utbetalnings avgift" - ], - "Price": [ - "" - ], - "Refunded": [ - "" - ], - "Delivery": [ - "" - ], - "Total transfer": [ - "Utbetalnings avgift" - ], - "Could not load pay status": [ - "" - ], - "Digital cash payment": [ - "" - ], - "Purchase": [ - "" - ], - "Receipt": [ - "" - ], - "Valid until": [ - "" - ], - "List of products": [ - "" - ], - "free": [ - "" - ], - "Already paid, you are going to be redirected to %1$s": [ - "" - ], - "Already paid": [ - "" - ], - "Already claimed": [ - "" - ], - "Pay with a mobile phone": [ - "" - ], - "Hide QR": [ - "" - ], - "Scan the QR code or   %1$s": [ - "" - ], - "Pay   %1$s": [ - "" - ], - "You have no balance for this currency. Withdraw digital cash first.": [ - "" - ], - "Could not find enough coins to pay. Even if you have enough %1$s some restriction may apply.": [ - "" - ], - "Your current balance is not enough.": [ - "Du har ingen balans att visa. Behöver du\n %1$s att börja?\n" - ], - "Merchant message": [ - "" - ], - "Could not load refund status": [ - "" - ], - "Digital cash refund": [ - "" - ], - "You've ignored the tip.": [ - "" - ], - "The refund is in progress.": [ - "" - ], - "Total to refund": [ - "Utbetalnings avgift" - ], - "The merchant "%1$s" is offering you a refund.": [ - "Säljaren %1$s erbjuder följande:" - ], - "Order amount": [ - "Återhämtnings avgift" - ], - "Already refunded": [ - "" - ], - "Refund offered": [ - "" - ], - "Accept   %1$s": [ - "" - ], - "Could not load tip status": [ - "" - ], - "Digital cash tip": [ - "" - ], - "The merchant is offering you a tip": [ - "Säljaren %1$s erbjuder följande:" - ], - "Merchant URL": [ - "" - ], - "Receive   %1$s": [ - "" - ], - "Tip from %1$s accepted. Check your transactions list for more details.": [ - "" - ], - "Select one option": [ - "" - ], - "Could not load": [ - "" - ], - "Show terms of service": [ - "" - ], - "I accept the exchange terms of service": [ - "" - ], - "Exchange doesn't have terms of service": [ - "" - ], - "Review exchange terms of service": [ - "" - ], - "Review new version of terms of service": [ - "" - ], - "The exchange reply with a empty terms of service": [ - "" - ], - "Download Terms of Service": [ - "" - ], - "Hide terms of service": [ - "" - ], - "Could not load exchange fees": [ - "" - ], - "Close": [ - "" - ], - "could not find any exchange": [ - "Accepterade tjänsteleverantörer:" - ], - "could not find any exchange for the currency %1$s": [ - "" - ], - "Service fee description": [ - "" - ], - "Select %1$s exchange": [ - "Välj %1$s" - ], - "Reset": [ - "" - ], - "Use this exchange": [ - "Accepterade tjänsteleverantörer:" - ], - "Doesn't have auditors": [ - "" - ], - "currency": [ - "" - ], - "Operations": [ - "" - ], - "Deposits": [ - "Depostitions avgift" - ], - "Denomination": [ - "" - ], - "Until": [ - "" - ], - "Withdrawals": [ - "Utbetalnings avgift" - ], - "Currency": [ - "" - ], - "Coin operations": [ - "" - ], - "Every operation in this section may be different by denomination value and is valid for a period of time. The exchange will charge the indicated amount every time a coin is used in such operation.": [ - "" - ], - "Transfer operations": [ - "" - ], - "Every operation in this section may be different by transfer type and is valid for a period of time. The exchange will charge the indicated amount every time a transfer is made.": [ - "" - ], - "Operation": [ - "" - ], - "Wallet operations": [ - "" - ], - "Feature": [ - "" - ], - "Could not get the info from the URI": [ - "" - ], - "Could not get info of withdrawal": [ - "" - ], - "Digital cash withdrawal": [ - "" - ], - "Could not finish the withdrawal operation": [ - "" - ], - "Age restriction": [ - "" - ], - "Withdraw   %1$s": [ - "" - ], - "Withdraw to a mobile phone": [ - "" - ], - "Digital invoice": [ - "" - ], - "Could not finish the invoice creation": [ - "" - ], - "Create": [ - "" - ], - "Could not finish the payment operation": [ - "" - ], - "Digital cash transfer": [ - "" - ], - "Could not finish the transfer creation": [ - "" - ], - "Could not finish the pickup operation": [ - "" - ], - "Manual Withdrawal for %1$s": [ - "Utbetalnings avgift" - ], - "Choose a exchange from where the coins will be withdrawn. The exchange will send the coins to this wallet after receiving a wire transfer with the correct subject.": [ - "" - ], - "No exchange found for %1$s": [ - "Accepterade tjänsteleverantörer:" - ], - "Add Exchange": [ - "Accepterade tjänsteleverantörer:" - ], - "No exchange configured": [ - "" - ], - "Can't create the reserve": [ - "" - ], - "Start withdrawal": [ - "" - ], - "Could not load deposit balance": [ - "" - ], - "A currency or an amount should be indicated": [ - "" - ], - "There is no enough balance to make a deposit for currency %1$s": [ - "" - ], - "Send %1$s to your account": [ - "" - ], - "There is no account to make a deposit for currency %1$s": [ - "" - ], - "Add account": [ - "Övervisa till bank konto" - ], - "Select account": [ - "Övervisa till bank konto" - ], - "Add another account": [ - "Övervisa till bank konto" - ], - "Deposit fee": [ - "Depostitions avgift" - ], - "Total deposit": [ - "" - ], - "Deposit %1$s %2$s": [ - "Depostitions avgift" - ], - "Add bank account for %1$s": [ - "Accepterade tjänsteleverantörer:" - ], - "Enter the URL of an exchange you trust.": [ - "" - ], - "Unable add this account": [ - "" - ], - "Select account type": [ - "" - ], - "Review terms of service": [ - "" - ], - "Exchange URL": [ - "" - ], - "Add exchange": [ - "Accepterade tjänsteleverantörer:" - ], - "Add new exchange": [ - "Accepterade tjänsteleverantörer:" - ], - "Add exchange for %1$s": [ - "Accepterade tjänsteleverantörer:" - ], - "An exchange has been found! Review the information and click next": [ - "" - ], - "This exchange doesn't match the expected currency %1$s": [ - "" - ], - "Unable to verify this exchange": [ - "" - ], - "Unable to add this exchange": [ - "" - ], - "loading": [ - "" - ], - "Version": [ - "" - ], - "Next": [ - "" - ], - "Waiting for confirmation": [ - "" - ], - "PENDING": [ - "" - ], - "Could not load the list of transactions": [ - "" - ], - "Your transaction history is empty for this currency.": [ - "" - ], - "Add backup provider": [ - "" - ], - "Could not get provider information": [ - "" - ], - "Backup providers may charge for their service": [ - "" - ], - "URL": [ - "" - ], - "Name": [ - "" - ], - "Provider URL": [ - "" - ], - "Please review and accept this provider's terms of service": [ - "" - ], - "Pricing": [ - "" - ], - "free of charge": [ - "" - ], - "%1$s per year of service": [ - "" - ], - "Storage": [ - "" - ], - "%1$s megabytes of storage per year of service": [ - "" - ], - "Accept terms of service": [ - "" - ], - "Could not parse the payto URI": [ - "" - ], - "Please check the uri": [ - "" - ], - "Exchange is ready for withdrawal": [ - "Tjänsteleverantörer i plånboken:" - ], - "To complete the process you need to wire%1$s %2$s to the exchange bank account": [ - "" - ], - "Alternative, you can also scan this QR code or open %1$s if you have a banking app installed that supports RFC 8905": [ - "" - ], - "Cancel withdrawal": [ - "" - ], - "Could not toggle auto-open": [ - "" - ], - "Could not toggle clipboard": [ - "" - ], - "Navigator": [ - "" - ], - "Automatically open wallet based on page content": [ - "" - ], - "Enabling this option below will make using the wallet faster, but requires more permissions from your browser.": [ - "" - ], - "Automatically check clipboard for Taler URI": [ - "" - ], - "Trust": [ - "" - ], - "No exchange yet": [ - "" - ], - "Term of Service": [ - "" - ], - "ok": [ - "" - ], - "changed": [ - "" - ], - "not accepted": [ - "" - ], - "unknown (exchange status should be updated)": [ - "" - ], - "Add an exchange": [ - "Accepterade tjänsteleverantörer:" - ], - "Troubleshooting": [ - "" - ], - "Developer mode": [ - "" - ], - "More options and information useful for debugging": [ - "" - ], - "Display": [ - "" - ], - "Current Language": [ - "" - ], - "Wallet Core": [ - "" - ], - "Web Extension": [ - "" - ], - "Exchange compatibility": [ - "" - ], - "Merchant compatibility": [ - "" - ], - "Bank compatibility": [ - "" - ], - "Browser Extension Installed!": [ - "" - ], - "You can open the GNU Taler Wallet using the combination %1$s .": [ - "" - ], - "Also pinning the GNU Taler Wallet to your Chrome browser allows you to quick access without keyboard:": [ - "" - ], - "Click the puzzle icon": [ - "" - ], - "Search for GNU Taler Wallet": [ - "" - ], - "Click the pin icon": [ - "" - ], - "Permissions": [ - "" - ], - "(Enabling this option below will make using the wallet faster, but requires more permissions from your browser.)": [ - "" - ], - "Next Steps": [ - "" - ], - "Try the demo": [ - "" - ], - "Learn how to top up your wallet balance": [ - "" - ], - "Diagnostics timed out. Could not talk to the wallet backend.": [ - "" - ], - "Problems detected:": [ - "" - ], - "Please check in your %1$s settings that you have IndexedDB enabled (check the preference name %2$s).": [ - "" - ], - "Your wallet database is outdated. Currently automatic migration is not supported. Please go %1$s to reset the wallet database.": [ - "" - ], - "Running diagnostics": [ - "" - ], - "Debug tools": [ - "" - ], - "Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?": [ - "" - ], - "reset": [ - "" - ], - "TESTING: This may delete all your coin, proceed with caution": [ - "" - ], - "run gc": [ - "" - ], - "import database": [ - "" - ], - "export database": [ - "" - ], - "Database exported at %1$s %2$s to download": [ - "" - ], - "Coins": [ - "# Mynt" - ], - "Pending operations": [ - "" - ], - "usable coins": [ - "" - ], - "id": [ - "" - ], - "denom": [ - "" - ], - "value": [ - "Värde" - ], - "status": [ - "" - ], - "from refresh?": [ - "" - ], - "age key count": [ - "Övervisa till bank konto" - ], - "spent coins": [ - "" - ], - "click to show": [ - "" - ], - "Scan a QR code or enter taler:// URI below": [ - "" - ], - "Open": [ - "" - ], - "URI is not valid. Taler URI should start with `taler://`": [ - "" - ], - "Try another": [ - "" - ], - "Could not load list of exchange": [ - "" - ], - "Choose a currency to proceed or add another exchange": [ - "" - ], - "Known currencies": [ - "" - ], - "Specify the amount and the origin": [ - "" - ], - "Change currency": [ - "" - ], - "Use previous origins:": [ - "" - ], - "Or specify the origin of the money": [ - "" - ], - "Specify the origin of the money": [ - "" - ], - "From my bank account": [ - "Övervisa till bank konto" - ], - "From another wallet": [ - "" - ], - "currency not provided": [ - "" - ], - "Specify the amount and the destination": [ - "" - ], - "Use previous destinations:": [ - "" - ], - "Or specify the destination of the money": [ - "" - ], - "Specify the destination of the money": [ - "" - ], - "To my bank account": [ - "Övervisa till bank konto" - ], - "To another wallet": [ - "" - ], - "Could not load backup recovery information": [ - "" - ], - "Digital wallet recovery": [ - "" - ], - "Import backup, show info": [ - "" - ], - "All done, your transaction is in progress": [ - "" - ], - "Edit": [ - "" - ], - "Could not load the list of known exchanges": [ - "" - ] - } - } -}; - -strings['tr'] = { - "domain": "messages", - "locale_data": { - "messages": { - "": { - "domain": "messages", - "plural_forms": "nplurals=2; plural=n != 1;", - "lang": "tr" - }, - "Balance": [ - "Bakiye" - ], - "Backup": [ - "Yedekle" - ], - "QR Reader and Taler URI": [ - "" - ], - "Settings": [ - "Ayarlar" - ], - "Dev": [ - "Gelişim" - ], - "%1$s": [ - "%1$s" - ], - "PENDING OPERATIONS": [ - "" - ], - "Loading": [ - "Yükleniyor" - ], - "Could not load backup providers": [ - "Yedekleme sağlayıcıları yüklenemedi" - ], - "No backup providers configured": [ - "Yapılandırılmış yedekleme sağlayıcısı yok" - ], - "Add provider": [ - "Sağlayıcı ekle" - ], - "Sync all backups": [ - "Tüm yedeklemeleri senkronize et" - ], - "Sync now": [ - "Şimdi senkronize et" - ], - "Last synced": [ - "Son Senkronizasyon" - ], - "Not synced": [ - "Senkronize Edilmedi" - ], - "Expires in": [ - "İçinde sona eriyor" - ], - "There was an error loading the provider detail for " %1$s"": [ - "" - ], - "There is not known provider with url "%1$s".": [ - "" - ], - "See providers": [ - "Sağlayıcı ekle" - ], - "Last backup": [ - "" - ], - "Back up": [ - "" - ], - "Provider fee": [ - "" - ], - "per year": [ - "" - ], - "Extend": [ - "" - ], - "terms has changed, extending the service will imply accepting the new terms of service": [ - "" - ], - "old": [ - "" - ], - "new": [ - "" - ], - "fee": [ - "" - ], - "storage": [ - "" - ], - "Remove provider": [ - "" - ], - "This provider has reported an error": [ - "" - ], - "There is conflict with another backup from %1$s": [ - "" - ], - "Backup is not readable": [ - "" - ], - "Unknown backup problem: %1$s": [ - "" - ], - "service paid": [ - "" - ], - "Backup valid until": [ - "" - ], - "Cancel": [ - "Bakiye" - ], - "Open reserve page": [ - "Rezerv sayfasını açın" - ], - "Open pay page": [ - "Ödeme sayfasını açın" - ], - "Open refund page": [ - "Geri ödeme sayfasını açın" - ], - "Open tip page": [ - "İkramiye sayfasını açın" - ], - "Open withdraw page": [ - "Para çekme sayfasını açın" - ], - "Get digital cash": [ - "" - ], - "Could not load balance page": [ - "Bakiye sayfası yüklenemedi" - ], - "Add": [ - "" - ], - "Send %1$s": [ - "%1$s seçin" - ], - "Taler Action": [ - "Taler Eylemi" - ], - "This page has pay action.": [ - "Bu sayfada ödeme eylemi var." - ], - "This page has a withdrawal action.": [ - "Bu sayfada para çekme eylemi var." - ], - "This page has a tip action.": [ - "Bu sayfada bir ikramiye eylemi var." - ], - "This page has a notify reserve action.": [ - "Bu sayfada bir rezervasyon bildir eylemi var." - ], - "Notify": [ - "Bildirin" - ], - "This page has a refund action.": [ - "Bu sayfada bir geri ödeme eylemi var." - ], - "This page has a malformed taler uri.": [ - "Bu sayfada hatalı biçimlendirilmiş taler uri var." - ], - "Dismiss": [ - "Reddet" - ], - "this popup is being closed and you are being redirected to %1$s": [ - "" - ], - "Could not load purchase proposal details": [ - "Yedekleme sağlayıcıları yüklenemedi" - ], - "Order Id": [ - "Sipariş reddedildi" - ], - "Summary": [ - "" - ], - "Amount": [ - "" - ], - "Merchant name": [ - "" - ], - "Merchant jurisdiction": [ - "" - ], - "Merchant address": [ - "" - ], - "Merchant logo": [ - "" - ], - "Merchant website": [ - "" - ], - "Merchant email": [ - "" - ], - "Merchant public key": [ - "" - ], - "Delivery date": [ - "" - ], - "Delivery location": [ - "Taler Eylemi" - ], - "Products": [ - "" - ], - "Created at": [ - "" - ], - "Refund deadline": [ - "" - ], - "Auto refund": [ - "Ödeme iadesi" - ], - "Pay deadline": [ - "" - ], - "Fulfillment URL": [ - "" - ], - "Fulfillment message": [ - "" - ], - "Max deposit fee": [ - "" - ], - "Max fee": [ - "" - ], - "Minimum age": [ - "" - ], - "Wire fee amortization": [ - "" - ], - "Auditors": [ - "" - ], - "Exchanges": [ - "Exchange" - ], - "Bank account": [ - "" - ], - "Bitcoin address": [ - "" - ], - "IBAN": [ - "" - ], - "Could not load deposit status": [ - "Bakiye sayfası yüklenemedi" - ], - "Digital cash deposit": [ - "" - ], - "Cost": [ - "" - ], - "Fee": [ - "Ücretler" - ], - "To be received": [ - "" - ], - "Send   %1$s": [ - "" - ], - "Bitcoin transfer details": [ - "" - ], - "The exchange need a transaction with 3 output, one output is the exchange account and the other two are segwit fake address for metadata with an minimum amount.": [ - "" - ], - "In bitcoincore wallet use 'Add Recipient' button to add two additional recipient and copy addresses and amounts": [ - "" - ], - "Make sure the amount show %1$s BTC, else you have to change the base unit to BTC": [ - "" - ], - "Account": [ - "" - ], - "Bank host": [ - "" - ], - "Bank transfer details": [ - "" - ], - "Subject": [ - "" - ], - "Receiver name": [ - "" - ], - "Could not load the transaction information": [ - "" - ], - "There was an error trying to complete the transaction": [ - "" - ], - "This transaction is not completed": [ - "" - ], - "Send": [ - "" - ], - "Retry": [ - "Yeniden deneyin" - ], - "Forget": [ - "" - ], - "Caution!": [ - "" - ], - "If you have already wired money to the exchange you will loose the chance to get the coins form it.": [ - "" - ], - "Confirm": [ - "Onaylamak" - ], - "Withdrawal": [ - "Çekildi" - ], - "Make sure to use the correct subject, otherwise the money will not arrive in this wallet.": [ - "" - ], - "The bank did not yet confirmed the wire transfer. Go to the %1$s %2$s and check there is no pending step.": [ - "" - ], - "Bank has confirmed the wire transfer. Waiting for the exchange to send the coins": [ - "" - ], - "Details": [ - "" - ], - "Payment": [ - "Ödeme gönderildi" - ], - "Refunds": [ - "" - ], - "%1$s %2$s on %3$s": [ - "" - ], - "Merchant created a refund for this order but was not automatically picked up.": [ - "" - ], - "Offer": [ - "" - ], - "Accept": [ - "İkramiye kabul edildi" - ], - "Merchant": [ - "" - ], - "Invoice ID": [ - "" - ], - "Deposit": [ - "" - ], - "Refresh": [ - "Ücreti yenile" - ], - "Tip": [ - "" - ], - "Refund": [ - "" - ], - "Original order ID": [ - "" - ], - "Purchase summary": [ - "" - ], - "copy": [ - "" - ], - "hide qr": [ - "" - ], - "show qr": [ - "" - ], - "Credit": [ - "" - ], - "Invoice": [ - "" - ], - "Exchange": [ - "Exchange" - ], - "URI": [ - "" - ], - "Debit": [ - "" - ], - "Transfer": [ - "" - ], - "Country": [ - "" - ], - "Address lines": [ - "" - ], - "Building number": [ - "" - ], - "Building name": [ - "" - ], - "Street": [ - "" - ], - "Post code": [ - "" - ], - "Town location": [ - "" - ], - "Town": [ - "" - ], - "District": [ - "" - ], - "Country subdivision": [ - "" - ], - "Date": [ - "" - ], - "Transaction fees": [ - "" - ], - "Total": [ - "" - ], - "Withdraw": [ - "Para çek" + "Konnte die Umsatzanzeige nicht laden", + ], + "Choose a currency to proceed or add another exchange": [""], + "Known currencies": [""], + "Specify the amount and the origin": [""], + "Change currency": [""], + "Use previous origins:": [""], + "Or specify the origin of the money": [""], + "Specify the origin of the money": [""], + "From my bank account": [""], + "From another wallet": [""], + "currency not provided": [""], + "Specify the amount and the destination": [""], + "Use previous destinations:": [""], + "Or specify the destination of the money": [""], + "Specify the destination of the money": [""], + "To my bank account": [""], + "To another wallet": [""], + "Could not load backup recovery information": [ + "Konnte die Umsatzanzeige nicht laden", + ], + "Digital wallet recovery": [""], + "Import backup, show info": [""], + "All done, your transaction is in progress": [""], + Edit: [""], + "Could not load the list of known exchanges": [""], + }, + }, +}; + +strings["es"] = { + domain: "messages", + locale_data: { + messages: { + "": { + domain: "messages", + plural_forms: "nplurals=2; plural=n != 1;", + lang: "es", + }, + Balance: ["Balance"], + Backup: ["Copia de seguridad"], + "QR Reader and Taler URI": ["Lector QR y Taler URI"], + Settings: ["Configuración"], + Dev: ["Dev"], + "%1$s": ["%1$s"], + "PENDING OPERATIONS": ["OPERACIONES PENDIENTES"], + Loading: ["Cargando"], + "Could not load backup providers": [ + "No se pudo cargar los proveedores de copias de seguridad", ], - "Price": [ - "" + "No backup providers configured": [ + "No hay proveedores de copias de seguridad configurados", + ], + "Add provider": ["Agregar proveedor"], + "Sync all backups": ["Sincronizar todas las copias de seguridad"], + "Sync now": ["Sincronizar ahora"], + "Last synced": ["Ultima vez sincronizado"], + "Not synced": ["No sincronizado"], + "Expires in": ["Expira en"], + "There was an error loading the provider detail for " %1$s"": [ + 'Hubo un error cargando los detalles del proveedor para "%1$s"', ], - "Refunded": [ - "" + "There is not known provider with url "%1$s".": [ + 'No hay proveedor conocido con la URL "%1$s".', + ], + "See providers": ["Ver proveedores"], + "Last backup": ["Última copia de seguridad"], + "Back up": ["Copia de seguridad"], + "Provider fee": ["Tarifa del proveedor"], + "per year": ["por año"], + Extend: ["Extender"], + "terms has changed, extending the service will imply accepting the new terms of service": + [ + "los términos han cambiado, extender el servicio implicará aceptar los nuevos términos de servicio", + ], + old: ["viejo"], + new: ["nuevo"], + fee: ["tarifa"], + storage: ["almacenamiento"], + "Remove provider": ["Eliminar proveedor"], + "This provider has reported an error": [ + "Este proveedor ha reportado un error", ], - "Delivery": [ - "" + "There is conflict with another backup from %1$s": [ + "Hay un conflicto con otra copia de seguridad de %1$s", ], - "Total transfer": [ - "Çekildi" + "Backup is not readable": ["La copia de seguridad no es legible"], + "Unknown backup problem: %1$s": [ + "Problema de copia de seguridad desconocido: %1$s", + ], + "service paid": ["servicio pagado"], + "Backup valid until": ["Copia de seguridad válida hasta"], + Cancel: ["Cancelar"], + "Open reserve page": ["Abrir página de reserva"], + "Open pay page": ["Abrir página de pago"], + "Open refund page": ["Abrir página de devolución"], + "Open tip page": ["Abrir página de propina"], + "Open withdraw page": ["Abrir página de retirada"], + "Get digital cash": ["Retirar dinero digital"], + "Could not load balance page": ["No se pudo cargar la página"], + Add: ["Agregar"], + "Send %1$s": ["Envíar %1$s"], + "Taler Action": ["Acción Taler"], + "This page has pay action.": ["Esta página tiene una acción de pago."], + "This page has a withdrawal action.": [ + "Esta página tiene una acción de retirada.", ], - "Could not load pay status": [ - "" + "This page has a tip action.": [ + "Esta página tiene una acción de propina.", ], - "Digital cash payment": [ - "" + "This page has a notify reserve action.": [ + "Esta página tiene una acción de notificación de reserva.", ], - "Purchase": [ - "" + Notify: ["Notificar"], + "This page has a refund action.": [ + "Esta página tiene una acción de devolución.", ], - "Receipt": [ - "" + "This page has a malformed taler uri.": [ + "Esta página tiene una URI de Taler malformada.", ], - "Valid until": [ - "" + Dismiss: ["Descartar"], + "this popup is being closed and you are being redirected to %1$s": [ + "Este popup está siendo cerrado y estás siendo redirigido a %1$s", ], - "List of products": [ - "" + "Could not load purchase proposal details": [ + "No se pudo cargar el detalle de la propuesta", + ], + "Order Id": ["Id de orden"], + Summary: ["Resumen"], + Amount: ["Cantidad"], + "Merchant name": ["Comerciante"], + "Merchant jurisdiction": ["Jurisdicción"], + "Merchant address": ["Dirección del comerciante"], + "Merchant logo": ["Logo"], + "Merchant website": ["Siti web"], + "Merchant email": ["Correo electrónico"], + "Merchant public key": ["Clave pública"], + "Delivery date": ["Fecha de entrega"], + "Delivery location": ["Ubicación de entrega"], + Products: ["Productos"], + "Created at": ["Creado en"], + "Refund deadline": ["Plazo de devolución"], + "Auto refund": ["Devolución automática"], + "Pay deadline": ["Plazo de pago"], + "Fulfillment URL": ["URL de éxito"], + "Fulfillment message": ["Mensaje de éxito"], + "Max deposit fee": ["Máxima comisión de depósito"], + "Max fee": ["Máxima comisión"], + "Minimum age": ["Edad mínima"], + "Wire fee amortization": ["Amortización de comisión de transferencia"], + Auditors: ["Auditores"], + Exchanges: ["Exchanges"], + "Bank account": ["Cuenta del banco"], + "Bitcoin address": ["Dirección de Bitcoin"], + IBAN: ["IBAN"], + "Could not load deposit status": [ + "No se pudo cargar el estado del depósito", + ], + "Digital cash deposit": ["Depósito de dinero digital"], + Cost: ["Costo"], + Fee: ["Comisión"], + "To be received": ["A recibir"], + "Send   %1$s": ["Envíar %1$s"], + "Bitcoin transfer details": ["Detalle de transferencia Bitcoin"], + "The exchange need a transaction with 3 output, one output is the exchange account and the other two are segwit fake address for metadata with an minimum amount.": + [ + "El exchange necesita una transacción con 3 salidas, una salida es hacia la cuenta del exchange y las otras dos son direcciones segwit falsas para metadata con el monto mínimo.", + ], + "In bitcoincore wallet use 'Add Recipient' button to add two additional recipient and copy addresses and amounts": + [ + 'En la billetera bitcoincore usar el botón "Agregar destinatario" para agregar dos destinatarios y copiar las direcciones y montos', + ], + "Make sure the amount show %1$s BTC, else you have to change the base unit to BTC": + [ + "Asegurarse de que el monto muestre %1$s BTC, sino tendrá que cambiar la unidad a BTC", + ], + Account: ["Cuenta"], + "Bank host": ["Banco anfitrión"], + "Bank transfer details": ["Detalle de transferencia bancaria"], + Subject: ["Asunto"], + "Receiver name": ["Nombre del receptor"], + "Could not load the transaction information": [ + "No se pudo cargar información de la transacción", ], - "free": [ - "" + "There was an error trying to complete the transaction": [ + "Hubo un error intentando completar la transacción", ], + "This transaction is not completed": [ + "Esta transacción no está completada", + ], + Send: ["Enviar"], + Retry: ["Reintentar"], + Forget: ["Olvidar"], + "Caution!": ["Cuidado!"], + "If you have already wired money to the exchange you will loose the chance to get the coins form it.": + [ + "Si tú ya has transferido dinero al exchange, perderás la oportunidad de recibir las monedas desde este.", + ], + Confirm: ["Confirmar"], + Withdrawal: ["Retirada"], + "Make sure to use the correct subject, otherwise the money will not arrive in this wallet.": + [ + "Asegúrate de usar el asunto correcto, de lo contrario el dinero no llegará a esta billetera.", + ], + "The bank did not yet confirmed the wire transfer. Go to the %1$s %2$s and check there is no pending step.": + [ + "El banco todavía no confirmó la transferencia. Ir a %1$s %2$s y verificar que no hay pasos pendientes.", + ], + "Bank has confirmed the wire transfer. Waiting for the exchange to send the coins": + [ + "El banco confirmó la transferencia. Esperando que el exchange envíe las monedas", + ], + Details: ["Detalles"], + Payment: ["Pago"], + Refunds: ["Devoluciones"], + "%1$s %2$s on %3$s": ["%1$s %2$s en %3$s"], + "Merchant created a refund for this order but was not automatically picked up.": + [ + "El comerciante creó una devolución para esta orden pero no fue recogida automáticamente.", + ], + Offer: ["Oferta"], + Accept: ["Aceptar"], + Merchant: ["Comerciante"], + "Invoice ID": ["Id de factura"], + Deposit: ["Depósito"], + Refresh: ["Actualizar"], + Tip: ["Propina"], + Refund: ["Devolución"], + "Original order ID": ["Id de orden original"], + "Purchase summary": ["Resumen de compra"], + copy: ["Copiar"], + "hide qr": ["Esconder QR"], + "show qr": ["Mostrar QR"], + Credit: ["Crédito"], + Invoice: ["Factura"], + Exchange: ["Exchange"], + URI: ["URI"], + Debit: ["Débito"], + Transfer: ["Transferencia"], + Country: ["País"], + "Address lines": ["Detalle de dirección"], + "Building number": ["Número de edificio"], + "Building name": ["Nombre de edificio"], + Street: ["Calle"], + "Post code": ["Código postal"], + "Town location": ["Ubicación de la ciudad"], + Town: ["Ciudad"], + District: ["Distrito"], + "Country subdivision": ["Subdivisión de país"], + Date: ["Fecha"], + "Transaction fees": ["Comisiones de transacción"], + Total: ["Total"], + Withdraw: ["Retirar"], + Price: ["Precio"], + Refunded: ["Devuelto"], + Delivery: ["Entrega"], + "Total transfer": ["Total transferido"], + "Could not load pay status": ["No se pudo cargar el estado del pago"], + "Digital cash payment": ["Pago con dinero digital"], + Purchase: ["Compra"], + Receipt: ["Recibo"], + "Valid until": ["Válido hasta"], + "List of products": ["Lista de productos"], + free: ["Gratis"], "Already paid, you are going to be redirected to %1$s": [ - "" - ], - "Already paid": [ - "" - ], - "Already claimed": [ - "" - ], - "Pay with a mobile phone": [ - "" - ], - "Hide QR": [ - "" - ], - "Scan the QR code or   %1$s": [ - "" - ], - "Pay   %1$s": [ - "" - ], + "Ya pagado, estás siendo dirigido a %1$s", + ], + "Already paid": ["Ya pagado"], + "Already claimed": ["Ya reclamado"], + "Pay with a mobile phone": ["Pagar con un teléfono móbil"], + "Hide QR": ["Esconder QR"], + "Scan the QR code or   %1$s": ["Escanear el código QR o %1$s"], + "Pay   %1$s": ["Pagar %1$s"], "You have no balance for this currency. Withdraw digital cash first.": [ - "" - ], - "Could not find enough coins to pay. Even if you have enough %1$s some restriction may apply.": [ - "" - ], - "Your current balance is not enough.": [ - "Gösterecek bakiyeniz yok." - ], - "Merchant message": [ - "" - ], + "No hay balance para esta divisa. Extraer dinero digital primero.", + ], + "Could not find enough coins to pay. Even if you have enough %1$s some restriction may apply.": + [ + "No se encontraron suficientes monedas para pagar. Incluso si tuviera suficiente %1$s algunas restricciones se podrían aplicar.", + ], + "Your current balance is not enough.": ["Tu balance no es suficiente."], + "Merchant message": ["Mensaje del comerciante"], "Could not load refund status": [ - "Bakiye sayfası yüklenemedi" - ], - "Digital cash refund": [ - "" - ], - "You've ignored the tip.": [ - "" + "No se pudo cargar el estado de la devolución", ], + "Digital cash refund": ["Devolución de dinero digital"], + "You've ignored the tip.": ["Has ignorado la propina."], "The refund is in progress.": [ - "" - ], - "Total to refund": [ - "Ödeme iadesi" + "El proceso de devolución está en progreso.", ], + "Total to refund": ["Total para devolver"], "The merchant "%1$s" is offering you a refund.": [ - "" - ], - "Order amount": [ - "Ücreti yenile" - ], - "Already refunded": [ - "Ödeme iadesi" - ], - "Refund offered": [ - "" - ], - "Accept   %1$s": [ - "" + 'El comerciante "%1$s" te está ofreciendo una devolución.', ], + "Order amount": ["Monto de la orden"], + "Already refunded": ["Ya devuelto"], + "Refund offered": ["Devolución ofrecida"], + "Accept   %1$s": ["Aceptar %1$s"], "Could not load tip status": [ - "Bakiye sayfası yüklenemedi" - ], - "Digital cash tip": [ - "" + "No se pudo cargar el estado de la propina", ], + "Digital cash tip": ["Propina con dinero digital"], "The merchant is offering you a tip": [ - "" - ], - "Merchant URL": [ - "" - ], - "Receive   %1$s": [ - "" - ], - "Tip from %1$s accepted. Check your transactions list for more details.": [ - "" - ], - "Select one option": [ - "" - ], - "Could not load": [ - "Bakiye sayfası yüklenemedi" - ], - "Show terms of service": [ - "Hizmet şartlarını göster" - ], + "El comerciante te ofrece una propina", + ], + "Merchant URL": ["URL del comerciante"], + "Receive   %1$s": ["Recibir %1$s"], + "Tip from %1$s accepted. Check your transactions list for more details.": + [ + "Propina de %1$s aceptada. Revisa tu lista de transacciones para más detalle.", + ], + "Select one option": ["Seleccione una opción"], + "Could not load": ["No se pudo cargar"], + "Show terms of service": ["Mostrar términos de servicio"], "I accept the exchange terms of service": [ - "Hizmet şartlarını kabul ediyorum" + "Yo acepto los términos de servicio del exchange", ], "Exchange doesn't have terms of service": [ - "Exchange'in hizmet şartları yok" - ], - "Review exchange terms of service": [ - "Exchange'in hizmet şartlarını inceleyin" + "El exchange no tiene los términos de servicio", ], + "Review exchange terms of service": ["Revisar los términos de servicio"], "Review new version of terms of service": [ - "Hizmet şartlarının yeni sürümünü inceleyin" + "Revisar los nuevos términos de servicio", ], "The exchange reply with a empty terms of service": [ - "" - ], - "Download Terms of Service": [ - "" - ], - "Hide terms of service": [ - "" + "El exchange respondió con unos términos de servicio vacíos", ], + "Download Terms of Service": ["Descargar los términos de servicio"], + "Hide terms of service": ["Esconder los términos de servicio"], "Could not load exchange fees": [ - "Bakiye sayfası yüklenemedi" - ], - "Close": [ - "" - ], - "could not find any exchange": [ - "Bakiye sayfası yüklenemedi" + "No se pudo cargar la comisión del exchange", ], + Close: ["Cerrar"], + "could not find any exchange": ["No se pudo encontrar ningún exchange"], "could not find any exchange for the currency %1$s": [ - "" - ], - "Service fee description": [ - "" - ], - "Select %1$s exchange": [ - "Özel exchange'i seçin" - ], - "Reset": [ - "" - ], - "Use this exchange": [ - "Özel exchange'i seçin" - ], - "Doesn't have auditors": [ - "" - ], - "currency": [ - "" - ], - "Operations": [ - "Bekleyen işlemler" - ], - "Deposits": [ - "Depozito %1$s" - ], - "Denomination": [ - "Bekleyen işlemler" - ], - "Until": [ - "" - ], - "Withdrawals": [ - "Çekildi" - ], - "Currency": [ - "" - ], - "Coin operations": [ - "Bekleyen işlemler" - ], - "Every operation in this section may be different by denomination value and is valid for a period of time. The exchange will charge the indicated amount every time a coin is used in such operation.": [ - "" - ], - "Transfer operations": [ - "Bekleyen işlemler" - ], - "Every operation in this section may be different by transfer type and is valid for a period of time. The exchange will charge the indicated amount every time a transfer is made.": [ - "" - ], - "Operation": [ - "" - ], - "Wallet operations": [ - "Bekleyen işlemler" - ], - "Feature": [ - "" - ], + "No se pudo encontrar ningún exchange para la divisa %1$s", + ], + "Service fee description": ["Descripción de comisión de servicio"], + "Select %1$s exchange": ["Seleccionar exchange %1$s"], + Reset: ["Reiniciar"], + "Use this exchange": ["Usar este exchange"], + "Doesn't have auditors": ["No tiene auditores"], + currency: ["Divisa"], + Operations: ["Operaciones"], + Deposits: ["Depósitos"], + Denomination: ["Operaciones"], + Until: ["Hasta"], + Withdrawals: ["Retiradas"], + Currency: ["Divisa"], + "Coin operations": ["Operaciones de moneda"], + "Every operation in this section may be different by denomination value and is valid for a period of time. The exchange will charge the indicated amount every time a coin is used in such operation.": + [ + "Toda operación en esta sección puede ser diferente por valor de denominación y es válida por un período. El exchange cobrará el monto indicado cada vez que una es usada en dicha operación.", + ], + "Transfer operations": ["Operaciones de transferencia"], + "Every operation in this section may be different by transfer type and is valid for a period of time. The exchange will charge the indicated amount every time a transfer is made.": + [ + "Toda operación en esta sección puede ser diferente por tipo de transacción y es válida por un período. El exchange cobrará el monto indicado cada vez que se haga una transferencia.", + ], + Operation: ["Operación"], + "Wallet operations": ["Operaciones de billetera"], + Feature: ["Característica"], "Could not get the info from the URI": [ - "" + "No se pudo obtener la información desde la URI", ], "Could not get info of withdrawal": [ - "Para çekme işlemi için ayrıntılar alınamadı:" - ], - "Digital cash withdrawal": [ - "" + "No se pudo obtener la información de retiro", ], + "Digital cash withdrawal": ["Retirada de dinero digital"], "Could not finish the withdrawal operation": [ - "" - ], - "Age restriction": [ - "" - ], - "Withdraw   %1$s": [ - "" - ], - "Withdraw to a mobile phone": [ - "" - ], - "Digital invoice": [ - "" + "No se pudo completar la operación de retirada", ], + "Age restriction": ["Restricción etaria"], + "Withdraw   %1$s": ["Retirar %1$s"], + "Withdraw to a mobile phone": ["Retirar con un teléfono móvil"], + "Digital invoice": ["Factura digital"], "Could not finish the invoice creation": [ - "" - ], - "Create": [ - "" + "No se pudo completar la creación de la factura", ], + Create: ["Crear"], "Could not finish the payment operation": [ - "Para çekme işlemi için ayrıntılar alınamadı:" - ], - "Digital cash transfer": [ - "" + "No se pudo completar la operación de pago", ], + "Digital cash transfer": ["Transferencia de dinero digital"], "Could not finish the transfer creation": [ - "Para çekme işlemi için ayrıntılar alınamadı:" + "No se pudo completar la operación de creación de transferencia", ], "Could not finish the pickup operation": [ - "Para çekme işlemi için ayrıntılar alınamadı:" - ], - "Manual Withdrawal for %1$s": [ - "Para çekme ücretleri:" - ], - "Choose a exchange from where the coins will be withdrawn. The exchange will send the coins to this wallet after receiving a wire transfer with the correct subject.": [ - "" - ], - "No exchange found for %1$s": [ - "" - ], - "Add Exchange": [ - "" - ], - "No exchange configured": [ - "" - ], - "Can't create the reserve": [ - "" - ], - "Start withdrawal": [ - "" - ], + "No se pudo completar la operación de recolección", + ], + "Manual Withdrawal for %1$s": ["Retirada Manual para %1$s"], + "Choose a exchange from where the coins will be withdrawn. The exchange will send the coins to this wallet after receiving a wire transfer with the correct subject.": + [ + "Elija un exchange desde donde las monedas serán retiradas. El exchange enviará las monedas a esta billetera después de recibir una transferencia bancaria con el asunto correcto.", + ], + "No exchange found for %1$s": ["No se encontró exchange para %1$s"], + "Add Exchange": ["Agregar Exchange"], + "No exchange configured": ["Sin exchange configurado"], + "Can't create the reserve": ["No se pudo crear una reserva"], + "Start withdrawal": ["Comenzar la retirada"], "Could not load deposit balance": [ - "Bakiye sayfası yüklenemedi" + "No se pudo cargar el balance de depósito", ], "A currency or an amount should be indicated": [ - "" + "Se debería especificar una divisa o un monto", ], "There is no enough balance to make a deposit for currency %1$s": [ - "" - ], - "Send %1$s to your account": [ - "" + "No hay suficiente balance para hacer un depósito para la divisa %1$s", ], + "Send %1$s to your account": ["Enviar %1$s a tu cuenta"], "There is no account to make a deposit for currency %1$s": [ - "" - ], - "Add account": [ - "" - ], - "Select account": [ - "" - ], - "Add another account": [ - "" - ], - "Deposit fee": [ - "" - ], - "Total deposit": [ - "" - ], - "Deposit %1$s %2$s": [ - "Test Havale Hesap #%1$s üzerinde %2$s" - ], - "Add bank account for %1$s": [ - "" - ], + "No hay una cuenta para hacer un depósito para la divisa %1$s", + ], + "Add account": ["Agregar cuenta"], + "Select account": ["Seleccionar cuenta"], + "Add another account": ["Agregar otra cuenta"], + "Deposit fee": ["Comisión de depósito"], + "Total deposit": ["Depósito total"], + "Deposit %1$s %2$s": ["Depositar %1$s %2$s"], + "Add bank account for %1$s": ["Agregar cuenta de banco para %1$s"], "Enter the URL of an exchange you trust.": [ - "" - ], - "Unable add this account": [ - "" - ], - "Select account type": [ - "" - ], - "Review terms of service": [ - "" - ], - "Exchange URL": [ - "" - ], - "Add exchange": [ - "" - ], - "Add new exchange": [ - "" - ], - "Add exchange for %1$s": [ - "" - ], + "Ingresar la URL de un exchange en el que confíes.", + ], + "Unable add this account": ["No fue posible agregar esta cuenta"], + "Select account type": ["Seleccione un tipo de cuenta"], + "Review terms of service": ["Revisar los términos de servicio"], + "Exchange URL": ["Exchange URL"], + "Add exchange": ["Agregar exchange"], + "Add new exchange": ["Agregar nuevo exchange"], + "Add exchange for %1$s": ["Agregar exchange para %1$s"], "An exchange has been found! Review the information and click next": [ - "" + "Un exchange ha sido encontrado! Revisa la información y haz clic en siguiente", ], "This exchange doesn't match the expected currency %1$s": [ - "" + "Este exchange no coincide con la divisa %1$s esperada", ], "Unable to verify this exchange": [ - "" - ], - "Unable to add this exchange": [ - "" - ], - "loading": [ - "" - ], - "Version": [ - "" - ], - "Next": [ - "" - ], - "Waiting for confirmation": [ - "" - ], - "PENDING": [ - "" - ], + "No fue posible verificar este exchange", + ], + "Unable to add this exchange": ["No fue posible agregar este exchange"], + loading: ["cargando"], + Version: ["Versión"], + Next: ["Siguiente"], + "Waiting for confirmation": ["Esperando confirmación"], + PENDING: ["PENDIENTE"], "Could not load the list of transactions": [ - "" + "No se pudo cargar la lista de transacciones", ], "Your transaction history is empty for this currency.": [ - "" - ], - "Add backup provider": [ - "" + "No hay historial para esta divisa.", ], + "Add backup provider": ["Agregar proveedor de copias de seguridad"], "Could not get provider information": [ - "" + "No se pudo conseguir la información del proveedor", ], "Backup providers may charge for their service": [ - "" - ], - "URL": [ - "" - ], - "Name": [ - "" - ], - "Provider URL": [ - "" + "Los proveedores de copias de seguridad pueden cobrarte por su servicio", ], + URL: ["URL"], + Name: ["Nombre"], + "Provider URL": ["URL del proveedor"], "Please review and accept this provider's terms of service": [ - "Hizmet şartlarını kabul ediyorum" - ], - "Pricing": [ - "" - ], - "free of charge": [ - "" - ], - "%1$s per year of service": [ - "" - ], - "Storage": [ - "" + "Por favor revisa y acepta los términos de servicio del proveedor", ], + Pricing: ["Precios"], + "free of charge": ["Gratis"], + "%1$s per year of service": ["%1$s por año de servicio"], + Storage: ["Alamcenamiento"], "%1$s megabytes of storage per year of service": [ - "" - ], - "Accept terms of service": [ - "" + "%1$s megabytes de almacenamiento por año de servicio", ], + "Accept terms of service": ["Aceptar los términos de servicio"], "Could not parse the payto URI": [ - "" - ], - "Please check the uri": [ - "" + "No se pudo obtener la información de la URI payto", ], + "Please check the uri": ["Revisar la URI"], "Exchange is ready for withdrawal": [ - "" - ], - "To complete the process you need to wire%1$s %2$s to the exchange bank account": [ - "" - ], - "Alternative, you can also scan this QR code or open %1$s if you have a banking app installed that supports RFC 8905": [ - "" - ], - "Cancel withdrawal": [ - "" - ], - "Could not toggle auto-open": [ - "Bakiye sayfası yüklenemedi" - ], - "Could not toggle clipboard": [ - "Bakiye sayfası yüklenemedi" - ], - "Navigator": [ - "" - ], + "El exchange está listo para la retirada", + ], + "To complete the process you need to wire%1$s %2$s to the exchange bank account": + [ + "Para completar el proceso necesitas transferir %1$s %2$s a la cuenta bancaria del exchange", + ], + "Alternative, you can also scan this QR code or open %1$s if you have a banking app installed that supports RFC 8905": + [ + "Alternativamente, también puedes escanear el código QR o abrir %1$s si tienes una App bancaria instalada que soporta RFC 8905", + ], + "Cancel withdrawal": ["Cancelar retirada"], + "Could not toggle auto-open": ["No se pudo cambiar el auto-open"], + "Could not toggle clipboard": ["No se pudo cambiar portapapeles"], + Navigator: ["Navegador"], "Automatically open wallet based on page content": [ - "" - ], - "Enabling this option below will make using the wallet faster, but requires more permissions from your browser.": [ - "" + "Abrir automáticamente la billetera basada en el contenido de la página", ], + "Enabling this option below will make using the wallet faster, but requires more permissions from your browser.": + [ + "Habilitar la opción de debajo, hará que el uso de la billetera sea mas rápido, pero requiere más permisos de tu navegador.", + ], "Automatically check clipboard for Taler URI": [ - "" - ], - "Trust": [ - "" - ], - "No exchange yet": [ - "" - ], - "Term of Service": [ - "" - ], - "ok": [ - "" - ], - "changed": [ - "" - ], - "not accepted": [ - "" - ], + "Revisar el portapapeles automáticamente por Taler URI", + ], + Trust: ["Confianza"], + "No exchange yet": ["No hay exchanges todavía"], + "Term of Service": ["Términos de servicio"], + ok: ["ok"], + changed: ["modificado"], + "not accepted": ["no aceptado"], "unknown (exchange status should be updated)": [ - "" - ], - "Add an exchange": [ - "" - ], - "Troubleshooting": [ - "" - ], - "Developer mode": [ - "" + "desconocido (el estado del exchange debería actualizarse)", ], + "Add an exchange": ["Agregar un exchange"], + Troubleshooting: ["Solución de problemas"], + "Developer mode": ["Modo desarrollador"], "More options and information useful for debugging": [ - "" - ], - "Display": [ - "" - ], - "Current Language": [ - "" - ], - "Wallet Core": [ - "" - ], - "Web Extension": [ - "" - ], - "Exchange compatibility": [ - "" - ], - "Merchant compatibility": [ - "" - ], - "Bank compatibility": [ - "" - ], - "Browser Extension Installed!": [ - "" - ], + "Más información y opciones útiles para depuración", + ], + Display: ["Pantalla"], + "Current Language": ["Lenguaje actual"], + "Wallet Core": ["Wallet core"], + "Web Extension": ["Web Extension"], + "Exchange compatibility": ["Compatibilidad con Exchange"], + "Merchant compatibility": ["Compatibilidad con Merchant"], + "Bank compatibility": ["Compatibilidad con Bank"], + "Browser Extension Installed!": ["Extensión del navegador instalada!"], "You can open the GNU Taler Wallet using the combination %1$s .": [ - "" - ], - "Also pinning the GNU Taler Wallet to your Chrome browser allows you to quick access without keyboard:": [ - "" - ], - "Click the puzzle icon": [ - "" - ], - "Search for GNU Taler Wallet": [ - "" - ], - "Click the pin icon": [ - "" - ], - "Permissions": [ - "" - ], - "(Enabling this option below will make using the wallet faster, but requires more permissions from your browser.)": [ - "" - ], - "Next Steps": [ - "" - ], - "Try the demo": [ - "" - ], + "Puedes abrir GNU Taler Wallet usando la combinación %1$s.", + ], + "Also pinning the GNU Taler Wallet to your Chrome browser allows you to quick access without keyboard:": + [ + "También fijando GNU Taler Wallet a to navegador Chrome permite un acceso rápido sin el teclado:", + ], + "Click the puzzle icon": ["Haz click en el ícono de rompecabezas"], + "Search for GNU Taler Wallet": ['Busca "GNU Taler Wallet"'], + "Click the pin icon": ["Haz click en el ícono de fijar"], + Permissions: ["Permisos"], + "(Enabling this option below will make using the wallet faster, but requires more permissions from your browser.)": + [ + "(Habilitar esta opción de abajo hará el uso de la billetera mas rápido, pero requiere mas permisos de tu navegador)", + ], + "Next Steps": ["Próximos pasos"], + "Try the demo": ["Probar la demostración"], "Learn how to top up your wallet balance": [ - "" + "Aprender como llenar tu billetera", ], "Diagnostics timed out. Could not talk to the wallet backend.": [ - "Tanılar zaman aşımına uğradı. Cüzdan arka ucuyla konuşulamadı." - ], - "Problems detected:": [ - "Tespit edilen sorunlar:" - ], - "Please check in your %1$s settings that you have IndexedDB enabled (check the preference name %2$s).": [ - "Lütfen %1$s ayarlarınızda, IndexedDB'nin etkinleştirildiğinizi kontrol edin (%2$s tercih adını kontrol edin)." - ], - "Your wallet database is outdated. Currently automatic migration is not supported. Please go %1$s to reset the wallet database.": [ - "Cüzdan veritabanınız eski. Şu anda otomatik aktarım desteklenmiyor. Cüzdan veritabanını sıfırlamak için lütfen %1$s gidin." - ], - "Running diagnostics": [ - "Tanılamayı çalıştır" - ], - "Debug tools": [ - "Hata ayıklama araçları" - ], - "Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?": [ - "Cüzdanınızdaki her şeyi GERİ ALINAMAZ BİÇİMDE İMHA ETMEK ve TÜM PARALARINIZI KAYBETMEK mi istiyorsunuz?" - ], - "reset": [ - "sıfırla" - ], + "El diagnóstico caducó. No nos pudimos comunicar con la billetera.", + ], + "Problems detected:": ["Problemas detectados:"], + "Please check in your %1$s settings that you have IndexedDB enabled (check the preference name %2$s).": + [ + "Por favor revisa en tu configuración %1$s que tienes IndexedDB habilitado (el nombre de la preferencia %2$s).", + ], + "Your wallet database is outdated. Currently automatic migration is not supported. Please go %1$s to reset the wallet database.": + [ + "La base de datos de la billetera expiró. Por ahora la migración automática no está soportada. Por favor dirijasé a %1$s para reiniciar la base de datos de la billetera.", + ], + "Running diagnostics": ["Ejecutando diagnósticos"], + "Debug tools": ["Herramientas de desarrollo"], + "Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?": + [ + "Quieres DESTRUIR IRREVOCABLEMENTE todo dentro de tu billetera y PERDER TODAS TUS MONEDAS?", + ], + reset: ["Reiniciar"], "TESTING: This may delete all your coin, proceed with caution": [ - "" - ], - "run gc": [ - "" - ], - "import database": [ - "veritabanını içe aktar" - ], - "export database": [ - "veritabanını dışa aktar" + "TESTING: Esto puede borrar todas tus monedas, proceder con precaución", ], + "run gc": ["Ejecutar GC"], + "import database": ["importar base de datos"], + "export database": ["exportar base de datos"], "Database exported at %1$s %2$s to download": [ - "Veritabanı %1$s'de dışa aktarıldı-%2$s indirilecek" - ], - "Coins": [ - "Madeni paralar" - ], - "Pending operations": [ - "Bekleyen işlemler" - ], - "usable coins": [ - "kullanılabilir madeni paralar" - ], - "id": [ - "kimlik" - ], - "denom": [ - "" - ], - "value": [ - "değer" - ], - "status": [ - "durum" - ], - "from refresh?": [ - "yenilemeden mi?" - ], - "age key count": [ - "" - ], - "spent coins": [ - "harcanan madeni paralar" - ], - "click to show": [ - "göstermek için tıklayın" - ], + "Base de datos exportada a %1$s %2$s para descargar", + ], + Coins: ["Monedas"], + "Pending operations": ["Operaciones pendientes"], + "usable coins": ["monedas usables"], + id: ["id"], + denom: ["denominación"], + value: ["valor"], + status: ["estado"], + "from refresh?": ["desde refresco?"], + "age key count": ["cantidad de age key"], + "spent coins": ["monedas gastadas"], + "click to show": ["hacer clic para mostrar"], "Scan a QR code or enter taler:// URI below": [ - "" - ], - "Open": [ - "" + "Escanear un código QR o ingresar taler:// URI debajo", ], + Open: ["Abrir"], "URI is not valid. Taler URI should start with `taler://`": [ - "" - ], - "Try another": [ - "" + "El URI no es válido. Taler URI debería comenzar con `taler://`", ], + "Try another": ["Intentar otro"], "Could not load list of exchange": [ - "Bakiye sayfası yüklenemedi" + "No se pudo cargar la lista de exchange", ], "Choose a currency to proceed or add another exchange": [ - "" + "Elija una divisa para proceder o agregue otro exchange", ], - "Known currencies": [ - "" + "Known currencies": ["Divisas conocidas"], + "Specify the amount and the origin": ["Indicar el monto y el origen"], + "Change currency": ["Cambiar divisa"], + "Use previous origins:": ["Usar un origen previo:"], + "Or specify the origin of the money": [ + "O especificar el origen del dinero", ], - "Specify the amount and the origin": [ - "" + "Specify the origin of the money": ["Especificar el origen del dinero"], + "From my bank account": ["Desde mi cuenta de banco"], + "From another wallet": ["Desde otra billetera"], + "currency not provided": ["Divisa no provista"], + "Specify the amount and the destination": [ + "Especificar el monto y el destino", ], - "Change currency": [ - "" + "Use previous destinations:": ["Usar destinos previos:"], + "Or specify the destination of the money": [ + "O especificar el destino del dinero", ], - "Use previous origins:": [ - "" + "Specify the destination of the money": [ + "Especificar el destino del dinero", ], - "Or specify the origin of the money": [ - "" + "To my bank account": ["Hacia mi cuenta de banco"], + "To another wallet": ["Hacia otra billetera"], + "Could not load backup recovery information": [ + "No se pudo cargar la información de recuperación de copia de seguridad", ], - "Specify the origin of the money": [ - "" + "Digital wallet recovery": ["Recuperación de billetera digital"], + "Import backup, show info": [ + "Importar copia de seguridad, mostrar información", ], - "From my bank account": [ - "Banka hesabına havale yap" + "All done, your transaction is in progress": [ + "Todo completo, su transacción está en progreso", ], - "From another wallet": [ - "" + Edit: ["Editar"], + "Could not load the list of known exchanges": [ + "No se pudo cargar la lista de exchange conocidos", ], - "currency not provided": [ - "" + }, + }, +}; + +strings["fr"] = { + domain: "messages", + locale_data: { + messages: { + "": { + domain: "messages", + plural_forms: "nplurals=2; plural=(n!=1);", + lang: "fr", + }, + Balance: [""], + Backup: [""], + "QR Reader and Taler URI": [""], + Settings: [""], + Dev: [""], + "%1$s": [""], + "PENDING OPERATIONS": [""], + Loading: [""], + "Could not load backup providers": [""], + "No backup providers configured": [""], + "Add provider": [""], + "Sync all backups": [""], + "Sync now": [""], + "Last synced": [""], + "Not synced": [""], + "Expires in": [""], + "There was an error loading the provider detail for " %1$s"": [ + "", + ], + "There is not known provider with url "%1$s".": [""], + "See providers": [""], + "Last backup": [""], + "Back up": [""], + "Provider fee": [""], + "per year": [""], + Extend: [""], + "terms has changed, extending the service will imply accepting the new terms of service": + [""], + old: [""], + new: [""], + fee: [""], + storage: [""], + "Remove provider": [""], + "This provider has reported an error": [""], + "There is conflict with another backup from %1$s": [""], + "Backup is not readable": [""], + "Unknown backup problem: %1$s": [""], + "service paid": [""], + "Backup valid until": [""], + Cancel: [""], + "Open reserve page": [""], + "Open pay page": [""], + "Open refund page": [""], + "Open tip page": [""], + "Open withdraw page": [""], + "Get digital cash": [""], + "Could not load balance page": [""], + Add: [""], + "Send %1$s": [""], + "Taler Action": [""], + "This page has pay action.": [""], + "This page has a withdrawal action.": [""], + "This page has a tip action.": [""], + "This page has a notify reserve action.": [""], + Notify: [""], + "This page has a refund action.": [""], + "This page has a malformed taler uri.": [""], + Dismiss: [""], + "this popup is being closed and you are being redirected to %1$s": [""], + "Could not load purchase proposal details": [""], + "Order Id": [""], + Summary: [""], + Amount: [""], + "Merchant name": [""], + "Merchant jurisdiction": [""], + "Merchant address": [""], + "Merchant logo": [""], + "Merchant website": [""], + "Merchant email": [""], + "Merchant public key": [""], + "Delivery date": [""], + "Delivery location": [""], + Products: [""], + "Created at": [""], + "Refund deadline": [""], + "Auto refund": [""], + "Pay deadline": [""], + "Fulfillment URL": [""], + "Fulfillment message": [""], + "Max deposit fee": [""], + "Max fee": [""], + "Minimum age": [""], + "Wire fee amortization": [""], + Auditors: [""], + Exchanges: [""], + "Bank account": [""], + "Bitcoin address": [""], + IBAN: [""], + "Could not load deposit status": [""], + "Digital cash deposit": [""], + Cost: [""], + Fee: [""], + "To be received": [""], + "Send   %1$s": [""], + "Bitcoin transfer details": [""], + "The exchange need a transaction with 3 output, one output is the exchange account and the other two are segwit fake address for metadata with an minimum amount.": + [""], + "In bitcoincore wallet use 'Add Recipient' button to add two additional recipient and copy addresses and amounts": + [""], + "Make sure the amount show %1$s BTC, else you have to change the base unit to BTC": + [""], + Account: [""], + "Bank host": [""], + "Bank transfer details": [""], + Subject: [""], + "Receiver name": [""], + "Could not load the transaction information": [""], + "There was an error trying to complete the transaction": [""], + "This transaction is not completed": [""], + Send: [""], + Retry: [""], + Forget: [""], + "Caution!": [""], + "If you have already wired money to the exchange you will loose the chance to get the coins form it.": + [""], + Confirm: ["Confirmer"], + Withdrawal: [""], + "Make sure to use the correct subject, otherwise the money will not arrive in this wallet.": + [""], + "The bank did not yet confirmed the wire transfer. Go to the %1$s %2$s and check there is no pending step.": + [""], + "Bank has confirmed the wire transfer. Waiting for the exchange to send the coins": + [""], + Details: [""], + Payment: [""], + Refunds: [""], + "%1$s %2$s on %3$s": [""], + "Merchant created a refund for this order but was not automatically picked up.": + [""], + Offer: [""], + Accept: [""], + Merchant: [""], + "Invoice ID": [""], + Deposit: [""], + Refresh: [""], + Tip: [""], + Refund: [""], + "Original order ID": [""], + "Purchase summary": [""], + copy: [""], + "hide qr": [""], + "show qr": [""], + Credit: [""], + Invoice: [""], + Exchange: [""], + URI: [""], + Debit: [""], + Transfer: [""], + Country: [""], + "Address lines": [""], + "Building number": [""], + "Building name": [""], + Street: [""], + "Post code": [""], + "Town location": [""], + Town: [""], + District: [""], + "Country subdivision": [""], + Date: [""], + "Transaction fees": [""], + Total: [""], + Withdraw: [""], + Price: [""], + Refunded: [""], + Delivery: [""], + "Total transfer": [""], + "Could not load pay status": [""], + "Digital cash payment": [""], + Purchase: [""], + Receipt: [""], + "Valid until": [""], + "List of products": [""], + free: [""], + "Already paid, you are going to be redirected to %1$s": [""], + "Already paid": [""], + "Already claimed": [""], + "Pay with a mobile phone": [""], + "Hide QR": [""], + "Scan the QR code or   %1$s": [""], + "Pay   %1$s": [""], + "You have no balance for this currency. Withdraw digital cash first.": [ + "", + ], + "Could not find enough coins to pay. Even if you have enough %1$s some restriction may apply.": + [""], + "Your current balance is not enough.": [""], + "Merchant message": [""], + "Could not load refund status": [""], + "Digital cash refund": [""], + "You've ignored the tip.": [""], + "The refund is in progress.": [""], + "Total to refund": [""], + "The merchant "%1$s" is offering you a refund.": [""], + "Order amount": [""], + "Already refunded": [""], + "Refund offered": [""], + "Accept   %1$s": [""], + "Could not load tip status": [""], + "Digital cash tip": [""], + "The merchant is offering you a tip": [""], + "Merchant URL": [""], + "Receive   %1$s": [""], + "Tip from %1$s accepted. Check your transactions list for more details.": + [""], + "Select one option": [""], + "Could not load": [""], + "Show terms of service": [""], + "I accept the exchange terms of service": [""], + "Exchange doesn't have terms of service": [""], + "Review exchange terms of service": [""], + "Review new version of terms of service": [""], + "The exchange reply with a empty terms of service": [""], + "Download Terms of Service": [""], + "Hide terms of service": [""], + "Could not load exchange fees": [""], + Close: [""], + "could not find any exchange": [""], + "could not find any exchange for the currency %1$s": [""], + "Service fee description": [""], + "Select %1$s exchange": [""], + Reset: [""], + "Use this exchange": [""], + "Doesn't have auditors": [""], + currency: [""], + Operations: [""], + Deposits: [""], + Denomination: [""], + Until: [""], + Withdrawals: [""], + Currency: [""], + "Coin operations": [""], + "Every operation in this section may be different by denomination value and is valid for a period of time. The exchange will charge the indicated amount every time a coin is used in such operation.": + [""], + "Transfer operations": [""], + "Every operation in this section may be different by transfer type and is valid for a period of time. The exchange will charge the indicated amount every time a transfer is made.": + [""], + Operation: [""], + "Wallet operations": [""], + Feature: [""], + "Could not get the info from the URI": [""], + "Could not get info of withdrawal": [""], + "Digital cash withdrawal": [""], + "Could not finish the withdrawal operation": [""], + "Age restriction": [""], + "Withdraw   %1$s": [""], + "Withdraw to a mobile phone": [""], + "Digital invoice": [""], + "Could not finish the invoice creation": [""], + Create: [""], + "Could not finish the payment operation": [""], + "Digital cash transfer": [""], + "Could not finish the transfer creation": [""], + "Could not finish the pickup operation": [""], + "Manual Withdrawal for %1$s": [""], + "Choose a exchange from where the coins will be withdrawn. The exchange will send the coins to this wallet after receiving a wire transfer with the correct subject.": + [""], + "No exchange found for %1$s": [""], + "Add Exchange": [""], + "No exchange configured": [""], + "Can't create the reserve": [""], + "Start withdrawal": [""], + "Could not load deposit balance": [""], + "A currency or an amount should be indicated": [""], + "There is no enough balance to make a deposit for currency %1$s": [""], + "Send %1$s to your account": [""], + "There is no account to make a deposit for currency %1$s": [""], + "Add account": [""], + "Select account": [""], + "Add another account": [""], + "Deposit fee": [""], + "Total deposit": [""], + "Deposit %1$s %2$s": [""], + "Add bank account for %1$s": [""], + "Enter the URL of an exchange you trust.": [""], + "Unable add this account": [""], + "Select account type": [""], + "Review terms of service": [""], + "Exchange URL": [""], + "Add exchange": [""], + "Add new exchange": [""], + "Add exchange for %1$s": [""], + "An exchange has been found! Review the information and click next": [""], + "This exchange doesn't match the expected currency %1$s": [""], + "Unable to verify this exchange": [""], + "Unable to add this exchange": [""], + loading: [""], + Version: [""], + Next: [""], + "Waiting for confirmation": [""], + PENDING: [""], + "Could not load the list of transactions": [""], + "Your transaction history is empty for this currency.": [""], + "Add backup provider": [""], + "Could not get provider information": [""], + "Backup providers may charge for their service": [""], + URL: [""], + Name: [""], + "Provider URL": [""], + "Please review and accept this provider's terms of service": [""], + Pricing: [""], + "free of charge": [""], + "%1$s per year of service": [""], + Storage: [""], + "%1$s megabytes of storage per year of service": [""], + "Accept terms of service": [""], + "Could not parse the payto URI": [""], + "Please check the uri": [""], + "Exchange is ready for withdrawal": [""], + "To complete the process you need to wire%1$s %2$s to the exchange bank account": + [""], + "Alternative, you can also scan this QR code or open %1$s if you have a banking app installed that supports RFC 8905": + [""], + "Cancel withdrawal": [""], + "Could not toggle auto-open": [""], + "Could not toggle clipboard": [""], + Navigator: [""], + "Automatically open wallet based on page content": [""], + "Enabling this option below will make using the wallet faster, but requires more permissions from your browser.": + [""], + "Automatically check clipboard for Taler URI": [""], + Trust: [""], + "No exchange yet": [""], + "Term of Service": [""], + ok: [""], + changed: [""], + "not accepted": [""], + "unknown (exchange status should be updated)": [""], + "Add an exchange": [""], + Troubleshooting: [""], + "Developer mode": [""], + "More options and information useful for debugging": [""], + Display: [""], + "Current Language": [""], + "Wallet Core": [""], + "Web Extension": [""], + "Exchange compatibility": [""], + "Merchant compatibility": [""], + "Bank compatibility": [""], + "Browser Extension Installed!": [""], + "You can open the GNU Taler Wallet using the combination %1$s .": [""], + "Also pinning the GNU Taler Wallet to your Chrome browser allows you to quick access without keyboard:": + [""], + "Click the puzzle icon": [""], + "Search for GNU Taler Wallet": [""], + "Click the pin icon": [""], + Permissions: [""], + "(Enabling this option below will make using the wallet faster, but requires more permissions from your browser.)": + [""], + "Next Steps": [""], + "Try the demo": [""], + "Learn how to top up your wallet balance": [""], + "Diagnostics timed out. Could not talk to the wallet backend.": [""], + "Problems detected:": [""], + "Please check in your %1$s settings that you have IndexedDB enabled (check the preference name %2$s).": + [""], + "Your wallet database is outdated. Currently automatic migration is not supported. Please go %1$s to reset the wallet database.": + [""], + "Running diagnostics": [""], + "Debug tools": [""], + "Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?": + [""], + reset: [""], + "TESTING: This may delete all your coin, proceed with caution": [""], + "run gc": [""], + "import database": [""], + "export database": [""], + "Database exported at %1$s %2$s to download": [""], + Coins: [""], + "Pending operations": [""], + "usable coins": [""], + id: [""], + denom: [""], + value: [""], + status: [""], + "from refresh?": [""], + "age key count": [""], + "spent coins": [""], + "click to show": [""], + "Scan a QR code or enter taler:// URI below": [""], + Open: [""], + "URI is not valid. Taler URI should start with `taler://`": [""], + "Try another": [""], + "Could not load list of exchange": [""], + "Choose a currency to proceed or add another exchange": [""], + "Known currencies": [""], + "Specify the amount and the origin": [""], + "Change currency": [""], + "Use previous origins:": [""], + "Or specify the origin of the money": [""], + "Specify the origin of the money": [""], + "From my bank account": [""], + "From another wallet": [""], + "currency not provided": [""], + "Specify the amount and the destination": [""], + "Use previous destinations:": [""], + "Or specify the destination of the money": [""], + "Specify the destination of the money": [""], + "To my bank account": [""], + "To another wallet": [""], + "Could not load backup recovery information": [""], + "Digital wallet recovery": [""], + "Import backup, show info": [""], + "All done, your transaction is in progress": [""], + Edit: [""], + "Could not load the list of known exchanges": [""], + }, + }, +}; + +strings["it"] = { + domain: "messages", + locale_data: { + messages: { + "": { + domain: "messages", + plural_forms: "nplurals=2; plural=n != 1;", + lang: "it", + }, + Balance: [""], + Backup: [""], + "QR Reader and Taler URI": [""], + Settings: [""], + Dev: [""], + "%1$s": [""], + "PENDING OPERATIONS": [""], + Loading: [""], + "Could not load backup providers": [""], + "No backup providers configured": [""], + "Add provider": [""], + "Sync all backups": [""], + "Sync now": [""], + "Last synced": [""], + "Not synced": [""], + "Expires in": [""], + "There was an error loading the provider detail for " %1$s"": [ + "", + ], + "There is not known provider with url "%1$s".": [""], + "See providers": [""], + "Last backup": [""], + "Back up": [""], + "Provider fee": [""], + "per year": [""], + Extend: [""], + "terms has changed, extending the service will imply accepting the new terms of service": + [""], + old: [""], + new: [""], + fee: [""], + storage: [""], + "Remove provider": [""], + "This provider has reported an error": [""], + "There is conflict with another backup from %1$s": [""], + "Backup is not readable": [""], + "Unknown backup problem: %1$s": [""], + "service paid": [""], + "Backup valid until": [""], + Cancel: [""], + "Open reserve page": [""], + "Open pay page": [""], + "Open refund page": [""], + "Open tip page": [""], + "Open withdraw page": [""], + "Get digital cash": [""], + "Could not load balance page": [""], + Add: [""], + "Send %1$s": [""], + "Taler Action": [""], + "This page has pay action.": [""], + "This page has a withdrawal action.": [""], + "This page has a tip action.": [""], + "This page has a notify reserve action.": [""], + Notify: [""], + "This page has a refund action.": [""], + "This page has a malformed taler uri.": [""], + Dismiss: [""], + "this popup is being closed and you are being redirected to %1$s": [""], + "Could not load purchase proposal details": [""], + "Order Id": [""], + Summary: [""], + Amount: [""], + "Merchant name": [""], + "Merchant jurisdiction": [""], + "Merchant address": [""], + "Merchant logo": [""], + "Merchant website": [""], + "Merchant email": [""], + "Merchant public key": [""], + "Delivery date": [""], + "Delivery location": [""], + Products: [""], + "Created at": [""], + "Refund deadline": [""], + "Auto refund": [""], + "Pay deadline": [""], + "Fulfillment URL": [""], + "Fulfillment message": [""], + "Max deposit fee": [""], + "Max fee": [""], + "Minimum age": [""], + "Wire fee amortization": [""], + Auditors: [""], + Exchanges: [""], + "Bank account": [""], + "Bitcoin address": [""], + IBAN: [""], + "Could not load deposit status": [""], + "Digital cash deposit": [""], + Cost: [""], + Fee: [""], + "To be received": [""], + "Send   %1$s": [""], + "Bitcoin transfer details": [""], + "The exchange need a transaction with 3 output, one output is the exchange account and the other two are segwit fake address for metadata with an minimum amount.": + [""], + "In bitcoincore wallet use 'Add Recipient' button to add two additional recipient and copy addresses and amounts": + [""], + "Make sure the amount show %1$s BTC, else you have to change the base unit to BTC": + [""], + Account: [""], + "Bank host": [""], + "Bank transfer details": [""], + Subject: [""], + "Receiver name": [""], + "Could not load the transaction information": [""], + "There was an error trying to complete the transaction": [""], + "This transaction is not completed": [""], + Send: [""], + Retry: [""], + Forget: [""], + "Caution!": [""], + "If you have already wired money to the exchange you will loose the chance to get the coins form it.": + [""], + Confirm: ["Confermare"], + Withdrawal: [""], + "Make sure to use the correct subject, otherwise the money will not arrive in this wallet.": + [""], + "The bank did not yet confirmed the wire transfer. Go to the %1$s %2$s and check there is no pending step.": + [""], + "Bank has confirmed the wire transfer. Waiting for the exchange to send the coins": + [""], + Details: [""], + Payment: [""], + Refunds: [""], + "%1$s %2$s on %3$s": [""], + "Merchant created a refund for this order but was not automatically picked up.": + [""], + Offer: [""], + Accept: [""], + Merchant: [""], + "Invoice ID": [""], + Deposit: [""], + Refresh: [""], + Tip: [""], + Refund: [""], + "Original order ID": [""], + "Purchase summary": [""], + copy: [""], + "hide qr": [""], + "show qr": [""], + Credit: [""], + Invoice: [""], + Exchange: [""], + URI: [""], + Debit: [""], + Transfer: [""], + Country: [""], + "Address lines": [""], + "Building number": [""], + "Building name": [""], + Street: [""], + "Post code": [""], + "Town location": [""], + Town: [""], + District: [""], + "Country subdivision": [""], + Date: [""], + "Transaction fees": [""], + Total: [""], + Withdraw: [""], + Price: [""], + Refunded: [""], + Delivery: [""], + "Total transfer": [""], + "Could not load pay status": [""], + "Digital cash payment": [""], + Purchase: [""], + Receipt: [""], + "Valid until": [""], + "List of products": [""], + free: [""], + "Already paid, you are going to be redirected to %1$s": [""], + "Already paid": [""], + "Already claimed": [""], + "Pay with a mobile phone": [""], + "Hide QR": [""], + "Scan the QR code or   %1$s": [""], + "Pay   %1$s": [""], + "You have no balance for this currency. Withdraw digital cash first.": [ + "", + ], + "Could not find enough coins to pay. Even if you have enough %1$s some restriction may apply.": + [""], + "Your current balance is not enough.": [""], + "Merchant message": [""], + "Could not load refund status": [""], + "Digital cash refund": [""], + "You've ignored the tip.": [""], + "The refund is in progress.": [""], + "Total to refund": [""], + "The merchant "%1$s" is offering you a refund.": [""], + "Order amount": [""], + "Already refunded": [""], + "Refund offered": [""], + "Accept   %1$s": [""], + "Could not load tip status": [""], + "Digital cash tip": [""], + "The merchant is offering you a tip": [""], + "Merchant URL": [""], + "Receive   %1$s": [""], + "Tip from %1$s accepted. Check your transactions list for more details.": + [""], + "Select one option": [""], + "Could not load": [""], + "Show terms of service": [""], + "I accept the exchange terms of service": [""], + "Exchange doesn't have terms of service": [""], + "Review exchange terms of service": [""], + "Review new version of terms of service": [""], + "The exchange reply with a empty terms of service": [""], + "Download Terms of Service": [""], + "Hide terms of service": [""], + "Could not load exchange fees": [""], + Close: [""], + "could not find any exchange": [""], + "could not find any exchange for the currency %1$s": [""], + "Service fee description": [""], + "Select %1$s exchange": [""], + Reset: [""], + "Use this exchange": [""], + "Doesn't have auditors": [""], + currency: [""], + Operations: [""], + Deposits: [""], + Denomination: [""], + Until: [""], + Withdrawals: [""], + Currency: [""], + "Coin operations": [""], + "Every operation in this section may be different by denomination value and is valid for a period of time. The exchange will charge the indicated amount every time a coin is used in such operation.": + [""], + "Transfer operations": [""], + "Every operation in this section may be different by transfer type and is valid for a period of time. The exchange will charge the indicated amount every time a transfer is made.": + [""], + Operation: [""], + "Wallet operations": [""], + Feature: [""], + "Could not get the info from the URI": [""], + "Could not get info of withdrawal": [""], + "Digital cash withdrawal": [""], + "Could not finish the withdrawal operation": [""], + "Age restriction": [""], + "Withdraw   %1$s": [""], + "Withdraw to a mobile phone": [""], + "Digital invoice": [""], + "Could not finish the invoice creation": [""], + Create: [""], + "Could not finish the payment operation": [""], + "Digital cash transfer": [""], + "Could not finish the transfer creation": [""], + "Could not finish the pickup operation": [""], + "Manual Withdrawal for %1$s": [""], + "Choose a exchange from where the coins will be withdrawn. The exchange will send the coins to this wallet after receiving a wire transfer with the correct subject.": + [""], + "No exchange found for %1$s": [""], + "Add Exchange": [""], + "No exchange configured": [""], + "Can't create the reserve": [""], + "Start withdrawal": [""], + "Could not load deposit balance": [""], + "A currency or an amount should be indicated": [""], + "There is no enough balance to make a deposit for currency %1$s": [""], + "Send %1$s to your account": [""], + "There is no account to make a deposit for currency %1$s": [""], + "Add account": [""], + "Select account": [""], + "Add another account": [""], + "Deposit fee": [""], + "Total deposit": [""], + "Deposit %1$s %2$s": [""], + "Add bank account for %1$s": [""], + "Enter the URL of an exchange you trust.": [""], + "Unable add this account": [""], + "Select account type": [""], + "Review terms of service": [""], + "Exchange URL": [""], + "Add exchange": [""], + "Add new exchange": [""], + "Add exchange for %1$s": [""], + "An exchange has been found! Review the information and click next": [""], + "This exchange doesn't match the expected currency %1$s": [""], + "Unable to verify this exchange": [""], + "Unable to add this exchange": [""], + loading: [""], + Version: [""], + Next: [""], + "Waiting for confirmation": [""], + PENDING: [""], + "Could not load the list of transactions": [""], + "Your transaction history is empty for this currency.": [""], + "Add backup provider": [""], + "Could not get provider information": [""], + "Backup providers may charge for their service": [""], + URL: [""], + Name: [""], + "Provider URL": [""], + "Please review and accept this provider's terms of service": [""], + Pricing: [""], + "free of charge": [""], + "%1$s per year of service": [""], + Storage: [""], + "%1$s megabytes of storage per year of service": [""], + "Accept terms of service": [""], + "Could not parse the payto URI": [""], + "Please check the uri": [""], + "Exchange is ready for withdrawal": [""], + "To complete the process you need to wire%1$s %2$s to the exchange bank account": + [""], + "Alternative, you can also scan this QR code or open %1$s if you have a banking app installed that supports RFC 8905": + [""], + "Cancel withdrawal": [""], + "Could not toggle auto-open": [""], + "Could not toggle clipboard": [""], + Navigator: [""], + "Automatically open wallet based on page content": [""], + "Enabling this option below will make using the wallet faster, but requires more permissions from your browser.": + [""], + "Automatically check clipboard for Taler URI": [""], + Trust: [""], + "No exchange yet": [""], + "Term of Service": [""], + ok: [""], + changed: [""], + "not accepted": [""], + "unknown (exchange status should be updated)": [""], + "Add an exchange": [""], + Troubleshooting: [""], + "Developer mode": [""], + "More options and information useful for debugging": [""], + Display: [""], + "Current Language": [""], + "Wallet Core": [""], + "Web Extension": [""], + "Exchange compatibility": [""], + "Merchant compatibility": [""], + "Bank compatibility": [""], + "Browser Extension Installed!": [""], + "You can open the GNU Taler Wallet using the combination %1$s .": [""], + "Also pinning the GNU Taler Wallet to your Chrome browser allows you to quick access without keyboard:": + [""], + "Click the puzzle icon": [""], + "Search for GNU Taler Wallet": [""], + "Click the pin icon": [""], + Permissions: [""], + "(Enabling this option below will make using the wallet faster, but requires more permissions from your browser.)": + [""], + "Next Steps": [""], + "Try the demo": [""], + "Learn how to top up your wallet balance": [""], + "Diagnostics timed out. Could not talk to the wallet backend.": [""], + "Problems detected:": [""], + "Please check in your %1$s settings that you have IndexedDB enabled (check the preference name %2$s).": + [""], + "Your wallet database is outdated. Currently automatic migration is not supported. Please go %1$s to reset the wallet database.": + [""], + "Running diagnostics": [""], + "Debug tools": [""], + "Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?": + [""], + reset: [""], + "TESTING: This may delete all your coin, proceed with caution": [""], + "run gc": [""], + "import database": [""], + "export database": [""], + "Database exported at %1$s %2$s to download": [""], + Coins: [""], + "Pending operations": [""], + "usable coins": [""], + id: [""], + denom: [""], + value: [""], + status: [""], + "from refresh?": [""], + "age key count": [""], + "spent coins": [""], + "click to show": [""], + "Scan a QR code or enter taler:// URI below": [""], + Open: [""], + "URI is not valid. Taler URI should start with `taler://`": [""], + "Try another": [""], + "Could not load list of exchange": [""], + "Choose a currency to proceed or add another exchange": [""], + "Known currencies": [""], + "Specify the amount and the origin": [""], + "Change currency": [""], + "Use previous origins:": [""], + "Or specify the origin of the money": [""], + "Specify the origin of the money": [""], + "From my bank account": [""], + "From another wallet": [""], + "currency not provided": [""], + "Specify the amount and the destination": [""], + "Use previous destinations:": [""], + "Or specify the destination of the money": [""], + "Specify the destination of the money": [""], + "To my bank account": [""], + "To another wallet": [""], + "Could not load backup recovery information": [""], + "Digital wallet recovery": [""], + "Import backup, show info": [""], + "All done, your transaction is in progress": [""], + Edit: [""], + "Could not load the list of known exchanges": [""], + }, + }, +}; + +strings["ja"] = { + domain: "messages", + locale_data: { + messages: { + "": { + domain: "messages", + plural_forms: "nplurals=2; plural=n != 1;", + lang: "ja", + }, + Balance: ["残高"], + Backup: ["バックアップ"], + "QR Reader and Taler URI": [""], + Settings: ["設定"], + Dev: [""], + "%1$s": [""], + "PENDING OPERATIONS": [""], + Loading: [""], + "Could not load backup providers": [""], + "No backup providers configured": [""], + "Add provider": [""], + "Sync all backups": [""], + "Sync now": [""], + "Last synced": [""], + "Not synced": [""], + "Expires in": [""], + "There was an error loading the provider detail for " %1$s"": [ + "", + ], + "There is not known provider with url "%1$s".": [""], + "See providers": [""], + "Last backup": [""], + "Back up": [""], + "Provider fee": [""], + "per year": [""], + Extend: [""], + "terms has changed, extending the service will imply accepting the new terms of service": + [""], + old: [""], + new: [""], + fee: [""], + storage: [""], + "Remove provider": [""], + "This provider has reported an error": [""], + "There is conflict with another backup from %1$s": [""], + "Backup is not readable": [""], + "Unknown backup problem: %1$s": [""], + "service paid": [""], + "Backup valid until": [""], + Cancel: [""], + "Open reserve page": [""], + "Open pay page": [""], + "Open refund page": [""], + "Open tip page": [""], + "Open withdraw page": [""], + "Get digital cash": [""], + "Could not load balance page": [""], + Add: [""], + "Send %1$s": [""], + "Taler Action": [""], + "This page has pay action.": [""], + "This page has a withdrawal action.": [""], + "This page has a tip action.": [""], + "This page has a notify reserve action.": [""], + Notify: [""], + "This page has a refund action.": [""], + "This page has a malformed taler uri.": [""], + Dismiss: [""], + "this popup is being closed and you are being redirected to %1$s": [""], + "Could not load purchase proposal details": [""], + "Order Id": [""], + Summary: [""], + Amount: [""], + "Merchant name": [""], + "Merchant jurisdiction": [""], + "Merchant address": [""], + "Merchant logo": [""], + "Merchant website": [""], + "Merchant email": [""], + "Merchant public key": [""], + "Delivery date": [""], + "Delivery location": [""], + Products: [""], + "Created at": [""], + "Refund deadline": [""], + "Auto refund": [""], + "Pay deadline": [""], + "Fulfillment URL": [""], + "Fulfillment message": [""], + "Max deposit fee": [""], + "Max fee": [""], + "Minimum age": [""], + "Wire fee amortization": [""], + Auditors: [""], + Exchanges: [""], + "Bank account": [""], + "Bitcoin address": [""], + IBAN: [""], + "Could not load deposit status": [""], + "Digital cash deposit": [""], + Cost: [""], + Fee: [""], + "To be received": [""], + "Send   %1$s": [""], + "Bitcoin transfer details": [""], + "The exchange need a transaction with 3 output, one output is the exchange account and the other two are segwit fake address for metadata with an minimum amount.": + [""], + "In bitcoincore wallet use 'Add Recipient' button to add two additional recipient and copy addresses and amounts": + [""], + "Make sure the amount show %1$s BTC, else you have to change the base unit to BTC": + [""], + Account: [""], + "Bank host": [""], + "Bank transfer details": [""], + Subject: [""], + "Receiver name": [""], + "Could not load the transaction information": [""], + "There was an error trying to complete the transaction": [""], + "This transaction is not completed": [""], + Send: [""], + Retry: [""], + Forget: [""], + "Caution!": [""], + "If you have already wired money to the exchange you will loose the chance to get the coins form it.": + [""], + Confirm: [""], + Withdrawal: [""], + "Make sure to use the correct subject, otherwise the money will not arrive in this wallet.": + [""], + "The bank did not yet confirmed the wire transfer. Go to the %1$s %2$s and check there is no pending step.": + [""], + "Bank has confirmed the wire transfer. Waiting for the exchange to send the coins": + [""], + Details: [""], + Payment: [""], + Refunds: [""], + "%1$s %2$s on %3$s": [""], + "Merchant created a refund for this order but was not automatically picked up.": + [""], + Offer: [""], + Accept: [""], + Merchant: [""], + "Invoice ID": [""], + Deposit: [""], + Refresh: [""], + Tip: [""], + Refund: [""], + "Original order ID": [""], + "Purchase summary": [""], + copy: [""], + "hide qr": [""], + "show qr": [""], + Credit: [""], + Invoice: [""], + Exchange: [""], + URI: [""], + Debit: [""], + Transfer: [""], + Country: [""], + "Address lines": [""], + "Building number": [""], + "Building name": [""], + Street: [""], + "Post code": [""], + "Town location": [""], + Town: [""], + District: [""], + "Country subdivision": [""], + Date: [""], + "Transaction fees": [""], + Total: [""], + Withdraw: ["撤退"], + Price: [""], + Refunded: [""], + Delivery: [""], + "Total transfer": [""], + "Could not load pay status": [""], + "Digital cash payment": [""], + Purchase: [""], + Receipt: [""], + "Valid until": [""], + "List of products": [""], + free: [""], + "Already paid, you are going to be redirected to %1$s": [""], + "Already paid": [""], + "Already claimed": [""], + "Pay with a mobile phone": [""], + "Hide QR": [""], + "Scan the QR code or   %1$s": [""], + "Pay   %1$s": [""], + "You have no balance for this currency. Withdraw digital cash first.": [ + "", + ], + "Could not find enough coins to pay. Even if you have enough %1$s some restriction may apply.": + [""], + "Your current balance is not enough.": ["表示するバランスがありません"], + "Merchant message": [""], + "Could not load refund status": [""], + "Digital cash refund": [""], + "You've ignored the tip.": [""], + "The refund is in progress.": [""], + "Total to refund": [""], + "The merchant "%1$s" is offering you a refund.": [""], + "Order amount": [""], + "Already refunded": [""], + "Refund offered": [""], + "Accept   %1$s": [""], + "Could not load tip status": [""], + "Digital cash tip": [""], + "The merchant is offering you a tip": [""], + "Merchant URL": [""], + "Receive   %1$s": [""], + "Tip from %1$s accepted. Check your transactions list for more details.": + [""], + "Select one option": [""], + "Could not load": [""], + "Show terms of service": [""], + "I accept the exchange terms of service": [""], + "Exchange doesn't have terms of service": [""], + "Review exchange terms of service": [""], + "Review new version of terms of service": [""], + "The exchange reply with a empty terms of service": [""], + "Download Terms of Service": [""], + "Hide terms of service": [""], + "Could not load exchange fees": [""], + Close: [""], + "could not find any exchange": [""], + "could not find any exchange for the currency %1$s": [""], + "Service fee description": [""], + "Select %1$s exchange": [""], + Reset: [""], + "Use this exchange": [""], + "Doesn't have auditors": [""], + currency: [""], + Operations: [""], + Deposits: [""], + Denomination: [""], + Until: [""], + Withdrawals: ["撤退"], + Currency: [""], + "Coin operations": [""], + "Every operation in this section may be different by denomination value and is valid for a period of time. The exchange will charge the indicated amount every time a coin is used in such operation.": + [""], + "Transfer operations": [""], + "Every operation in this section may be different by transfer type and is valid for a period of time. The exchange will charge the indicated amount every time a transfer is made.": + [""], + Operation: [""], + "Wallet operations": [""], + Feature: [""], + "Could not get the info from the URI": [""], + "Could not get info of withdrawal": [""], + "Digital cash withdrawal": [""], + "Could not finish the withdrawal operation": [""], + "Age restriction": [""], + "Withdraw   %1$s": [""], + "Withdraw to a mobile phone": [""], + "Digital invoice": [""], + "Could not finish the invoice creation": [""], + Create: [""], + "Could not finish the payment operation": [""], + "Digital cash transfer": [""], + "Could not finish the transfer creation": [""], + "Could not finish the pickup operation": [""], + "Manual Withdrawal for %1$s": [""], + "Choose a exchange from where the coins will be withdrawn. The exchange will send the coins to this wallet after receiving a wire transfer with the correct subject.": + [""], + "No exchange found for %1$s": [""], + "Add Exchange": [""], + "No exchange configured": [""], + "Can't create the reserve": [""], + "Start withdrawal": [""], + "Could not load deposit balance": [""], + "A currency or an amount should be indicated": [""], + "There is no enough balance to make a deposit for currency %1$s": [""], + "Send %1$s to your account": [""], + "There is no account to make a deposit for currency %1$s": [""], + "Add account": [""], + "Select account": [""], + "Add another account": [""], + "Deposit fee": [""], + "Total deposit": [""], + "Deposit %1$s %2$s": [""], + "Add bank account for %1$s": [""], + "Enter the URL of an exchange you trust.": [""], + "Unable add this account": [""], + "Select account type": [""], + "Review terms of service": [""], + "Exchange URL": [""], + "Add exchange": [""], + "Add new exchange": [""], + "Add exchange for %1$s": [""], + "An exchange has been found! Review the information and click next": [""], + "This exchange doesn't match the expected currency %1$s": [""], + "Unable to verify this exchange": [""], + "Unable to add this exchange": [""], + loading: [""], + Version: [""], + Next: [""], + "Waiting for confirmation": [""], + PENDING: [""], + "Could not load the list of transactions": [""], + "Your transaction history is empty for this currency.": [""], + "Add backup provider": [""], + "Could not get provider information": [""], + "Backup providers may charge for their service": [""], + URL: [""], + Name: [""], + "Provider URL": [""], + "Please review and accept this provider's terms of service": [""], + Pricing: [""], + "free of charge": [""], + "%1$s per year of service": [""], + Storage: [""], + "%1$s megabytes of storage per year of service": [""], + "Accept terms of service": [""], + "Could not parse the payto URI": [""], + "Please check the uri": [""], + "Exchange is ready for withdrawal": [""], + "To complete the process you need to wire%1$s %2$s to the exchange bank account": + [""], + "Alternative, you can also scan this QR code or open %1$s if you have a banking app installed that supports RFC 8905": + [""], + "Cancel withdrawal": [""], + "Could not toggle auto-open": [""], + "Could not toggle clipboard": [""], + Navigator: [""], + "Automatically open wallet based on page content": [""], + "Enabling this option below will make using the wallet faster, but requires more permissions from your browser.": + [""], + "Automatically check clipboard for Taler URI": [""], + Trust: [""], + "No exchange yet": [""], + "Term of Service": [""], + ok: [""], + changed: [""], + "not accepted": [""], + "unknown (exchange status should be updated)": [""], + "Add an exchange": [""], + Troubleshooting: [""], + "Developer mode": [""], + "More options and information useful for debugging": [""], + Display: [""], + "Current Language": [""], + "Wallet Core": [""], + "Web Extension": [""], + "Exchange compatibility": [""], + "Merchant compatibility": [""], + "Bank compatibility": [""], + "Browser Extension Installed!": [""], + "You can open the GNU Taler Wallet using the combination %1$s .": [""], + "Also pinning the GNU Taler Wallet to your Chrome browser allows you to quick access without keyboard:": + [""], + "Click the puzzle icon": [""], + "Search for GNU Taler Wallet": [""], + "Click the pin icon": [""], + Permissions: [""], + "(Enabling this option below will make using the wallet faster, but requires more permissions from your browser.)": + [""], + "Next Steps": [""], + "Try the demo": [""], + "Learn how to top up your wallet balance": [""], + "Diagnostics timed out. Could not talk to the wallet backend.": [""], + "Problems detected:": [""], + "Please check in your %1$s settings that you have IndexedDB enabled (check the preference name %2$s).": + [""], + "Your wallet database is outdated. Currently automatic migration is not supported. Please go %1$s to reset the wallet database.": + [""], + "Running diagnostics": [""], + "Debug tools": [""], + "Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?": + [""], + reset: [""], + "TESTING: This may delete all your coin, proceed with caution": [""], + "run gc": [""], + "import database": [""], + "export database": [""], + "Database exported at %1$s %2$s to download": [""], + Coins: [""], + "Pending operations": [""], + "usable coins": [""], + id: [""], + denom: [""], + value: [""], + status: [""], + "from refresh?": [""], + "age key count": [""], + "spent coins": [""], + "click to show": [""], + "Scan a QR code or enter taler:// URI below": [""], + Open: [""], + "URI is not valid. Taler URI should start with `taler://`": [""], + "Try another": [""], + "Could not load list of exchange": [""], + "Choose a currency to proceed or add another exchange": [""], + "Known currencies": [""], + "Specify the amount and the origin": [""], + "Change currency": [""], + "Use previous origins:": [""], + "Or specify the origin of the money": [""], + "Specify the origin of the money": [""], + "From my bank account": [""], + "From another wallet": [""], + "currency not provided": [""], + "Specify the amount and the destination": [""], + "Use previous destinations:": [""], + "Or specify the destination of the money": [""], + "Specify the destination of the money": [""], + "To my bank account": [""], + "To another wallet": [""], + "Could not load backup recovery information": [""], + "Digital wallet recovery": [""], + "Import backup, show info": [""], + "All done, your transaction is in progress": [""], + Edit: [""], + "Could not load the list of known exchanges": [""], + }, + }, +}; + +strings["sv"] = { + domain: "messages", + locale_data: { + messages: { + "": { + domain: "messages", + plural_forms: "nplurals=2; plural=n != 1;", + lang: "sv", + }, + Balance: ["Balans"], + Backup: [""], + "QR Reader and Taler URI": [""], + Settings: [""], + Dev: [""], + "%1$s": [""], + "PENDING OPERATIONS": [""], + Loading: [""], + "Could not load backup providers": [""], + "No backup providers configured": [""], + "Add provider": [""], + "Sync all backups": [""], + "Sync now": [""], + "Last synced": [""], + "Not synced": [""], + "Expires in": [""], + "There was an error loading the provider detail for " %1$s"": [ + "", + ], + "There is not known provider with url "%1$s".": [""], + "See providers": [""], + "Last backup": [""], + "Back up": [""], + "Provider fee": [""], + "per year": [""], + Extend: [""], + "terms has changed, extending the service will imply accepting the new terms of service": + [""], + old: [""], + new: [""], + fee: [""], + storage: [""], + "Remove provider": [""], + "This provider has reported an error": [""], + "There is conflict with another backup from %1$s": [""], + "Backup is not readable": [""], + "Unknown backup problem: %1$s": [""], + "service paid": [""], + "Backup valid until": [""], + Cancel: ["Avbryt"], + "Open reserve page": [""], + "Open pay page": [""], + "Open refund page": [""], + "Open tip page": [""], + "Open withdraw page": ["Utbetalnings avgift"], + "Get digital cash": ["Utbetalnings avgifter:"], + "Could not load balance page": [""], + Add: [""], + "Send %1$s": ["Välj %1$s"], + "Taler Action": [""], + "This page has pay action.": [""], + "This page has a withdrawal action.": [""], + "This page has a tip action.": [""], + "This page has a notify reserve action.": [""], + Notify: [""], + "This page has a refund action.": [""], + "This page has a malformed taler uri.": [""], + Dismiss: [""], + "this popup is being closed and you are being redirected to %1$s": [""], + "Could not load purchase proposal details": [""], + "Order Id": [""], + Summary: [""], + Amount: [""], + "Merchant name": [""], + "Merchant jurisdiction": [""], + "Merchant address": [""], + "Merchant logo": [""], + "Merchant website": [""], + "Merchant email": [""], + "Merchant public key": [""], + "Delivery date": [""], + "Delivery location": [""], + Products: [""], + "Created at": [""], + "Refund deadline": [""], + "Auto refund": [""], + "Pay deadline": [""], + "Fulfillment URL": [""], + "Fulfillment message": [""], + "Max deposit fee": ["Depostitions avgift"], + "Max fee": [""], + "Minimum age": [""], + "Wire fee amortization": [""], + Auditors: [""], + Exchanges: ["Accepterade tjänsteleverantörer:"], + "Bank account": ["Övervisa till bank konto"], + "Bitcoin address": [""], + IBAN: [""], + "Could not load deposit status": [""], + "Digital cash deposit": [""], + Cost: [""], + Fee: [""], + "To be received": [""], + "Send   %1$s": [""], + "Bitcoin transfer details": [""], + "The exchange need a transaction with 3 output, one output is the exchange account and the other two are segwit fake address for metadata with an minimum amount.": + [""], + "In bitcoincore wallet use 'Add Recipient' button to add two additional recipient and copy addresses and amounts": + [""], + "Make sure the amount show %1$s BTC, else you have to change the base unit to BTC": + [""], + Account: [""], + "Bank host": [""], + "Bank transfer details": [""], + Subject: [""], + "Receiver name": [""], + "Could not load the transaction information": [""], + "There was an error trying to complete the transaction": [""], + "This transaction is not completed": [""], + Send: [""], + Retry: [""], + Forget: [""], + "Caution!": [""], + "If you have already wired money to the exchange you will loose the chance to get the coins form it.": + [""], + Confirm: ["Bekräfta"], + Withdrawal: ["Utbetalnings avgift"], + "Make sure to use the correct subject, otherwise the money will not arrive in this wallet.": + [""], + "The bank did not yet confirmed the wire transfer. Go to the %1$s %2$s and check there is no pending step.": + [""], + "Bank has confirmed the wire transfer. Waiting for the exchange to send the coins": + [""], + Details: [""], + Payment: ["Godkän betalning"], + Refunds: [""], + "%1$s %2$s on %3$s": ["Säljaren %1$sgav en återbetalning på %2$s.\n"], + "Merchant created a refund for this order but was not automatically picked up.": + [""], + Offer: [""], + Accept: [""], + Merchant: [""], + "Invoice ID": [""], + Deposit: ["Depostitions avgift"], + Refresh: ["Återhämtnings avgift"], + Tip: [""], + Refund: [""], + "Original order ID": [""], + "Purchase summary": [""], + copy: [""], + "hide qr": [""], + "show qr": [""], + Credit: [""], + Invoice: [""], + Exchange: [""], + URI: [""], + Debit: [""], + Transfer: [""], + Country: [""], + "Address lines": [""], + "Building number": [""], + "Building name": [""], + Street: [""], + "Post code": [""], + "Town location": [""], + Town: [""], + District: [""], + "Country subdivision": [""], + Date: [""], + "Transaction fees": [""], + Total: [""], + Withdraw: ["Utbetalnings avgift"], + Price: [""], + Refunded: [""], + Delivery: [""], + "Total transfer": ["Utbetalnings avgift"], + "Could not load pay status": [""], + "Digital cash payment": [""], + Purchase: [""], + Receipt: [""], + "Valid until": [""], + "List of products": [""], + free: [""], + "Already paid, you are going to be redirected to %1$s": [""], + "Already paid": [""], + "Already claimed": [""], + "Pay with a mobile phone": [""], + "Hide QR": [""], + "Scan the QR code or   %1$s": [""], + "Pay   %1$s": [""], + "You have no balance for this currency. Withdraw digital cash first.": [ + "", ], - "Specify the amount and the destination": [ - "" + "Could not find enough coins to pay. Even if you have enough %1$s some restriction may apply.": + [""], + "Your current balance is not enough.": [ + "Du har ingen balans att visa. Behöver du\n %1$s att börja?\n", + ], + "Merchant message": [""], + "Could not load refund status": [""], + "Digital cash refund": [""], + "You've ignored the tip.": [""], + "The refund is in progress.": [""], + "Total to refund": ["Utbetalnings avgift"], + "The merchant "%1$s" is offering you a refund.": [ + "Säljaren %1$s erbjuder följande:", + ], + "Order amount": ["Återhämtnings avgift"], + "Already refunded": [""], + "Refund offered": [""], + "Accept   %1$s": [""], + "Could not load tip status": [""], + "Digital cash tip": [""], + "The merchant is offering you a tip": [ + "Säljaren %1$s erbjuder följande:", + ], + "Merchant URL": [""], + "Receive   %1$s": [""], + "Tip from %1$s accepted. Check your transactions list for more details.": + [""], + "Select one option": [""], + "Could not load": [""], + "Show terms of service": [""], + "I accept the exchange terms of service": [""], + "Exchange doesn't have terms of service": [""], + "Review exchange terms of service": [""], + "Review new version of terms of service": [""], + "The exchange reply with a empty terms of service": [""], + "Download Terms of Service": [""], + "Hide terms of service": [""], + "Could not load exchange fees": [""], + Close: [""], + "could not find any exchange": ["Accepterade tjänsteleverantörer:"], + "could not find any exchange for the currency %1$s": [""], + "Service fee description": [""], + "Select %1$s exchange": ["Välj %1$s"], + Reset: [""], + "Use this exchange": ["Accepterade tjänsteleverantörer:"], + "Doesn't have auditors": [""], + currency: [""], + Operations: [""], + Deposits: ["Depostitions avgift"], + Denomination: [""], + Until: [""], + Withdrawals: ["Utbetalnings avgift"], + Currency: [""], + "Coin operations": [""], + "Every operation in this section may be different by denomination value and is valid for a period of time. The exchange will charge the indicated amount every time a coin is used in such operation.": + [""], + "Transfer operations": [""], + "Every operation in this section may be different by transfer type and is valid for a period of time. The exchange will charge the indicated amount every time a transfer is made.": + [""], + Operation: [""], + "Wallet operations": [""], + Feature: [""], + "Could not get the info from the URI": [""], + "Could not get info of withdrawal": [""], + "Digital cash withdrawal": [""], + "Could not finish the withdrawal operation": [""], + "Age restriction": [""], + "Withdraw   %1$s": [""], + "Withdraw to a mobile phone": [""], + "Digital invoice": [""], + "Could not finish the invoice creation": [""], + Create: [""], + "Could not finish the payment operation": [""], + "Digital cash transfer": [""], + "Could not finish the transfer creation": [""], + "Could not finish the pickup operation": [""], + "Manual Withdrawal for %1$s": ["Utbetalnings avgift"], + "Choose a exchange from where the coins will be withdrawn. The exchange will send the coins to this wallet after receiving a wire transfer with the correct subject.": + [""], + "No exchange found for %1$s": ["Accepterade tjänsteleverantörer:"], + "Add Exchange": ["Accepterade tjänsteleverantörer:"], + "No exchange configured": [""], + "Can't create the reserve": [""], + "Start withdrawal": [""], + "Could not load deposit balance": [""], + "A currency or an amount should be indicated": [""], + "There is no enough balance to make a deposit for currency %1$s": [""], + "Send %1$s to your account": [""], + "There is no account to make a deposit for currency %1$s": [""], + "Add account": ["Övervisa till bank konto"], + "Select account": ["Övervisa till bank konto"], + "Add another account": ["Övervisa till bank konto"], + "Deposit fee": ["Depostitions avgift"], + "Total deposit": [""], + "Deposit %1$s %2$s": ["Depostitions avgift"], + "Add bank account for %1$s": ["Accepterade tjänsteleverantörer:"], + "Enter the URL of an exchange you trust.": [""], + "Unable add this account": [""], + "Select account type": [""], + "Review terms of service": [""], + "Exchange URL": [""], + "Add exchange": ["Accepterade tjänsteleverantörer:"], + "Add new exchange": ["Accepterade tjänsteleverantörer:"], + "Add exchange for %1$s": ["Accepterade tjänsteleverantörer:"], + "An exchange has been found! Review the information and click next": [""], + "This exchange doesn't match the expected currency %1$s": [""], + "Unable to verify this exchange": [""], + "Unable to add this exchange": [""], + loading: [""], + Version: [""], + Next: [""], + "Waiting for confirmation": [""], + PENDING: [""], + "Could not load the list of transactions": [""], + "Your transaction history is empty for this currency.": [""], + "Add backup provider": [""], + "Could not get provider information": [""], + "Backup providers may charge for their service": [""], + URL: [""], + Name: [""], + "Provider URL": [""], + "Please review and accept this provider's terms of service": [""], + Pricing: [""], + "free of charge": [""], + "%1$s per year of service": [""], + Storage: [""], + "%1$s megabytes of storage per year of service": [""], + "Accept terms of service": [""], + "Could not parse the payto URI": [""], + "Please check the uri": [""], + "Exchange is ready for withdrawal": ["Tjänsteleverantörer i plånboken:"], + "To complete the process you need to wire%1$s %2$s to the exchange bank account": + [""], + "Alternative, you can also scan this QR code or open %1$s if you have a banking app installed that supports RFC 8905": + [""], + "Cancel withdrawal": [""], + "Could not toggle auto-open": [""], + "Could not toggle clipboard": [""], + Navigator: [""], + "Automatically open wallet based on page content": [""], + "Enabling this option below will make using the wallet faster, but requires more permissions from your browser.": + [""], + "Automatically check clipboard for Taler URI": [""], + Trust: [""], + "No exchange yet": [""], + "Term of Service": [""], + ok: [""], + changed: [""], + "not accepted": [""], + "unknown (exchange status should be updated)": [""], + "Add an exchange": ["Accepterade tjänsteleverantörer:"], + Troubleshooting: [""], + "Developer mode": [""], + "More options and information useful for debugging": [""], + Display: [""], + "Current Language": [""], + "Wallet Core": [""], + "Web Extension": [""], + "Exchange compatibility": [""], + "Merchant compatibility": [""], + "Bank compatibility": [""], + "Browser Extension Installed!": [""], + "You can open the GNU Taler Wallet using the combination %1$s .": [""], + "Also pinning the GNU Taler Wallet to your Chrome browser allows you to quick access without keyboard:": + [""], + "Click the puzzle icon": [""], + "Search for GNU Taler Wallet": [""], + "Click the pin icon": [""], + Permissions: [""], + "(Enabling this option below will make using the wallet faster, but requires more permissions from your browser.)": + [""], + "Next Steps": [""], + "Try the demo": [""], + "Learn how to top up your wallet balance": [""], + "Diagnostics timed out. Could not talk to the wallet backend.": [""], + "Problems detected:": [""], + "Please check in your %1$s settings that you have IndexedDB enabled (check the preference name %2$s).": + [""], + "Your wallet database is outdated. Currently automatic migration is not supported. Please go %1$s to reset the wallet database.": + [""], + "Running diagnostics": [""], + "Debug tools": [""], + "Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?": + [""], + reset: [""], + "TESTING: This may delete all your coin, proceed with caution": [""], + "run gc": [""], + "import database": [""], + "export database": [""], + "Database exported at %1$s %2$s to download": [""], + Coins: ["# Mynt"], + "Pending operations": [""], + "usable coins": [""], + id: [""], + denom: [""], + value: ["Värde"], + status: [""], + "from refresh?": [""], + "age key count": ["Övervisa till bank konto"], + "spent coins": [""], + "click to show": [""], + "Scan a QR code or enter taler:// URI below": [""], + Open: [""], + "URI is not valid. Taler URI should start with `taler://`": [""], + "Try another": [""], + "Could not load list of exchange": [""], + "Choose a currency to proceed or add another exchange": [""], + "Known currencies": [""], + "Specify the amount and the origin": [""], + "Change currency": [""], + "Use previous origins:": [""], + "Or specify the origin of the money": [""], + "Specify the origin of the money": [""], + "From my bank account": ["Övervisa till bank konto"], + "From another wallet": [""], + "currency not provided": [""], + "Specify the amount and the destination": [""], + "Use previous destinations:": [""], + "Or specify the destination of the money": [""], + "Specify the destination of the money": [""], + "To my bank account": ["Övervisa till bank konto"], + "To another wallet": [""], + "Could not load backup recovery information": [""], + "Digital wallet recovery": [""], + "Import backup, show info": [""], + "All done, your transaction is in progress": [""], + Edit: [""], + "Could not load the list of known exchanges": [""], + }, + }, +}; + +strings["tr"] = { + domain: "messages", + locale_data: { + messages: { + "": { + domain: "messages", + plural_forms: "nplurals=2; plural=n != 1;", + lang: "tr", + }, + Balance: ["Bakiye"], + Backup: ["Yedekle"], + "QR Reader and Taler URI": [""], + Settings: ["Ayarlar"], + Dev: ["Gelişim"], + "%1$s": ["%1$s"], + "PENDING OPERATIONS": [""], + Loading: ["Yükleniyor"], + "Could not load backup providers": [ + "Yedekleme sağlayıcıları yüklenemedi", ], - "Use previous destinations:": [ - "" + "No backup providers configured": [ + "Yapılandırılmış yedekleme sağlayıcısı yok", + ], + "Add provider": ["Sağlayıcı ekle"], + "Sync all backups": ["Tüm yedeklemeleri senkronize et"], + "Sync now": ["Şimdi senkronize et"], + "Last synced": ["Son Senkronizasyon"], + "Not synced": ["Senkronize Edilmedi"], + "Expires in": ["İçinde sona eriyor"], + "There was an error loading the provider detail for " %1$s"": [ + "", + ], + "There is not known provider with url "%1$s".": [""], + "See providers": ["Sağlayıcı ekle"], + "Last backup": [""], + "Back up": [""], + "Provider fee": [""], + "per year": [""], + Extend: [""], + "terms has changed, extending the service will imply accepting the new terms of service": + [""], + old: [""], + new: [""], + fee: [""], + storage: [""], + "Remove provider": [""], + "This provider has reported an error": [""], + "There is conflict with another backup from %1$s": [""], + "Backup is not readable": [""], + "Unknown backup problem: %1$s": [""], + "service paid": [""], + "Backup valid until": [""], + Cancel: ["Bakiye"], + "Open reserve page": ["Rezerv sayfasını açın"], + "Open pay page": ["Ödeme sayfasını açın"], + "Open refund page": ["Geri ödeme sayfasını açın"], + "Open tip page": ["İkramiye sayfasını açın"], + "Open withdraw page": ["Para çekme sayfasını açın"], + "Get digital cash": [""], + "Could not load balance page": ["Bakiye sayfası yüklenemedi"], + Add: [""], + "Send %1$s": ["%1$s seçin"], + "Taler Action": ["Taler Eylemi"], + "This page has pay action.": ["Bu sayfada ödeme eylemi var."], + "This page has a withdrawal action.": [ + "Bu sayfada para çekme eylemi var.", ], - "Or specify the destination of the money": [ - "" + "This page has a tip action.": ["Bu sayfada bir ikramiye eylemi var."], + "This page has a notify reserve action.": [ + "Bu sayfada bir rezervasyon bildir eylemi var.", ], - "Specify the destination of the money": [ - "" + Notify: ["Bildirin"], + "This page has a refund action.": [ + "Bu sayfada bir geri ödeme eylemi var.", ], - "To my bank account": [ - "Banka hesabına havale yap" + "This page has a malformed taler uri.": [ + "Bu sayfada hatalı biçimlendirilmiş taler uri var.", ], - "To another wallet": [ - "" + Dismiss: ["Reddet"], + "this popup is being closed and you are being redirected to %1$s": [""], + "Could not load purchase proposal details": [ + "Yedekleme sağlayıcıları yüklenemedi", + ], + "Order Id": ["Sipariş reddedildi"], + Summary: [""], + Amount: [""], + "Merchant name": [""], + "Merchant jurisdiction": [""], + "Merchant address": [""], + "Merchant logo": [""], + "Merchant website": [""], + "Merchant email": [""], + "Merchant public key": [""], + "Delivery date": [""], + "Delivery location": ["Taler Eylemi"], + Products: [""], + "Created at": [""], + "Refund deadline": [""], + "Auto refund": ["Ödeme iadesi"], + "Pay deadline": [""], + "Fulfillment URL": [""], + "Fulfillment message": [""], + "Max deposit fee": [""], + "Max fee": [""], + "Minimum age": [""], + "Wire fee amortization": [""], + Auditors: [""], + Exchanges: ["Exchange"], + "Bank account": [""], + "Bitcoin address": [""], + IBAN: [""], + "Could not load deposit status": ["Bakiye sayfası yüklenemedi"], + "Digital cash deposit": [""], + Cost: [""], + Fee: ["Ücretler"], + "To be received": [""], + "Send   %1$s": [""], + "Bitcoin transfer details": [""], + "The exchange need a transaction with 3 output, one output is the exchange account and the other two are segwit fake address for metadata with an minimum amount.": + [""], + "In bitcoincore wallet use 'Add Recipient' button to add two additional recipient and copy addresses and amounts": + [""], + "Make sure the amount show %1$s BTC, else you have to change the base unit to BTC": + [""], + Account: [""], + "Bank host": [""], + "Bank transfer details": [""], + Subject: [""], + "Receiver name": [""], + "Could not load the transaction information": [""], + "There was an error trying to complete the transaction": [""], + "This transaction is not completed": [""], + Send: [""], + Retry: ["Yeniden deneyin"], + Forget: [""], + "Caution!": [""], + "If you have already wired money to the exchange you will loose the chance to get the coins form it.": + [""], + Confirm: ["Onaylamak"], + Withdrawal: ["Çekildi"], + "Make sure to use the correct subject, otherwise the money will not arrive in this wallet.": + [""], + "The bank did not yet confirmed the wire transfer. Go to the %1$s %2$s and check there is no pending step.": + [""], + "Bank has confirmed the wire transfer. Waiting for the exchange to send the coins": + [""], + Details: [""], + Payment: ["Ödeme gönderildi"], + Refunds: [""], + "%1$s %2$s on %3$s": [""], + "Merchant created a refund for this order but was not automatically picked up.": + [""], + Offer: [""], + Accept: ["İkramiye kabul edildi"], + Merchant: [""], + "Invoice ID": [""], + Deposit: [""], + Refresh: ["Ücreti yenile"], + Tip: [""], + Refund: [""], + "Original order ID": [""], + "Purchase summary": [""], + copy: [""], + "hide qr": [""], + "show qr": [""], + Credit: [""], + Invoice: [""], + Exchange: ["Exchange"], + URI: [""], + Debit: [""], + Transfer: [""], + Country: [""], + "Address lines": [""], + "Building number": [""], + "Building name": [""], + Street: [""], + "Post code": [""], + "Town location": [""], + Town: [""], + District: [""], + "Country subdivision": [""], + Date: [""], + "Transaction fees": [""], + Total: [""], + Withdraw: ["Para çek"], + Price: [""], + Refunded: [""], + Delivery: [""], + "Total transfer": ["Çekildi"], + "Could not load pay status": [""], + "Digital cash payment": [""], + Purchase: [""], + Receipt: [""], + "Valid until": [""], + "List of products": [""], + free: [""], + "Already paid, you are going to be redirected to %1$s": [""], + "Already paid": [""], + "Already claimed": [""], + "Pay with a mobile phone": [""], + "Hide QR": [""], + "Scan the QR code or   %1$s": [""], + "Pay   %1$s": [""], + "You have no balance for this currency. Withdraw digital cash first.": [ + "", + ], + "Could not find enough coins to pay. Even if you have enough %1$s some restriction may apply.": + [""], + "Your current balance is not enough.": ["Gösterecek bakiyeniz yok."], + "Merchant message": [""], + "Could not load refund status": ["Bakiye sayfası yüklenemedi"], + "Digital cash refund": [""], + "You've ignored the tip.": [""], + "The refund is in progress.": [""], + "Total to refund": ["Ödeme iadesi"], + "The merchant "%1$s" is offering you a refund.": [""], + "Order amount": ["Ücreti yenile"], + "Already refunded": ["Ödeme iadesi"], + "Refund offered": [""], + "Accept   %1$s": [""], + "Could not load tip status": ["Bakiye sayfası yüklenemedi"], + "Digital cash tip": [""], + "The merchant is offering you a tip": [""], + "Merchant URL": [""], + "Receive   %1$s": [""], + "Tip from %1$s accepted. Check your transactions list for more details.": + [""], + "Select one option": [""], + "Could not load": ["Bakiye sayfası yüklenemedi"], + "Show terms of service": ["Hizmet şartlarını göster"], + "I accept the exchange terms of service": [ + "Hizmet şartlarını kabul ediyorum", ], - "Could not load backup recovery information": [ - "Yedekleme sağlayıcıları yüklenemedi" + "Exchange doesn't have terms of service": [ + "Exchange'in hizmet şartları yok", ], - "Digital wallet recovery": [ - "" + "Review exchange terms of service": [ + "Exchange'in hizmet şartlarını inceleyin", ], - "Import backup, show info": [ - "" + "Review new version of terms of service": [ + "Hizmet şartlarının yeni sürümünü inceleyin", + ], + "The exchange reply with a empty terms of service": [""], + "Download Terms of Service": [""], + "Hide terms of service": [""], + "Could not load exchange fees": ["Bakiye sayfası yüklenemedi"], + Close: [""], + "could not find any exchange": ["Bakiye sayfası yüklenemedi"], + "could not find any exchange for the currency %1$s": [""], + "Service fee description": [""], + "Select %1$s exchange": ["Özel exchange'i seçin"], + Reset: [""], + "Use this exchange": ["Özel exchange'i seçin"], + "Doesn't have auditors": [""], + currency: [""], + Operations: ["Bekleyen işlemler"], + Deposits: ["Depozito %1$s"], + Denomination: ["Bekleyen işlemler"], + Until: [""], + Withdrawals: ["Çekildi"], + Currency: [""], + "Coin operations": ["Bekleyen işlemler"], + "Every operation in this section may be different by denomination value and is valid for a period of time. The exchange will charge the indicated amount every time a coin is used in such operation.": + [""], + "Transfer operations": ["Bekleyen işlemler"], + "Every operation in this section may be different by transfer type and is valid for a period of time. The exchange will charge the indicated amount every time a transfer is made.": + [""], + Operation: [""], + "Wallet operations": ["Bekleyen işlemler"], + Feature: [""], + "Could not get the info from the URI": [""], + "Could not get info of withdrawal": [ + "Para çekme işlemi için ayrıntılar alınamadı:", + ], + "Digital cash withdrawal": [""], + "Could not finish the withdrawal operation": [""], + "Age restriction": [""], + "Withdraw   %1$s": [""], + "Withdraw to a mobile phone": [""], + "Digital invoice": [""], + "Could not finish the invoice creation": [""], + Create: [""], + "Could not finish the payment operation": [ + "Para çekme işlemi için ayrıntılar alınamadı:", ], - "All done, your transaction is in progress": [ - "" + "Digital cash transfer": [""], + "Could not finish the transfer creation": [ + "Para çekme işlemi için ayrıntılar alınamadı:", ], - "Edit": [ - "Lütfen bir exchange seçin. Detayları seçiminizden önce inceleyebilirsiniz." + "Could not finish the pickup operation": [ + "Para çekme işlemi için ayrıntılar alınamadı:", + ], + "Manual Withdrawal for %1$s": ["Para çekme ücretleri:"], + "Choose a exchange from where the coins will be withdrawn. The exchange will send the coins to this wallet after receiving a wire transfer with the correct subject.": + [""], + "No exchange found for %1$s": [""], + "Add Exchange": [""], + "No exchange configured": [""], + "Can't create the reserve": [""], + "Start withdrawal": [""], + "Could not load deposit balance": ["Bakiye sayfası yüklenemedi"], + "A currency or an amount should be indicated": [""], + "There is no enough balance to make a deposit for currency %1$s": [""], + "Send %1$s to your account": [""], + "There is no account to make a deposit for currency %1$s": [""], + "Add account": [""], + "Select account": [""], + "Add another account": [""], + "Deposit fee": [""], + "Total deposit": [""], + "Deposit %1$s %2$s": ["Test Havale Hesap #%1$s üzerinde %2$s"], + "Add bank account for %1$s": [""], + "Enter the URL of an exchange you trust.": [""], + "Unable add this account": [""], + "Select account type": [""], + "Review terms of service": [""], + "Exchange URL": [""], + "Add exchange": [""], + "Add new exchange": [""], + "Add exchange for %1$s": [""], + "An exchange has been found! Review the information and click next": [""], + "This exchange doesn't match the expected currency %1$s": [""], + "Unable to verify this exchange": [""], + "Unable to add this exchange": [""], + loading: [""], + Version: [""], + Next: [""], + "Waiting for confirmation": [""], + PENDING: [""], + "Could not load the list of transactions": [""], + "Your transaction history is empty for this currency.": [""], + "Add backup provider": [""], + "Could not get provider information": [""], + "Backup providers may charge for their service": [""], + URL: [""], + Name: [""], + "Provider URL": [""], + "Please review and accept this provider's terms of service": [ + "Hizmet şartlarını kabul ediyorum", + ], + Pricing: [""], + "free of charge": [""], + "%1$s per year of service": [""], + Storage: [""], + "%1$s megabytes of storage per year of service": [""], + "Accept terms of service": [""], + "Could not parse the payto URI": [""], + "Please check the uri": [""], + "Exchange is ready for withdrawal": [""], + "To complete the process you need to wire%1$s %2$s to the exchange bank account": + [""], + "Alternative, you can also scan this QR code or open %1$s if you have a banking app installed that supports RFC 8905": + [""], + "Cancel withdrawal": [""], + "Could not toggle auto-open": ["Bakiye sayfası yüklenemedi"], + "Could not toggle clipboard": ["Bakiye sayfası yüklenemedi"], + Navigator: [""], + "Automatically open wallet based on page content": [""], + "Enabling this option below will make using the wallet faster, but requires more permissions from your browser.": + [""], + "Automatically check clipboard for Taler URI": [""], + Trust: [""], + "No exchange yet": [""], + "Term of Service": [""], + ok: [""], + changed: [""], + "not accepted": [""], + "unknown (exchange status should be updated)": [""], + "Add an exchange": [""], + Troubleshooting: [""], + "Developer mode": [""], + "More options and information useful for debugging": [""], + Display: [""], + "Current Language": [""], + "Wallet Core": [""], + "Web Extension": [""], + "Exchange compatibility": [""], + "Merchant compatibility": [""], + "Bank compatibility": [""], + "Browser Extension Installed!": [""], + "You can open the GNU Taler Wallet using the combination %1$s .": [""], + "Also pinning the GNU Taler Wallet to your Chrome browser allows you to quick access without keyboard:": + [""], + "Click the puzzle icon": [""], + "Search for GNU Taler Wallet": [""], + "Click the pin icon": [""], + Permissions: [""], + "(Enabling this option below will make using the wallet faster, but requires more permissions from your browser.)": + [""], + "Next Steps": [""], + "Try the demo": [""], + "Learn how to top up your wallet balance": [""], + "Diagnostics timed out. Could not talk to the wallet backend.": [ + "Tanılar zaman aşımına uğradı. Cüzdan arka ucuyla konuşulamadı.", + ], + "Problems detected:": ["Tespit edilen sorunlar:"], + "Please check in your %1$s settings that you have IndexedDB enabled (check the preference name %2$s).": + [ + "Lütfen %1$s ayarlarınızda, IndexedDB'nin etkinleştirildiğinizi kontrol edin (%2$s tercih adını kontrol edin).", + ], + "Your wallet database is outdated. Currently automatic migration is not supported. Please go %1$s to reset the wallet database.": + [ + "Cüzdan veritabanınız eski. Şu anda otomatik aktarım desteklenmiyor. Cüzdan veritabanını sıfırlamak için lütfen %1$s gidin.", + ], + "Running diagnostics": ["Tanılamayı çalıştır"], + "Debug tools": ["Hata ayıklama araçları"], + "Do you want to IRREVOCABLY DESTROY everything inside your wallet and LOSE ALL YOUR COINS?": + [ + "Cüzdanınızdaki her şeyi GERİ ALINAMAZ BİÇİMDE İMHA ETMEK ve TÜM PARALARINIZI KAYBETMEK mi istiyorsunuz?", + ], + reset: ["sıfırla"], + "TESTING: This may delete all your coin, proceed with caution": [""], + "run gc": [""], + "import database": ["veritabanını içe aktar"], + "export database": ["veritabanını dışa aktar"], + "Database exported at %1$s %2$s to download": [ + "Veritabanı %1$s'de dışa aktarıldı-%2$s indirilecek", + ], + Coins: ["Madeni paralar"], + "Pending operations": ["Bekleyen işlemler"], + "usable coins": ["kullanılabilir madeni paralar"], + id: ["kimlik"], + denom: [""], + value: ["değer"], + status: ["durum"], + "from refresh?": ["yenilemeden mi?"], + "age key count": [""], + "spent coins": ["harcanan madeni paralar"], + "click to show": ["göstermek için tıklayın"], + "Scan a QR code or enter taler:// URI below": [""], + Open: [""], + "URI is not valid. Taler URI should start with `taler://`": [""], + "Try another": [""], + "Could not load list of exchange": ["Bakiye sayfası yüklenemedi"], + "Choose a currency to proceed or add another exchange": [""], + "Known currencies": [""], + "Specify the amount and the origin": [""], + "Change currency": [""], + "Use previous origins:": [""], + "Or specify the origin of the money": [""], + "Specify the origin of the money": [""], + "From my bank account": ["Banka hesabına havale yap"], + "From another wallet": [""], + "currency not provided": [""], + "Specify the amount and the destination": [""], + "Use previous destinations:": [""], + "Or specify the destination of the money": [""], + "Specify the destination of the money": [""], + "To my bank account": ["Banka hesabına havale yap"], + "To another wallet": [""], + "Could not load backup recovery information": [ + "Yedekleme sağlayıcıları yüklenemedi", ], - "Could not load the list of known exchanges": [ - "" - ] - } - } + "Digital wallet recovery": [""], + "Import backup, show info": [""], + "All done, your transaction is in progress": [""], + Edit: [ + "Lütfen bir exchange seçin. Detayları seçiminizden önce inceleyebilirsiniz.", + ], + "Could not load the list of known exchanges": [""], + }, + }, }; - diff --git a/packages/taler-wallet-webextension/src/stories.test.ts b/packages/taler-wallet-webextension/src/stories.test.ts index 9f7374369..bb5abb92c 100644 --- a/packages/taler-wallet-webextension/src/stories.test.ts +++ b/packages/taler-wallet-webextension/src/stories.test.ts @@ -32,7 +32,7 @@ setupI18n("en", { en: {} }); setupPlatform(chromeAPI); function testThisStory(st: any): any { - describe(`render examples for ${(st as any).default.title}`, () => { + describe(`example "${(st as any).default.title}"`, () => { Object.keys(st).forEach((k) => { const Component = (st as any)[k]; if (k === "default" || !Component) return; diff --git a/packages/taler-wallet-webextension/src/test-utils.ts b/packages/taler-wallet-webextension/src/test-utils.ts index 695fec201..ccc8774e9 100644 --- a/packages/taler-wallet-webextension/src/test-utils.ts +++ b/packages/taler-wallet-webextension/src/test-utils.ts @@ -15,7 +15,12 @@ */ import { NotificationType } from "@gnu-taler/taler-util"; -import { WalletCoreApiClient, WalletCoreOpKeys, WalletCoreRequestType, WalletCoreResponseType } from "@gnu-taler/taler-wallet-core"; +import { + WalletCoreApiClient, + WalletCoreOpKeys, + WalletCoreRequestType, + WalletCoreResponseType, +} from "@gnu-taler/taler-wallet-core"; import { ComponentChildren, Fragment, @@ -207,7 +212,8 @@ export function mountHook( export const nullFunction: any = () => null; interface MockHandler { - addWalletCallResponse(operation: Op, + addWalletCallResponse( + operation: Op, payload?: Partial>, response?: WalletCoreResponseType, callback?: () => void, @@ -220,16 +226,16 @@ interface MockHandler { type CallRecord = WalletCallRecord | BackgroundCallRecord; interface WalletCallRecord { - source: "wallet" + source: "wallet"; callback: () => void; - operation: WalletCoreOpKeys, - payload?: WalletCoreRequestType, - response?: WalletCoreResponseType, + operation: WalletCoreOpKeys; + payload?: WalletCoreRequestType; + response?: WalletCoreResponseType; } interface BackgroundCallRecord { - source: "background" - name: string, - args: any, + source: "background"; + name: string; + args: any; response: any; } @@ -237,78 +243,112 @@ type Subscriptions = { [key in NotificationType]?: VoidFunction; }; -export function createWalletApiMock(): { handler: MockHandler, mock: typeof wxApi } { - const calls = new Array() +export function createWalletApiMock(): { + handler: MockHandler; + mock: typeof wxApi; +} { + const calls = new Array(); const subscriptions: Subscriptions = {}; - const mock: typeof wxApi = { wallet: new Proxy({} as any, { get(target, name, receiver) { - const functionName = String(name) + const functionName = String(name); if (functionName !== "call") { - throw Error(`the only method in wallet api should be 'call': ${functionName}`) + throw Error( + `the only method in wallet api should be 'call': ${functionName}`, + ); } - return function (operation: WalletCoreOpKeys, payload: WalletCoreRequestType) { - const next = calls.shift() + return function ( + operation: WalletCoreOpKeys, + payload: WalletCoreRequestType, + ) { + const next = calls.shift(); if (!next) { - throw Error(`wallet operation was called but none was expected: ${operation} (${JSON.stringify(payload, undefined, 2)})`) + throw Error( + `wallet operation was called but none was expected: ${operation} (${JSON.stringify( + payload, + undefined, + 2, + )})`, + ); } if (next.source !== "wallet") { - throw Error(`wallet operation expected`) + throw Error(`wallet operation expected`); } if (operation !== next.operation) { //more checks, deep check payload - throw Error(`wallet operation doesn't match: expected ${next.operation} actual ${operation}`) + throw Error( + `wallet operation doesn't match: expected ${next.operation} actual ${operation}`, + ); } - next.callback() + next.callback(); - return next.response ?? {} - } - } + return next.response ?? {}; + }; + }, }), listener: { - onUpdateNotification(mTypes: NotificationType[], callback: (() => void) | undefined): (() => void) { - mTypes.forEach(m => { - subscriptions[m] = callback - }) - return nullFunction - } + onUpdateNotification( + mTypes: NotificationType[], + callback: (() => void) | undefined, + ): () => void { + mTypes.forEach((m) => { + subscriptions[m] = callback; + }); + return nullFunction; + }, }, background: new Proxy({} as any, { get(target, name, receiver) { const functionName = String(name); return function (...args: any) { - const next = calls.shift() + const next = calls.shift(); if (!next) { - throw Error(`background operation was called but none was expected: ${functionName} (${JSON.stringify(args, undefined, 2)})`) + throw Error( + `background operation was called but none was expected: ${functionName} (${JSON.stringify( + args, + undefined, + 2, + )})`, + ); } if (next.source !== "background" || functionName !== next.name) { //more checks, deep check args - throw Error(`background operation doesn't match`) + throw Error(`background operation doesn't match`); } - return next.response - } - } + return next.response; + }; + }, }), - } - + }; const handler: MockHandler = { addWalletCallResponse(operation, payload, response, cb) { - calls.push({ source: "wallet", operation, payload, response, callback: cb ? cb : () => { null } }) - return handler + calls.push({ + source: "wallet", + operation, + payload, + response, + callback: cb + ? cb + : () => { + null; + }, + }); + return handler; }, notifyEventFromWallet(event: NotificationType): void { - const callback = subscriptions[event] - if (!callback) throw Error(`Expected to have a subscription for ${event}`); + const callback = subscriptions[event]; + if (!callback) + throw Error(`Expected to have a subscription for ${event}`); return callback(); }, getCallingQueueState() { return calls.length === 0 ? "empty" : `${calls.length} left`; }, - } + }; - return { handler, mock } + return { handler, mock }; } diff --git a/packages/taler-wallet-webextension/src/utils/index.ts b/packages/taler-wallet-webextension/src/utils/index.ts index a1b2d5f14..23cfc7730 100644 --- a/packages/taler-wallet-webextension/src/utils/index.ts +++ b/packages/taler-wallet-webextension/src/utils/index.ts @@ -26,7 +26,8 @@ function getJsonIfOk(r: Response): Promise { } throw new Error( - `Try another server: (${r.status}) ${r.statusText || "internal server error" + `Try another server: (${r.status}) ${ + r.statusText || "internal server error" }`, ); } @@ -109,3 +110,7 @@ export function compose( return h(); }; } + +export function assertUnreachable(x: never): never { + throw new Error("Didn't expect to get here"); +} diff --git a/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/index.ts b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/index.ts new file mode 100644 index 000000000..3205588af --- /dev/null +++ b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/index.ts @@ -0,0 +1,95 @@ +/* + This file is part of GNU Taler + (C) 2022 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see + */ + +import { + AmountJson, + BackupBackupProviderTerms, + TalerErrorDetail, +} from "@gnu-taler/taler-util"; +import { SyncTermsOfServiceResponse } from "@gnu-taler/taler-wallet-core"; +import { Loading } from "../../components/Loading.js"; +import { HookError } from "../../hooks/useAsyncAsHook.js"; +import { + ButtonHandler, + TextFieldHandler, + ToggleHandler, +} from "../../mui/handlers.js"; +import { compose, StateViewMap } from "../../utils/index.js"; +import { wxApi } from "../../wxApi.js"; +import { useComponentState } from "./state.js"; +import { + LoadingUriView, + SelectProviderView, + ConfirmProviderView, +} from "./views.js"; + +export interface Props { + currency: string; + onBack: () => Promise; + onComplete: (pid: string) => Promise; + onPaymentRequired: (uri: string) => Promise; +} + +export type State = + | State.Loading + | State.LoadingUriError + | State.ConfirmProvider + | State.SelectProvider; + +export namespace State { + export interface Loading { + status: "loading"; + error: undefined; + } + + export interface LoadingUriError { + status: "loading-error"; + error: HookError; + } + + export interface ConfirmProvider { + status: "confirm-provider"; + error: undefined | TalerErrorDetail; + url: string; + provider: SyncTermsOfServiceResponse; + tos: ToggleHandler; + onCancel: ButtonHandler; + onAccept: ButtonHandler; + } + + export interface SelectProvider { + status: "select-provider"; + url: TextFieldHandler; + urlOk: boolean; + name: TextFieldHandler; + onConfirm: ButtonHandler; + onCancel: ButtonHandler; + error: undefined | TalerErrorDetail; + } +} + +const viewMapping: StateViewMap = { + loading: Loading, + "loading-error": LoadingUriView, + "select-provider": SelectProviderView, + "confirm-provider": ConfirmProviderView, +}; + +export const AddBackupProviderPage = compose( + "AddBackupProvider", + (p: Props) => useComponentState(p, wxApi), + viewMapping, +); diff --git a/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/state.ts b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/state.ts new file mode 100644 index 000000000..0b3c17902 --- /dev/null +++ b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/state.ts @@ -0,0 +1,260 @@ +/* + This file is part of GNU Taler + (C) 2022 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see + */ + +import { + canonicalizeBaseUrl, + Codec, + TalerErrorDetail, +} from "@gnu-taler/taler-util"; +import { + codecForSyncTermsOfServiceResponse, + WalletApiOperation, +} from "@gnu-taler/taler-wallet-core"; +import { useEffect, useState } from "preact/hooks"; +import { assertUnreachable } from "../../utils/index.js"; +import { wxApi } from "../../wxApi.js"; +import { Props, State } from "./index.js"; + +type UrlState = UrlOk | UrlError; + +interface UrlOk { + status: "ok"; + result: T; +} +type UrlError = + | UrlNetworkError + | UrlClientError + | UrlServerError + | UrlParsingError + | UrlReadError; + +interface UrlNetworkError { + status: "network-error"; + href: string; +} +interface UrlClientError { + status: "client-error"; + code: number; +} +interface UrlServerError { + status: "server-error"; + code: number; +} +interface UrlParsingError { + status: "parsing-error"; + json: any; +} +interface UrlReadError { + status: "url-error"; +} + +function useDebounceEffect( + time: number, + cb: undefined | (() => Promise), + deps: Array, +): void { + const [currentTimer, setCurrentTimer] = useState(); + useEffect(() => { + if (currentTimer !== undefined) clearTimeout(currentTimer); + if (cb !== undefined) { + const tid = setTimeout(cb, time); + setCurrentTimer(tid); + } + }, deps); +} + +function useUrlState( + host: string | undefined, + path: string, + codec: Codec, +): UrlState | undefined { + const [state, setState] = useState | undefined>(); + + let href: string | undefined; + try { + if (host) { + const isHttps = + host.startsWith("https://") && host.length > "https://".length; + const isHttp = + host.startsWith("http://") && host.length > "http://".length; + const withProto = isHttp || isHttps ? host : `https://${host}`; + const baseUrl = canonicalizeBaseUrl(withProto); + href = new URL(path, baseUrl).href; + } + } catch (e) { + setState({ + status: "url-error", + }); + } + const constHref = href; + + useDebounceEffect( + 500, + constHref == undefined + ? undefined + : async () => { + const req = await fetch(constHref).catch((e) => { + return setState({ + status: "network-error", + href: constHref, + }); + }); + if (!req) return; + + if (req.status >= 400 && req.status < 500) { + setState({ + status: "client-error", + code: req.status, + }); + return; + } + if (req.status > 500) { + setState({ + status: "server-error", + code: req.status, + }); + return; + } + + const json = await req.json(); + try { + const result = codec.decode(json); + setState({ status: "ok", result }); + } catch (e: any) { + setState({ status: "parsing-error", json }); + } + }, + [host, path], + ); + + return state; +} + +export function useComponentState( + { currency, onBack, onComplete, onPaymentRequired }: Props, + api: typeof wxApi, +): State { + const [url, setHost] = useState(); + const [name, setName] = useState(); + const [tos, setTos] = useState(false); + const urlState = useUrlState( + url, + "config", + codecForSyncTermsOfServiceResponse(), + ); + const [operationError, setOperationError] = useState< + TalerErrorDetail | undefined + >(); + const [showConfirm, setShowConfirm] = useState(false); + + async function addBackupProvider() { + if (!url || !name) return; + + const resp = await api.wallet.call(WalletApiOperation.AddBackupProvider, { + backupProviderBaseUrl: url, + name: name, + activate: true, + }); + + switch (resp.status) { + case "payment-required": + return onPaymentRequired(resp.talerUri); + case "error": + return setOperationError(resp.error); + case "ok": + return onComplete(url); + default: + assertUnreachable(resp); + } + } + + if (showConfirm && urlState && urlState.status === "ok") { + return { + status: "confirm-provider", + error: operationError, + onAccept: { + onClick: !tos ? undefined : addBackupProvider, + }, + onCancel: { + onClick: onBack, + }, + provider: urlState.result, + tos: { + value: tos, + button: { + onClick: async () => setTos(!tos), + }, + }, + url: url ?? "", + }; + } + + return { + status: "select-provider", + error: undefined, + name: { + value: name || "", + onInput: async (e) => setName(e), + error: + name === undefined ? undefined : !name ? "Can't be empty" : undefined, + }, + onCancel: { + onClick: onBack, + }, + onConfirm: { + onClick: + !urlState || urlState.status !== "ok" || !name + ? undefined + : async () => { + setShowConfirm(true); + }, + }, + urlOk: urlState?.status === "ok", + url: { + value: url || "", + onInput: async (e) => setHost(e), + error: errorString(urlState), + }, + }; +} + +function errorString(state: undefined | UrlState): string | undefined { + if (!state) return state; + switch (state.status) { + case "ok": + return undefined; + case "client-error": { + switch (state.code) { + case 404: + return "Not found"; + case 401: + return "Unauthorized"; + case 403: + return "Forbidden"; + default: + return `Server says it a client error: ${state.code}.`; + } + } + case "server-error": + return `Server had a problem ${state.code}.`; + case "parsing-error": + return `Server response doesn't have the right format.`; + case "network-error": + return `Unable to connect to ${state.href}.`; + case "url-error": + return "URL is not complete"; + } +} diff --git a/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/stories.tsx b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/stories.tsx new file mode 100644 index 000000000..ae3e1b091 --- /dev/null +++ b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/stories.tsx @@ -0,0 +1,109 @@ +/* + This file is part of GNU Taler + (C) 2022 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see + */ + +/** + * + * @author Sebastian Javier Marchano (sebasjm) + */ + +import { createExample } from "../../test-utils.js"; +import { ConfirmProviderView, SelectProviderView } from "./views.js"; + +export default { + title: "wallet/backup/confirm", +}; + +export const DemoService = createExample(ConfirmProviderView, { + url: "https://sync.demo.taler.net/", + provider: { + annual_fee: "KUDOS:0.1", + storage_limit_in_megabytes: 20, + version: "1", + }, + tos: { + button: {}, + }, + onAccept: {}, + onCancel: {}, +}); + +export const FreeService = createExample(ConfirmProviderView, { + url: "https://sync.taler:9667/", + provider: { + annual_fee: "ARS:0", + storage_limit_in_megabytes: 20, + version: "1", + }, + tos: { + button: {}, + }, + onAccept: {}, + onCancel: {}, +}); + +export const Initial = createExample(SelectProviderView, { + url: { value: "" }, + name: { value: "" }, + onCancel: {}, + onConfirm: {}, +}); + +export const WithValue = createExample(SelectProviderView, { + url: { + value: "sync.demo.taler.net", + }, + name: { + value: "Demo backup service", + }, + onCancel: {}, + onConfirm: {}, +}); + +export const WithConnectionError = createExample(SelectProviderView, { + url: { + value: "sync.demo.taler.net", + error: "Network error", + }, + name: { + value: "Demo backup service", + }, + onCancel: {}, + onConfirm: {}, +}); + +export const WithClientError = createExample(SelectProviderView, { + url: { + value: "sync.demo.taler.net", + error: "URL may not be right: (404) Not Found", + }, + name: { + value: "Demo backup service", + }, + onCancel: {}, + onConfirm: {}, +}); + +export const WithServerError = createExample(SelectProviderView, { + url: { + value: "sync.demo.taler.net", + error: "Try another server: (500) Internal Server Error", + }, + name: { + value: "Demo backup service", + }, + onCancel: {}, + onConfirm: {}, +}); diff --git a/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/test.ts b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/test.ts new file mode 100644 index 000000000..1143853f8 --- /dev/null +++ b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/test.ts @@ -0,0 +1,79 @@ +/* + This file is part of GNU Taler + (C) 2022 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see + */ + +/** + * + * @author Sebastian Javier Marchano (sebasjm) + */ + +import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; +import { expect } from "chai"; +import { + createWalletApiMock, + mountHook, + nullFunction, +} from "../../test-utils.js"; +import { Props } from "./index.js"; +import { useComponentState } from "./state.js"; + +const props: Props = { + currency: "KUDOS", + onBack: nullFunction, + onComplete: nullFunction, + onPaymentRequired: nullFunction, +}; +describe("AddBackupProvider states", () => { + it("should start in 'select-provider' state", async () => { + const { handler, mock } = createWalletApiMock(); + + // handler.addWalletCallResponse( + // WalletApiOperation.ListKnownBankAccounts, + // undefined, + // { + // accounts: [], + // }, + // ); + + const { pullLastResultOrThrow, waitForStateUpdate, assertNoPendingUpdate } = + mountHook(() => useComponentState(props, mock)); + + { + const state = pullLastResultOrThrow(); + expect(state.status).equal("select-provider"); + if (state.status !== "select-provider") return; + expect(state.name.value).eq(""); + expect(state.url.value).eq(""); + } + + //FIXME: this should not make an extra update + /** + * this may be due to useUrlState because is using an effect over + * a dependency with a timeout + */ + // NOTE: do not remove this comment, keeping as an example + // await waitForStateUpdate() + // { + // const state = pullLastResultOrThrow(); + // expect(state.status).equal("select-provider"); + // if (state.status !== "select-provider") return; + // expect(state.name.value).eq("") + // expect(state.url.value).eq("") + // } + + await assertNoPendingUpdate(); + expect(handler.getCallingQueueState()).eq("empty"); + }); +}); diff --git a/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/views.tsx b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/views.tsx new file mode 100644 index 000000000..b633a595f --- /dev/null +++ b/packages/taler-wallet-webextension/src/wallet/AddBackupProvider/views.tsx @@ -0,0 +1,172 @@ +/* + This file is part of GNU Taler + (C) 2022 Taler Systems S.A. + + GNU Taler is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see + */ + +import { Amounts } from "@gnu-taler/taler-util"; +import { Fragment, h, VNode } from "preact"; +import { Checkbox } from "../../components/Checkbox.js"; +import { LoadingError } from "../../components/LoadingError.js"; +import { + LightText, + SmallLightText, + SubTitle, + TermsOfService, + Title, +} from "../../components/styled/index.js"; +import { useTranslationContext } from "../../context/translation.js"; +import { Button } from "../../mui/Button.js"; +import { TextField } from "../../mui/TextField.js"; +import { State } from "./index.js"; + +export function LoadingUriView({ error }: State.LoadingUriError): VNode { + const { i18n } = useTranslationContext(); + + return ( + Could not load} + error={error} + /> + ); +} + +export function ConfirmProviderView({ + url, + provider, + tos, + onCancel, + onAccept, +}: State.ConfirmProvider): VNode { + const { i18n } = useTranslationContext(); + const noFee = Amounts.isZero(provider.annual_fee); + return ( + +
+ + <i18n.Translate>Review terms of service</i18n.Translate> + +
+ Provider URL:{" "} + + {url} + +
+ + + Please review and accept this provider's terms of service + + + + 1. Pricing + +

+ {noFee ? ( + free of charge + ) : ( + + {provider.annual_fee} per year of service + + )} +

+ + 2. Storage + +

+ + {provider.storage_limit_in_megabytes} megabytes of storage per year + of service + +

+ {/* replace with */} + Accept terms of service} + name="terms" + onToggle={tos.button.onClick} + enabled={tos.value} + /> +
+
+ + +
+
+ ); +} + +export function SelectProviderView({ + url, + name, + urlOk, + onCancel, + onConfirm, +}: State.SelectProvider): VNode { + const { i18n } = useTranslationContext(); + return ( + +
+ + <i18n.Translate>Add backup provider</i18n.Translate> + + + + Backup providers may charge for their service + + +

+ URL} + placeholder="https://" + color={urlOk ? "success" : undefined} + value={url.value} + error={url.error} + onChange={url.onInput} + /> +

+

+ Name} + placeholder="provider name" + value={name.value} + error={name.error} + onChange={name.onInput} + /> +

+
+
+ + +
+
+ ); +} diff --git a/packages/taler-wallet-webextension/src/wallet/Application.tsx b/packages/taler-wallet-webextension/src/wallet/Application.tsx index 5934dec00..6b265c1ba 100644 --- a/packages/taler-wallet-webextension/src/wallet/Application.tsx +++ b/packages/taler-wallet-webextension/src/wallet/Application.tsx @@ -65,6 +65,7 @@ import { InvoiceCreatePage } from "../cta/InvoiceCreate/index.js"; import { TransferPickupPage } from "../cta/TransferPickup/index.js"; import { InvoicePayPage } from "../cta/InvoicePay/index.js"; import { RecoveryPage } from "../cta/Recovery/index.js"; +import { AddBackupProviderPage } from "./AddBackupProvider/index.js"; export function Application(): VNode { const [globalNotification, setGlobalNotification] = useState< @@ -221,7 +222,13 @@ export function Application(): VNode { /> + redirectTo(`${Pages.ctaPay}?talerPayUri=${uri}`) + } + onComplete={(pid: string) => + redirectTo(Pages.backupProviderDetail({ pid })) + } onBack={() => redirectTo(Pages.backup)} /> diff --git a/packages/taler-wallet-webextension/src/wallet/DepositPage/index.ts b/packages/taler-wallet-webextension/src/wallet/DepositPage/index.ts index 85896da26..373045833 100644 --- a/packages/taler-wallet-webextension/src/wallet/DepositPage/index.ts +++ b/packages/taler-wallet-webextension/src/wallet/DepositPage/index.ts @@ -20,7 +20,7 @@ import { HookError } from "../../hooks/useAsyncAsHook.js"; import { ButtonHandler, SelectFieldHandler, - TextFieldHandler + TextFieldHandler, } from "../../mui/handlers.js"; import { compose, StateViewMap } from "../../utils/index.js"; import { wxApi } from "../../wxApi.js"; @@ -31,7 +31,7 @@ import { LoadingErrorView, NoAccountToDepositView, NoEnoughBalanceView, - ReadyView + ReadyView, } from "./views.js"; export interface Props { diff --git a/packages/taler-wallet-webextension/src/wallet/DepositPage/state.ts b/packages/taler-wallet-webextension/src/wallet/DepositPage/state.ts index d8b752d44..91883c823 100644 --- a/packages/taler-wallet-webextension/src/wallet/DepositPage/state.ts +++ b/packages/taler-wallet-webextension/src/wallet/DepositPage/state.ts @@ -21,7 +21,7 @@ import { KnownBankAccountsInfo, parsePaytoUri, PaytoUri, - stringifyPaytoUri + stringifyPaytoUri, } from "@gnu-taler/taler-util"; import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { useState } from "preact/hooks"; @@ -37,10 +37,16 @@ export function useComponentState( const currency = parsed !== undefined ? parsed.currency : currencyStr; const hook = useAsyncAsHook(async () => { - const { balances } = await api.wallet.call(WalletApiOperation.GetBalances, {}); - const { accounts } = await api.wallet.call(WalletApiOperation.ListKnownBankAccounts, { - currency - }); + const { balances } = await api.wallet.call( + WalletApiOperation.GetBalances, + {}, + ); + const { accounts } = await api.wallet.call( + WalletApiOperation.ListKnownBankAccounts, + { + currency, + }, + ); return { accounts, balances }; }); @@ -120,13 +126,13 @@ export function useComponentState( }, }; } - const firstAccount = accounts[0].uri + const firstAccount = accounts[0].uri; const currentAccount = !selectedAccount ? firstAccount : selectedAccount; if (fee === undefined && parsedAmount) { - getFeeForAmount(currentAccount, parsedAmount, api).then(initialFee => { - setFee(initialFee) - }) + getFeeForAmount(currentAccount, parsedAmount, api).then((initialFee) => { + setFee(initialFee); + }); return { status: "loading", error: undefined, @@ -177,10 +183,10 @@ export function useComponentState( const amountError = !isDirty ? undefined : !parsedAmount - ? "Invalid amount" - : Amounts.cmp(balance, parsedAmount) === -1 - ? `Too much, your current balance is ${Amounts.stringifyValue(balance)}` - : undefined; + ? "Invalid amount" + : Amounts.cmp(balance, parsedAmount) === -1 + ? `Too much, your current balance is ${Amounts.stringifyValue(balance)}` + : undefined; const unableToDeposit = !parsedAmount || //no amount specified @@ -194,8 +200,9 @@ export function useComponentState( const depositPaytoUri = stringifyPaytoUri(currentAccount); const amount = Amounts.stringify(parsedAmount); await api.wallet.call(WalletApiOperation.CreateDepositGroup, { - amount, depositPaytoUri - }) + amount, + depositPaytoUri, + }); onSuccess(currency); } @@ -242,8 +249,9 @@ async function getFeeForAmount( const depositPaytoUri = `payto://${p.targetType}/${p.targetPath}`; const amount = Amounts.stringify(a); return await api.wallet.call(WalletApiOperation.GetFeeForDeposit, { - amount, depositPaytoUri - }) + amount, + depositPaytoUri, + }); } export function labelForAccountType(id: string) { diff --git a/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/index.ts b/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/index.ts index ddfaa71f9..a95830f8e 100644 --- a/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/index.ts +++ b/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/index.ts @@ -18,7 +18,7 @@ import { DenomOperationMap, ExchangeFullDetails, ExchangeListItem, - FeeDescriptionPair + FeeDescriptionPair, } from "@gnu-taler/taler-util"; import { Loading } from "../../components/Loading.js"; import { HookError } from "../../hooks/useAsyncAsHook.js"; @@ -33,7 +33,7 @@ import { NoExchangesView, PrivacyContentView, ReadyView, - TosContentView + TosContentView, } from "./views.js"; export interface Props { diff --git a/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/state.ts b/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/state.ts index ee839cad7..0a66dc381 100644 --- a/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/state.ts +++ b/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/state.ts @@ -15,7 +15,10 @@ */ import { DenomOperationMap, FeeDescription } from "@gnu-taler/taler-util"; -import { createPairTimeline, WalletApiOperation } from "@gnu-taler/taler-wallet-core"; +import { + createPairTimeline, + WalletApiOperation, +} from "@gnu-taler/taler-wallet-core"; import { useState } from "preact/hooks"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; import { wxApi } from "../../wxApi.js"; @@ -41,15 +44,23 @@ export function useComponentState( exchanges.length == 0 ? undefined : exchanges[selectedIdx]; const selected = !selectedExchange ? undefined - : await api.wallet.call(WalletApiOperation.GetExchangeDetailedInfo, { exchangeBaseUrl: selectedExchange.exchangeBaseUrl }); + : await api.wallet.call(WalletApiOperation.GetExchangeDetailedInfo, { + exchangeBaseUrl: selectedExchange.exchangeBaseUrl, + }); const initialExchange = selectedIdx === initialValue ? undefined : exchanges[initialValue]; const original = !initialExchange ? undefined - : await api.wallet.call(WalletApiOperation.GetExchangeDetailedInfo, { exchangeBaseUrl: initialExchange.exchangeBaseUrl }); + : await api.wallet.call(WalletApiOperation.GetExchangeDetailedInfo, { + exchangeBaseUrl: initialExchange.exchangeBaseUrl, + }); - return { exchanges, selected: selected?.exchange, original: original?.exchange }; + return { + exchanges, + selected: selected?.exchange, + original: original?.exchange, + }; }, [value]); const [showingTos, setShowingTos] = useState(undefined); diff --git a/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/views.tsx b/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/views.tsx index d9a33c5c2..be059630f 100644 --- a/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/views.tsx +++ b/packages/taler-wallet-webextension/src/wallet/ExchangeSelection/views.tsx @@ -161,11 +161,14 @@ export function NoExchangesView({ title={Could not find any exchange} /> ); - } return ( Could not find any exchange for the currency {currency}} + title={ + + Could not find any exchange for the currency {currency} + + } /> ); } diff --git a/packages/taler-wallet-webextension/src/wallet/ManageAccount/index.ts b/packages/taler-wallet-webextension/src/wallet/ManageAccount/index.ts index cd591be74..df4e7586f 100644 --- a/packages/taler-wallet-webextension/src/wallet/ManageAccount/index.ts +++ b/packages/taler-wallet-webextension/src/wallet/ManageAccount/index.ts @@ -20,7 +20,7 @@ import { HookError } from "../../hooks/useAsyncAsHook.js"; import { ButtonHandler, SelectFieldHandler, - TextFieldHandler + TextFieldHandler, } from "../../mui/handlers.js"; import { compose, StateViewMap } from "../../utils/index.js"; import { wxApi } from "../../wxApi.js"; @@ -58,13 +58,13 @@ export namespace State { alias: TextFieldHandler; onAccountAdded: ButtonHandler; onCancel: ButtonHandler; - accountByType: AccountByType, - deleteAccount: (a: KnownBankAccountsInfo) => Promise, + accountByType: AccountByType; + deleteAccount: (a: KnownBankAccountsInfo) => Promise; } } export type AccountByType = { - [key: string]: KnownBankAccountsInfo[] + [key: string]: KnownBankAccountsInfo[]; }; const viewMapping: StateViewMap = { diff --git a/packages/taler-wallet-webextension/src/wallet/ManageAccount/state.ts b/packages/taler-wallet-webextension/src/wallet/ManageAccount/state.ts index f180fc1c0..1f920f05f 100644 --- a/packages/taler-wallet-webextension/src/wallet/ManageAccount/state.ts +++ b/packages/taler-wallet-webextension/src/wallet/ManageAccount/state.ts @@ -14,7 +14,11 @@ GNU Taler; see the file COPYING. If not, see */ -import { KnownBankAccountsInfo, parsePaytoUri, stringifyPaytoUri } from "@gnu-taler/taler-util"; +import { + KnownBankAccountsInfo, + parsePaytoUri, + stringifyPaytoUri, +} from "@gnu-taler/taler-util"; import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { useState } from "preact/hooks"; import { useAsyncAsHook } from "../../hooks/useAsyncAsHook.js"; @@ -25,7 +29,9 @@ export function useComponentState( { currency, onAccountAdded, onCancel }: Props, api: typeof wxApi, ): State { - const hook = useAsyncAsHook(() => api.wallet.call(WalletApiOperation.ListKnownBankAccounts, { currency })); + const hook = useAsyncAsHook(() => + api.wallet.call(WalletApiOperation.ListKnownBankAccounts, { currency }), + ); const [payto, setPayto] = useState(""); const [alias, setAlias] = useState(""); @@ -61,34 +67,34 @@ export function useComponentState( const normalizedPayto = stringifyPaytoUri(uri); await api.wallet.call(WalletApiOperation.AddKnownBankAccounts, { - alias, currency, payto: normalizedPayto + alias, + currency, + payto: normalizedPayto, }); onAccountAdded(payto); } - const paytoUriError = - found - ? "that account is already present" - : undefined; + const paytoUriError = found ? "that account is already present" : undefined; - const unableToAdd = !type || !alias || paytoUriError !== undefined || uri === undefined; + const unableToAdd = + !type || !alias || paytoUriError !== undefined || uri === undefined; const accountByType: AccountByType = { iban: [], bitcoin: [], "x-taler-bank": [], - } + }; - hook.response.accounts.forEach(acc => { - accountByType[acc.uri.targetType].push(acc) + hook.response.accounts.forEach((acc) => { + accountByType[acc.uri.targetType].push(acc); }); async function deleteAccount(account: KnownBankAccountsInfo): Promise { const payto = stringifyPaytoUri(account.uri); await api.wallet.call(WalletApiOperation.ForgetKnownBankAccounts, { - payto - }) - hook?.retry() + payto, + }); + hook?.retry(); } return { diff --git a/packages/taler-wallet-webextension/src/wallet/QrReader.stories.tsx b/packages/taler-wallet-webextension/src/wallet/QrReader.stories.tsx index ba5a78570..caf833e79 100644 --- a/packages/taler-wallet-webextension/src/wallet/QrReader.stories.tsx +++ b/packages/taler-wallet-webextension/src/wallet/QrReader.stories.tsx @@ -23,7 +23,7 @@ import { createExample } from "../test-utils.js"; import { QrReaderPage } from "./QrReader.js"; export default { - title: "wallet/qr", + title: "wallet/qr reader", }; export const Reading = createExample(QrReaderPage, {}); diff --git a/packages/taler-wallet-webextension/src/wallet/index.stories.tsx b/packages/taler-wallet-webextension/src/wallet/index.stories.tsx index d63f25ead..42808b573 100644 --- a/packages/taler-wallet-webextension/src/wallet/index.stories.tsx +++ b/packages/taler-wallet-webextension/src/wallet/index.stories.tsx @@ -25,8 +25,7 @@ import * as a4 from "./DepositPage/stories.js"; import * as a5 from "./ExchangeAddConfirm.stories.js"; import * as a6 from "./ExchangeAddSetUrl.stories.js"; import * as a7 from "./History.stories.js"; -import * as a8 from "./ProviderAddConfirmProvider.stories.js"; -import * as a9 from "./ProviderAddSetUrl.stories.js"; +import * as a8 from "./AddBackupProvider/stories.js"; import * as a10 from "./ProviderDetail.stories.js"; import * as a11 from "./ReserveCreated.stories.js"; import * as a12 from "./Settings.stories.js"; @@ -47,7 +46,6 @@ export default [ a6, a7, a8, - a9, a10, a11, a12, diff --git a/packages/taler-wallet-webextension/src/wxApi.ts b/packages/taler-wallet-webextension/src/wxApi.ts index bd1184d46..524eed990 100644 --- a/packages/taler-wallet-webextension/src/wxApi.ts +++ b/packages/taler-wallet-webextension/src/wxApi.ts @@ -22,13 +22,17 @@ * Imports. */ import { - CoreApiResponse, Logger, NotificationType, WalletDiagnostics + CoreApiResponse, + Logger, + NotificationType, + WalletDiagnostics, } from "@gnu-taler/taler-util"; import { - TalerError, WalletCoreApiClient, + TalerError, + WalletCoreApiClient, WalletCoreOpKeys, WalletCoreRequestType, - WalletCoreResponseType + WalletCoreResponseType, } from "@gnu-taler/taler-wallet-core"; import { MessageFromBackend, platform } from "./platform/api.js"; import { nullFunction } from "./test-utils.js"; @@ -107,7 +111,6 @@ export class WxWalletCoreApiClient implements WalletCoreApiClient { } export class BackgroundApiClient { - public resetDb(): Promise { return callBackend("reset-db", {}); } @@ -129,16 +132,16 @@ export class BackgroundApiClient { public runGarbageCollector(): Promise { return callBackend("run-gc", {}); } - } function onUpdateNotification( messageTypes: Array, doCallback: undefined | (() => void), ): () => void { //if no callback, then ignore - if (!doCallback) return () => { - return - }; + if (!doCallback) + return () => { + return; + }; const onNewMessage = (message: MessageFromBackend): void => { const shouldNotify = messageTypes.includes(message.type); if (shouldNotify) { @@ -152,7 +155,6 @@ export const wxApi = { wallet: new WxWalletCoreApiClient(), background: new BackgroundApiClient(), listener: { - onUpdateNotification - } -} - + onUpdateNotification, + }, +}; -- cgit v1.2.3