[#1362] Release 1-2-1 preview

- The scan qr for some cameras returned several QR codes found, this needed to be handled

[#1362] Release 1-2-1 preview

- All texts localized
This commit is contained in:
Lukas Korba 2024-10-09 07:52:39 +02:00
parent a9aae12413
commit acdba147b4
18 changed files with 244 additions and 145 deletions

View File

@ -89,7 +89,7 @@ let package = Package(
.package(url: "https://github.com/pointfreeco/swift-case-paths", from: "1.5.4"),
.package(url: "https://github.com/pointfreeco/swift-url-routing", from: "0.6.2"),
.package(url: "https://github.com/zcash-hackworks/MnemonicSwift", from: "2.2.4"),
.package(url: "https://github.com/Electric-Coin-Company/zcash-swift-wallet-sdk", from: "2.2.4"),
.package(url: "https://github.com/Electric-Coin-Company/zcash-swift-wallet-sdk", exact: "2.2.3"),
.package(url: "https://github.com/firebase/firebase-ios-sdk", from: "10.27.0"),
.package(url: "https://github.com/flexa/flexa-ios.git", from: "1.0.3"),
.package(url: "https://github.com/pacu/zcash-swift-payment-uri", from: "0.1.0-beta.9")

View File

@ -84,7 +84,7 @@ public struct AddressDetails {
case .copyToPastboard:
pasteboard.setString(state.address)
state.toast = .top("Copied to the clipboard!")
state.toast = .top(L10n.General.copiedToTheClipboard)
return .none
case .generateQRCode:

View File

@ -74,7 +74,7 @@ public struct AddressDetailsView: View {
Spacer()
ZashiButton(
"Share QR Code",
L10n.AddressDetails.shareQR,
prefixView:
Asset.Assets.Icons.share.image
.zImage(size: 20, style: Design.Btns.Primary.fg)
@ -85,7 +85,7 @@ public struct AddressDetailsView: View {
.disabled(store.addressToShare != nil)
ZashiButton(
"Copy Address",
L10n.AddressDetails.copyAddress,
type: .ghost,
prefixView:
Asset.Assets.copy.image
@ -129,9 +129,9 @@ extension AddressDetailsView {
UIShareDialogView(activityItems: [
ShareableImage(
image: UIImage(cgImage: cgImg),
title: "My Zashi ZEC Address",
reason: "Hi, scan this QR code to send me a ZEC payment!"
), "Hi, scan this QR code to send me a ZEC payment!"
title: L10n.AddressDetails.shareTitle,
reason: L10n.AddressDetails.shareDesc
), L10n.AddressDetails.shareDesc
]) {
store.send(.shareFinished)
}

View File

@ -28,13 +28,13 @@ public struct DeeplinkWarningView: View {
.padding(.bottom, 24)
.padding(.leading, 12)
Text("Looks like you used a third-party app to scan for payment.")
Text(L10n.DeeplinkWarning.title)
.zFont(.semiBold, size: 24, style: Design.Text.primary)
.minimumScaleFactor(0.5)
.multilineTextAlignment(.center)
.lineLimit(2)
Text("For better safety and security, rescan the QR code with Zashi.")
Text(L10n.DeeplinkWarning.desc)
.zFont(size: 14, style: Design.Text.primary)
.multilineTextAlignment(.center)
.screenHorizontalPadding()
@ -42,7 +42,7 @@ public struct DeeplinkWarningView: View {
Spacer()
ZashiButton("Rescan in Zashi") {
ZashiButton(L10n.DeeplinkWarning.cta) {
store.send(.gotItTapped)
}
.padding(.bottom, 24)
@ -51,7 +51,7 @@ public struct DeeplinkWarningView: View {
.navigationBarTitleDisplayMode(.inline)
.screenHorizontalPadding()
.applyErredScreenBackground()
.screenTitle("HELLO!")
.screenTitle(L10n.DeeplinkWarning.screenTitle.uppercased())
}
}

View File

@ -68,7 +68,7 @@ public struct Receive {
case .copyToPastboard(let text):
pasteboard.setString(text)
state.toast = .top("Copied to the clipboard!")
state.toast = .top(L10n.General.copiedToTheClipboard)
return .none
case .requestTapped:

View File

@ -38,7 +38,7 @@ public struct ReceiveView: View {
WithPerceptionTracking {
VStack(alignment: .leading, spacing: 0) {
HStack {
Text("Receive Zcash")
Text(L10n.Receive.title)
.zFont(.semiBold, size: 28, style: Design.Text.primary)
.lineLimit(1)
.padding(.top, 24)
@ -47,7 +47,7 @@ public struct ReceiveView: View {
Spacer()
}
Text("Prioritize using your shielded address for maximum privacy.")
Text(L10n.Receive.warning)
.zFont(size: 16, style: Design.Text.secondary)
}
.padding(.horizontal, 20)
@ -55,23 +55,9 @@ public struct ReceiveView: View {
currentFocus = .uaAddress
}
// HStack(alignment: .top, spacing: 0) {
// Asset.Assets.infoOutline.image
// .zImage(size: 20, style: Design.Text.tertiary)
// .padding(.trailing, 12)
//
// Text("Prioritize using shielded address for maximum privacy.")
// .zFont(size: 12, style: Design.Text.tertiary)
// .padding(.top, 3)
//
// Spacer(minLength: 0)
// }
// .padding(.horizontal, 20)
// .padding(.top, 24)
addressBlock(
prefixIcon: Asset.Assets.Brandmarks.brandmarkMax.image,
title: "Zcash Shielded Address",
title: L10n.Receive.shieldedAddress,
address: store.unifiedAddress,
postfixIcon: Asset.Assets.Icons.shieldTickFilled.image,
iconFg: Design.Utility.Purple._800,
@ -94,7 +80,7 @@ public struct ReceiveView: View {
addressBlock(
prefixIcon: Asset.Assets.Brandmarks.brandmarkLow.image,
title: "Zcash Transparent Address",
title: L10n.Receive.transparentAddress,
address: store.transparentAddress,
iconFg: Design.Text.primary,
iconBg: Design.Surfaces.bgTertiary,
@ -116,7 +102,7 @@ public struct ReceiveView: View {
if networkType == .testnet {
addressBlock(
prefixIcon: Asset.Assets.Brandmarks.brandmarkLow.image,
title: "Zcash Sapling Address",
title: L10n.Receive.saplingAddress,
address: store.saplingAddress,
iconFg: Design.Text.primary,
iconBg: Design.Surfaces.bgTertiary,
@ -170,8 +156,6 @@ public struct ReceiveView: View {
Text(address.zip316)
.zFont(size: 14, style: Design.Text.tertiary)
//.truncationMode(.middle)
//.frame(maxWidth: 110)
.padding(.bottom, expanded ? 10 : 0)
}
.lineLimit(1)
@ -188,15 +172,15 @@ public struct ReceiveView: View {
if expanded {
HStack(spacing: 8) {
button("Copy", fill: iconBg.color, icon: Asset.Assets.copy.image) {
button(L10n.Receive.copy, fill: iconBg.color, icon: Asset.Assets.copy.image) {
copyAction()
}
button("QR Code", fill: iconBg.color, icon: Asset.Assets.Icons.qr.image) {
button(L10n.Receive.qrCode, fill: iconBg.color, icon: Asset.Assets.Icons.qr.image) {
qrAction()
}
button("Request", fill: iconBg.color, icon: Asset.Assets.Icons.coinsHand.image) {
button(L10n.Receive.request, fill: iconBg.color, icon: Asset.Assets.Icons.coinsHand.image) {
requestAction()
}
}

View File

@ -18,8 +18,11 @@ public struct RequestZecSummaryView: View {
@Perception.Bindable var store: StoreOf<RequestZec>
public init(store: StoreOf<RequestZec>) {
let tokenName: String
public init(store: StoreOf<RequestZec>, tokenName: String) {
self.store = store
self.tokenName = tokenName
}
public var body: some View {
@ -30,7 +33,7 @@ public struct RequestZecSummaryView: View {
Group {
Text(store.requestedZec.decimalString())
+ Text(" ZEC")
+ Text(" \(tokenName)")
.foregroundColor(Design.Text.quaternary.color)
}
.zFont(.semiBold, size: 56, style: Design.Text.primary)
@ -64,7 +67,7 @@ public struct RequestZecSummaryView: View {
Spacer()
ZashiButton(
"Share QR Code",
L10n.RequestZec.Summary.shareQR,
prefixView:
Asset.Assets.Icons.share.image
.zImage(size: 20, style: Design.Btns.Primary.fg)
@ -75,7 +78,7 @@ public struct RequestZecSummaryView: View {
.disabled(store.encryptedOutputToBeShared != nil)
ZashiButton(
"Close",
L10n.General.close,
type: .ghost
) {
store.send(.cancelRequestTapped)
@ -89,7 +92,7 @@ public struct RequestZecSummaryView: View {
.onAppear { store.send(.onAppear) }
.onDisappear { store.send(.onDisappear) }
}
.screenTitle("Request")
.screenTitle(L10n.General.request)
.screenHorizontalPadding()
.applyScreenBackground()
.zashiBack()
@ -117,9 +120,9 @@ extension RequestZecSummaryView {
UIShareDialogView(activityItems: [
ShareableImage(
image: UIImage(cgImage: cgImg),
title: "Request ZEC",
reason: "Hi, I have generated a ZEC payment request for you using the Zashi app!"
), "Hi, I have generated a ZEC payment request for you using the Zashi app! (download link: https://apps.apple.com/app/zashi-zcash-wallet/id1672392439)"
title: L10n.RequestZec.Summary.shareTitle,
reason: L10n.RequestZec.Summary.shareDesc
), "\(L10n.RequestZec.Summary.shareDesc) \(L10n.RequestZec.Summary.shareMsg)"
]) {
store.send(.shareFinished)
}
@ -134,6 +137,6 @@ extension RequestZecSummaryView {
#Preview {
NavigationView {
RequestZecView(store: RequestZec.placeholder)
RequestZecView(store: RequestZec.placeholder, tokenName: "ZEC")
}
}

View File

@ -19,9 +19,12 @@ public struct RequestZecView: View {
@State private var keyboardVisible: Bool = false
@FocusState private var isMemoFocused
let tokenName: String
public init(store: StoreOf<RequestZec>) {
public init(store: StoreOf<RequestZec>, tokenName: String) {
self.store = store
self.tokenName = tokenName
}
public var body: some View {
@ -37,13 +40,13 @@ public struct RequestZecView: View {
PrivacyBadge(store.maxPrivacy ? .max : .low)
.padding(.top, 26)
Text("Payment Request")
Text(L10n.RequestZec.title)
.zFont(.medium, size: 18, style: Design.Text.tertiary)
.padding(.top, 12)
Group {
Text(store.requestedZec.decimalString())
+ Text(" ZEC")
+ Text(" \(tokenName)")
.foregroundColor(Design.Text.quaternary.color)
}
.zFont(.semiBold, size: 56, style: Design.Text.primary)
@ -55,7 +58,7 @@ public struct RequestZecView: View {
MessageEditorView(
store: store.memoStore(),
title: "",
placeholder: "Whats this for?"
placeholder: L10n.RequestZec.whatFor
)
.frame(minHeight: 155)
.frame(maxHeight: 300)
@ -68,13 +71,13 @@ public struct RequestZecView: View {
}
.padding(.vertical, 1)
ZashiButton("Request") {
ZashiButton(L10n.General.request) {
store.send(.requestTapped)
}
.disabled(!store.memoState.isValid)
.padding(.bottom, keyboardVisible ? 48 : 24)
}
.screenTitle("Request")
.screenTitle(L10n.General.request)
.zashiBack()
.screenHorizontalPadding()
.applyScreenBackground()
@ -127,7 +130,7 @@ public struct RequestZecView: View {
#Preview {
NavigationView {
RequestZecView(store: RequestZec.placeholder)
RequestZecView(store: RequestZec.placeholder, tokenName: "ZEC")
}
}

View File

@ -33,9 +33,10 @@ public struct Scan {
public var cancelId = UUID()
public var info = ""
public var isCameraEnabled = true
public var isTorchAvailable = false
public var isTorchOn = false
public var isCameraEnabled = true
public var isRPFound = false
public init(
info: String = "",
@ -77,6 +78,7 @@ public struct Scan {
case .onAppear:
// reset the values
state.isTorchOn = false
state.isRPFound = false
// check the torch availability
state.isTorchAvailable = captureDevice.isTorchAvailable()
if !captureDevice.isAuthorized() {
@ -102,6 +104,10 @@ public struct Scan {
return .none
case .libraryImage(let image):
guard !state.isRPFound else {
return .none
}
guard let codes = qrImageDetector.check(image) else {
return .send(.scanFailed(.noQRCodeFound))
}
@ -117,7 +123,8 @@ public struct Scan {
if uriParser.isValidURI(code, zcashSDKEnvironment.network.networkType) {
return .send(.found(code.redacted))
} else if let data = uriParser.checkRP(code) {
return .send(.foundRP(data))
state.isRPFound = true
return .send(.foundRP(data))
} else {
return .send(.scanFailed(.noQRCodeFound))
}
@ -141,9 +148,13 @@ public struct Scan {
)
case .scan(let code):
guard !state.isRPFound else {
return .none
}
if uriParser.isValidURI(code.data, zcashSDKEnvironment.network.networkType) {
return .send(.found(code))
} else if let data = uriParser.checkRP(code.data) {
state.isRPFound = true
return .send(.foundRP(data))
} else {
return .send(.scanFailed(.invalidQRCode))

View File

@ -40,7 +40,7 @@ public struct RequestPaymentConfirmationView: View {
HStack {
VStack(alignment: .leading, spacing: 6) {
Text("Requested By")
Text(L10n.Send.RequestPayment.requestedBy)
.zFont(.medium, size: 14, style: Design.Text.tertiary)
if let alias = store.alias {
@ -62,7 +62,7 @@ public struct RequestPaymentConfirmationView: View {
if !store.isTransparentAddress {
if store.isAddressExpanded {
ZashiButton(
"Hide",
L10n.General.hide,
type: .tertiary,
infinityWidth: false,
prefixView:
@ -75,7 +75,7 @@ public struct RequestPaymentConfirmationView: View {
.padding(.trailing, 12)
} else {
ZashiButton(
"Show",
L10n.General.show,
type: .tertiary,
infinityWidth: false,
prefixView:
@ -90,7 +90,7 @@ public struct RequestPaymentConfirmationView: View {
if store.alias == nil {
ZashiButton(
"Save",
L10n.General.save,
type: .tertiary,
infinityWidth: false,
prefixView:
@ -109,7 +109,7 @@ public struct RequestPaymentConfirmationView: View {
if !store.message.isEmpty {
VStack(alignment: .leading) {
Text("For:")
Text(L10n.Send.RequestPayment.for)
.zFont(.medium, size: 14, style: Design.Text.tertiary)
HStack {
@ -148,7 +148,7 @@ public struct RequestPaymentConfirmationView: View {
.padding(.bottom, 20)
HStack {
Text("Total")
Text(L10n.Send.RequestPayment.total)
.zFont(.medium, size: 14, style: Design.Text.tertiary)
Spacer()
@ -204,7 +204,7 @@ public struct RequestPaymentConfirmationView: View {
}
}
.onAppear { store.send(.onAppear) }
.screenTitle("PAYMENT REQUEST")
.screenTitle(L10n.Send.RequestPayment.title.uppercased())
}
.navigationBarBackButtonHidden()
.padding(.vertical, 1)

View File

@ -212,7 +212,7 @@ public struct SendFlow {
case resetForm
case reviewPressed
case scan(Scan.Action)
case sendFailed(ZcashError)
case sendFailed(ZcashError, Confirmation)
case syncAmounts(Bool)
case updateDestination(SendFlow.State.Destination?)
case walletBalances(WalletBalances.Action)
@ -307,7 +307,7 @@ public struct SendFlow {
case .value(let rate), .refreshEnable(let rate):
if let rate {
state.currencyConversion = CurrencyConversion(.usd, ratio: rate.rate.doubleValue, timestamp: rate.date.timeIntervalSince1970)
return .send(.syncAmounts(false))
return .send(.syncAmounts(true))
}
case .stale:
state.currencyConversion = nil
@ -337,13 +337,17 @@ public struct SendFlow {
await send(.proposal(proposal))
await send(.confirmationRequired(confirmationType))
} catch {
await send(.sendFailed(error.toZcashError()))
await send(.sendFailed(error.toZcashError(), confirmationType))
}
}
case .sendFailed(let error):
state.alert = AlertState.sendFailure(error)
return .none
case let .sendFailed(error, confirmationType):
if confirmationType == .requestPayment {
return .send(.updateDestination(nil))
} else {
state.alert = AlertState.sendFailure(error)
return .none
}
case .confirmationRequired:
return .none

View File

@ -225,7 +225,7 @@ public struct SendFlowView: View {
.zImage(size: 20, style: Design.Text.lightSupport)
.padding(.trailing, 12)
Text("Add contact by tapping on Address Book icon.")
Text(L10n.Send.addressNotInBook)
.zFont(.medium, size: 14, style: Design.Text.light)
.padding(.top, 2)
.lineLimit(1)
@ -241,37 +241,6 @@ public struct SendFlowView: View {
}
.frame(width: geometry.size.width - 48)
.offset(x: 24, y: geometry[$0].minY + geometry[$0].height - 16)
// VStack(spacing: 0) {
// Asset.Assets.Icons.user.image
// .zImage(size: 20, style: Design.Text.primary)
//
// Text(L10n.Send.addressNotInBook)
// .zFont(.semiBold, size: 18, style: Design.Text.primary)
// .padding(.top, 8)
//
// ZashiButton(
// L10n.AddressBook.addNewContact,
// type: .tertiary,
// infinityWidth: false
// ) {
// store.send(.addNewContactTapped(store.address))
// }
// .padding(.top, 16)
// }
// .padding(32)
// .frame(width: geometry.size.width - 48)
// .background {
// RoundedRectangle(cornerRadius: 10)
// .fill(Design.Surfaces.bgPrimary.color)
// .background {
// RoundedRectangle(cornerRadius: 10)
// .stroke(Design.Surfaces.strokePrimary.color)
// }
// }
// .offset(x: 24, y: geometry[$0].minY + geometry[$0].height - 18)
}
}
}

View File

@ -145,31 +145,46 @@ public struct TabsView: View {
.navigationLinkEmpty(
isActive: store.bindingForStackMaxPrivacy(.zecKeyboard),
destination: {
ZecKeyboardView(store: store.zecKeyboardStore())
.navigationLinkEmpty(
isActive: store.bindingForStackMaxPrivacy(.requestZec),
destination: {
RequestZecView(store: store.requestZecStore())
.navigationLinkEmpty(
isActive: store.bindingForStackMaxPrivacy(.requestZecSummary),
destination: {
RequestZecSummaryView(store: store.requestZecStore())
}
ZecKeyboardView(
store: store.zecKeyboardStore(),
tokenName: tokenName
)
.navigationLinkEmpty(
isActive: store.bindingForStackMaxPrivacy(.requestZec),
destination: {
RequestZecView(
store: store.requestZecStore(),
tokenName: tokenName
)
.navigationLinkEmpty(
isActive: store.bindingForStackMaxPrivacy(.requestZecSummary),
destination: {
RequestZecSummaryView(
store: store.requestZecStore(),
tokenName: tokenName
)
}
)
}
)
}
)
}
)
.navigationLinkEmpty(
isActive: store.bindingForStackLowPrivacy(.zecKeyboard),
destination: {
ZecKeyboardView(store: store.zecKeyboardStore())
.navigationLinkEmpty(
isActive: store.bindingForStackLowPrivacy(.requestZecSummary),
destination: {
RequestZecSummaryView(store: store.requestZecStore())
}
)
ZecKeyboardView(
store: store.zecKeyboardStore(),
tokenName: tokenName
)
.navigationLinkEmpty(
isActive: store.bindingForStackLowPrivacy(.requestZecSummary),
destination: {
RequestZecSummaryView(
store: store.requestZecStore(),
tokenName: tokenName
)
}
)
}
)
.navigationLinkEmpty(

View File

@ -16,8 +16,11 @@ import Utils
public struct ZecKeyboardView: View {
@Perception.Bindable var store: StoreOf<ZecKeyboard>
public init(store: StoreOf<ZecKeyboard>) {
let tokenName: String
public init(store: StoreOf<ZecKeyboard>, tokenName: String) {
self.store = store
self.tokenName = tokenName
}
public var body: some View {
@ -30,7 +33,7 @@ public struct ZecKeyboardView: View {
.zImage(size: 20, style: Design.Utility.WarningYellow._500)
.padding(.trailing, 12)
Text("This transaction amount is invalid.")
Text(L10n.ZecKeyboard.invalid)
.zFont(.medium, size: 14, style: Design.Utility.WarningYellow._700)
.padding(.top, 3)
}
@ -42,7 +45,7 @@ public struct ZecKeyboardView: View {
HStack(spacing: 0) {
if store.isInputInZec {
Text(store.humanReadableMainInput)
+ Text(" ZEC")
+ Text(" \(tokenName)")
.foregroundColor(Design.Text.quaternary.color)
} else {
if store.isCurrencySymbolPrefix {
@ -82,7 +85,7 @@ public struct ZecKeyboardView: View {
}
} else {
Text(store.humanReadableConvertedInput)
+ Text(" ZEC")
+ Text(" \(tokenName)")
.foregroundColor(Design.Text.quaternary.color)
}
}
@ -150,7 +153,7 @@ public struct ZecKeyboardView: View {
.padding(.bottom, 24)
}
ZashiButton("Next") {
ZashiButton(L10n.General.next) {
store.send(.nextTapped)
}
.disabled(store.isNextButtonDisabled)
@ -161,13 +164,13 @@ public struct ZecKeyboardView: View {
}
.applyScreenBackground()
.zashiBack()
.screenTitle("Request")
.screenTitle(L10n.General.request)
}
}
#Preview {
NavigationView {
ZecKeyboardView(store: ZecKeyboard.placeholder)
ZecKeyboardView(store: ZecKeyboard.placeholder, tokenName: "ZEC")
}
}

View File

@ -71,6 +71,16 @@ public enum L10n {
public static let title = L10n.tr("Localizable", "addressBook.newContact.title", fallback: "Add New Address")
}
}
public enum AddressDetails {
/// Copy Address
public static let copyAddress = L10n.tr("Localizable", "addressDetails.copyAddress", fallback: "Copy Address")
/// Hi, scan this QR code to send me a ZEC payment!
public static let shareDesc = L10n.tr("Localizable", "addressDetails.shareDesc", fallback: "Hi, scan this QR code to send me a ZEC payment!")
/// Share QR Code
public static let shareQR = L10n.tr("Localizable", "addressDetails.shareQR", fallback: "Share QR Code")
/// My Zashi ZEC Address
public static let shareTitle = L10n.tr("Localizable", "addressDetails.shareTitle", fallback: "My Zashi ZEC Address")
}
public enum Balance {
/// Available Balance:
public static let availableTitle = L10n.tr("Localizable", "balance.availableTitle", fallback: "Available Balance:")
@ -149,6 +159,16 @@ public enum L10n {
/// Currency Conversion
public static let title = L10n.tr("Localizable", "currencyConversion.title", fallback: "Currency Conversion")
}
public enum DeeplinkWarning {
/// Rescan in Zashi
public static let cta = L10n.tr("Localizable", "deeplinkWarning.cta", fallback: "Rescan in Zashi")
/// For better safety and security, rescan the QR code with Zashi.
public static let desc = L10n.tr("Localizable", "deeplinkWarning.desc", fallback: "For better safety and security, rescan the QR code with Zashi.")
/// HELLO!
public static let screenTitle = L10n.tr("Localizable", "deeplinkWarning.screenTitle", fallback: "HELLO!")
/// Looks like you used a third-party app to scan for payment.
public static let title = L10n.tr("Localizable", "deeplinkWarning.title", fallback: "Looks like you used a third-party app to scan for payment.")
}
public enum DeleteWallet {
/// Delete
public static let actionButtonTitle = L10n.tr("Localizable", "deleteWallet.actionButtonTitle", fallback: "Delete")
@ -182,6 +202,8 @@ public enum L10n {
public static let close = L10n.tr("Localizable", "general.close", fallback: "Close")
/// Confirm
public static let confirm = L10n.tr("Localizable", "general.confirm", fallback: "Confirm")
/// Copied to the clipboard!
public static let copiedToTheClipboard = L10n.tr("Localizable", "general.copiedToTheClipboard", fallback: "Copied to the clipboard!")
/// Delete
public static let delete = L10n.tr("Localizable", "general.delete", fallback: "Delete")
/// Done
@ -190,6 +212,8 @@ public enum L10n {
public static func fee(_ p1: Any) -> String {
return L10n.tr("Localizable", "general.fee", String(describing: p1), fallback: "Typical Fee < %@")
}
/// Hide
public static let hide = L10n.tr("Localizable", "general.hide", fallback: "Hide")
///
public static let hideBalancesLeast = L10n.tr("Localizable", "general.hideBalancesLeast", fallback: "")
/// -----
@ -206,10 +230,14 @@ public enum L10n {
public static let no = L10n.tr("Localizable", "general.no", fallback: "No")
/// Ok
public static let ok = L10n.tr("Localizable", "general.ok", fallback: "Ok")
/// Request
public static let request = L10n.tr("Localizable", "general.request", fallback: "Request")
/// Save
public static let save = L10n.tr("Localizable", "general.save", fallback: "Save")
/// Send
public static let send = L10n.tr("Localizable", "general.send", fallback: "Send")
/// Show
public static let show = L10n.tr("Localizable", "general.show", fallback: "Show")
/// Success
public static let success = L10n.tr("Localizable", "general.success", fallback: "Success")
/// Tap to copy
@ -340,14 +368,26 @@ public enum L10n {
public enum Receive {
/// Copy
public static let copy = L10n.tr("Localizable", "receive.copy", fallback: "Copy")
/// QR Code
public static let qrCode = L10n.tr("Localizable", "receive.qrCode", fallback: "QR Code")
/// Request
public static let request = L10n.tr("Localizable", "receive.request", fallback: "Request")
/// Sapling Address
public static let sa = L10n.tr("Localizable", "receive.sa", fallback: "Sapling Address")
/// Share
public static let share = L10n.tr("Localizable", "receive.share", fallback: "Share")
/// Zcash Sapling Address
public static let saplingAddress = L10n.tr("Localizable", "receive.saplingAddress", fallback: "Zcash Sapling Address")
/// Zcash Shielded Address
public static let shieldedAddress = L10n.tr("Localizable", "receive.shieldedAddress", fallback: "Zcash Shielded Address")
/// Transparent Address
public static let ta = L10n.tr("Localizable", "receive.ta", fallback: "Transparent Address")
/// Receive Zcash
public static let title = L10n.tr("Localizable", "receive.title", fallback: "Receive Zcash")
/// Zcash Transparent Address
public static let transparentAddress = L10n.tr("Localizable", "receive.transparentAddress", fallback: "Zcash Transparent Address")
/// Unified Address
public static let ua = L10n.tr("Localizable", "receive.ua", fallback: "Unified Address")
/// Prioritize using your shielded address for maximum privacy.
public static let warning = L10n.tr("Localizable", "receive.warning", fallback: "Prioritize using your shielded address for maximum privacy.")
public enum Error {
/// could not extract sapling receiver from UA
public static let cantExtractSaplingAddress = L10n.tr("Localizable", "receive.error.cantExtractSaplingAddress", fallback: "could not extract sapling receiver from UA")
@ -385,6 +425,22 @@ public enum L10n {
public static let wroteItDown = L10n.tr("Localizable", "recoveryPhraseDisplay.button.wroteItDown", fallback: "I've saved it")
}
}
public enum RequestZec {
/// Payment Request
public static let title = L10n.tr("Localizable", "requestZec.title", fallback: "Payment Request")
/// Whats this for?
public static let whatFor = L10n.tr("Localizable", "requestZec.whatFor", fallback: "Whats this for?")
public enum Summary {
/// Hi, I have generated a ZEC payment request for you using the Zashi app!
public static let shareDesc = L10n.tr("Localizable", "requestZec.summary.shareDesc", fallback: "Hi, I have generated a ZEC payment request for you using the Zashi app!")
/// (download link: https://apps.apple.com/app/zashi-zcash-wallet/id1672392439)
public static let shareMsg = L10n.tr("Localizable", "requestZec.summary.shareMsg", fallback: "(download link: https://apps.apple.com/app/zashi-zcash-wallet/id1672392439)")
/// Share QR Code
public static let shareQR = L10n.tr("Localizable", "requestZec.summary.shareQR", fallback: "Share QR Code")
/// Request ZEC
public static let shareTitle = L10n.tr("Localizable", "requestZec.summary.shareTitle", fallback: "Request ZEC")
}
}
public enum RestoreInfo {
/// Got it!
public static let gotIt = L10n.tr("Localizable", "restoreInfo.gotIt", fallback: "Got it!")
@ -575,8 +631,8 @@ public enum L10n {
public static let warningD = L10n.tr("Localizable", "securityWarning.warningD", fallback: ": Crash reports might reveal the timing of the crash and what events occurred, but do not reveal spending or viewing keys.")
}
public enum Send {
/// Address not in Address Book
public static let addressNotInBook = L10n.tr("Localizable", "send.addressNotInBook", fallback: "Address not in Address Book")
/// Add contact by tapping on Address Book icon.
public static let addressNotInBook = L10n.tr("Localizable", "send.addressNotInBook", fallback: "Add contact by tapping on Address Book icon.")
/// Zcash Address
public static let addressPlaceholder = L10n.tr("Localizable", "send.addressPlaceholder", fallback: "Zcash Address")
/// Amount
@ -625,6 +681,16 @@ public enum L10n {
/// Transparent transactions cant have memos
public static let memo = L10n.tr("Localizable", "send.info.memo", fallback: "Transparent transactions cant have memos")
}
public enum RequestPayment {
/// For:
public static let `for` = L10n.tr("Localizable", "send.requestPayment.for", fallback: "For:")
/// Requested By
public static let requestedBy = L10n.tr("Localizable", "send.requestPayment.requestedBy", fallback: "Requested By")
/// Payment Request
public static let title = L10n.tr("Localizable", "send.requestPayment.title", fallback: "Payment Request")
/// Total
public static let total = L10n.tr("Localizable", "send.requestPayment.total", fallback: "Total")
}
}
public enum ServerSetup {
/// Active
@ -848,6 +914,10 @@ public enum L10n {
return L10n.tr("Localizable", "whatsNew.version", String(describing: p1), fallback: "Zashi Version %@")
}
}
public enum ZecKeyboard {
/// This transaction amount is invalid.
public static let invalid = L10n.tr("Localizable", "zecKeyboard.invalid", fallback: "This transaction amount is invalid.")
}
}
// swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length
// swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces

View File

@ -66,16 +66,36 @@
"home.migratingDatabases" = "Upgrading databases…";
// MARK: - Address Details
"addressDetails.shareTitle" = "My Zashi ZEC Address";
"addressDetails.shareDesc" = "Hi, scan this QR code to send me a ZEC payment!";
"addressDetails.shareQR" = "Share QR Code";
"addressDetails.copyAddress" = "Copy Address";
// MARK: - Request ZEC
"requestZec.title" = "Payment Request";
"requestZec.whatFor" = "Whats this for?";
"requestZec.summary.shareQR" = "Share QR Code";
"requestZec.summary.shareTitle" = "Request ZEC";
"requestZec.summary.shareDesc" = "Hi, I have generated a ZEC payment request for you using the Zashi app!";
"requestZec.summary.shareMsg" = "(download link: https://apps.apple.com/app/zashi-zcash-wallet/id1672392439)";
// MARK: - Receive
"receive.ua" = "Unified Address";
"receive.sa" = "Sapling Address";
"receive.ta" = "Transparent Address";
"receive.copy" = "Copy";
"receive.share" = "Share";
"receive.error.cantExtractUnifiedAddress" = "could not extract UA";
"receive.error.cantExtractTransparentAddress" = "could not extract transparent receiver from UA";
"receive.error.cantExtractSaplingAddress" = "could not extract sapling receiver from UA";
"receive.title" = "Receive Zcash";
"receive.warning" = "Prioritize using your shielded address for maximum privacy.";
"receive.shieldedAddress" = "Zcash Shielded Address";
"receive.transparentAddress" = "Zcash Transparent Address";
"receive.saplingAddress" = "Zcash Sapling Address";
"receive.copy" = "Copy";
"receive.qrCode" = "QR Code";
"receive.request" = "Request";
// MARK: - Address Details
// MARK: - Server Setup
"serverSetup.title" = "Server";
"serverSetup.custom" = "custom server";
"serverSetup.default" = "Default";
@ -122,7 +142,7 @@
"send.error.invalidAmount" = "Invalid amount";
"send.error.invalidAddress" = "Invalid address";
"send.info.memo" = "Transparent transactions cant have memos";
"send.addressNotInBook" = "Address not in Address Book";
"send.addressNotInBook" = "Add contact by tapping on Address Book icon.";
"send.amountSummary" = "Total Amount";
"send.amount" = "Amount";
"send.toSummary" = "Sending to";
@ -135,6 +155,13 @@
"send.alert.failure.message" = "Error: %@";
"send.addressPlaceholder" = "Zcash Address";
"send.currencyPlaceholder" = "USD";
"send.requestPayment.requestedBy" = "Requested By";
"send.requestPayment.for" = "For:";
"send.requestPayment.total" = "Total";
"send.requestPayment.title" = "Payment Request";
// MARK: - ZEC Keyboard
"zecKeyboard.invalid" = "This transaction amount is invalid.";
// MARK: - Delete Wallet
"deleteWallet.title" = "Delete Zashi";
@ -215,6 +242,9 @@ Sharing this private data is irrevocable — once you have shared this private d
"general.confirm" = "Confirm";
"general.done" = "Done";
"general.save" = "Save";
"general.request" = "Request";
"general.hide" = "Hide";
"general.show" = "Show";
"balance.availableTitle" = "Available Balance:";
"qrCodeFor" = "QR Code for %@";
"general.tapToCopy" = "Tap to copy";
@ -226,6 +256,7 @@ Sharing this private data is irrevocable — once you have shared this private d
"general.alert.continue" = "Continue";
"general.alert.caution" = "Heads up";
"general.alert.ignore" = "Ignore";
"general.copiedToTheClipboard" = "Copied to the clipboard!";
// MARK: - Wallet Status
"walletStatus.restoringWallet" = "RESTORING YOUR WALLET…";
@ -353,6 +384,12 @@ Sharing this private data is irrevocable — once you have shared this private d
"currencyConversion.refreshDesc" = "The rate is refreshed automatically and can also be refreshed manually.";
"currencyConversion.skipBtn" = "Skip for now";
// MARK: - Deeplink Warning
"deeplinkWarning.title" = "Looks like you used a third-party app to scan for payment.";
"deeplinkWarning.desc" = "For better safety and security, rescan the QR code with Zashi.";
"deeplinkWarning.cta" = "Rescan in Zashi";
"deeplinkWarning.screenTitle" = "Hello!";
// MARK: - Tooltips
"tooltip.exchangeRate.title" = "Exchange rate unavailable";
"tooltip.exchangeRate.desc" = "We tried but we couldnt refresh the exchange rate for you. Check your connection, relaunch the app, and well try again.";

View File

@ -2020,7 +2020,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = "secant-distrib.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2;
CURRENT_PROJECT_VERSION = 5;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_ASSET_PATHS = "\"secant/Preview Content\"";
DEVELOPMENT_TEAM = RLPRR8CPQG;
@ -2061,7 +2061,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = "secant-distrib.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2;
CURRENT_PROJECT_VERSION = 5;
DEVELOPMENT_ASSET_PATHS = "\"secant/Preview Content\"";
DEVELOPMENT_TEAM = RLPRR8CPQG;
ENABLE_BITCODE = NO;
@ -2263,7 +2263,7 @@
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_ENTITLEMENTS = "secant-distrib.entitlements";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 2;
CURRENT_PROJECT_VERSION = 5;
DEVELOPMENT_ASSET_PATHS = "\"secant/Preview Content\"";
DEVELOPMENT_TEAM = RLPRR8CPQG;
ENABLE_BITCODE = NO;

View File

@ -356,8 +356,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-nio-http2.git",
"state" : {
"revision" : "b5f7062b60e4add1e8c343ba4eb8da2e324b3a94",
"version" : "1.34.0"
"revision" : "eaa71bb6ae082eee5a07407b1ad0cbd8f48f9dca",
"version" : "1.34.1"
}
},
{
@ -374,8 +374,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-nio-transport-services.git",
"state" : {
"revision" : "38ac8221dd20674682148d6451367f89c2652980",
"version" : "1.21.0"
"revision" : "dbace16f126fdcd80d58dc54526c561ca17327d7",
"version" : "1.22.0"
}
},
{
@ -471,10 +471,10 @@
{
"identity" : "zcash-light-client-ffi",
"kind" : "remoteSourceControl",
"location" : "https://github.com/Electric-Coin-Company/zcash-light-client-ffi",
"location" : "https://github.com/zcash-hackworks/zcash-light-client-ffi",
"state" : {
"revision" : "be1575f8d2dce5b7502448ef1f8619e2ca9359d9",
"version" : "0.10.0"
"revision" : "8ed5b08d59ff5e7e11240be29b084dedbdf2f268",
"version" : "0.9.1"
}
},
{
@ -491,8 +491,8 @@
"kind" : "remoteSourceControl",
"location" : "https://github.com/Electric-Coin-Company/zcash-swift-wallet-sdk",
"state" : {
"revision" : "e2ce60ef245e3d672b0703a0fbf1d4ed31eaa16c",
"version" : "2.2.4"
"revision" : "af9383b419c2cafe37ac9edecf9d41cf37fbbf45",
"version" : "2.2.3"
}
}
],