summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--TalerWallet.xcodeproj/project.pbxproj73
-rw-r--r--TalerWallet1/Backend/WalletCore.swift18
-rw-r--r--TalerWallet1/Controllers/DebugViewC.swift2
-rw-r--r--TalerWallet1/Helper/Font+Taler.swift16
-rw-r--r--TalerWallet1/Localizable.xcstrings3744
-rw-r--r--TalerWallet1/Model/Transaction.swift2
-rw-r--r--TalerWallet1/Model/WalletModel.swift25
-rw-r--r--TalerWallet1/Quickjs/QuickDataTask.swift16
-rw-r--r--TalerWallet1/Views/Balances/BalanceRowView.swift2
-rw-r--r--TalerWallet1/Views/Balances/BalancesSectionView.swift4
-rw-r--r--TalerWallet1/Views/Balances/PendingRowView.swift3
-rw-r--r--TalerWallet1/Views/Banking/DepositAmountV.swift2
-rw-r--r--TalerWallet1/Views/Banking/DepositIbanV.swift2
-rw-r--r--TalerWallet1/Views/Banking/ManualWithdraw.swift3
-rw-r--r--TalerWallet1/Views/Banking/QuiteSomeCoins.swift8
-rw-r--r--TalerWallet1/Views/HelperViews/AgePicker.swift2
-rw-r--r--TalerWallet1/Views/HelperViews/ListStyle.swift2
-rw-r--r--TalerWallet1/Views/HelperViews/QRCodeDetailView.swift30
-rw-r--r--TalerWallet1/Views/Main/MainView.swift33
-rw-r--r--TalerWallet1/Views/Main/WalletEmptyView.swift2
-rw-r--r--TalerWallet1/Views/Peer2peer/P2PSubjectV.swift4
-rw-r--r--TalerWallet1/Views/Settings/AboutView.swift6
-rw-r--r--TalerWallet1/Views/Settings/SettingsView.swift14
-rw-r--r--TalerWallet1/Views/Sheets/Payment/PayTemplateV.swift2
-rw-r--r--TalerWallet1/Views/Sheets/Payment/PaymentView.swift6
-rw-r--r--TalerWallet1/Views/Sheets/QRSheet.swift4
-rw-r--r--TalerWallet1/Views/Sheets/Sheet.swift7
-rw-r--r--TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift1
-rw-r--r--TalerWallet1/Views/Transactions/ManualDetailsV.swift2
-rw-r--r--TalerWallet1/Views/Transactions/TransactionDetailV.swift4
-rw-r--r--TalerWallet1/Views/Transactions/TransactionRowView.swift8
-rw-r--r--TalerWallet1/Views/Transactions/TransactionSummaryV.swift4
-rw-r--r--TalerWallet1/Views/Transactions/TransactionsListView.swift2
-rw-r--r--TestFlight/WhatToTest.en-US.txt12
34 files changed, 3920 insertions, 145 deletions
diff --git a/TalerWallet.xcodeproj/project.pbxproj b/TalerWallet.xcodeproj/project.pbxproj
index 817c493..df17b89 100644
--- a/TalerWallet.xcodeproj/project.pbxproj
+++ b/TalerWallet.xcodeproj/project.pbxproj
@@ -8,6 +8,8 @@
/* Begin PBXBuildFile section */
4E16E12329F3BB99008B9C86 /* CurrencySpecification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E16E12229F3BB99008B9C86 /* CurrencySpecification.swift */; };
+ 4E18539A2BDAE6D40034F3BA /* LocalConsole in Frameworks */ = {isa = PBXBuildFile; productRef = 4E1853992BDAE6D40034F3BA /* LocalConsole */; };
+ 4E18539C2BDAE6E50034F3BA /* LocalConsole in Frameworks */ = {isa = PBXBuildFile; productRef = 4E18539B2BDAE6E50034F3BA /* LocalConsole */; };
4E2254972A822B8100E41D29 /* payment_received.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 4E2254952A822B8100E41D29 /* payment_received.m4a */; };
4E2254982A822B8100E41D29 /* payment_sent.m4a in Resources */ = {isa = PBXBuildFile; fileRef = 4E2254962A822B8100E41D29 /* payment_sent.m4a */; };
4E2D8DD32B3F513800234039 /* MarkdownUI in Frameworks */ = {isa = PBXBuildFile; productRef = 4E2D8DD22B3F513800234039 /* MarkdownUI */; };
@@ -139,7 +141,6 @@
4E578E942A4822D500F21F1C /* P2pPayURIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E578E932A4822D500F21F1C /* P2pPayURIView.swift */; };
4E5A88F52A38A4FD00072618 /* QRCodeDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E5A88F42A38A4FD00072618 /* QRCodeDetailView.swift */; };
4E5A88F72A3B9E5B00072618 /* WithdrawAcceptDone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E5A88F62A3B9E5B00072618 /* WithdrawAcceptDone.swift */; };
- 4E5FA9A22B862C4A002DB016 /* LocalConsole in Frameworks */ = {isa = PBXBuildFile; productRef = 4E5FA9A12B862C4A002DB016 /* LocalConsole */; };
4E605D902AA8B407002FB9A7 /* Nunito-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4E605D8E2AA8B407002FB9A7 /* Nunito-Black.ttf */; };
4E605D912AA8B407002FB9A7 /* Nunito-Black.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4E605D8E2AA8B407002FB9A7 /* Nunito-Black.ttf */; };
4E605D922AA8B407002FB9A7 /* Nunito-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 4E605D8F2AA8B407002FB9A7 /* Nunito-BlackItalic.ttf */; };
@@ -176,7 +177,6 @@
4E983C2A2ADBDD3500FA9CC5 /* SingleAxisGeometryReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E983C282ADBDD3500FA9CC5 /* SingleAxisGeometryReader.swift */; };
4E983C2C2ADC416800FA9CC5 /* View+fitsSideBySide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E983C2B2ADC416800FA9CC5 /* View+fitsSideBySide.swift */; };
4E983C2D2ADC416800FA9CC5 /* View+fitsSideBySide.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E983C2B2ADC416800FA9CC5 /* View+fitsSideBySide.swift */; };
- 4EA076B12BBEED7E00685A10 /* LocalConsole in Frameworks */ = {isa = PBXBuildFile; productRef = 4EA076B02BBEED7E00685A10 /* LocalConsole */; };
4EA076B32BC0607400685A10 /* DepositWithdrawV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EA076B22BC0607400685A10 /* DepositWithdrawV.swift */; };
4EA076B42BC0607400685A10 /* DepositWithdrawV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EA076B22BC0607400685A10 /* DepositWithdrawV.swift */; };
4EA1ABBE29A3833A008821EA /* PublicConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EA1ABBD29A3833A008821EA /* PublicConstants.swift */; };
@@ -272,6 +272,7 @@
4EF840A72A0B85F400EE0D47 /* CopyShare.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EF840A62A0B85F400EE0D47 /* CopyShare.swift */; };
4EFA39602AA7946B00742548 /* ToSButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EFA395F2AA7946B00742548 /* ToSButtonView.swift */; };
4EFA39612AA7946B00742548 /* ToSButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EFA395F2AA7946B00742548 /* ToSButtonView.swift */; };
+ 4EFFDD6B2A501121000C1C6A /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 4EFFDD6A2A501121000C1C6A /* Localizable.xcstrings */; };
ABC13AA32859962800D23185 /* taler-swift in Frameworks */ = {isa = PBXBuildFile; productRef = ABC13AA22859962800D23185 /* taler-swift */; };
ABE97B1D286D82BF00580772 /* AnyCodable in Frameworks */ = {isa = PBXBuildFile; productRef = ABE97B1C286D82BF00580772 /* AnyCodable */; };
E37AA62A2AF197E5003850CF /* Model+Refund.swift in Sources */ = {isa = PBXBuildFile; fileRef = E37AA6292AF197E5003850CF /* Model+Refund.swift */; };
@@ -456,6 +457,7 @@
4EEC3A702B2285A200D05F9D /* WithdrawExchangeV.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WithdrawExchangeV.swift; sourceTree = "<group>"; };
4EF840A62A0B85F400EE0D47 /* CopyShare.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CopyShare.swift; sourceTree = "<group>"; };
4EFA395F2AA7946B00742548 /* ToSButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ToSButtonView.swift; sourceTree = "<group>"; };
+ 4EFFDD6A2A501121000C1C6A /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
AB710490285995B6008B04F0 /* taler-swift */ = {isa = PBXFileReference; lastKnownFileType = text; path = "taler-swift"; sourceTree = SOURCE_ROOT; };
D14AFD1D24D232B300C51073 /* Taler_Wallet.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Taler_Wallet.app; sourceTree = BUILT_PRODUCTS_DIR; };
D14AFD3324D232B500C51073 /* TalerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TalerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -473,7 +475,7 @@
files = (
4E3EAE772A990778009F1BE8 /* AnyCodable in Frameworks */,
4E3EAE782A990778009F1BE8 /* SymLog in Frameworks */,
- 4E5FA9A22B862C4A002DB016 /* LocalConsole in Frameworks */,
+ 4E18539C2BDAE6E50034F3BA /* LocalConsole in Frameworks */,
4E3EAE792A990778009F1BE8 /* FTalerWalletcore.framework in Frameworks */,
4EE171882B49635800BF9FF5 /* MarkdownUI in Frameworks */,
4E3EAE7A2A990778009F1BE8 /* taler-swift in Frameworks */,
@@ -488,7 +490,7 @@
files = (
ABE97B1D286D82BF00580772 /* AnyCodable in Frameworks */,
4EB094FD29897D280043A8A1 /* SymLog in Frameworks */,
- 4EA076B12BBEED7E00685A10 /* LocalConsole in Frameworks */,
+ 4E18539A2BDAE6D40034F3BA /* LocalConsole in Frameworks */,
4EB094F829897CA20043A8A1 /* FTalerWalletcore.framework in Frameworks */,
4E2D8DD32B3F513800234039 /* MarkdownUI in Frameworks */,
ABC13AA32859962800D23185 /* taler-swift in Frameworks */,
@@ -586,6 +588,7 @@
4EB094EF298979D30043A8A1 /* Assets.xcassets */,
4E2254942A822B8100E41D29 /* Sounds */,
4E3EAEA62AA12750009F1BE8 /* Fonts */,
+ 4EFFDD6A2A501121000C1C6A /* Localizable.xcstrings */,
4E363CBF2A24754200D7E98C /* Settings.bundle */,
4EB094F529897A9A0043A8A1 /* Preview Content */,
4E3208562BB550CA00211E9E /* PrivacyInfo.xcprivacy */,
@@ -917,7 +920,7 @@
4E3EAE1A2A990778009F1BE8 /* CodeScanner */,
4EE171872B49635800BF9FF5 /* MarkdownUI */,
4EE171912B49FE4E00BF9FF5 /* OrderedCollections */,
- 4E5FA9A12B862C4A002DB016 /* LocalConsole */,
+ 4E18539B2BDAE6E50034F3BA /* LocalConsole */,
);
productName = Taler;
productReference = 4E3EAE892A990778009F1BE8 /* GNU_Taler.app */;
@@ -944,7 +947,7 @@
4EEC157529F8ECBF00D46A03 /* CodeScanner */,
4E2D8DD22B3F513800234039 /* MarkdownUI */,
4EE1718F2B49FE2B00BF9FF5 /* OrderedCollections */,
- 4EA076B02BBEED7E00685A10 /* LocalConsole */,
+ 4E1853992BDAE6D40034F3BA /* LocalConsole */,
);
productName = Taler;
productReference = D14AFD1D24D232B300C51073 /* Taler_Wallet.app */;
@@ -1019,6 +1022,7 @@
knownRegions = (
en,
Base,
+ de,
);
mainGroup = D14AFD1424D232B300C51073;
packageReferences = (
@@ -1027,7 +1031,7 @@
4EEC157429F8ECBF00D46A03 /* XCRemoteSwiftPackageReference "CodeScanner" */,
4E2D8DD12B3F513800234039 /* XCRemoteSwiftPackageReference "swift-markdown-ui-standalone" */,
4EE1718C2B49EB7200BF9FF5 /* XCRemoteSwiftPackageReference "swift-collections" */,
- 4E5FA9A02B862638002DB016 /* XCRemoteSwiftPackageReference "LocalConsole" */,
+ 4E1853982BDAE6390034F3BA /* XCRemoteSwiftPackageReference "LocalConsole" */,
);
productRefGroup = D14AFD1E24D232B300C51073 /* Products */;
projectDirPath = "";
@@ -1080,6 +1084,7 @@
4E3EAEA52AA12582009F1BE8 /* Nunito-BoldItalic.ttf in Resources */,
4E605D912AA8B407002FB9A7 /* Nunito-Black.ttf in Resources */,
4E3EAEA32AA12582009F1BE8 /* Nunito-Italic.ttf in Resources */,
+ 4EFFDD6B2A501121000C1C6A /* Localizable.xcstrings in Resources */,
4E2254972A822B8100E41D29 /* payment_received.m4a in Resources */,
4E2254982A822B8100E41D29 /* payment_sent.m4a in Resources */,
4E3208582BB550CA00211E9E /* PrivacyInfo.xcprivacy in Resources */,
@@ -1384,7 +1389,7 @@
CODE_SIGN_ENTITLEMENTS = "$(TARGET_NAME).entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 0.10.6;
+ CURRENT_PROJECT_VERSION = 0.10.7;
DEVELOPMENT_TEAM = GUDDQ9428Y;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
@@ -1402,7 +1407,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- MARKETING_VERSION = 0.10.0;
+ MARKETING_VERSION = 0.10.2;
PRODUCT_BUNDLE_IDENTIFIER = "com.taler-systems.talerwallet-1";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1426,7 +1431,7 @@
CODE_SIGN_ENTITLEMENTS = "$(TARGET_NAME).entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 0.10.6;
+ CURRENT_PROJECT_VERSION = 0.10.7;
DEVELOPMENT_TEAM = GUDDQ9428Y;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
@@ -1444,7 +1449,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- MARKETING_VERSION = 0.10.0;
+ MARKETING_VERSION = 0.10.2;
PRODUCT_BUNDLE_IDENTIFIER = "com.taler-systems.talerwallet-1";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1508,6 +1513,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
@@ -1564,6 +1570,7 @@
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
OTHER_LDFLAGS = "-lc++";
@@ -1585,7 +1592,7 @@
CODE_SIGN_ENTITLEMENTS = "$(TARGET_NAME).entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 0.10.6;
+ CURRENT_PROJECT_VERSION = 0.10.7;
DEVELOPMENT_TEAM = GUDDQ9428Y;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
@@ -1603,7 +1610,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- MARKETING_VERSION = 0.10.0;
+ MARKETING_VERSION = 0.10.2;
PRODUCT_BUNDLE_IDENTIFIER = "com.taler-systems.talerwallet-2";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1627,7 +1634,7 @@
CODE_SIGN_ENTITLEMENTS = "$(TARGET_NAME).entitlements";
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 0.10.6;
+ CURRENT_PROJECT_VERSION = 0.10.7;
DEVELOPMENT_TEAM = GUDDQ9428Y;
ENABLE_PREVIEWS = YES;
GENERATE_INFOPLIST_FILE = YES;
@@ -1645,7 +1652,7 @@
"$(inherited)",
"@executable_path/Frameworks",
);
- MARKETING_VERSION = 0.10.0;
+ MARKETING_VERSION = 0.10.2;
PRODUCT_BUNDLE_IDENTIFIER = "com.taler-systems.talerwallet-2";
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
@@ -1806,6 +1813,14 @@
/* End XCConfigurationList section */
/* Begin XCRemoteSwiftPackageReference section */
+ 4E1853982BDAE6390034F3BA /* XCRemoteSwiftPackageReference "LocalConsole" */ = {
+ isa = XCRemoteSwiftPackageReference;
+ repositoryURL = "https://github.com/Fesh-com/LocalConsole";
+ requirement = {
+ branch = main;
+ kind = branch;
+ };
+ };
4E2D8DD12B3F513800234039 /* XCRemoteSwiftPackageReference "swift-markdown-ui-standalone" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/Fesh-com/swift-markdown-ui-standalone";
@@ -1838,14 +1853,6 @@
minimumVersion = 2.0.0;
};
};
- 4E5FA9A02B862638002DB016 /* XCRemoteSwiftPackageReference "LocalConsole" */ = {
- isa = XCRemoteSwiftPackageReference;
- repositoryURL = "https://github.com/duraidabdul/LocalConsole";
- requirement = {
- kind = upToNextMajorVersion;
- minimumVersion = 1.12.1;
- };
- };
4EB094FB29897D280043A8A1 /* XCRemoteSwiftPackageReference "SymLog" */ = {
isa = XCRemoteSwiftPackageReference;
repositoryURL = "https://github.com/Fesh-com/SymLog";
@@ -1881,6 +1888,16 @@
/* End XCRemoteSwiftPackageReference section */
/* Begin XCSwiftPackageProductDependency section */
+ 4E1853992BDAE6D40034F3BA /* LocalConsole */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 4E1853982BDAE6390034F3BA /* XCRemoteSwiftPackageReference "LocalConsole" */;
+ productName = LocalConsole;
+ };
+ 4E18539B2BDAE6E50034F3BA /* LocalConsole */ = {
+ isa = XCSwiftPackageProductDependency;
+ package = 4E1853982BDAE6390034F3BA /* XCRemoteSwiftPackageReference "LocalConsole" */;
+ productName = LocalConsole;
+ };
4E2D8DD22B3F513800234039 /* MarkdownUI */ = {
isa = XCSwiftPackageProductDependency;
package = 4E2D8DD12B3F513800234039 /* XCRemoteSwiftPackageReference "swift-markdown-ui-standalone" */;
@@ -1905,16 +1922,6 @@
package = 4E3EAE1B2A990778009F1BE8 /* XCRemoteSwiftPackageReference "CodeScanner" */;
productName = CodeScanner;
};
- 4E5FA9A12B862C4A002DB016 /* LocalConsole */ = {
- isa = XCSwiftPackageProductDependency;
- package = 4E5FA9A02B862638002DB016 /* XCRemoteSwiftPackageReference "LocalConsole" */;
- productName = LocalConsole;
- };
- 4EA076B02BBEED7E00685A10 /* LocalConsole */ = {
- isa = XCSwiftPackageProductDependency;
- package = 4E5FA9A02B862638002DB016 /* XCRemoteSwiftPackageReference "LocalConsole" */;
- productName = LocalConsole;
- };
4EB094FC29897D280043A8A1 /* SymLog */ = {
isa = XCSwiftPackageProductDependency;
package = 4EB094FB29897D280043A8A1 /* XCRemoteSwiftPackageReference "SymLog" */;
diff --git a/TalerWallet1/Backend/WalletCore.swift b/TalerWallet1/Backend/WalletCore.swift
index 7b7b9c0..cec27c2 100644
--- a/TalerWallet1/Backend/WalletCore.swift
+++ b/TalerWallet1/Backend/WalletCore.swift
@@ -112,7 +112,8 @@ extension WalletCore {
if let walletError = decoded.error { // wallet-core sent an error message
do {
let jsonData = try JSONEncoder().encode(walletError)
- logger.error("wallet-core sent back an error for request \(requestId, privacy: .public)")
+ let responseCode = walletError.errorResponse?.code ?? 0
+ logger.error("wallet-core sent back error \(walletError.code, privacy: .public), \(responseCode, privacy: .public) for request \(requestId, privacy: .public)")
symLog.log("id:\(requestId) \(walletError)")
completion(requestId, timeSent, jsonData, walletError)
} catch { // JSON encoding of response.result failed / should never happen
@@ -375,7 +376,6 @@ print("\n❗️ WalletCore.swift:251 Notification: ", anyPayload, "\n") /
let decoded = try JSONDecoder().decode(ResponseOrNotification.self, from: messageData)
switch decoded.type {
case "error":
- symLog.log(decoded) // TODO: .error
try handleError(decoded)
case "response":
try handleResponse(decoded)
@@ -404,7 +404,7 @@ print("\n❗️ WalletCore.swift:251 Notification: ", anyPayload, "\n") /
}
}
- private func sendRequest(request: WalletBackendRequest, completionHandler: @escaping (UInt, Date, Data?, WalletBackendResponseError?) -> Void) {
+ private func encodeAndSend(_ request: WalletBackendRequest, completionHandler: @escaping (UInt, Date, Data?, WalletBackendResponseError?) -> Void) {
// Encode the request and send it to the backend.
queue.async {
self.semaphore.wait() // guard access to requestsMade
@@ -436,7 +436,7 @@ extension WalletCore {
let reqData = WalletBackendRequest(operation: request.operation(),
args: AnyEncodable(request.args()))
return try await withCheckedThrowingContinuation { continuation in
- sendRequest(request: reqData) { requestId, timeSent, result, error in
+ encodeAndSend(reqData) { requestId, timeSent, result, error in
let timeUsed = Date.now - timeSent
let millisecs = timeUsed.milliseconds
if let error {
@@ -469,14 +469,12 @@ extension WalletCore {
}
err = error // this will be thrown in continuation.resume(throwing:), otherwise keep nil
}
- } else {
+ } else if let error {
// TODO: WALLET_CORE_REQUEST_CANCELLED
- if let error {
- self.lastError = FullError(type: "error", operation: request.operation(), id: requestId, error: error)
- } else {
- self.lastError = nil
- }
+ self.lastError = FullError(type: "error", operation: request.operation(), id: requestId, error: error)
err = WalletBackendError.walletCoreError(error)
+ } else { // both result and error are nil
+ self.lastError = nil
}
continuation.resume(throwing: err ?? TransactionDecodingError.invalidStringValue)
}
diff --git a/TalerWallet1/Controllers/DebugViewC.swift b/TalerWallet1/Controllers/DebugViewC.swift
index c7de32f..bdf8e55 100644
--- a/TalerWallet1/Controllers/DebugViewC.swift
+++ b/TalerWallet1/Controllers/DebugViewC.swift
@@ -137,7 +137,7 @@ struct DebugViewV: View {
.id("viewID")
.accessibilityLabel(Text("View.ID.", comment: "AccessibilityLabel"))
.accessibilityValue(viewIDString)
- .accessibilityHint("Shows which view you currently are on.")
+ .accessibilityHint(String(localized: "Shows which view you currently are on."))
Spacer()
}
.edgesIgnoringSafeArea(.top)
diff --git a/TalerWallet1/Helper/Font+Taler.swift b/TalerWallet1/Helper/Font+Taler.swift
index b797354..ac98b4f 100644
--- a/TalerWallet1/Helper/Font+Taler.swift
+++ b/TalerWallet1/Helper/Font+Taler.swift
@@ -301,27 +301,27 @@ struct ContentViewFonts: View {
var body: some View {
VStack {
HStack {
- Text("title a")
- Text("bold").bold()
+ Text(verbatim: "title a")
+ Text(verbatim: "bold").bold()
}
.talerFont(.title)
.padding()
HStack {
- Text("title2 a")
- Text("italic").italic()
- Text("bold").bold()
+ Text(verbatim: "title2 a")
+ Text(verbatim: "italic").italic()
+ Text(verbatim: "bold").bold()
}
.talerFont(.title2)
.padding()
- Text("headline")
+ Text(verbatim: "headline")
.talerFont(.headline)
.padding(.top)
- Text("headline bold")
+ Text(verbatim: "headline bold")
.bold()
.talerFont(.headline)
.padding(.bottom)
- Text("title2 bold italic")
+ Text(verbatim: "title2 bold italic")
.bold()
.italic()
.talerFont(.title2)
diff --git a/TalerWallet1/Localizable.xcstrings b/TalerWallet1/Localizable.xcstrings
new file mode 100644
index 0000000..a4bbaaf
--- /dev/null
+++ b/TalerWallet1/Localizable.xcstrings
@@ -0,0 +1,3744 @@
+{
+ "sourceLanguage" : "en",
+ "strings" : {
+ "- %@ fee" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "- %@ Gebühr"
+ }
+ }
+ }
+ },
+ ", canceled" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : ", abgebrochen"
+ }
+ }
+ }
+ },
+ ". Needs bank confirmation" : {
+ "comment" : "VoiceOver",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : ". Benötigt die Bestätigung der Bank"
+ }
+ }
+ }
+ },
+ ". Needs K Y C" : {
+ "comment" : "VoiceOver",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : ". Benötigt K Y C"
+ }
+ }
+ }
+ },
+ "**Alternative:** If your bank already supports PayTo, you can use this PayTo-Link instead:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "**Alternative:** Wenn ihre Bank bereits Payto unterstützt, können Sie diesen Paytolink verwenden:"
+ }
+ }
+ }
+ },
+ "**Alternative:** Use this PayTo-Link:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "**Alternative:** Verwenden SIe diesen PayTo-Link:"
+ }
+ }
+ }
+ },
+ "**Step 1:** Copy this code and paste it into the subject/purpose field in your banking app or bank website:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "**Schritt 1:** Kopieren Sie diesen Code und setzen ihn als Verwendungszweck in ihrer Banking-App oder Bank-Webseite ein:"
+ }
+ }
+ }
+ },
+ "**Step 1:** Copy+Paste this subject:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "**Schritt 1:** Kopieren Sie diesen Verwendungszweck"
+ }
+ }
+ }
+ },
+ "**Step 2:** Copy and paste payee and account into the corresponding fields in your banking app or website:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "**Schritt 2:** Kopieren Sie Empfänger und Konto in Ihre Banking-App oder Bank-Webseite:"
+ }
+ }
+ }
+ },
+ "**Step 2:** Copy+Paste payee and account:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "**Schritt 2:** Kopieren Sie Empfänger und Konto"
+ }
+ }
+ }
+ },
+ "**Step 2:** Copy+Paste payee and IBAN:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "**Schritt 2:** Kopieren Sie Empfänger und IBAN"
+ }
+ }
+ }
+ },
+ "**Step 2:** If you don't already have it in your banking favorites list, then copy and paste payee and IBAN into the payee/IBAN fields in your banking app or website (and save it as favorite for the next time):" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "**Schritt 2:** Wenn Sie es noch nicht in Ihrer Favoritenliste haben, kopieren Sie Empfänger und IBAN in Ihre Banking-App oder Bank-Webseite (und speichern den Kontakt als Favorit für das nächste Mal):"
+ }
+ }
+ }
+ },
+ "**Step 3:** Finish the wire transfer of %@ in your banking app or website, then this withdrawal will proceed automatically. Depending on your bank the transfer can take from minutes to two working days, please be patient." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "**Schritt 3:** Schließen Sie die Überweisung von %@ in Ihrer Banking-App oder Bank-Webseite ab, dann wird diese Abhebung automatisch durchgeführt. Die Überweisung kann - je nach Bank - bis zu zwei Tage dauern. Bitte haben Sie etwas Geduld."
+ }
+ }
+ }
+ },
+ "**Step 3:** Transfer %@." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "**Schritt 3:** Schließen Sie die Überweisung von %@ ab."
+ }
+ }
+ }
+ },
+ "%@ %@" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%1$@ %2$@"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "%1$@ %2$@"
+ }
+ }
+ }
+ },
+ "%lld characters of 100" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%lld Zeichen von 100"
+ }
+ }
+ }
+ },
+ "%lld days ago" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Vor %lld Tagen"
+ }
+ }
+ }
+ },
+ "%lld hours ago" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Vor %lld Stunden"
+ }
+ }
+ }
+ },
+ "%lld minutes ago" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Vor %lld Minuten"
+ }
+ }
+ }
+ },
+ "%lld years" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%lld Jahre"
+ }
+ }
+ }
+ },
+ "%llu Day" : {
+ "comment" : "1 Day, might get plural (e.g. 2..3 Days), 4 letters max., abbreviate if longer",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%llu Tag"
+ }
+ }
+ }
+ },
+ "%llu Days" : {
+ "comment" : "7 Days, always plural (3..9), 4 letters max., abbreviate if longer",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%llu Tage"
+ }
+ }
+ }
+ },
+ "+ %@ fee" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "+ %@ Gebühr"
+ }
+ }
+ }
+ },
+ "1 hour ago" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Vor 1 Stunde"
+ }
+ }
+ }
+ },
+ "1 minute ago" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Vor 1 Minute"
+ }
+ }
+ }
+ },
+ "Abort Deposit" : {
+ "comment" : "RefreshReason",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Einzahlung abbrechen"
+ }
+ }
+ }
+ },
+ "Abort P2P Send" : {
+ "comment" : "RefreshReason",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "P2P Zahlung abbrechen"
+ }
+ }
+ }
+ },
+ "Abort Payment" : {
+ "comment" : "RefreshReason",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Zahlung abbrechen"
+ }
+ }
+ }
+ },
+ "About %@" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Über %@"
+ }
+ }
+ }
+ },
+ "About 1½ hours ago" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Vor ca. 1½ Stunden"
+ }
+ }
+ }
+ },
+ "About 2 hours ago" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Vor ca. 2 Stunden"
+ }
+ }
+ }
+ },
+ "About an hour ago" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Vor ca. 1 Stunde"
+ }
+ }
+ }
+ },
+ "Accept" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Akzeptieren"
+ }
+ }
+ }
+ },
+ "Accept P2P Receive" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "P2P Zahlungsempfang akzeptieren"
+ }
+ }
+ }
+ },
+ "Accept Terms of Service" : {
+ "comment" : "Button",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Nutzungsbedingungen akzeptieren"
+ }
+ }
+ }
+ },
+ "Account holder:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Kontoinhaber:"
+ }
+ }
+ }
+ },
+ "account of the payee" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Konto des Empfängers"
+ }
+ }
+ }
+ },
+ "Account:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Konto"
+ }
+ }
+ }
+ },
+ "Add" : {
+ "comment" : "button in the addExchange alert",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Hinzufügen"
+ }
+ }
+ }
+ },
+ "Add Payment Service" : {
+ "comment" : "accessibilityLabel for the + button",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Zahlungsdienst hinzufügen"
+ }
+ }
+ }
+ },
+ "Address of Payment Service" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Adresse des Zahlungsdienstes"
+ }
+ }
+ }
+ },
+ "Amount available:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Verfügbarer Betrag:"
+ }
+ }
+ }
+ },
+ "Amount to be spent:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Auszugebender Betrag:"
+ }
+ }
+ }
+ },
+ "Amount to be withdrawn:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Abzuhebender Betrag:"
+ }
+ }
+ }
+ },
+ "Amount to deposit:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Einzuzahlender Betrag:"
+ }
+ }
+ }
+ },
+ "Amount to pay:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Zu bezahlender Betrag:"
+ }
+ }
+ }
+ },
+ "Amount to request:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Anzufordernder Betrag:"
+ }
+ }
+ }
+ },
+ "Amount to send:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Zu sendender Betrag:"
+ }
+ }
+ }
+ },
+ "Amount to spend:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Auszugebender Betrag:"
+ }
+ }
+ }
+ },
+ "Amount to withdraw:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Abzuhebender Betrag:"
+ }
+ }
+ }
+ },
+ "Amount too big for a single withdrawal!" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Betrag zu groß für eine Abhebung!"
+ }
+ }
+ }
+ },
+ "Amount too small!" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Betrag zu klein!"
+ }
+ }
+ }
+ },
+ "Amount:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Betrag:"
+ }
+ }
+ }
+ },
+ "App Version" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "App-Version"
+ }
+ }
+ }
+ },
+ "Are you sure you want to abort this transaction?" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Sind Sie sicher, dass Sie diese Transaktion abbrechen wollen?"
+ }
+ }
+ }
+ },
+ "Are you sure you want to delete this transaction?" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Sind Sie sicher, dass Sie diese Transaktion löschen wollen?"
+ }
+ }
+ }
+ },
+ "Are you sure you want to fail this transaction?" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Sind Sie sicher, dass Sie diese Transaktion scheitern lassen wollen?"
+ }
+ }
+ }
+ },
+ "Available:" : {
+ "comment" : "mini",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Verfügbar:"
+ }
+ }
+ }
+ },
+ "Available:\t%@" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Verfügbar: %@"
+ }
+ }
+ }
+ },
+ "Backup restored" : {
+ "comment" : "RefreshReason",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Backup wiederhergestellt"
+ }
+ }
+ }
+ },
+ "Balance:" : {
+ "comment" : "Main view",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Saldo:"
+ }
+ }
+ }
+ },
+ "Bank" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Bank"
+ }
+ }
+ }
+ },
+ "but you only have %@ to deposit." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "aber Sie haben nur %@ zum Einzahlen."
+ }
+ }
+ }
+ },
+ "but you only have %@ to send." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "aber Sie haben nur %@ zum Versenden."
+ }
+ }
+ }
+ },
+ "Cancel" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Abbrechen"
+ }
+ }
+ }
+ },
+ "Checking Link" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Link wird überprüft"
+ }
+ }
+ }
+ },
+ "Choose the expiration duration" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Wählen Sie die Verfallszeit"
+ }
+ }
+ }
+ },
+ "Chosen amount to withdraw:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Gewählter Betrag zum Abheben:"
+ }
+ }
+ }
+ },
+ "Chosen:" : {
+ "comment" : "mini",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Gewählt:"
+ }
+ }
+ }
+ },
+ "Close" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Schließen"
+ }
+ }
+ }
+ },
+ "Closing Camera" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Kamera beenden"
+ }
+ }
+ }
+ },
+ "Confirm later" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Später bestätigen"
+ }
+ }
+ }
+ },
+ "Confirm now" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Jetzt bestätigen"
+ }
+ }
+ }
+ },
+ "Confirm Payment" : {
+ "comment" : "pay P2P request/invoice\npay merchant",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Zahlung bestätigen"
+ }
+ }
+ }
+ },
+ "Confirm with Bank" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Mit der Bank bestätigen"
+ }
+ }
+ }
+ },
+ "Confirm Withdrawal" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Abhebung bestätigen"
+ }
+ }
+ }
+ },
+ "Contacting..." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Kontaktiere..."
+ }
+ }
+ }
+ },
+ "Copy the account" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Konto kopieren"
+ }
+ }
+ }
+ },
+ "Copy the cryptocode" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Cryptocode kopieren"
+ }
+ }
+ }
+ },
+ "Copy the error" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Fehler kopieren"
+ }
+ }
+ }
+ },
+ "Copy the error JSON" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Fehler-JSON kopieren"
+ }
+ }
+ }
+ },
+ "Copy the IBAN" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "IBAN kopieren"
+ }
+ }
+ }
+ },
+ "Copy the payee" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Empfänger kopieren"
+ }
+ }
+ }
+ },
+ "Copy.long" : {
+ "comment" : "may be a bit longer",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Kopieren"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Copy"
+ }
+ }
+ }
+ },
+ "Copy.short" : {
+ "comment" : "5 letters max, else abbreviate",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Copy"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Copy"
+ }
+ }
+ }
+ },
+ "Cryptocode" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Cryptocode"
+ }
+ }
+ }
+ },
+ "Customize Order" : {
+ "comment" : "pay merchant",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Auftrag bearbeiten"
+ }
+ }
+ }
+ },
+ "Demo: get digital cash to experience how to pay with the money of the future." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Demo: Mit Digitalem Bargeld ausprobieren wie Sie mit dem Geld der Zukunft bezahlen."
+ }
+ }
+ }
+ },
+ "Deposit" : {
+ "comment" : "TransactionType",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Einzahlen"
+ }
+ }
+ }
+ },
+ "Deposit\t%@" : {
+ "comment" : "Button `Deposit (currency)´, must have ONE \\t and ONE %@",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@\teinzahlen"
+ }
+ }
+ }
+ },
+ "Deposit %@" : {
+ "comment" : "amount with currency",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@ einzahlen"
+ }
+ }
+ }
+ },
+ "Deposit:" : {
+ "comment" : "mini",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Einzahlen:"
+ }
+ }
+ }
+ },
+ "DepositButton_Short" : {
+ "comment" : "Abbreviation of `Deposit (currency)´",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Einzahlen"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Deposit"
+ }
+ }
+ }
+ },
+ "Deserialization error" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Interner Deserialisierungsfehler"
+ }
+ }
+ }
+ },
+ "Done" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Fertig"
+ }
+ }
+ }
+ },
+ "Effective:" : {
+ "comment" : "mini",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Netto:"
+ }
+ }
+ }
+ },
+ "Either (payee) Long 1" : {
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Entweder geben Sie diesen Zahlungslink"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Either provide this payment link"
+ }
+ }
+ }
+ },
+ "Either (payee) Long 2" : {
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "an den Empfänger, oder"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "to the payee, or"
+ }
+ }
+ }
+ },
+ "Either (payee) Long 3" : {
+ "comment" : "e.g. '$ 7.41'",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "lassen Sie den Empfänger den QR Code scannen um %@ zu erhalten."
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "let the payee scan this QR code to receive %@."
+ }
+ }
+ }
+ },
+ "Either (payee) Mini 1" : {
+ "comment" : "Either (copy/share this link to the payee)",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Entweder"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Either"
+ }
+ }
+ }
+ },
+ "Either (payee) Mini 2" : {
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "oder den QR Code"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "or scan this"
+ }
+ }
+ }
+ },
+ "Either (payee) Mini 3" : {
+ "comment" : "e.g. '$ 7.41'",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "scannen um %@ zu erhalten."
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "to receive %@."
+ }
+ }
+ }
+ },
+ "Either (payer) Long 1" : {
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Entweder geben Sie diesen Zahlungslink"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Either provide this payment link"
+ }
+ }
+ }
+ },
+ "Either (payer) Long 2" : {
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "an den Bezahlenden, oder"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "to the payer, or"
+ }
+ }
+ }
+ },
+ "Either (payer) Long 3" : {
+ "comment" : "e.g. '5,3 €'",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "lassen Sie den Bezahlenden den QR Code scannen um %@ zu bezahlen."
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "let the payer scan this QR code to pay %@."
+ }
+ }
+ }
+ },
+ "Either (payer) Mini 1" : {
+ "comment" : "Either (copy/share this link to the payer)",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Entweder"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Either"
+ }
+ }
+ }
+ },
+ "Either (payer) Mini 2" : {
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "oder den QR Code"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "or scan this"
+ }
+ }
+ }
+ },
+ "Either (payer) Mini 3" : {
+ "comment" : "e.g. '5,3 €'",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "scannen um %@ zu bezahlen."
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "to pay %@."
+ }
+ }
+ }
+ },
+ "enabled when account holder and IBAN are set" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "aktiviert, wenn Kontoinhaber und IBAN eingegeben sind"
+ }
+ }
+ }
+ },
+ "enabled when amount is non-zero, but not higher than your available amount" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "aktiviert, wenn der Betrag ungleich Null ist, aber nicht höher als Ihr verfügbarer Betrag"
+ }
+ }
+ }
+ },
+ "enabled when subject and expiration are set" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "aktiviert, wenn Betreff und Ablaufdatum eingegeben sind"
+ }
+ }
+ }
+ },
+ "Enter subject:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Verwendungszweck eingeben:"
+ }
+ }
+ }
+ },
+ "Error" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Fehler"
+ }
+ }
+ }
+ },
+ "Expires in:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Läuft ab in:"
+ }
+ }
+ }
+ },
+ "Expires: %@" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Läuft ab: %@"
+ }
+ }
+ }
+ },
+ "Fee (long):" : {
+ "comment" : "long version",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Gebühr:"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Fee:"
+ }
+ }
+ }
+ },
+ "Fee (short):" : {
+ "comment" : "short version",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Gebühr:"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Fee:"
+ }
+ }
+ }
+ },
+ "For Delete, Fail & Abort buttons" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Für Löschen, Abbrechen und Scheitern"
+ }
+ }
+ }
+ },
+ "from %@" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "von %@"
+ }
+ }
+ }
+ },
+ "Gross Amount to receive:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Bruttobetrag zu erhalten:"
+ }
+ }
+ }
+ },
+ "Haptics" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Haptik"
+ }
+ }
+ }
+ },
+ "IBAN of the payee" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "IBAN des Empfängers"
+ }
+ }
+ }
+ },
+ "IBAN:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "IBAN:"
+ }
+ }
+ }
+ },
+ "If this wallet belongs to a child or teenager, the generated electronic cash should be age-restricted:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Wenn diese Wallet einem Kind oder Minderjährigen gehört, sollte das generierte Elektronic-Cash altersbeschränkt sein."
+ }
+ }
+ }
+ },
+ "In progress" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "In Verarbeitung"
+ }
+ }
+ }
+ },
+ "Initialization error" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Initialisierungsfehler"
+ }
+ }
+ }
+ },
+ "Internal core error" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Interner Systemfehler"
+ }
+ }
+ }
+ },
+ "KYC" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "KYC"
+ }
+ }
+ }
+ },
+ "Language:" : {
+ "comment" : "title of ToS language selection",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Sprache:"
+ }
+ }
+ }
+ },
+ "LinkTitle_DEMOBANK" : {
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Demo Bank Webseite"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Demo Bank Website"
+ }
+ }
+ }
+ },
+ "LinkTitle_DEMOSHOP" : {
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Demogeld ausgeben"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Spend test money"
+ }
+ }
+ }
+ },
+ "LinkTitle_Test_Money" : {
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Demogeld erhalten"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Get demo money"
+ }
+ }
+ }
+ },
+ "List Style:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Listenstil:"
+ }
+ }
+ }
+ },
+ "Loading…" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Laden..."
+ }
+ }
+ }
+ },
+ "Lost:" : {
+ "comment" : "mini",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Verlust:"
+ }
+ }
+ }
+ },
+ "Main Menu" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Hauptmenü"
+ }
+ }
+ }
+ },
+ "MajorState.Aborted" : {
+ "comment" : "TxMajorState heading",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Abgebrochen"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Aborted"
+ }
+ }
+ }
+ },
+ "MajorState.Aborting" : {
+ "comment" : "TxMajorState heading",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Abbrechend"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Aborting"
+ }
+ }
+ }
+ },
+ "MajorState.Deleted" : {
+ "comment" : "TxMajorState heading",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Gelöscht"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Deleted"
+ }
+ }
+ }
+ },
+ "MajorState.Dialog" : {
+ "comment" : "TxMajorState heading",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Dialog"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Dialog"
+ }
+ }
+ }
+ },
+ "MajorState.Done" : {
+ "comment" : "TxMajorState heading",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Fertig"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Done"
+ }
+ }
+ }
+ },
+ "MajorState.Expired" : {
+ "comment" : "TxMajorState heading",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Abgelaufen"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Expired"
+ }
+ }
+ }
+ },
+ "MajorState.Failed" : {
+ "comment" : "TxMajorState heading",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Gescheitert"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Failed"
+ }
+ }
+ }
+ },
+ "MajorState.Pending" : {
+ "comment" : "TxMajorState heading",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Ausstehend"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Pending"
+ }
+ }
+ }
+ },
+ "Manage payment service providers..." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Zahlungsdienste verwalten"
+ }
+ }
+ }
+ },
+ "Merchant" : {
+ "comment" : "RefreshReason",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Händler"
+ }
+ }
+ }
+ },
+ "Minimalistic" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Minimalistisch"
+ }
+ }
+ }
+ },
+ "MinorState.aml" : {
+ "comment" : "TxMinorState heading",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "AML benötigt"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "AML required"
+ }
+ }
+ }
+ },
+ "MinorState.bankConfirmTransfer" : {
+ "comment" : "TxMinorState heading",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Warte auf Banküberweisung"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Waiting for bank transfer"
+ }
+ }
+ }
+ },
+ "MinorState.kyc" : {
+ "comment" : "TxMinorState heading",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "KYC benötigt"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "KYC required"
+ }
+ }
+ }
+ },
+ "MinorState.mergekyc" : {
+ "comment" : "TxMinorState heading",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "KYC benötigt"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "KYC required"
+ }
+ }
+ }
+ },
+ "Money lost" : {
+ "comment" : "TransactionType",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geld verloren"
+ }
+ }
+ }
+ },
+ "Money lost:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geld verloren:"
+ }
+ }
+ }
+ },
+ "More info about GNU Taler in general..." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Mehr Info über GNU Taler im Allgemeinen..."
+ }
+ }
+ }
+ },
+ "More info about this app..." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Mehr Info über diese App..."
+ }
+ }
+ }
+ },
+ "More than a week ago" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Vor mehr als einer Woche"
+ }
+ }
+ }
+ },
+ "NavTitle_Deposit_AmountStr" : {
+ "comment" : "NavTitle: Deposit",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Einzahlung"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Deposit"
+ }
+ }
+ }
+ },
+ "NavTitle_Deposit_Currency" : {
+ "comment" : "NavTitle: Deposit 'currencySymbol'",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@ einzahlen"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Deposit %@"
+ }
+ }
+ }
+ },
+ "NavTitle_Request_AmountStr" : {
+ "comment" : "NavTitle: Request 'amountStr'",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@ anfordern"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Request %@"
+ }
+ }
+ }
+ },
+ "NavTitle_Request_Currency" : {
+ "comment" : "NavTitle: Request 'currencySymbol'",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@ anfordern"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Request %@"
+ }
+ }
+ }
+ },
+ "NavTitle_Send_AmountStr" : {
+ "comment" : "NavTitle: Send 'amountStr'",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@ senden"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Send %@"
+ }
+ }
+ }
+ },
+ "NavTitle_Send_Currency" : {
+ "comment" : "NavTitle: Send 'currencySymbol'",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@ senden"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Send %@"
+ }
+ }
+ }
+ },
+ "NavTitle_Withdraw (currency)" : {
+ "comment" : "NavTitle: Withdraw 'currencySymbol'",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@ abheben"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Withdraw %@"
+ }
+ }
+ }
+ },
+ "NavTitle_Withdraw (currency) A11y" : {
+ "comment" : "NavTitle: Withdraw 'currency'",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@ abheben"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Withdraw %@"
+ }
+ }
+ }
+ },
+ "Net Amount to receive:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Nettobetrag erhalten:"
+ }
+ }
+ }
+ },
+ "Next" : {
+ "comment" : "advance Deposit to Amount",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Weiter"
+ }
+ }
+ }
+ },
+ "No date" : {
+ "comment" : "Timestamp missing or invalid",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Kein Datum"
+ }
+ }
+ }
+ },
+ "No withdrawal fee" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Keine Gebühr"
+ }
+ }
+ }
+ },
+ "Note: It will take quite some time to withdraw this amount! Be more patient..." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Hinweis: Es braucht eine ganze Weile um diesen Betrag abzuheben. Seien Sie noch geduldiger..."
+ }
+ }
+ }
+ },
+ "Note: It will take some time to withdraw this amount. Be patient..." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Hinweis: Es braucht eine Weile um diesen Betrag abzuheben. Seien Sie geduldig..."
+ }
+ }
+ }
+ },
+ "Observe walletCore" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "WalleCore observieren"
+ }
+ }
+ }
+ },
+ "Obtained amount:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Erhaltenen Betrag:"
+ }
+ }
+ }
+ },
+ "Obtained:" : {
+ "comment" : "mini",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Erhalten:"
+ }
+ }
+ }
+ },
+ "Omit text where possible" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Möglichst wenig Text"
+ }
+ }
+ }
+ },
+ "on LocalConsole" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "on LocalConsole"
+ }
+ }
+ }
+ },
+ "Open KYC website" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "KYC Webseite öffnen"
+ }
+ }
+ }
+ },
+ "Open merchant website" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Händler-Webseite öffnen"
+ }
+ }
+ }
+ },
+ "Open Settings" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Einstellungen öffnen"
+ }
+ }
+ }
+ },
+ "Opening Camera" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Kamera wird geöffnet"
+ }
+ }
+ }
+ },
+ "P2P Ready" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "P2P bereit"
+ }
+ }
+ }
+ },
+ "P2P Receive" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "P2P erhalten"
+ }
+ }
+ }
+ },
+ "Paid" : {
+ "comment" : "Title, short",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Bezahlt"
+ }
+ }
+ }
+ },
+ "Paid amount:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Bezahlter Betrag:"
+ }
+ }
+ }
+ },
+ "Paid P2P" : {
+ "comment" : "Title, short",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "P2P bezahlt"
+ }
+ }
+ }
+ },
+ "Paid Request" : {
+ "comment" : "TransactionType, paid invoice from another wallet",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Anforderung bezahlt"
+ }
+ }
+ }
+ },
+ "Paid:" : {
+ "comment" : "mini",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Bezahlt:"
+ }
+ }
+ }
+ },
+ "Pay P2P" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "P2P bezahlen"
+ }
+ }
+ }
+ },
+ "Pay Peer-Pull" : {
+ "comment" : "RefreshReason",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Pay Peer-Pull"
+ }
+ }
+ }
+ },
+ "Pay Peer-Push" : {
+ "comment" : "RefreshReason",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Pay Peer-Push"
+ }
+ }
+ }
+ },
+ "Pay Request" : {
+ "comment" : "TransactionType, scan invoice to pay to another wallet",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Zahlungsanforderung"
+ }
+ }
+ }
+ },
+ "Pay:" : {
+ "comment" : "mini",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Bezahlen:"
+ }
+ }
+ }
+ },
+ "Payee" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Empfänger"
+ }
+ }
+ }
+ },
+ "Payee:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Empfänger:"
+ }
+ }
+ }
+ },
+ "Payment" : {
+ "comment" : "TransactionType",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Zahlung"
+ }
+ }
+ }
+ },
+ "Payment provider:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Zahlungsdienst"
+ }
+ }
+ }
+ },
+ "Pending" : {
+ "comment" : "ViewTitle of TransactionList",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Ausstehend"
+ }
+ }
+ }
+ },
+ "Pending amount to obtain:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Zu erhaltender Betrag:"
+ }
+ }
+ }
+ },
+ "Pending:" : {
+ "comment" : "mini",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Ausstehend:"
+ }
+ }
+ }
+ },
+ "Play Payment Sounds" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Zahlungs-Töne abspielen"
+ }
+ }
+ }
+ },
+ "Please allow camera access in settings." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Bitte erlauben Sie den Zugriff auf die Kamera in den Systemeinstellungen"
+ }
+ }
+ }
+ },
+ "Please enter the URL" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Bitte geben Sie die URL ein"
+ }
+ }
+ }
+ },
+ "Price (net):" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Nettopreis:"
+ }
+ }
+ }
+ },
+ "Price:" : {
+ "comment" : "mini",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Preis:"
+ }
+ }
+ }
+ },
+ "QR Code" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "QR Code"
+ }
+ }
+ }
+ },
+ "QR code and link can also be scanned or copied / shared from Transactions later." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "QR Code und Link können auch aus der Umsatzliste kopiert/geteilt werden."
+ }
+ }
+ }
+ },
+ "Receive gross:" : {
+ "comment" : "mini",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Erhalten (brutto):"
+ }
+ }
+ }
+ },
+ "Receive Money" : {
+ "comment" : "TransactionType, scan to receive coins sent from another wallet",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geld erhalten"
+ }
+ }
+ }
+ },
+ "Receive net:" : {
+ "comment" : "mini",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Erhalten (netto):"
+ }
+ }
+ }
+ },
+ "Received Money" : {
+ "comment" : "TransactionType, received coins sent from another wallet",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geld erhalten"
+ }
+ }
+ }
+ },
+ "Received P2P" : {
+ "comment" : "Title, short",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "P2P erhalten"
+ }
+ }
+ }
+ },
+ "Recent %lld transactions" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Aktuellste %lld Umsätze"
+ }
+ }
+ }
+ },
+ "Recent transaction" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Aktueller Umsatz"
+ }
+ }
+ }
+ },
+ "Recoup" : {
+ "comment" : "TransactionType",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Recoup"
+ }
+ }
+ }
+ },
+ "Recoup:" : {
+ "comment" : "mini",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Recoup:"
+ }
+ }
+ }
+ },
+ "Refresh" : {
+ "comment" : "TransactionType",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Erneuerung"
+ }
+ }
+ }
+ },
+ "Refund" : {
+ "comment" : "TransactionType",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Erstattung"
+ }
+ }
+ }
+ },
+ "Refunded amount:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Erstatteter Betrag:"
+ }
+ }
+ }
+ },
+ "Refunded:" : {
+ "comment" : "mini",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Erstattet:"
+ }
+ }
+ }
+ },
+ "Reload" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Neu laden"
+ }
+ }
+ }
+ },
+ "Request %@" : {
+ "comment" : "amount with currency",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@ anfordern"
+ }
+ }
+ }
+ },
+ "Request Money" : {
+ "comment" : "TransactionType, send invoice to another wallet",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geld anfordern"
+ }
+ }
+ }
+ },
+ "RequestButton_Full" : {
+ "comment" : "`Request Payment´ in Balances - set exactly 1 \\t for line break",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Bezahlung\tanfordern"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Request\tPayment"
+ }
+ }
+ }
+ },
+ "RequestButton_Short" : {
+ "comment" : "Abbreviation of button `Request Payment´",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Anfordern"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Request"
+ }
+ }
+ }
+ },
+ "Requested Money" : {
+ "comment" : "TransactionType, sent invoice to another wallet",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Angefordertes Geld"
+ }
+ }
+ }
+ },
+ "Reset" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Zurücksetzen"
+ }
+ }
+ }
+ },
+ "Reset Wallet" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Wallet zurücksetzen"
+ }
+ }
+ }
+ },
+ "Restriction:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Beschränkung:"
+ }
+ }
+ }
+ },
+ "Right now" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Gerade eben"
+ }
+ }
+ }
+ },
+ "Save" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Sichern"
+ }
+ }
+ }
+ },
+ "Scan QR codes" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "QR Code scannen"
+ }
+ }
+ }
+ },
+ "Scanning QR-codes requires access to the camera" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Um QR Codes zu scannen wird Zugriff auf die Kamera benötigt"
+ }
+ }
+ }
+ },
+ "Scheduled" : {
+ "comment" : "RefreshReason",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geplant"
+ }
+ }
+ }
+ },
+ "Scroll down" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Abwärts blättern"
+ }
+ }
+ }
+ },
+ "Scroll up" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Aufwärts blättern"
+ }
+ }
+ }
+ },
+ "Select age" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Alter auswählen"
+ }
+ }
+ }
+ },
+ "Send %@ now" : {
+ "comment" : "amount with currency",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Jetzt %@ senden"
+ }
+ }
+ }
+ },
+ "Send Money" : {
+ "comment" : "TransactionType, send coins to another wallet",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geld senden"
+ }
+ }
+ }
+ },
+ "SendButton_Full" : {
+ "comment" : "`Send Money´ in Balances - set exactly 1 \\t for line break",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geld\tsenden"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Send\tMoney"
+ }
+ }
+ }
+ },
+ "SendButton_Short" : {
+ "comment" : "Abbreviation of button `Send Money´",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Senden"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Send"
+ }
+ }
+ }
+ },
+ "Sent Money" : {
+ "comment" : "TransactionType, sent coins to another wallet",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geld gesendet"
+ }
+ }
+ }
+ },
+ "Serialization error" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Interner Serialisierungsfehler"
+ }
+ }
+ }
+ },
+ "Share" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Teilen"
+ }
+ }
+ }
+ },
+ "Share the PayTo URL" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Die PayTo URL teilen"
+ }
+ }
+ }
+ },
+ "Sheet.ID." : {
+ "comment" : "AccessibilityLabel",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Blatt.ID."
+ }
+ }
+ }
+ },
+ "Shortcut" : {
+ "comment" : "VoiceOver: $50,$25,$10,$5 shortcut buttons",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Kurzwahl"
+ }
+ }
+ }
+ },
+ "Show logs" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Logs anzeigen"
+ }
+ }
+ }
+ },
+ "Show Warnings" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Warnungen anzeigen"
+ }
+ }
+ }
+ },
+ "Shows which view you currently are on." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Zeigt bei welchen Dialog Sie gerade sind"
+ }
+ }
+ }
+ },
+ "Since the demo bank supports the Taler integration, you can start a withdrawal directly on the" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Da die Demobank Taler direkt unterstützt, können Sie eine Abhebung starten von der"
+ }
+ }
+ }
+ },
+ "Some pending transactions" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Ausstehende Umsätze"
+ }
+ }
+ }
+ },
+ "Standard iOS Font" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Standard iOS Zeichensatz"
+ }
+ }
+ }
+ },
+ "Status: %@" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Status: %@"
+ }
+ }
+ }
+ },
+ "Subject" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Verwendungszweck"
+ }
+ }
+ }
+ },
+ "Summary" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Übersicht"
+ }
+ }
+ }
+ },
+ "Taler Logo" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Taler Logo"
+ }
+ }
+ }
+ },
+ "Tap the button to go to the KYC website." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Drücken Sie den Button um auf die KYC Webseite zu gehen."
+ }
+ }
+ }
+ },
+ "Terms of Service" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Nutzungsbedingungen"
+ }
+ }
+ }
+ },
+ "The bank is waiting for your confirmation." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Die Bank wartet auf Ihre Freigabe."
+ }
+ }
+ }
+ },
+ "The Payment Service Provider is waiting for your wire-transfer." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Der Zahlungsdienst wartet auf Ihre Überweisung."
+ }
+ }
+ }
+ },
+ "There are no Payment Services yet." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Es gibt noch keine Zahlungsdienste."
+ }
+ }
+ }
+ },
+ "There are no transactions for %@." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Es gibt noch keine Umsätze for %@."
+ }
+ }
+ }
+ },
+ "There is no digital cash in your wallet." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Es gibt noch kein digitales Geld in Ihrem Wallet."
+ }
+ }
+ }
+ },
+ "This is mandatory, otherwise your money will not arrive in this wallet." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Dies ist obligatorisch, da Ihr Geld sonst nicht in dieser Wallet ankommt."
+ }
+ }
+ }
+ },
+ "This operation cannot be undone" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Das kann nicht rückgängig gemacht werden"
+ }
+ }
+ }
+ },
+ "This transaction is not yet ready..." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Diese Transaktion ist noch nicht bereit..."
+ }
+ }
+ }
+ },
+ "TitleBalances" : {
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Salden"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Balances"
+ }
+ }
+ }
+ },
+ "TitleExchanges" : {
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Zahlungsdienste"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Payment Services"
+ }
+ }
+ }
+ },
+ "TitleIncoming_Full" : {
+ "comment" : "`Pending incoming´ in Balances - set exactly 1 \t for line break",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Ausstehende\tEingänge"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Pending\tincoming"
+ }
+ }
+ }
+ },
+ "TitleIncoming_Short" : {
+ "comment" : "Abbreviation of `Pending incoming´ in Balances",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Eingehend"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Incoming"
+ }
+ }
+ }
+ },
+ "TitleOutgoing_Full" : {
+ "comment" : "`Pending outgoing´ in Balances - set exactly 1 \t for line break",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Ausstehende\tAusgänge"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Pending\toutgoing"
+ }
+ }
+ }
+ },
+ "TitleOutgoing_Short" : {
+ "comment" : "Abbreviation of `Pending outgoing´ in Balances",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Ausgehend"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Outgoing"
+ }
+ }
+ }
+ },
+ "TitleSettings" : {
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Einstellungen"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Settings"
+ }
+ }
+ }
+ },
+ "Transaction list" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Umsatzliste"
+ }
+ }
+ }
+ },
+ "Transactions" : {
+ "comment" : "ViewTitle of TransactionList",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Umsätze"
+ }
+ }
+ }
+ },
+ "Transfer %@ to the Payment Service." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Überweisen Sie %@ an den Zahlungsdienst."
+ }
+ }
+ }
+ },
+ "TxAction.Abort" : {
+ "comment" : "TxAction button",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Abbrechen"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Abort"
+ }
+ }
+ }
+ },
+ "TxAction.Delete" : {
+ "comment" : "TxAction button",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Aus der Liste löschen"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Delete from history"
+ }
+ }
+ }
+ },
+ "TxAction.Fail" : {
+ "comment" : "TxAction button",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Scheitern"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Fail"
+ }
+ }
+ }
+ },
+ "TxAction.Retry" : {
+ "comment" : "TxAction button",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Jetzt nochmal versuchen"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Retry now"
+ }
+ }
+ }
+ },
+ "TxActionDone.Abort" : {
+ "comment" : "TxAction button",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Ausstehende abbrechen"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Abort pending..."
+ }
+ }
+ }
+ },
+ "TxActionDone.Delete" : {
+ "comment" : "TxAction button",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Von der Liste gelöscht"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Deleted from list"
+ }
+ }
+ }
+ },
+ "TxActionDone.Fail" : {
+ "comment" : "TxAction button",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Scheitern..."
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Failing..."
+ }
+ }
+ }
+ },
+ "TxActionDone.Retry" : {
+ "comment" : "TxAction button",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Nochmal versuchen..."
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Retrying..."
+ }
+ }
+ }
+ },
+ "unknown command" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Unbekanntes Kommando"
+ }
+ }
+ }
+ },
+ "Unknown error" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Unbekannter Fehler"
+ }
+ }
+ }
+ },
+ "unknown payment method" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Unbekannte Zahlungsmethode"
+ }
+ }
+ }
+ },
+ "Unknown Payment Provider" : {
+ "comment" : "exchange url",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Unbekannter Zahlungsdienst"
+ }
+ }
+ }
+ },
+ "Unknown Payment Service" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Unbekannter Zahlungsdienst"
+ }
+ }
+ }
+ },
+ "unrestricted" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "unbeschränkt"
+ }
+ }
+ }
+ },
+ "Use the Add button to add a service." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Fügen Sie einen Zahlungsdienst hinzu."
+ }
+ }
+ }
+ },
+ "Use the QR code scan button to start a withdrawal if your bank already supports Taler payments." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Scannen Sie einen QR-Code um eine Abhebung zu starten wenn Ihre Bank schon Taler-Abhebungen unterstützt."
+ }
+ }
+ }
+ },
+ "Using payment service provider:" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Mit dem Zahlungsdienst:"
+ }
+ }
+ }
+ },
+ "via %@" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "via %@"
+ }
+ }
+ }
+ },
+ "Vibration Feedback" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Vibrations-Feedback"
+ }
+ }
+ }
+ },
+ "View.ID." : {
+ "comment" : "AccessibilityLabel",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Seiten-ID."
+ }
+ }
+ }
+ },
+ "Visit the taler.net website" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Gehe zur taler.net Webseite"
+ }
+ }
+ }
+ },
+ "WalletCore Version" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "WalletCore-Version"
+ }
+ }
+ }
+ },
+ "When a transaction finished" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Wenn eine Transaktion abgeschlossen ist"
+ }
+ }
+ }
+ },
+ "Will go to bank website to confirm this withdrawal." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geht zur Bank-Webseite um diese Abhebung zu bestätigen."
+ }
+ }
+ }
+ },
+ "Will go to detail view." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geht zur Detail-Ansicht."
+ }
+ }
+ }
+ },
+ "Will go to KYC website to confirm this withdrawal." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geht zur KYC-Webseite um diese Abhebung zu bestätigen."
+ }
+ }
+ }
+ },
+ "Will go to main transactions list." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geht zur Transaktions-Liste"
+ }
+ }
+ }
+ },
+ "Will go to Pending transactions." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geht zu den ausstehenden Transaktionen."
+ }
+ }
+ }
+ },
+ "Will go to the demo shop website." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geht zur Demo Shop-Webseite"
+ }
+ }
+ }
+ },
+ "Will go to the merchant website." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Geht zur Händler-Webseite"
+ }
+ }
+ }
+ },
+ "Wire Transfer" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Überweisung"
+ }
+ }
+ }
+ },
+ "Withdraw\t%@" : {
+ "comment" : "Button `Withdraw (currency)´, must have ONE \\t and ONE %@",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "%@\tabheben"
+ }
+ }
+ }
+ },
+ "Withdrawal" : {
+ "comment" : "TransactionType",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Abhebung"
+ }
+ }
+ }
+ },
+ "WithdrawButton_Short" : {
+ "comment" : "Abbreviation of `Withdraw (currency)´",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Abheben"
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "Withdraw"
+ }
+ }
+ }
+ },
+ "xloc.generic.ok" : {
+
+ },
+ "Yesterday" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Gestern"
+ }
+ }
+ }
+ },
+ "You can also add a payment service manually in the Settings." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Sie können in den Einstellungen manuell einen Zahlungsdienst hinzufügen."
+ }
+ }
+ }
+ },
+ "You can also scan a withdrawal QR code from your bank on the Balances tab to automatically add a payment service." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Sie können auch im Salden-Tab einen Abheben-QR-Code scannen um automatisch einen Zahlungsdienst hinzuzufügen."
+ }
+ }
+ }
+ },
+ "You can spend these %@ in the Demo shop, or send them to another wallet." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Sie können diese %@ im Demo-Shop ausgeben, oder an eine andere Wallet senden."
+ }
+ }
+ }
+ },
+ "You don't have enough %@." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Sie haben nicht genug %@."
+ }
+ }
+ }
+ },
+ "You must accept the Payment Service Provider's Terms of Service first before you can receive electronic cash in your wallet." : {
+ "comment" : "P2P Receive",
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Sie müssen zuerst die Nutzungsbedingungen des Zahlungsdienstes akzeptieren, bevor sie Elektronic-Cash in ihr Wallet bekommen können."
+ }
+ }
+ }
+ },
+ "You must accept the Payment Service Provider's Terms of Service first before you can use it to withdraw electronic cash to your wallet." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Sie müssen zuerst die Nutzungsbedingungen des Zahlungsdienstes akzeptieren, bevor sie Electronic-Cash in Ihr Wallet abheben können."
+ }
+ }
+ }
+ },
+ "You must accept the Payment Service's Terms of Service first." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Sie müssen zuerst die Nutzungsbedingungen des Zahlungsdienstes akzeptieren."
+ }
+ }
+ }
+ },
+ "You need to pass a KYC procedure" : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Sie müssen ein KYC-Verfahren durchlaufen"
+ }
+ }
+ }
+ },
+ "You need to transfer %@ from your regular bank account to the Payment Service Provider to receive %@ as electronic cash in this wallet." : {
+ "localizations" : {
+ "de" : {
+ "stringUnit" : {
+ "state" : "translated",
+ "value" : "Sie müssen %1$@ von Ihrem regulären Bankkonto an den Zahlungsdienst überweisen um %2$@ als Electronic-Cash in dieses Wallet zu erhalten."
+ }
+ },
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "You need to transfer %1$@ from your regular bank account to the Payment Service Provider to receive %2$@ as electronic cash in this wallet."
+ }
+ }
+ }
+ }
+ },
+ "version" : "1.0"
+} \ No newline at end of file
diff --git a/TalerWallet1/Model/Transaction.swift b/TalerWallet1/Model/Transaction.swift
index 1dec6b7..956d7ed 100644
--- a/TalerWallet1/Model/Transaction.swift
+++ b/TalerWallet1/Model/Transaction.swift
@@ -61,7 +61,7 @@ enum TransactionMinorState: String, Codable {
case .deposit: return self.rawValue
case .kyc: return String(localized: "MinorState.kyc", defaultValue: "KYC required", comment: "TxMinorState heading")
case .aml: return String(localized: "MinorState.aml", defaultValue: "AML required", comment: "TxMinorState heading")
- case .mergeKycRequired: return String(localized: "MinorState.mergekyc", defaultValue: "KYC merge", comment: "TxMinorState heading")
+ case .mergeKycRequired: return String(localized: "MinorState.mergekyc", defaultValue: "KYC required", comment: "TxMinorState heading")
case .track: return self.rawValue
case .submitPayment: return self.rawValue
case .rebindSession: return self.rawValue
diff --git a/TalerWallet1/Model/WalletModel.swift b/TalerWallet1/Model/WalletModel.swift
index 5463f76..9e48f44 100644
--- a/TalerWallet1/Model/WalletModel.swift
+++ b/TalerWallet1/Model/WalletModel.swift
@@ -28,8 +28,16 @@ class WalletModel: ObservableObject {
var cachedBalances: [Balance]? = nil
@Published var showError: Bool = false
- @Published var error: ErrorData? = nil {
- didSet { showError = error != nil }
+ @Published var error2: ErrorData? = nil
+
+ @MainActor func setError(_ theError: Error?) {
+ if let theError {
+ self.error2 = .error(theError)
+ self.showError = true
+ } else {
+ self.error2 = nil
+ self.showError = false
+ }
}
func sendRequest<T: WalletBackendFormattedRequest> (_ request: T, _ delay: UInt = 0, viewHandles: Bool = false)
@@ -54,7 +62,7 @@ class WalletModel: ObservableObject {
logger.error("\(request.operation(), privacy: .public) failed after \(timeUsed.milliseconds, privacy: .public) ms\n\(error, privacy: .public)")
if !viewHandles {
// TODO: symlog + controller sound
- self.error = .error(error)
+ await setError(error)
}
throw error
}
@@ -271,14 +279,3 @@ extension WalletModel {
}
}
-extension WalletModel {
- @MainActor
- func showError(_ error: ErrorData) {
- self.error = error
- }
-
- @MainActor
- func cleanError() {
- self.error = nil
- }
-}
diff --git a/TalerWallet1/Quickjs/QuickDataTask.swift b/TalerWallet1/Quickjs/QuickDataTask.swift
index e4afe88..4334e88 100644
--- a/TalerWallet1/Quickjs/QuickDataTask.swift
+++ b/TalerWallet1/Quickjs/QuickDataTask.swift
@@ -134,17 +134,17 @@ class QuickDataTask: NSObject {
let responseInfoPtr = UnsafeMutablePointer<JSHttpResponseInfo>(&responseInfo)
responseCb(responseCbCls, responseInfoPtr)
}
- } else {
+ } else { // TODO: pass error to walletCore
var errmsg = "No http response from \(url)"
- logger.error("⁉️\(self.requestID, privacy: .public) \(method, privacy: .public) \(errmsg, privacy: .public)")
+ logger.error("⁉️ \(self.requestID, privacy: .public) \(method, privacy: .public) \(errmsg, privacy: .public)")
var errmsg_p0 = UnsafeMutablePointer<CChar>(mutating: errmsg.cString(using: .utf8))
var responseInfo = JSHttpResponseInfo(request_id: self.requestID,
- status: 0,
- errmsg: errmsg_p0,
- response_headers: nil,
- num_response_headers: 0,
- body: nil,
- body_len: 0)
+ status: 0,
+ errmsg: errmsg_p0,
+ response_headers: nil,
+ num_response_headers: 0,
+ body: nil,
+ body_len: 0)
let responseInfoPtr = UnsafeMutablePointer<JSHttpResponseInfo>(&responseInfo)
responseCb(responseCbCls, responseInfoPtr)
}
diff --git a/TalerWallet1/Views/Balances/BalanceRowView.swift b/TalerWallet1/Views/Balances/BalanceRowView.swift
index e39e48a..0861011 100644
--- a/TalerWallet1/Views/Balances/BalanceRowView.swift
+++ b/TalerWallet1/Views/Balances/BalanceRowView.swift
@@ -48,7 +48,7 @@ struct BalanceCell: View {
NavigationLink { balanceDest } label: {
balanceCell
.accessibilityElement(children: .combine)
- .accessibilityHint("Will go to main transactions list.")
+ .accessibilityHint(String(localized: "Will go to main transactions list."))
// .accessibilityLabel(balanceTitleStr + " " + amountStr) // TODO: CurrencyFormatter!
}
}
diff --git a/TalerWallet1/Views/Balances/BalancesSectionView.swift b/TalerWallet1/Views/Balances/BalancesSectionView.swift
index 1fab4db..7643b32 100644
--- a/TalerWallet1/Views/Balances/BalancesSectionView.swift
+++ b/TalerWallet1/Views/Balances/BalancesSectionView.swift
@@ -111,7 +111,7 @@ extension BalancesSectionView: View {
UIApplication.shared.open(URL(string:DEMOSHOP)!, options: [:])
}
.buttonStyle(TalerButtonStyle(type: .bordered, narrow: false, aligned: .center))
- .accessibilityHint("Will go to the demo shop website.")
+ .accessibilityHint(String(localized: "Will go to the demo shop website."))
.listRowSeparator(.hidden)
}
DepositWithdrawV(stack: stack.push(),
@@ -217,7 +217,7 @@ fileprivate struct BalancesPendingRowView: View {
needsKYC ? needsKYCStr :
shouldConfirm ? needsConfStr
: EMPTYSTRING)
- .accessibilityHint("Will go to Pending transactions.")
+ .accessibilityHint(String(localized: "Will go to Pending transactions."))
} // NavLinkLabel
} // body
} // BalancesPendingRowView
diff --git a/TalerWallet1/Views/Balances/PendingRowView.swift b/TalerWallet1/Views/Balances/PendingRowView.swift
index 8f8d1b7..f8411ed 100644
--- a/TalerWallet1/Views/Balances/PendingRowView.swift
+++ b/TalerWallet1/Views/Balances/PendingRowView.swift
@@ -82,7 +82,8 @@ fileprivate struct Previews: PreviewProvider {
struct StateContainer: View {
// @StateObject private var controller = Controller.shared
var body: some View {
- Text("Hello")
+ let hello = "Hello"
+ Text(hello)
// Preview_Content()
// .environmentObject(controller)
}
diff --git a/TalerWallet1/Views/Banking/DepositAmountV.swift b/TalerWallet1/Views/Banking/DepositAmountV.swift
index a03ee2b..0884295 100644
--- a/TalerWallet1/Views/Banking/DepositAmountV.swift
+++ b/TalerWallet1/Views/Banking/DepositAmountV.swift
@@ -134,7 +134,7 @@ struct DepositAmountV: View {
}
.buttonStyle(TalerButtonStyle(type: .prominent, disabled: disabled || depositStarted))
.disabled(disabled || depositStarted)
- .accessibilityHint(disabled ? "enabled when amount is non-zero, but not higher than your available amount" : EMPTYSTRING)
+ .accessibilityHint(disabled ? String(localized: "enabled when amount is non-zero, but not higher than your available amount") : EMPTYSTRING)
}.padding(.horizontal) } // ScrollVStack
.frame(maxWidth: .infinity, alignment: .leading)
// .scrollBounceBehavior(.basedOnSize) needs iOS 16.4
diff --git a/TalerWallet1/Views/Banking/DepositIbanV.swift b/TalerWallet1/Views/Banking/DepositIbanV.swift
index 6d588bf..15da601 100644
--- a/TalerWallet1/Views/Banking/DepositIbanV.swift
+++ b/TalerWallet1/Views/Banking/DepositIbanV.swift
@@ -114,7 +114,7 @@ struct DepositIbanV: View {
}
.buttonStyle(TalerButtonStyle(type: .prominent, disabled: disabled))
.disabled(disabled)
- .accessibilityHint(disabled ? "enabled when account holder and IBAN are set" : EMPTYSTRING)
+ .accessibilityHint(disabled ? String(localized: "enabled when account holder and IBAN are set") : EMPTYSTRING)
}.padding(.horizontal) } // ScrollVStack
// .scrollBounceBehavior(.basedOnSize) needs iOS 16.4
.navigationTitle(subjectTitle(amountToTransfer, currencyInfo))
diff --git a/TalerWallet1/Views/Banking/ManualWithdraw.swift b/TalerWallet1/Views/Banking/ManualWithdraw.swift
index c902802..ad95943 100644
--- a/TalerWallet1/Views/Banking/ManualWithdraw.swift
+++ b/TalerWallet1/Views/Banking/ManualWithdraw.swift
@@ -109,7 +109,8 @@ struct ManualWithdraw: View {
symLog.log("❗️ \(navTitle) onDisappear")
}
} else {
- LoadingView(scopeInfo: scopeInfo, message: "Contacting...")
+ let contacting = String(localized: "Contacting...")
+ LoadingView(scopeInfo: scopeInfo, message: contacting)
}
}
.task(id: amountToTransfer.value) { // re-run this whenever amountToTransfer changes
diff --git a/TalerWallet1/Views/Banking/QuiteSomeCoins.swift b/TalerWallet1/Views/Banking/QuiteSomeCoins.swift
index 4bcfb88..0a090fd 100644
--- a/TalerWallet1/Views/Banking/QuiteSomeCoins.swift
+++ b/TalerWallet1/Views/Banking/QuiteSomeCoins.swift
@@ -17,10 +17,10 @@ struct SomeCoins {
let fee: Amount?
func feeLabel(_ currencyInfo: CurrencyInfo?) -> String {
return if let fee {
- invalid ? "Amount too small!"
- : tooMany ? "Amount too big for a single withdrawal!"
- : fee.isZero ? "No withdrawal fee"
- : "- \(fee.string(currencyInfo)) fee"
+ invalid ? String(localized: "Amount too small!")
+ : tooMany ? String(localized: "Amount too big for a single withdrawal!")
+ : fee.isZero ? String(localized: "No withdrawal fee")
+ : String(localized: "- \(fee.string(currencyInfo)) fee")
} else {
EMPTYSTRING
}
diff --git a/TalerWallet1/Views/HelperViews/AgePicker.swift b/TalerWallet1/Views/HelperViews/AgePicker.swift
index 2881a3b..3103c53 100644
--- a/TalerWallet1/Views/HelperViews/AgePicker.swift
+++ b/TalerWallet1/Views/HelperViews/AgePicker.swift
@@ -38,7 +38,7 @@ struct AgePicker: View {
ForEach($ageMenuList, id: \.self) { item in
let index = item.wrappedValue
Text((index == 0) ? "unrestricted"
- : "\(index) years").tag(index)
+ : "\(index) years", comment: "Age Picker").tag(index)
}
}
.talerFont(.body)
diff --git a/TalerWallet1/Views/HelperViews/ListStyle.swift b/TalerWallet1/Views/HelperViews/ListStyle.swift
index c3f625a..6d5a0f1 100644
--- a/TalerWallet1/Views/HelperViews/ListStyle.swift
+++ b/TalerWallet1/Views/HelperViews/ListStyle.swift
@@ -66,7 +66,7 @@ struct AnyViewDemo: View {
var body: some View {
VStack {
- Picker("List Style", selection: $selectedStyle) {
+ Picker("List Style:", selection: $selectedStyle) {
ForEach(MyListStyle.allCases, id: \.self) {
Text($0.displayName.capitalized).tag($0)
}
diff --git a/TalerWallet1/Views/HelperViews/QRCodeDetailView.swift b/TalerWallet1/Views/HelperViews/QRCodeDetailView.swift
index 52cdbba..44796f2 100644
--- a/TalerWallet1/Views/HelperViews/QRCodeDetailView.swift
+++ b/TalerWallet1/Views/HelperViews/QRCodeDetailView.swift
@@ -25,13 +25,15 @@ struct QRCodeDetailView: View {
var body: some View {
if talerURI.count > 10 {
Section {
- let eitherMini = incoming ? String(localized: "Either (payer)", defaultValue: "Either",
+ let eitherMini = incoming ? String(localized: "Either (payer) Mini 1",
+ defaultValue: "Either",
comment: "Either (copy/share this link to the payer)")
- : String(localized: "Either (payee)", defaultValue: "Either",
+ : String(localized: "Either (payee) Mini 1",
+ defaultValue: "Either",
comment: "Either (copy/share this link to the payee)")
- let eitherLong = incoming ? String(localized: "Either provide this payment link (payer)",
+ let eitherLong = incoming ? String(localized: "Either (payer) Long 1",
defaultValue: "Either provide this payment link")
- : String(localized: "Either provide this payment link (payee)",
+ : String(localized: "Either (payee) Long 1",
defaultValue: "Either provide this payment link")
Text(minimalistic ? eitherMini : eitherLong)
.multilineTextAlignment(.leading)
@@ -43,10 +45,10 @@ struct QRCodeDetailView: View {
// .padding(.bottom)
.listRowSeparator(.hidden)
- let otherPartyMini = incoming ? String(localized: "or scan this(payer)", defaultValue: "or scan this")
- : String(localized: "or scan this(payee)", defaultValue: "or scan this")
- let otherPartyLong = incoming ? String(localized: "to the payer, or")
- : String(localized: "to the payee, or")
+ let otherPartyMini = incoming ? String(localized: "Either (payer) Mini 2", defaultValue: "or scan this")
+ : String(localized: "Either (payee) Mini 2", defaultValue: "or scan this")
+ let otherPartyLong = incoming ? String(localized: "Either (payer) Long 2", defaultValue: "to the payer, or")
+ : String(localized: "Either (payee) Long 2", defaultValue: "to the payee, or")
Text(minimalistic ? otherPartyMini : otherPartyLong)
.multilineTextAlignment(.leading)
.talerFont(.title3)
@@ -56,11 +58,15 @@ struct QRCodeDetailView: View {
.accessibilityLabel("QR Code")
.listRowSeparator(.hidden)
- let scanMini = incoming ? String(localized: "to pay \(amountStr).", comment: "e.g. '5,3 €'")
- : String(localized: "to receive \(amountStr).", comment: "e.g. '$ 7.41'")
- let scanLong = incoming ? String(localized: "let the payer scan this QR code to pay \(amountStr).",
+ let scanMini = incoming ? String(localized: "Either (payer) Mini 3",
+ defaultValue: "to pay \(amountStr).", comment: "e.g. '5,3 €'")
+ : String(localized: "Either (payee) Mini 3",
+ defaultValue: "to receive \(amountStr).", comment: "e.g. '$ 7.41'")
+ let scanLong = incoming ? String(localized: "Either (payer) Long 3",
+ defaultValue: "let the payer scan this QR code to pay \(amountStr).",
comment: "e.g. '5,3 €'")
- : String(localized: "let the payee scan this QR code to receive \(amountStr).",
+ : String(localized: "Either (payee) Long 3",
+ defaultValue: "let the payee scan this QR code to receive \(amountStr).",
comment: "e.g. '$ 7.41'")
Text(minimalistic ? scanMini : scanLong)
.multilineTextAlignment(.leading)
diff --git a/TalerWallet1/Views/Main/MainView.swift b/TalerWallet1/Views/Main/MainView.swift
index 9d7effe..3c3bced 100644
--- a/TalerWallet1/Views/Main/MainView.swift
+++ b/TalerWallet1/Views/Main/MainView.swift
@@ -41,6 +41,7 @@ struct MainView: View {
func sheetDismissed() -> Void {
logger.info("sheet dismiss")
+ ViewState.shared.popToRootView(nil)
}
var body: some View {
#if PRINT_CHANGES
@@ -82,11 +83,11 @@ struct MainView: View {
Sheet(sheetView: sheet)
}
.sheet(isPresented: $model.showError) {
- model.cleanError()
+ model.setError(nil)
} content: {
- if let error = model.error {
- ErrorSheet(data: error, devMode: developerMode) {
- model.cleanError()
+ if let error2 = model.error2 {
+ ErrorSheet(data: error2, devMode: developerMode) {
+ model.setError(nil)
}.interactiveDismissDisabled()
}
}
@@ -106,26 +107,25 @@ extension MainView {
struct Content: View {
let logger: Logger
let stack: CallStack
- @State private var shouldReloadBalances = 0
- @State private var balances: [Balance] = []
@Binding var talerFontIndex: Int
+
+#if DEBUG
+ @AppStorage("developerMode") var developerMode: Bool = true
+#else
+ @AppStorage("developerMode") var developerMode: Bool = false
+#endif
@AppStorage("minimalistic") var minimalistic: Bool = false
@EnvironmentObject private var controller: Controller
@EnvironmentObject private var model: WalletModel
@EnvironmentObject private var viewState: ViewState // popToRootView()
@EnvironmentObject private var viewState2: ViewState2 // popToRootView()
- let balancesTitle = String(localized: "TitleBalances", defaultValue: "Balances")
-// let exchangesTitle = String(localized: "TitleExchanges", defaultValue: "Banking")
- let settingsTitle = String(localized: "TitleSettings", defaultValue: "Settings")
+
+ @State private var shouldReloadBalances = 0
+ @State private var balances: [Balance] = []
@State private var selectedTab: Tab = .balances
@State private var showKycAlert: Bool = false
@State private var kycURI: URL?
-#if DEBUG
- @AppStorage("developerMode") var developerMode: Bool = true
-#else
- @AppStorage("developerMode") var developerMode: Bool = false
-#endif
private var openKycButton: some View {
Button("KYC") {
@@ -183,6 +183,9 @@ extension MainView {
#else
let delay: UInt = 0 // no delay for release builds
#endif
+ let balancesTitle = String(localized: "TitleBalances", defaultValue: "Balances")
+// let exchangesTitle = String(localized: "TitleExchanges", defaultValue: "Banking")
+ let settingsTitle = String(localized: "TitleSettings", defaultValue: "Settings")
Group {
// let labelStyle = minimalistic ? IconOnlyLabelStyle() : TitleAndIconLabelStyle() // labelStyle doesn't work
TabView(selection: tabSelection()) {
@@ -262,7 +265,7 @@ extension MainView {
}
.onNotification(.Error) { notification in
if let error = notification.userInfo?[NOTIFICATIONERROR] as? Error {
- model.showError(.error(error))
+ model.setError(error)
controller.playSound(0)
}
}
diff --git a/TalerWallet1/Views/Main/WalletEmptyView.swift b/TalerWallet1/Views/Main/WalletEmptyView.swift
index 46cb387..15ff639 100644
--- a/TalerWallet1/Views/Main/WalletEmptyView.swift
+++ b/TalerWallet1/Views/Main/WalletEmptyView.swift
@@ -53,7 +53,7 @@ struct WalletEmptyView: View {
// Link(title, destination: URL(string: DEMOBANK)!)
// .buttonStyle(TalerButtonStyle(type: .prominent, narrow: false, aligned: .center))
// .padding(.vertical)
-// .accessibilityHint("Will go to the demo bank website.")
+// .accessibilityHint(String(localized: "Will go to the demo bank website."))
}
}
.listStyle(myListStyle.style).anyView
diff --git a/TalerWallet1/Views/Peer2peer/P2PSubjectV.swift b/TalerWallet1/Views/Peer2peer/P2PSubjectV.swift
index bbb2587..1e1550e 100644
--- a/TalerWallet1/Views/Peer2peer/P2PSubjectV.swift
+++ b/TalerWallet1/Views/Peer2peer/P2PSubjectV.swift
@@ -100,7 +100,7 @@ struct P2PSubjectV: View {
Text(verbatim: "\(summary.count)/100") // maximum 100 characters
.frame(maxWidth: .infinity, alignment: .trailing)
.talerFont(.body)
- .accessibilityValue("\(summary.count) characters of 100")
+ .accessibilityValue(String(localized: "\(summary.count) characters of 100"))
// TODO: compute max Expiration day from peerPushCheck to disable 30 (and even 7)
SelectDays(selected: $expireDays, maxExpiration: THIRTYDAYS)
@@ -120,7 +120,7 @@ struct P2PSubjectV: View {
}
.buttonStyle(TalerButtonStyle(type: .prominent, disabled: disabled))
.disabled(disabled)
- .accessibilityHint(disabled ? "enabled when subject and expiration are set" : EMPTYSTRING)
+ .accessibilityHint(disabled ? String(localized: "enabled when subject and expiration are set") : EMPTYSTRING)
}.padding(.horizontal) } // ScrollVStack
// .scrollBounceBehavior(.basedOnSize) needs iOS 16.4
.navigationTitle(subjectTitle(amountToTransfer, currencyInfo))
diff --git a/TalerWallet1/Views/Settings/AboutView.swift b/TalerWallet1/Views/Settings/AboutView.swift
index dc0569e..2a4965a 100644
--- a/TalerWallet1/Views/Settings/AboutView.swift
+++ b/TalerWallet1/Views/Settings/AboutView.swift
@@ -40,7 +40,7 @@ struct AboutView: View {
.frame(maxWidth: .infinity, alignment: .center)
// .accessibilityLabel("Progress indicator")
.onTapGesture(count: 1) { rotationEnabled.toggle() }
- SettingsItem(name: "Visit the taler.net website", id1: "web",
+ SettingsItem(name: String(localized: "Visit the taler.net website"), id1: "web",
description: minimalistic ? nil : String(localized: "More info about GNU Taler in general...")) { }
.accessibilityAddTraits(.isLink)
.accessibilityRemoveTraits(.isStaticText)
@@ -48,7 +48,7 @@ struct AboutView: View {
UIApplication.shared.open(URL(string:TALER_NET)!, options: [:])
}
- SettingsItem(name: "App Version", id1: "app") {
+ SettingsItem(name: String(localized: "App Version"), id1: "app") {
Text(verbatim: "\(Bundle.main.releaseVersionNumberPretty)")
}
Group {
@@ -62,7 +62,7 @@ struct AboutView: View {
}
}
} else {
- SettingsItem(name: "Wallet-Core Version", id1: "wallet-coreV") {
+ SettingsItem(name: String(localized: "WalletCore Version"), id1: "wallet-coreV") {
Text(verbatim: "\(walletCore.versionInfo?.implementationSemver ?? "unknown")")
}
}
diff --git a/TalerWallet1/Views/Settings/SettingsView.swift b/TalerWallet1/Views/Settings/SettingsView.swift
index 4d913d5..3c456a2 100644
--- a/TalerWallet1/Views/Settings/SettingsView.swift
+++ b/TalerWallet1/Views/Settings/SettingsView.swift
@@ -125,7 +125,7 @@ struct SettingsView: View {
description: hideDescriptions ? nil : String(localized: "For Delete, Fail & Abort buttons"))
// SettingsFont(title: String(localized: "Font:"), value: talerFontIndex, action: redraw)
// .id("font")
- SettingsStyle(title: String(localized: "Liststyle:"), myListStyle: $myListStyle)
+ SettingsStyle(title: String(localized: "List Style:"), myListStyle: $myListStyle)
.id("liststyle")
let localConsStr = String(localized: "on LocalConsole")
let observability = String(localized: "Observe walletCore")
@@ -154,12 +154,12 @@ struct SettingsView: View {
}
#if DEBUG
if showDevelopItems {
- Text("https://bank.taler.grothoff.org/")
- Text("https://bank.regio-taler.fdold.eu/")
- Text("https://bank.head.taler.net/")
- Text("https://bank.test.taler.net/")
- Text("https://bank.demo.taler.net/")
- Text("https://bank.taler.ar/")
+ Text(verbatim: "https://bank.taler.grothoff.org/")
+ Text(verbatim: "https://bank.regio-taler.fdold.eu/")
+ Text(verbatim: "https://bank.head.taler.net/")
+ Text(verbatim: "https://bank.test.taler.net/")
+ Text(verbatim: "https://bank.demo.taler.net/")
+ Text(verbatim: "https://bank.taler.ar/")
}
#endif
if showDevelopItems { // show or hide the following items
diff --git a/TalerWallet1/Views/Sheets/Payment/PayTemplateV.swift b/TalerWallet1/Views/Sheets/Payment/PayTemplateV.swift
index e993dd0..6eaa555 100644
--- a/TalerWallet1/Views/Sheets/Payment/PayTemplateV.swift
+++ b/TalerWallet1/Views/Sheets/Payment/PayTemplateV.swift
@@ -101,6 +101,8 @@ struct PayTemplateV: View {
let amountVoiceOver = amount.string(currencyInfo)
announce(this: "\(amountVoiceOver), \(feeLabel)")
preparePayResult = ppCheck
+ } else {
+ symLog.log("preparePayForTemplateM failed")
}
}
diff --git a/TalerWallet1/Views/Sheets/Payment/PaymentView.swift b/TalerWallet1/Views/Sheets/Payment/PaymentView.swift
index 7cb4903..dd3581f 100644
--- a/TalerWallet1/Views/Sheets/Payment/PaymentView.swift
+++ b/TalerWallet1/Views/Sheets/Payment/PaymentView.swift
@@ -55,7 +55,7 @@ struct PaymentView: View {
merchant: terms.merchant.name)
// TODO: payment: popup with all possible exchanges, check fees
} else if let balanceDetails = preparePayResult.balanceDetails { // Insufficient
- Text("You don't have enough \(currency)")
+ Text("You don't have enough \(currency).")
.talerFont(.headline)
ThreeAmountsV(stack: stack.push(),
topTitle: topTitle,
@@ -88,7 +88,9 @@ struct PaymentView: View {
.buttonStyle(TalerButtonStyle(type: .prominent))
.padding(.horizontal)
} else {
- Button("Cancel", action: { dismissTop() })
+ Button("Cancel", action: {
+ dismissTop()
+ })
.buttonStyle(TalerButtonStyle(type: .bordered))
.padding(.horizontal)
}
diff --git a/TalerWallet1/Views/Sheets/QRSheet.swift b/TalerWallet1/Views/Sheets/QRSheet.swift
index 33aab47..d775deb 100644
--- a/TalerWallet1/Views/Sheets/QRSheet.swift
+++ b/TalerWallet1/Views/Sheets/QRSheet.swift
@@ -22,7 +22,7 @@ struct QRSheet: View {
if scheme?.lowercased() == "taler" {
URLSheet(stack: stack.push(), urlToOpen: scannedURL)
} else {
-// let _ = print(scannedURL) // TODO: logging
+// let _ = print(scannedURL) // TODO: error logging
ErrorView(errortext: scannedURL.absoluteString)
}
} else {
@@ -35,10 +35,10 @@ struct QRSheet: View {
symLog.log("Found code: \(result.string)")
scannedCode = result.string
case .failure(let error):
+ // TODO: errorAlert
ErrorView(errortext: error.localizedDescription)
}
}
- // TODO: errorAlert
}
}
}
diff --git a/TalerWallet1/Views/Sheets/Sheet.swift b/TalerWallet1/Views/Sheets/Sheet.swift
index a0f2da6..6aa796e 100644
--- a/TalerWallet1/Views/Sheets/Sheet.swift
+++ b/TalerWallet1/Views/Sheets/Sheet.swift
@@ -35,8 +35,9 @@ struct Sheet: View {
: "" // show nothing if 0
NavigationView {
Group {
- if let error = model.error {
- ErrorSheet(data: error, devMode: developerMode) {
+ if let error2 = model.error2 {
+ ErrorSheet(data: error2, devMode: developerMode) {
+ logger.log("ErrorSheet dismissTop")
dismissTop()
}
} else {
@@ -61,7 +62,7 @@ struct Sheet: View {
.accessibilityValue(idString)
}
.onDisappear {
- model.cleanError()
+ symLog.log("❗️❗️Sheet onDisappear")
}
}
}
diff --git a/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift b/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift
index dfa6a0e..d6f3563 100644
--- a/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift
+++ b/TalerWallet1/Views/Sheets/WithdrawBankIntegrated/WithdrawAcceptDone.swift
@@ -23,6 +23,7 @@ struct WithdrawAcceptDone: View {
return try await model.getTransactionByIdT(transactionId, viewHandles: viewHandles)
}
func dismissTopAnimated(_ stack: CallStack) {
+ symLog.log("ErrorSheet dismissTop")
dismissTop()
}
diff --git a/TalerWallet1/Views/Transactions/ManualDetailsV.swift b/TalerWallet1/Views/Transactions/ManualDetailsV.swift
index fe1d858..ea25e11 100644
--- a/TalerWallet1/Views/Transactions/ManualDetailsV.swift
+++ b/TalerWallet1/Views/Transactions/ManualDetailsV.swift
@@ -270,7 +270,7 @@ struct ManualDetailsV: View {
.multilineTextAlignment(.leading)
.padding(.top)
let step3 = Text(minimalistic ? "**Step 3:** Transfer \(amountStr)."
- : "**Step 3:** Finish the wire transfer of \(amountStr) in your banking app or website, then this withdrawal will proceed automatically.")
+ : "**Step 3:** Finish the wire transfer of \(amountStr) in your banking app or website, then this withdrawal will proceed automatically. Depending on your bank the transfer can take from minutes to two working days, please be patient.")
.multilineTextAlignment(.leading)
.padding(.top)
Group {
diff --git a/TalerWallet1/Views/Transactions/TransactionDetailV.swift b/TalerWallet1/Views/Transactions/TransactionDetailV.swift
index 0e4feb0..e374a12 100644
--- a/TalerWallet1/Views/Transactions/TransactionDetailV.swift
+++ b/TalerWallet1/Views/Transactions/TransactionDetailV.swift
@@ -25,10 +25,10 @@ struct TransactionDetailV: View {
if let fulfillmentUrl = info.fulfillmentUrl {
if let destination = URL(string: fulfillmentUrl) {
- let buttonTitle = info.fulfillmentMessage ?? "Open merchant website"
+ let buttonTitle = info.fulfillmentMessage ?? String(localized: "Open merchant website")
Link(buttonTitle, destination: destination)
.buttonStyle(TalerButtonStyle(type: .bordered))
- .accessibilityHint("Will go to the merchant website.")
+ .accessibilityHint(String(localized: "Will go to the merchant website."))
}
} else if let fulfillmentMessage = info.fulfillmentMessage {
Text(fulfillmentMessage)
diff --git a/TalerWallet1/Views/Transactions/TransactionRowView.swift b/TalerWallet1/Views/Transactions/TransactionRowView.swift
index dea1331..61e878d 100644
--- a/TalerWallet1/Views/Transactions/TransactionRowView.swift
+++ b/TalerWallet1/Views/Transactions/TransactionRowView.swift
@@ -90,7 +90,7 @@ struct TransactionRowView: View {
.talerFont(.headline)
// .fontWeight(.medium) iOS 16
.padding(.bottom, -2.0)
- .accessibilityLabel(doneOrPending ? topString : topString + ", canceled")
+ .accessibilityLabel(doneOrPending ? topString : topString + String(localized: ", canceled"))
let centerBottom = Text(dateString)
.foregroundColor(textColor)
.talerFont(.callout)
@@ -193,9 +193,9 @@ struct TransactionRowView: View {
} else { layout4 } // view for iOS 15
}
.accessibilityElement(children: .combine)
- .accessibilityValue(needsKYC ? ". Needs K Y C" :
- shouldConfirm ? ". Needs bank confirmation" : EMPTYSTRING)
- .accessibilityHint("Will go to detail view.")
+ .accessibilityValue(needsKYC ? String(localized: ". Needs K Y C") :
+ shouldConfirm ? String(localized: ". Needs bank confirmation") : EMPTYSTRING)
+ .accessibilityHint(String(localized: "Will go to detail view."))
}
}
// MARK: -
diff --git a/TalerWallet1/Views/Transactions/TransactionSummaryV.swift b/TalerWallet1/Views/Transactions/TransactionSummaryV.swift
index 4f089c4..12f6314 100644
--- a/TalerWallet1/Views/Transactions/TransactionSummaryV.swift
+++ b/TalerWallet1/Views/Transactions/TransactionSummaryV.swift
@@ -214,7 +214,7 @@ struct TransactionSummaryV: View {
}
Link("Open KYC website", destination: destination)
.buttonStyle(TalerButtonStyle(type: .prominent, badge: NEEDS_KYC))
- .accessibilityHint("Will go to KYC website to confirm this withdrawal.")
+ .accessibilityHint(String(localized: "Will go to KYC website to confirm this withdrawal."))
}
}
}
@@ -233,7 +233,7 @@ struct TransactionSummaryV: View {
}
Link("Confirm now", destination: destination)
.buttonStyle(TalerButtonStyle(type: .prominent, badge: CONFIRM_BANK))
- .accessibilityHint("Will go to bank website to confirm this withdrawal.")
+ .accessibilityHint(String(localized: "Will go to bank website to confirm this withdrawal."))
}
}
}
diff --git a/TalerWallet1/Views/Transactions/TransactionsListView.swift b/TalerWallet1/Views/Transactions/TransactionsListView.swift
index 3f2dbc9..a049e89 100644
--- a/TalerWallet1/Views/Transactions/TransactionsListView.swift
+++ b/TalerWallet1/Views/Transactions/TransactionsListView.swift
@@ -62,7 +62,7 @@ struct TransactionsListView: View {
}
} // ScrollView
.navigationTitle(navTitle)
- .accessibilityHint(Text("Transaction list"))
+ .accessibilityHint(String(localized: "Transaction list"))
.task {
symLog.log(".task ")
await reloadAllAction(stack.push())
diff --git a/TestFlight/WhatToTest.en-US.txt b/TestFlight/WhatToTest.en-US.txt
index c61ab9f..15e49fd 100644
--- a/TestFlight/WhatToTest.en-US.txt
+++ b/TestFlight/WhatToTest.en-US.txt
@@ -1,3 +1,15 @@
+Version 0.10.2 (wallet-core 0.10.7)
+
+- Improve German localization
+- Minor bugfixes
+
+
+Version 0.10.1 (wallet-core 0.10.7)
+
+• German localization
+- Improve observability and error handling
+
+
Version 0.10.0 (wallet-core 0.10.6)
• Use segmented control instead of drop-down picker for bank selection in manual withdrawal