diff --git a/DashSyncCurrentCommit b/DashSyncCurrentCommit index cd3e94a66..84d6c197f 100644 --- a/DashSyncCurrentCommit +++ b/DashSyncCurrentCommit @@ -1 +1 @@ -f3624bc8887a5661f6a9b8ad214afdaca77fd674 +66aed38275fe8e5f8ee2e05cfa1414777952c94f diff --git a/DashWallet.xcodeproj/project.pbxproj b/DashWallet.xcodeproj/project.pbxproj index a02ac72dd..da2a5ab6b 100644 --- a/DashWallet.xcodeproj/project.pbxproj +++ b/DashWallet.xcodeproj/project.pbxproj @@ -45,7 +45,6 @@ 1141E4C5291FDC7A00ACDA9E /* WelcomeToCrowdNodeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1141E4C4291FDC7A00ACDA9E /* WelcomeToCrowdNodeViewController.swift */; }; 114573A42949B221009DCF27 /* VerifiedSuccessfullyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 114573A32949B221009DCF27 /* VerifiedSuccessfullyViewController.swift */; }; 1147687E294B789800FB1EEE /* CrowdNodePortalViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1147687D294B789800FB1EEE /* CrowdNodePortalViewController.swift */; }; - 1148CED529D57E0200D0C136 /* SpendableTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1148CED429D57E0200D0C136 /* SpendableTransaction.swift */; }; 114CFED0296469D9005F421B /* CrowdNodeDepositTx.swift in Sources */ = {isa = PBXBuildFile; fileRef = 114CFECF296469D9005F421B /* CrowdNodeDepositTx.swift */; }; 114CFED2296489CD005F421B /* MinimumDepositBanner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 114CFED1296489CD005F421B /* MinimumDepositBanner.swift */; }; 114D16B629812730009A124C /* OnlineAccountDetailsController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 114D16B529812730009A124C /* OnlineAccountDetailsController.swift */; }; @@ -144,14 +143,11 @@ 2A2CD71822F99CAE008C7BC9 /* ShortcutsView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A2CD71722F99CAE008C7BC9 /* ShortcutsView.xib */; }; 2A2CD72222F9B571008C7BC9 /* DWIntrinsicCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A2CD72122F9B571008C7BC9 /* DWIntrinsicCollectionView.m */; }; 2A2CD72522FA05DD008C7BC9 /* DWPressableButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A2CD72422FA05DD008C7BC9 /* DWPressableButton.m */; }; - 2A307CB622E7006600A18347 /* DWBalanceView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A307CB522E7006600A18347 /* DWBalanceView.m */; }; - 2A307CB822E7006F00A18347 /* DWBalanceView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A307CB722E7006F00A18347 /* DWBalanceView.xib */; }; 2A307CBC22E8925100A18347 /* DWHomeView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A307CBB22E8925100A18347 /* DWHomeView.m */; }; 2A307CBF22E8A44200A18347 /* DWButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A307CBE22E8A44200A18347 /* DWButton.m */; }; 2A36A88B2350A05B0014DC60 /* DWBackupSeedPhraseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A36A88A2350A05B0014DC60 /* DWBackupSeedPhraseViewController.m */; }; 2A392565234CD21300316EA6 /* DWTabBarButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A392564234CD21300316EA6 /* DWTabBarButton.m */; }; 2A392568234CFE9D00316EA6 /* NSAttributedString+DWHighlightText.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A392567234CFE9D00316EA6 /* NSAttributedString+DWHighlightText.m */; }; - 2A392768235732E9004E9A96 /* DWDerivationPathKeysModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A392767235732E9004E9A96 /* DWDerivationPathKeysModel.m */; }; 2A3CCEF9242BB1B900300AF8 /* DWRegistrationCompletedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3CCEF8242BB1B900300AF8 /* DWRegistrationCompletedViewController.m */; }; 2A3CCEFC242BB1DD00300AF8 /* DWDPAvatarView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3CCEFB242BB1DD00300AF8 /* DWDPAvatarView.m */; }; 2A3DC86E239717C2004B3DBA /* DWRecoverWalletCommand.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3DC86D239717C2004B3DBA /* DWRecoverWalletCommand.m */; }; @@ -170,12 +166,8 @@ 2A44314722CF82D9009BAF7F /* DWBiometricAuthViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A44314622CF82D9009BAF7F /* DWBiometricAuthViewController.m */; }; 2A44314922CF82EF009BAF7F /* BiometricAuth.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A44314822CF82EF009BAF7F /* BiometricAuth.storyboard */; }; 2A44314C22CF8801009BAF7F /* DWBiometricAuthModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A44314B22CF8801009BAF7F /* DWBiometricAuthModel.m */; }; - 2A4431BC22D4ACCD009BAF7F /* DWSecureWalletInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4431BB22D4ACCD009BAF7F /* DWSecureWalletInfoViewController.m */; }; - 2A4431BE22D4ACDB009BAF7F /* SecureWalletInfo.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A4431BD22D4ACDB009BAF7F /* SecureWalletInfo.storyboard */; }; - 2A4431C322D4CAEA009BAF7F /* DWBackupInfoViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4431C222D4CAEA009BAF7F /* DWBackupInfoViewController.m */; }; 2A4431C522D4CAFA009BAF7F /* BackupInfo.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A4431C422D4CAFA009BAF7F /* BackupInfo.storyboard */; }; 2A4431C822D4D92A009BAF7F /* DWCenteredTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4431C722D4D92A009BAF7F /* DWCenteredTableView.m */; }; - 2A4431CC22D5279A009BAF7F /* DWBackupInfoHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4431CB22D5279A009BAF7F /* DWBackupInfoHeaderView.m */; }; 2A4431D522D52F67009BAF7F /* DWInfoTextCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4431D322D52F67009BAF7F /* DWInfoTextCell.m */; }; 2A4431D622D52F67009BAF7F /* DWInfoTextCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A4431D422D52F67009BAF7F /* DWInfoTextCell.xib */; }; 2A4431DB22D675CD009BAF7F /* DWPreviewSeedPhraseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A4431DA22D675CD009BAF7F /* DWPreviewSeedPhraseViewController.m */; }; @@ -296,28 +288,21 @@ 2A885FD02449F37A00B9F679 /* DWUserSearchModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A885FCF2449F37A00B9F679 /* DWUserSearchModel.m */; }; 2A885FD6244DFEF100B9F679 /* UIView+DWFindConstraints.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A885FD5244DFEF100B9F679 /* UIView+DWFindConstraints.m */; }; 2A8B9E2922FB1C5D00FF8653 /* DWSharedUIConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E2822FB1C5D00FF8653 /* DWSharedUIConstants.m */; }; - 2A8B9E3B22FC817100FF8653 /* DWPaymentsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E3A22FC817100FF8653 /* DWPaymentsViewController.m */; }; 2A8B9E3D22FD71E100FF8653 /* Payments.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A8B9E3C22FD71E100FF8653 /* Payments.storyboard */; }; 2A8B9E4022FD75C000FF8653 /* DWSegmentedControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E3F22FD75C000FF8653 /* DWSegmentedControl.m */; }; 2A8B9E4D22FEBF7A00FF8653 /* DWProgressAnimator.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E4C22FEBF7A00FF8653 /* DWProgressAnimator.mm */; }; 2A8B9E4F22FED47E00FF8653 /* DWOverlapControl.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E4E22FED47E00FF8653 /* DWOverlapControl.m */; }; 2A8B9E5622FEDF2900FF8653 /* DWControllerCollectionView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E5522FEDF2900FF8653 /* DWControllerCollectionView.m */; }; - 2A8B9E5A22FF6FBD00FF8653 /* DWPayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E5922FF6FBD00FF8653 /* DWPayViewController.m */; }; 2A8B9E5C22FF6FE500FF8653 /* Pay.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A8B9E5B22FF6FE500FF8653 /* Pay.storyboard */; }; - 2A8B9E6122FF712000FF8653 /* DWPayTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E5F22FF712000FF8653 /* DWPayTableViewCell.m */; }; - 2A8B9E6222FF712000FF8653 /* DWPayTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A8B9E6022FF712000FF8653 /* DWPayTableViewCell.xib */; }; + 2A8B9E6222FF712000FF8653 /* PayTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2A8B9E6022FF712000FF8653 /* PayTableViewCell.xib */; }; 2A8B9E6522FFE43500FF8653 /* DWPayModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E6422FFE43500FF8653 /* DWPayModel.m */; }; 2A8B9E6822FFE4CC00FF8653 /* DWPayOptionModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E6722FFE4CC00FF8653 /* DWPayOptionModel.m */; }; 2A8B9E6C23029D2B00FF8653 /* DWPaymentInputBuilder.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E6B23029D2B00FF8653 /* DWPaymentInputBuilder.m */; }; 2A8B9E6F2302A9C200FF8653 /* DWPasteboardAddressExtractor.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E6E2302A9C200FF8653 /* DWPasteboardAddressExtractor.m */; }; - 2A8B9E742302E5ED00FF8653 /* DWReceiveViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E732302E5ED00FF8653 /* DWReceiveViewController.m */; }; 2A8B9E7A2302E67400FF8653 /* DWReceiveModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E792302E67400FF8653 /* DWReceiveModel.m */; }; 2A8B9E7D23034AC100FF8653 /* DWAppGroupOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8B9E7C23034AC100FF8653 /* DWAppGroupOptions.m */; }; 2A8C24B423336FEA00000D43 /* DWQuickReceiveViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8C24B323336FEA00000D43 /* DWQuickReceiveViewController.m */; }; 2A8C24B6233370A600000D43 /* QuickReceive.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2A8C24B5233370A600000D43 /* QuickReceive.storyboard */; }; - 2A8DBA702630A609009094BD /* DWExtendedPublicKeysViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8DBA6F2630A609009094BD /* DWExtendedPublicKeysViewController.m */; }; - 2A8DBA7A2630A6D6009094BD /* DWExtendedPublicKeysModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8DBA792630A6D6009094BD /* DWExtendedPublicKeysModel.m */; }; - 2A8DBAAF2630CC2D009094BD /* DWDerivationPathKeysItemObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8DBAAE2630CC2D009094BD /* DWDerivationPathKeysItemObject.m */; }; 2A8F420921BED16300858B91 /* DashSyncCurrentCommit in Resources */ = {isa = PBXBuildFile; fileRef = 2A8F420821BED16300858B91 /* DashSyncCurrentCommit */; }; 2A8F420F21BEE95D00858B91 /* DWAboutViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8F420E21BEE95D00858B91 /* DWAboutViewController.m */; }; 2A8F422021BEFEEA00858B91 /* DWAboutModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A8F421F21BEFEEA00858B91 /* DWAboutModel.m */; }; @@ -396,8 +381,6 @@ 2AB3417723A92978004E37A7 /* DWDemoAdvancedSecurityViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AB3417623A92978004E37A7 /* DWDemoAdvancedSecurityViewController.m */; }; 2AB3417A23A929B6004E37A7 /* DWAdvancedSecurityModelStub.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AB3417923A929B6004E37A7 /* DWAdvancedSecurityModelStub.m */; }; 2AB3417F23A92A2A004E37A7 /* DWBaseAdvancedSecurityModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AB3417E23A92A2A004E37A7 /* DWBaseAdvancedSecurityModel.m */; }; - 2AB66E02235711FA007BE825 /* DWWalletKeysOverviewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AB66E01235711FA007BE825 /* DWWalletKeysOverviewModel.m */; }; - 2AB66E0623572358007BE825 /* DWDerivationPathKeysTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AB66E0523572358007BE825 /* DWDerivationPathKeysTableViewCell.m */; }; 2AB7303E24D0BC0400DCB420 /* UIColor+DWDashPay.m in Sources */ = {isa = PBXBuildFile; fileRef = 2AB7303D24D0BC0400DCB420 /* UIColor+DWDashPay.m */; }; 2AB7C907234DB82700A56795 /* About.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 2AB7C906234DB82700A56795 /* About.storyboard */; }; 2AB7F7E72384676200C173AD /* DWWatchDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AB7F7E62384676200C173AD /* DWWatchDataManager.swift */; }; @@ -415,8 +398,6 @@ 2ACCD84D23180E7E00A96B62 /* DWPaymentOutput.m in Sources */ = {isa = PBXBuildFile; fileRef = 2ACCD84C23180E7E00A96B62 /* DWPaymentOutput.m */; }; 2ACCD8592319399100A96B62 /* DWRequestAmountViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2ACCD8582319399100A96B62 /* DWRequestAmountViewController.m */; }; 2ACCD85D231939FE00A96B62 /* DWRequestAmountContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2ACCD85C231939FE00A96B62 /* DWRequestAmountContentView.m */; }; - 2ACCD86123193BE300A96B62 /* DWReceiveContentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 2ACCD86023193BE300A96B62 /* DWReceiveContentView.m */; }; - 2ACCD86323193C1E00A96B62 /* DWReceiveContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2ACCD86223193C1E00A96B62 /* DWReceiveContentView.xib */; }; 2ACCD865231959CD00A96B62 /* AmountPreviewView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2ACCD864231959CD00A96B62 /* AmountPreviewView.xib */; }; 2ACCD86E2319609400A96B62 /* UIViewController+DWShareReceiveInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 2ACCD86D2319609400A96B62 /* UIViewController+DWShareReceiveInfo.m */; }; 2ACCD8D1231D33EA00A96B62 /* DWAnimatedShapeLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 2ACCD8D0231D33EA00A96B62 /* DWAnimatedShapeLayer.m */; }; @@ -545,7 +526,6 @@ 4759D514292FEFFC002F20DC /* ModalNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4759D513292FEFFB002F20DC /* ModalNavigationController.swift */; }; 4759D51729300212002F20DC /* ProvideAmountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4759D51629300212002F20DC /* ProvideAmountViewController.swift */; }; 475AE2B92974348F009A1055 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 475AE2B82974348F009A1055 /* App.swift */; }; - 475AE2BB297434CF009A1055 /* Preferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 475AE2BA297434CF009A1055 /* Preferences.swift */; }; 4774DCDB28F3FA9C008CF87D /* Coinbase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4774DCDA28F3FA9C008CF87D /* Coinbase.swift */; }; 4774DCDD28F43A68008CF87D /* ServiceDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4774DCDC28F43A68008CF87D /* ServiceDataSource.swift */; }; 4774DCDF28F43AB4008CF87D /* ServiceItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4774DCDE28F43AB4008CF87D /* ServiceItem.swift */; }; @@ -712,11 +692,36 @@ C3DAD2CC24757A210001624F /* DWContactsSearchDataSourceObject.m in Sources */ = {isa = PBXBuildFile; fileRef = C3DAD2CB24757A210001624F /* DWContactsSearchDataSourceObject.m */; }; C3DAD2CF247585C10001624F /* NSPredicate+DWFullTextSearch.m in Sources */ = {isa = PBXBuildFile; fileRef = C3DAD2CE247585C10001624F /* NSPredicate+DWFullTextSearch.m */; }; C3DAD2D52476886D0001624F /* DWContactsSearchInfoHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = C3DAD2D42476886D0001624F /* DWContactsSearchInfoHeaderView.m */; }; + C909614D29EFF7D600002D82 /* WalletKeysOverviewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C909614C29EFF7D600002D82 /* WalletKeysOverviewModel.swift */; }; + C909615129F158D700002D82 /* DerivationPathKeysViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C909615029F158D700002D82 /* DerivationPathKeysViewController.swift */; }; + C909615329F28E3700002D82 /* DerivationPathKeysModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C909615229F28E3700002D82 /* DerivationPathKeysModel.swift */; }; + C909615529F297DD00002D82 /* DerivationPathKeysCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C909615429F297DD00002D82 /* DerivationPathKeysCell.swift */; }; + C909615929F29C9200002D82 /* KeysOverviewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C909615829F29C9200002D82 /* KeysOverviewCell.swift */; }; + C909615B29F6535300002D82 /* DerivationPathKeysHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C909615A29F6535300002D82 /* DerivationPathKeysHeaderView.swift */; }; + C917023F29D44E0B008C034D /* SendReceivePageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C917023E29D44E0B008C034D /* SendReceivePageController.swift */; }; + C917024129D462C6008C034D /* PayViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C917024029D462C6008C034D /* PayViewController.swift */; }; + C91E919729FBACE6003E7883 /* ExtendedPublicKeysModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C91E919629FBACE6003E7883 /* ExtendedPublicKeysModel.swift */; }; + C91E91AE29FFC8A1003E7883 /* ExtendedPublicKeysViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C91E91AD29FFC8A1003E7883 /* ExtendedPublicKeysViewController.swift */; }; C94F5E8829D3E7E30034FD57 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C94F5E8729D3E7E30034FD57 /* GoogleService-Info.plist */; }; C94F5E8A29D3FCCF0034FD57 /* ShortcutAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94F5E8929D3FCCF0034FD57 /* ShortcutAction.swift */; }; C94F5E8C29D3FEC10034FD57 /* ShortcutsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94F5E8B29D3FEC10034FD57 /* ShortcutsModel.swift */; }; C94F5E8E29D404850034FD57 /* ShortcutCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94F5E8D29D404850034FD57 /* ShortcutCell.swift */; }; C94F5E9029D4060A0034FD57 /* ShortcutsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94F5E8F29D4060A0034FD57 /* ShortcutsView.swift */; }; + C9903A5429E6A5F600535A4E /* KeysOverviewViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9903A5329E6A5F600535A4E /* KeysOverviewViewController.swift */; }; + C9F067F229E4576D0022D958 /* HomeBalanceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F067F129E4576D0022D958 /* HomeBalanceView.swift */; }; + C9F067F429E543630022D958 /* HomeBalanceView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C9F067F329E457790022D958 /* HomeBalanceView.xib */; }; + C9F42F9F29DA82E5001BC549 /* PayableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F42F9E29DA82E5001BC549 /* PayableViewController.swift */; }; + C9F42FA129DA95F5001BC549 /* PayTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F42FA029DA95F5001BC549 /* PayTableViewCell.swift */; }; + C9F42FA429DBC6E5001BC549 /* PaymentsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F42FA229DBC183001BC549 /* PaymentsViewController.swift */; }; + C9F42FA629DC092B001BC549 /* ReceiveViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F42FA529DC092B001BC549 /* ReceiveViewController.swift */; }; + C9F42FA929DC09CF001BC549 /* Style.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F42FA829DC09CF001BC549 /* Style.swift */; }; + C9F42FAB29DC1098001BC549 /* ReceiveContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F42FAA29DC1098001BC549 /* ReceiveContentView.swift */; }; + C9F42FAD29DC115A001BC549 /* ReceiveContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C9F42FAC29DC115A001BC549 /* ReceiveContentView.xib */; }; + C9F42FB029DC27F4001BC549 /* EmptyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F42FAF29DC27F4001BC549 /* EmptyView.swift */; }; + C9F42FB229DD5141001BC549 /* BackupInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F42FB129DD5141001BC549 /* BackupInfoViewController.swift */; }; + C9F42FB429DD86FB001BC549 /* BackupInfoItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F42FB329DD86FB001BC549 /* BackupInfoItemView.swift */; }; + C9F42FB629DD8702001BC549 /* BackupInfoItemView.xib in Resources */ = {isa = PBXBuildFile; fileRef = C9F42FB529DD8702001BC549 /* BackupInfoItemView.xib */; }; + C9F42FB829DFC507001BC549 /* SpendableTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9F42FB729DFC506001BC549 /* SpendableTransaction.swift */; }; CC5F88E358330F8EE192D5BE /* libPods-DashWalletScreenshotsUITests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0CDD4C961516ED20BC9F01FA /* libPods-DashWalletScreenshotsUITests.a */; }; DE3A167A235B79D705C0A962 /* libPods-dashwallet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 982607F21196681DAC51A074 /* libPods-dashwallet.a */; }; FB248B5D1F73803100405AE0 /* UserNotifications.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB248B5C1F73803100405AE0 /* UserNotifications.framework */; }; @@ -724,8 +729,6 @@ FB2E5537218BA161003A1B7C /* DWVersionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FB2E5536218BA161003A1B7C /* DWVersionManager.m */; }; FB3E9F60236125F600C09C5C /* BackgroundTasks.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB3E9F5F236125F600C09C5C /* BackgroundTasks.framework */; }; FB3FA3D61F2364140071FCC5 /* UIImage+Utils.m in Sources */ = {isa = PBXBuildFile; fileRef = BAA4843B1B3EFFAF0075C749 /* UIImage+Utils.m */; }; - FB3FF0B5222642FB0059A9A5 /* DWKeysOverviewViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FB3FF0B4222642FB0059A9A5 /* DWKeysOverviewViewController.m */; }; - FB3FF0B822264DC60059A9A5 /* DWDerivationPathKeysViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = FB3FF0B722264DC60059A9A5 /* DWDerivationPathKeysViewController.m */; }; FB43BC78211CD15500BC9879 /* DWActionButton.m in Sources */ = {isa = PBXBuildFile; fileRef = FB43BC77211CD15500BC9879 /* DWActionButton.m */; }; FB4FA9C322505DD70060B017 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FB4FA9C222505DD60060B017 /* AudioToolbox.framework */; }; FB66977F212C0B940034BE4F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = FB66977E212C0B940034BE4F /* LaunchScreen.storyboard */; }; @@ -855,7 +858,6 @@ 1141E4C4291FDC7A00ACDA9E /* WelcomeToCrowdNodeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WelcomeToCrowdNodeViewController.swift; sourceTree = ""; }; 114573A32949B221009DCF27 /* VerifiedSuccessfullyViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerifiedSuccessfullyViewController.swift; sourceTree = ""; }; 1147687D294B789800FB1EEE /* CrowdNodePortalViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrowdNodePortalViewController.swift; sourceTree = ""; }; - 1148CED429D57E0200D0C136 /* SpendableTransaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpendableTransaction.swift; sourceTree = ""; }; 114CFECF296469D9005F421B /* CrowdNodeDepositTx.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CrowdNodeDepositTx.swift; sourceTree = ""; }; 114CFED1296489CD005F421B /* MinimumDepositBanner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MinimumDepositBanner.swift; sourceTree = ""; }; 114D16B529812730009A124C /* OnlineAccountDetailsController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnlineAccountDetailsController.swift; sourceTree = ""; }; @@ -1004,9 +1006,6 @@ 2A2CD72122F9B571008C7BC9 /* DWIntrinsicCollectionView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWIntrinsicCollectionView.m; sourceTree = ""; }; 2A2CD72322FA05DD008C7BC9 /* DWPressableButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWPressableButton.h; sourceTree = ""; }; 2A2CD72422FA05DD008C7BC9 /* DWPressableButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWPressableButton.m; sourceTree = ""; }; - 2A307CB422E7006600A18347 /* DWBalanceView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWBalanceView.h; sourceTree = ""; }; - 2A307CB522E7006600A18347 /* DWBalanceView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWBalanceView.m; sourceTree = ""; }; - 2A307CB722E7006F00A18347 /* DWBalanceView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DWBalanceView.xib; sourceTree = ""; }; 2A307CBA22E8925100A18347 /* DWHomeView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWHomeView.h; sourceTree = ""; }; 2A307CBB22E8925100A18347 /* DWHomeView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWHomeView.m; sourceTree = ""; }; 2A307CBD22E8A44200A18347 /* DWButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWButton.h; sourceTree = ""; }; @@ -1019,8 +1018,6 @@ 2A392564234CD21300316EA6 /* DWTabBarButton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWTabBarButton.m; sourceTree = ""; }; 2A392566234CFE9D00316EA6 /* NSAttributedString+DWHighlightText.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSAttributedString+DWHighlightText.h"; sourceTree = ""; }; 2A392567234CFE9D00316EA6 /* NSAttributedString+DWHighlightText.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSAttributedString+DWHighlightText.m"; sourceTree = ""; }; - 2A392766235732E9004E9A96 /* DWDerivationPathKeysModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWDerivationPathKeysModel.h; sourceTree = ""; }; - 2A392767235732E9004E9A96 /* DWDerivationPathKeysModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWDerivationPathKeysModel.m; sourceTree = ""; }; 2A3CCEF7242BB1B900300AF8 /* DWRegistrationCompletedViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWRegistrationCompletedViewController.h; sourceTree = ""; }; 2A3CCEF8242BB1B900300AF8 /* DWRegistrationCompletedViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWRegistrationCompletedViewController.m; sourceTree = ""; }; 2A3CCEFA242BB1DD00300AF8 /* DWDPAvatarView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWDPAvatarView.h; sourceTree = ""; }; @@ -1054,16 +1051,9 @@ 2A44314822CF82EF009BAF7F /* BiometricAuth.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = BiometricAuth.storyboard; sourceTree = ""; }; 2A44314A22CF8801009BAF7F /* DWBiometricAuthModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWBiometricAuthModel.h; sourceTree = ""; }; 2A44314B22CF8801009BAF7F /* DWBiometricAuthModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWBiometricAuthModel.m; sourceTree = ""; }; - 2A4431BA22D4ACCD009BAF7F /* DWSecureWalletInfoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWSecureWalletInfoViewController.h; sourceTree = ""; }; - 2A4431BB22D4ACCD009BAF7F /* DWSecureWalletInfoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWSecureWalletInfoViewController.m; sourceTree = ""; }; - 2A4431BD22D4ACDB009BAF7F /* SecureWalletInfo.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = SecureWalletInfo.storyboard; sourceTree = ""; }; - 2A4431C122D4CAEA009BAF7F /* DWBackupInfoViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWBackupInfoViewController.h; sourceTree = ""; }; - 2A4431C222D4CAEA009BAF7F /* DWBackupInfoViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWBackupInfoViewController.m; sourceTree = ""; }; 2A4431C422D4CAFA009BAF7F /* BackupInfo.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = BackupInfo.storyboard; sourceTree = ""; }; 2A4431C622D4D92A009BAF7F /* DWCenteredTableView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWCenteredTableView.h; sourceTree = ""; }; 2A4431C722D4D92A009BAF7F /* DWCenteredTableView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWCenteredTableView.m; sourceTree = ""; }; - 2A4431CA22D5279A009BAF7F /* DWBackupInfoHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWBackupInfoHeaderView.h; sourceTree = ""; }; - 2A4431CB22D5279A009BAF7F /* DWBackupInfoHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWBackupInfoHeaderView.m; sourceTree = ""; }; 2A4431D222D52F67009BAF7F /* DWInfoTextCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWInfoTextCell.h; sourceTree = ""; }; 2A4431D322D52F67009BAF7F /* DWInfoTextCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWInfoTextCell.m; sourceTree = ""; }; 2A4431D422D52F67009BAF7F /* DWInfoTextCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DWInfoTextCell.xib; sourceTree = ""; }; @@ -1303,8 +1293,6 @@ 2A885FD5244DFEF100B9F679 /* UIView+DWFindConstraints.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIView+DWFindConstraints.m"; sourceTree = ""; }; 2A8B9E2722FB1C5D00FF8653 /* DWSharedUIConstants.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWSharedUIConstants.h; sourceTree = ""; }; 2A8B9E2822FB1C5D00FF8653 /* DWSharedUIConstants.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWSharedUIConstants.m; sourceTree = ""; }; - 2A8B9E3922FC817100FF8653 /* DWPaymentsViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWPaymentsViewController.h; sourceTree = ""; }; - 2A8B9E3A22FC817100FF8653 /* DWPaymentsViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWPaymentsViewController.m; sourceTree = ""; }; 2A8B9E3C22FD71E100FF8653 /* Payments.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Payments.storyboard; sourceTree = ""; }; 2A8B9E3E22FD75C000FF8653 /* DWSegmentedControl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWSegmentedControl.h; sourceTree = ""; }; 2A8B9E3F22FD75C000FF8653 /* DWSegmentedControl.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWSegmentedControl.m; sourceTree = ""; }; @@ -1315,12 +1303,8 @@ 2A8B9E4E22FED47E00FF8653 /* DWOverlapControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DWOverlapControl.m; sourceTree = ""; }; 2A8B9E5422FEDF2900FF8653 /* DWControllerCollectionView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWControllerCollectionView.h; sourceTree = ""; }; 2A8B9E5522FEDF2900FF8653 /* DWControllerCollectionView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWControllerCollectionView.m; sourceTree = ""; }; - 2A8B9E5822FF6FBD00FF8653 /* DWPayViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWPayViewController.h; sourceTree = ""; }; - 2A8B9E5922FF6FBD00FF8653 /* DWPayViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWPayViewController.m; sourceTree = ""; }; 2A8B9E5B22FF6FE500FF8653 /* Pay.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Pay.storyboard; sourceTree = ""; }; - 2A8B9E5E22FF712000FF8653 /* DWPayTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWPayTableViewCell.h; sourceTree = ""; }; - 2A8B9E5F22FF712000FF8653 /* DWPayTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWPayTableViewCell.m; sourceTree = ""; }; - 2A8B9E6022FF712000FF8653 /* DWPayTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DWPayTableViewCell.xib; sourceTree = ""; }; + 2A8B9E6022FF712000FF8653 /* PayTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = PayTableViewCell.xib; sourceTree = ""; }; 2A8B9E6322FFE43500FF8653 /* DWPayModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWPayModel.h; sourceTree = ""; }; 2A8B9E6422FFE43500FF8653 /* DWPayModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWPayModel.m; sourceTree = ""; }; 2A8B9E6622FFE4CC00FF8653 /* DWPayOptionModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWPayOptionModel.h; sourceTree = ""; }; @@ -1329,22 +1313,13 @@ 2A8B9E6B23029D2B00FF8653 /* DWPaymentInputBuilder.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWPaymentInputBuilder.m; sourceTree = ""; }; 2A8B9E6E2302A9C200FF8653 /* DWPasteboardAddressExtractor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWPasteboardAddressExtractor.m; sourceTree = ""; }; 2A8B9E702302AFDD00FF8653 /* DWPasteboardAddressExtractor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DWPasteboardAddressExtractor.h; sourceTree = ""; }; - 2A8B9E722302E5ED00FF8653 /* DWReceiveViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWReceiveViewController.h; sourceTree = ""; }; - 2A8B9E732302E5ED00FF8653 /* DWReceiveViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWReceiveViewController.m; sourceTree = ""; }; 2A8B9E782302E67400FF8653 /* DWReceiveModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWReceiveModel.h; sourceTree = ""; }; 2A8B9E792302E67400FF8653 /* DWReceiveModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWReceiveModel.m; sourceTree = ""; }; 2A8B9E7B23034AC100FF8653 /* DWAppGroupOptions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWAppGroupOptions.h; sourceTree = ""; }; 2A8B9E7C23034AC100FF8653 /* DWAppGroupOptions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWAppGroupOptions.m; sourceTree = ""; }; - 2A8C24B02333659100000D43 /* DWReceiveViewType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWReceiveViewType.h; sourceTree = ""; }; 2A8C24B223336FEA00000D43 /* DWQuickReceiveViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWQuickReceiveViewController.h; sourceTree = ""; }; 2A8C24B323336FEA00000D43 /* DWQuickReceiveViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWQuickReceiveViewController.m; sourceTree = ""; }; 2A8C24B5233370A600000D43 /* QuickReceive.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = QuickReceive.storyboard; sourceTree = ""; }; - 2A8DBA6E2630A609009094BD /* DWExtendedPublicKeysViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWExtendedPublicKeysViewController.h; sourceTree = ""; }; - 2A8DBA6F2630A609009094BD /* DWExtendedPublicKeysViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWExtendedPublicKeysViewController.m; sourceTree = ""; }; - 2A8DBA782630A6D6009094BD /* DWExtendedPublicKeysModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWExtendedPublicKeysModel.h; sourceTree = ""; }; - 2A8DBA792630A6D6009094BD /* DWExtendedPublicKeysModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWExtendedPublicKeysModel.m; sourceTree = ""; }; - 2A8DBAAD2630CC2D009094BD /* DWDerivationPathKeysItemObject.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWDerivationPathKeysItemObject.h; sourceTree = ""; }; - 2A8DBAAE2630CC2D009094BD /* DWDerivationPathKeysItemObject.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWDerivationPathKeysItemObject.m; sourceTree = ""; }; 2A8E79B9240676D400AA7C3D /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = sk; path = sk.lproj/Localizable.stringsdict; sourceTree = ""; }; 2A8E79BA240676D400AA7C3D /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Interface.strings; sourceTree = ""; }; 2A8E79BB2406772900AA7C3D /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Interface.strings; sourceTree = ""; }; @@ -1524,11 +1499,6 @@ 2AB3417923A929B6004E37A7 /* DWAdvancedSecurityModelStub.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWAdvancedSecurityModelStub.m; sourceTree = ""; }; 2AB3417D23A92A2A004E37A7 /* DWBaseAdvancedSecurityModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWBaseAdvancedSecurityModel.h; sourceTree = ""; }; 2AB3417E23A92A2A004E37A7 /* DWBaseAdvancedSecurityModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWBaseAdvancedSecurityModel.m; sourceTree = ""; }; - 2AB66E00235711FA007BE825 /* DWWalletKeysOverviewModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWWalletKeysOverviewModel.h; sourceTree = ""; }; - 2AB66E01235711FA007BE825 /* DWWalletKeysOverviewModel.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWWalletKeysOverviewModel.m; sourceTree = ""; }; - 2AB66E0423572358007BE825 /* DWDerivationPathKeysTableViewCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWDerivationPathKeysTableViewCell.h; sourceTree = ""; }; - 2AB66E0523572358007BE825 /* DWDerivationPathKeysTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWDerivationPathKeysTableViewCell.m; sourceTree = ""; }; - 2AB66E0A23572587007BE825 /* DWDerivationPathKeysItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWDerivationPathKeysItem.h; sourceTree = ""; }; 2AB7303C24D0BC0400DCB420 /* UIColor+DWDashPay.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIColor+DWDashPay.h"; sourceTree = ""; }; 2AB7303D24D0BC0400DCB420 /* UIColor+DWDashPay.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIColor+DWDashPay.m"; sourceTree = ""; }; 2AB7C906234DB82700A56795 /* About.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = About.storyboard; sourceTree = ""; }; @@ -1563,9 +1533,6 @@ 2ACCD8582319399100A96B62 /* DWRequestAmountViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWRequestAmountViewController.m; sourceTree = ""; }; 2ACCD85B231939FE00A96B62 /* DWRequestAmountContentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWRequestAmountContentView.h; sourceTree = ""; }; 2ACCD85C231939FE00A96B62 /* DWRequestAmountContentView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWRequestAmountContentView.m; sourceTree = ""; }; - 2ACCD85F23193BE300A96B62 /* DWReceiveContentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWReceiveContentView.h; sourceTree = ""; }; - 2ACCD86023193BE300A96B62 /* DWReceiveContentView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWReceiveContentView.m; sourceTree = ""; }; - 2ACCD86223193C1E00A96B62 /* DWReceiveContentView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = DWReceiveContentView.xib; sourceTree = ""; }; 2ACCD864231959CD00A96B62 /* AmountPreviewView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AmountPreviewView.xib; sourceTree = ""; }; 2ACCD86C2319609400A96B62 /* UIViewController+DWShareReceiveInfo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIViewController+DWShareReceiveInfo.h"; sourceTree = ""; }; 2ACCD86D2319609400A96B62 /* UIViewController+DWShareReceiveInfo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIViewController+DWShareReceiveInfo.m"; sourceTree = ""; }; @@ -1761,7 +1728,6 @@ 4759D513292FEFFB002F20DC /* ModalNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModalNavigationController.swift; sourceTree = ""; }; 4759D51629300212002F20DC /* ProvideAmountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProvideAmountViewController.swift; sourceTree = ""; }; 475AE2B82974348F009A1055 /* App.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = ""; }; - 475AE2BA297434CF009A1055 /* Preferences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Preferences.swift; sourceTree = ""; }; 4762C947276CAF6800F5F42D /* DWPaymentCurrency.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWPaymentCurrency.h; sourceTree = ""; }; 4774DCDA28F3FA9C008CF87D /* Coinbase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Coinbase.swift; sourceTree = ""; }; 4774DCDC28F43A68008CF87D /* ServiceDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceDataSource.swift; sourceTree = ""; }; @@ -1998,12 +1964,37 @@ C3DAD2D32476886D0001624F /* DWContactsSearchInfoHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWContactsSearchInfoHeaderView.h; sourceTree = ""; }; C3DAD2D42476886D0001624F /* DWContactsSearchInfoHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWContactsSearchInfoHeaderView.m; sourceTree = ""; }; C47D5A9D319D41B450A9B96B /* libPods-WatchApp Extension.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-WatchApp Extension.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + C909614C29EFF7D600002D82 /* WalletKeysOverviewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WalletKeysOverviewModel.swift; sourceTree = ""; }; + C909615029F158D700002D82 /* DerivationPathKeysViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DerivationPathKeysViewController.swift; sourceTree = ""; }; + C909615229F28E3700002D82 /* DerivationPathKeysModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DerivationPathKeysModel.swift; sourceTree = ""; }; + C909615429F297DD00002D82 /* DerivationPathKeysCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DerivationPathKeysCell.swift; sourceTree = ""; }; + C909615829F29C9200002D82 /* KeysOverviewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeysOverviewCell.swift; sourceTree = ""; }; + C909615A29F6535300002D82 /* DerivationPathKeysHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DerivationPathKeysHeaderView.swift; sourceTree = ""; }; + C917023E29D44E0B008C034D /* SendReceivePageController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendReceivePageController.swift; sourceTree = ""; }; + C917024029D462C6008C034D /* PayViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayViewController.swift; sourceTree = ""; }; + C91E919629FBACE6003E7883 /* ExtendedPublicKeysModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedPublicKeysModel.swift; sourceTree = ""; }; + C91E91AD29FFC8A1003E7883 /* ExtendedPublicKeysViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedPublicKeysViewController.swift; sourceTree = ""; }; C94F5E8729D3E7E30034FD57 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; C94F5E8929D3FCCF0034FD57 /* ShortcutAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortcutAction.swift; sourceTree = ""; }; C94F5E8B29D3FEC10034FD57 /* ShortcutsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortcutsModel.swift; sourceTree = ""; }; C94F5E8D29D404850034FD57 /* ShortcutCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortcutCell.swift; sourceTree = ""; }; C94F5E8F29D4060A0034FD57 /* ShortcutsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShortcutsView.swift; sourceTree = ""; }; C98AA93FF5283EC6405BCE4B /* Pods-WatchApp Extension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WatchApp Extension.debug.xcconfig"; path = "Pods/Target Support Files/Pods-WatchApp Extension/Pods-WatchApp Extension.debug.xcconfig"; sourceTree = ""; }; + C9903A5329E6A5F600535A4E /* KeysOverviewViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeysOverviewViewController.swift; sourceTree = ""; }; + C9F067F129E4576D0022D958 /* HomeBalanceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeBalanceView.swift; sourceTree = ""; }; + C9F067F329E457790022D958 /* HomeBalanceView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HomeBalanceView.xib; sourceTree = ""; }; + C9F42F9E29DA82E5001BC549 /* PayableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayableViewController.swift; sourceTree = ""; }; + C9F42FA029DA95F5001BC549 /* PayTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PayTableViewCell.swift; sourceTree = ""; }; + C9F42FA229DBC183001BC549 /* PaymentsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PaymentsViewController.swift; sourceTree = ""; }; + C9F42FA529DC092B001BC549 /* ReceiveViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReceiveViewController.swift; sourceTree = ""; }; + C9F42FA829DC09CF001BC549 /* Style.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Style.swift; sourceTree = ""; }; + C9F42FAA29DC1098001BC549 /* ReceiveContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReceiveContentView.swift; sourceTree = ""; }; + C9F42FAC29DC115A001BC549 /* ReceiveContentView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ReceiveContentView.xib; sourceTree = ""; }; + C9F42FAF29DC27F4001BC549 /* EmptyView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyView.swift; sourceTree = ""; }; + C9F42FB129DD5141001BC549 /* BackupInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupInfoViewController.swift; sourceTree = ""; }; + C9F42FB329DD86FB001BC549 /* BackupInfoItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BackupInfoItemView.swift; sourceTree = ""; }; + C9F42FB529DD8702001BC549 /* BackupInfoItemView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BackupInfoItemView.xib; sourceTree = ""; }; + C9F42FB729DFC506001BC549 /* SpendableTransaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpendableTransaction.swift; sourceTree = ""; }; CE02413EF0C60B1D1EDE6457 /* Pods-WatchApp Extension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-WatchApp Extension.release.xcconfig"; path = "Pods/Target Support Files/Pods-WatchApp Extension/Pods-WatchApp Extension.release.xcconfig"; sourceTree = ""; }; D58B25CB4DC36975E05D3C0A /* Pods-dashwallet no watch.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-dashwallet no watch.debug.xcconfig"; path = "Pods/Target Support Files/Pods-dashwallet no watch/Pods-dashwallet no watch.debug.xcconfig"; sourceTree = ""; }; EA95ACF6CA2A73810B9BB451 /* Pods-DashWalletScreenshotsUITests.testflight.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DashWalletScreenshotsUITests.testflight.xcconfig"; path = "Pods/Target Support Files/Pods-DashWalletScreenshotsUITests/Pods-DashWalletScreenshotsUITests.testflight.xcconfig"; sourceTree = ""; }; @@ -2016,10 +2007,6 @@ FB2E5535218BA161003A1B7C /* DWVersionManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWVersionManager.h; sourceTree = ""; }; FB2E5536218BA161003A1B7C /* DWVersionManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWVersionManager.m; sourceTree = ""; }; FB3E9F5F236125F600C09C5C /* BackgroundTasks.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = BackgroundTasks.framework; path = System/Library/Frameworks/BackgroundTasks.framework; sourceTree = SDKROOT; }; - FB3FF0B3222642FB0059A9A5 /* DWKeysOverviewViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWKeysOverviewViewController.h; sourceTree = ""; }; - FB3FF0B4222642FB0059A9A5 /* DWKeysOverviewViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWKeysOverviewViewController.m; sourceTree = ""; }; - FB3FF0B622264DC60059A9A5 /* DWDerivationPathKeysViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWDerivationPathKeysViewController.h; sourceTree = ""; }; - FB3FF0B722264DC60059A9A5 /* DWDerivationPathKeysViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DWDerivationPathKeysViewController.m; sourceTree = ""; }; FB4310F01FA027DB00784EBC /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/Interface.strings; sourceTree = ""; }; FB4310F11FA027DB00784EBC /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/Localizable.strings; sourceTree = ""; }; FB43BC76211CD15500BC9879 /* DWActionButton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DWActionButton.h; sourceTree = ""; }; @@ -2312,6 +2299,7 @@ 117ED4A628ED66A2006E3EE4 /* TxFilters */ = { isa = PBXGroup; children = ( + C9F42FB729DFC506001BC549 /* SpendableTransaction.swift */, 117ED4A728ED66F9006E3EE4 /* TransactionFilter.swift */, 119E8D092905413F00D406C1 /* TransactionWrapper.swift */, 119E8D052905200300D406C1 /* CoinsToAddressTxFilter.swift */, @@ -2325,7 +2313,6 @@ 111C3C4F296D5A4700788E18 /* TxWithinTimePeriod.swift */, 111C3C53296D6A2D00788E18 /* CrowdNodeWithdrawalReceivedTx.swift */, 1186092429759C4B00279FCC /* CrowdNodeAPIConfirmationTx.swift */, - 1148CED429D57E0200D0C136 /* SpendableTransaction.swift */, ); path = TxFilters; sourceTree = ""; @@ -2709,9 +2696,8 @@ children = ( 2A2CD70B22F97A9D008C7BC9 /* Shortcuts */, 2A4E533C22F025ED00E5168A /* Cells */, - 2A307CB422E7006600A18347 /* DWBalanceView.h */, - 2A307CB522E7006600A18347 /* DWBalanceView.m */, - 2A307CB722E7006F00A18347 /* DWBalanceView.xib */, + C9F067F129E4576D0022D958 /* HomeBalanceView.swift */, + C9F067F329E457790022D958 /* HomeBalanceView.xib */, 2A307CBA22E8925100A18347 /* DWHomeView.h */, 2A307CBB22E8925100A18347 /* DWHomeView.m */, 2A4E531622EA381F00E5168A /* DWSyncView.h */, @@ -2784,6 +2770,7 @@ 2ADC9D1A24603C4F001D7C0D /* UISearchBar+DWAdditions.h */, 2ADC9D1B24603C4F001D7C0D /* UISearchBar+DWAdditions.m */, 47AE8C1428C6378E00490F5E /* HairlineView.swift */, + C9F42FAF29DC27F4001BC549 /* EmptyView.swift */, ); path = Views; sourceTree = ""; @@ -2886,6 +2873,7 @@ 2A44313C22CF631E009BAF7F /* UI */ = { isa = PBXGroup; children = ( + C9F42FA729DC09C6001BC549 /* Style */, 11C5F51128E5D0C500F6F135 /* CrowdNode */, 47A50F362912D9A800C70123 /* Payment Controller */, 4751137228DAF27300223B77 /* Assembly */, @@ -2951,22 +2939,11 @@ path = BiometricAuth; sourceTree = ""; }; - 2A4431B922D4ACAC009BAF7F /* SecureWalletInfo */ = { - isa = PBXGroup; - children = ( - 2A4431BA22D4ACCD009BAF7F /* DWSecureWalletInfoViewController.h */, - 2A4431BB22D4ACCD009BAF7F /* DWSecureWalletInfoViewController.m */, - 2A4431BD22D4ACDB009BAF7F /* SecureWalletInfo.storyboard */, - ); - path = SecureWalletInfo; - sourceTree = ""; - }; 2A4431C022D4CAC6009BAF7F /* BackupInfo */ = { isa = PBXGroup; children = ( 2A4431C922D52776009BAF7F /* Views */, - 2A4431C122D4CAEA009BAF7F /* DWBackupInfoViewController.h */, - 2A4431C222D4CAEA009BAF7F /* DWBackupInfoViewController.m */, + C9F42FB129DD5141001BC549 /* BackupInfoViewController.swift */, 2A4431C422D4CAFA009BAF7F /* BackupInfo.storyboard */, ); path = BackupInfo; @@ -2975,8 +2952,8 @@ 2A4431C922D52776009BAF7F /* Views */ = { isa = PBXGroup; children = ( - 2A4431CA22D5279A009BAF7F /* DWBackupInfoHeaderView.h */, - 2A4431CB22D5279A009BAF7F /* DWBackupInfoHeaderView.m */, + C9F42FB329DD86FB001BC549 /* BackupInfoItemView.swift */, + C9F42FB529DD8702001BC549 /* BackupInfoItemView.xib */, ); path = Views; sourceTree = ""; @@ -3476,8 +3453,8 @@ 2AB8CDD5220D80F100A3D1DB /* Amount */, 2A8B9E712302E43400FF8653 /* Receive */, 2A8B9E5722FF6F2900FF8653 /* Pay */, - 2A8B9E3922FC817100FF8653 /* DWPaymentsViewController.h */, - 2A8B9E3A22FC817100FF8653 /* DWPaymentsViewController.m */, + C9F42FA229DBC183001BC549 /* PaymentsViewController.swift */, + C917023E29D44E0B008C034D /* SendReceivePageController.swift */, 2A8B9E3C22FD71E100FF8653 /* Payments.storyboard */, ); path = Payments; @@ -3514,9 +3491,9 @@ 2A8B9E5D22FF710A00FF8653 /* Cells */, 2ACCD85323191C8500A96B62 /* DWBasePayViewController.h */, 2ACCD85423191C8500A96B62 /* DWBasePayViewController.m */, - 2A8B9E5822FF6FBD00FF8653 /* DWPayViewController.h */, - 2A8B9E5922FF6FBD00FF8653 /* DWPayViewController.m */, 2A8B9E5B22FF6FE500FF8653 /* Pay.storyboard */, + C917024029D462C6008C034D /* PayViewController.swift */, + C9F42F9E29DA82E5001BC549 /* PayableViewController.swift */, ); path = Pay; sourceTree = ""; @@ -3524,9 +3501,8 @@ 2A8B9E5D22FF710A00FF8653 /* Cells */ = { isa = PBXGroup; children = ( - 2A8B9E5E22FF712000FF8653 /* DWPayTableViewCell.h */, - 2A8B9E5F22FF712000FF8653 /* DWPayTableViewCell.m */, - 2A8B9E6022FF712000FF8653 /* DWPayTableViewCell.xib */, + 2A8B9E6022FF712000FF8653 /* PayTableViewCell.xib */, + C9F42FA029DA95F5001BC549 /* PayTableViewCell.swift */, ); path = Cells; sourceTree = ""; @@ -3551,11 +3527,9 @@ 2ACCD8562319395000A96B62 /* RequestAmount */, 2A8B9E772302E66100FF8653 /* Models */, 2ACCD85E23193BC200A96B62 /* Views */, - 2A8B9E722302E5ED00FF8653 /* DWReceiveViewController.h */, - 2A8B9E732302E5ED00FF8653 /* DWReceiveViewController.m */, + C9F42FA529DC092B001BC549 /* ReceiveViewController.swift */, 2ACCD86C2319609400A96B62 /* UIViewController+DWShareReceiveInfo.h */, 2ACCD86D2319609400A96B62 /* UIViewController+DWShareReceiveInfo.m */, - 2A8C24B02333659100000D43 /* DWReceiveViewType.h */, ); path = Receive; sourceTree = ""; @@ -3585,10 +3559,8 @@ 2A8DBA772630A6BE009094BD /* ExtendedKeys */ = { isa = PBXGroup; children = ( - 2A8DBA6E2630A609009094BD /* DWExtendedPublicKeysViewController.h */, - 2A8DBA6F2630A609009094BD /* DWExtendedPublicKeysViewController.m */, - 2A8DBA782630A6D6009094BD /* DWExtendedPublicKeysModel.h */, - 2A8DBA792630A6D6009094BD /* DWExtendedPublicKeysModel.m */, + C91E919629FBACE6003E7883 /* ExtendedPublicKeysModel.swift */, + C91E91AD29FFC8A1003E7883 /* ExtendedPublicKeysViewController.swift */, ); path = ExtendedKeys; sourceTree = ""; @@ -3742,7 +3714,6 @@ isa = PBXGroup; children = ( 2A4431C022D4CAC6009BAF7F /* BackupInfo */, - 2A4431B922D4ACAC009BAF7F /* SecureWalletInfo */, 2A4431D822D67592009BAF7F /* Seed */, 2AD1CE9A22DFBA0900C99324 /* VerifiedSuccessfully */, 2AD1CE8122DC9B3900C99324 /* Verify */, @@ -4107,22 +4078,21 @@ path = Protocol; sourceTree = ""; }; - 2AB66E03235722E0007BE825 /* Cells */ = { + 2AB66E03235722E0007BE825 /* Views */ = { isa = PBXGroup; children = ( - 2AB66E0423572358007BE825 /* DWDerivationPathKeysTableViewCell.h */, - 2AB66E0523572358007BE825 /* DWDerivationPathKeysTableViewCell.m */, + C909615429F297DD00002D82 /* DerivationPathKeysCell.swift */, + C909615A29F6535300002D82 /* DerivationPathKeysHeaderView.swift */, ); - path = Cells; + path = Views; sourceTree = ""; }; 2AB66E0723572379007BE825 /* Overview */ = { isa = PBXGroup; children = ( - FB3FF0B3222642FB0059A9A5 /* DWKeysOverviewViewController.h */, - FB3FF0B4222642FB0059A9A5 /* DWKeysOverviewViewController.m */, - 2AB66E00235711FA007BE825 /* DWWalletKeysOverviewModel.h */, - 2AB66E01235711FA007BE825 /* DWWalletKeysOverviewModel.m */, + C909615729F29C7E00002D82 /* Model */, + C909615629F29C7500002D82 /* Cell */, + C9903A5329E6A5F600535A4E /* KeysOverviewViewController.swift */, ); path = Overview; sourceTree = ""; @@ -4131,9 +4101,8 @@ isa = PBXGroup; children = ( 2AB66E0923572572007BE825 /* Models */, - 2AB66E03235722E0007BE825 /* Cells */, - FB3FF0B622264DC60059A9A5 /* DWDerivationPathKeysViewController.h */, - FB3FF0B722264DC60059A9A5 /* DWDerivationPathKeysViewController.m */, + 2AB66E03235722E0007BE825 /* Views */, + C909615029F158D700002D82 /* DerivationPathKeysViewController.swift */, ); path = DerivationPathKeys; sourceTree = ""; @@ -4141,11 +4110,7 @@ 2AB66E0923572572007BE825 /* Models */ = { isa = PBXGroup; children = ( - 2AB66E0A23572587007BE825 /* DWDerivationPathKeysItem.h */, - 2A392766235732E9004E9A96 /* DWDerivationPathKeysModel.h */, - 2A392767235732E9004E9A96 /* DWDerivationPathKeysModel.m */, - 2A8DBAAD2630CC2D009094BD /* DWDerivationPathKeysItemObject.h */, - 2A8DBAAE2630CC2D009094BD /* DWDerivationPathKeysItemObject.m */, + C909615229F28E3700002D82 /* DerivationPathKeysModel.swift */, ); path = Models; sourceTree = ""; @@ -4232,9 +4197,8 @@ 2ACCD85E23193BC200A96B62 /* Views */ = { isa = PBXGroup; children = ( - 2ACCD85F23193BE300A96B62 /* DWReceiveContentView.h */, - 2ACCD86023193BE300A96B62 /* DWReceiveContentView.m */, - 2ACCD86223193C1E00A96B62 /* DWReceiveContentView.xib */, + C9F42FAA29DC1098001BC549 /* ReceiveContentView.swift */, + C9F42FAC29DC115A001BC549 /* ReceiveContentView.xib */, ); path = Views; sourceTree = ""; @@ -5346,7 +5310,6 @@ 471DD1B7290A92CD00E030C8 /* Tools.swift */, 478C983B2945801D00FAA0F0 /* Constants.swift */, 475AE2B82974348F009A1055 /* App.swift */, - 475AE2BA297434CF009A1055 /* Preferences.swift */, ); path = Application; sourceTree = ""; @@ -5732,6 +5695,30 @@ path = Base; sourceTree = ""; }; + C909615629F29C7500002D82 /* Cell */ = { + isa = PBXGroup; + children = ( + C909615829F29C9200002D82 /* KeysOverviewCell.swift */, + ); + path = Cell; + sourceTree = ""; + }; + C909615729F29C7E00002D82 /* Model */ = { + isa = PBXGroup; + children = ( + C909614C29EFF7D600002D82 /* WalletKeysOverviewModel.swift */, + ); + path = Model; + sourceTree = ""; + }; + C9F42FA729DC09C6001BC549 /* Style */ = { + isa = PBXGroup; + children = ( + C9F42FA829DC09CF001BC549 /* Style.swift */, + ); + path = Style; + sourceTree = ""; + }; EBFC2EA47915CD4F5BA81564 /* Pods */ = { isa = PBXGroup; children = ( @@ -6037,23 +6024,24 @@ 474C720F298A1A3E00475CA6 /* TxDetailTaxCategoryCell.xib in Resources */, 2ADC722923B5547000D9DD37 /* Localizable.stringsdict in Resources */, 2A2CD71822F99CAE008C7BC9 /* ShortcutsView.xib in Resources */, + C9F067F429E543630022D958 /* HomeBalanceView.xib in Resources */, 2A5E4549243E06E7006BA067 /* DWDPRegistrationStatusTableViewCell.xib in Resources */, 474C7213298A1EFC00475CA6 /* TxDetailInfoCell.xib in Resources */, 2A9FFE942230FF4700956D5F /* UpholdOTPStoryboard.storyboard in Resources */, 2A4430F222CBD57A009BAF7F /* AppAssets.xcassets in Resources */, - 2A8B9E6222FF712000FF8653 /* DWPayTableViewCell.xib in Resources */, + 2A8B9E6222FF712000FF8653 /* PayTableViewCell.xib in Resources */, 75E83CF61B5F997A0038FB70 /* coinflip.aiff in Resources */, 2ADF83FF23633116008459A7 /* SharedAssets.xcassets in Resources */, 2A4431C522D4CAFA009BAF7F /* BackupInfo.storyboard in Resources */, 2A4E531A22EA382B00E5168A /* DWSyncView.xib in Resources */, 2A4E535522F1D0D900E5168A /* DWTxListTableViewCell.xib in Resources */, + C9F42FB629DD8702001BC549 /* BackupInfoItemView.xib in Resources */, 47AE8BB028BFF28700490F5E /* explore.db in Resources */, 2A0C69F423179C0F001B8C90 /* DWConfirmPaymentContentView.xib in Resources */, 0F36937F2919A70B007F4E91 /* Coinbase.storyboard in Resources */, - 2ACCD86323193C1E00A96B62 /* DWReceiveContentView.xib in Resources */, - 2A307CB822E7006F00A18347 /* DWBalanceView.xib in Resources */, C3DAD2C9247538AA0001624F /* DWTitleActionHeaderView.xib in Resources */, 2A10EB3E2358BDA500C38B61 /* ImportWalletInfo.storyboard in Resources */, + C9F42FAD29DC115A001BC549 /* ReceiveContentView.xib in Resources */, 2AD1CE8622DC9B7300C99324 /* VerifySeedPhrase.storyboard in Resources */, 2A7F3B21238C653000DEA3EF /* DWSecurityStatusView.xib in Resources */, 2AB7C907234DB82700A56795 /* About.storyboard in Resources */, @@ -6077,7 +6065,6 @@ 2A811559269CE09300215F81 /* uphold-logout.jpg in Resources */, 2ACCD865231959CD00A96B62 /* AmountPreviewView.xib in Resources */, 474C7215298A1FCF00475CA6 /* TxDetailActionCell.xib in Resources */, - 2A4431BE22D4ACDB009BAF7F /* SecureWalletInfo.storyboard in Resources */, 47083B3829893F4B0010AF71 /* CNCreateAccountCell.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -6413,9 +6400,9 @@ 11B8449628F5B9F80082770C /* CrowdNodeResponse.swift in Sources */, 47AE8BB228BFF61A00490F5E /* FileManager+DashWallet.swift in Sources */, 47AE8BF228C1306000490F5E /* PointOfUseItemCell.swift in Sources */, - 2A392768235732E9004E9A96 /* DWDerivationPathKeysModel.m in Sources */, 47083B3229892D770010AF71 /* DSTransaction+DashWallet.swift in Sources */, 2AE8B66423CF09000016F221 /* DWConfirmUsernameViewController.m in Sources */, + C9F42F9F29DA82E5001BC549 /* PayableViewController.swift in Sources */, 47AE8C1528C6378E00490F5E /* HairlineView.swift in Sources */, 2A913E9523A3F75F006A2A59 /* DWInitialViewController.m in Sources */, 4751136C28D9A3DB00223B77 /* PortalViewController.swift in Sources */, @@ -6430,8 +6417,8 @@ 2A1B7DC323266C8400BA8C6A /* DWHomeViewController+DWSecureWalletDelegateImpl.m in Sources */, 2AEC5CB52493D87D00F4A689 /* DWNotificationsProvider.m in Sources */, 2A9FFF2A2233E60F00956D5F /* DWUpholdAccountObject.m in Sources */, - 2A4431BC22D4ACCD009BAF7F /* DWSecureWalletInfoViewController.m in Sources */, 2A9FFE812230FF4700956D5F /* DWFormTableViewController.m in Sources */, + C909614D29EFF7D600002D82 /* WalletKeysOverviewModel.swift in Sources */, 4751137528DAF28800223B77 /* UIAssembly.swift in Sources */, 47AE8BAD28BFAE6700490F5E /* DWLocationManager.swift in Sources */, 47AE8BF428C1306000490F5E /* FetchingNextPageCell.swift in Sources */, @@ -6446,6 +6433,7 @@ 2ACD53EE234C9D8E00650AD3 /* UIView+DWRecursiveSubview.m in Sources */, 2A9CEBA822E1D5A200A50237 /* DWMainTabbarViewController.m in Sources */, 11860923297598B400279FCC /* AddressStatus.swift in Sources */, + C91E919729FBACE6003E7883 /* ExtendedPublicKeysModel.swift in Sources */, 4751CAD5297024EA00F63AC4 /* OrderPreviewViewController.swift in Sources */, 478C982F294305D800FAA0F0 /* ActivePaymentMethodView.swift in Sources */, 47CDEEC72949DC38008AE06D /* BasicInfoController.swift in Sources */, @@ -6458,6 +6446,7 @@ 479DBDDD2995168C00F30AF1 /* Transactions.swift in Sources */, 2A74EFFB2305464C00C475EB /* DWRecoverTextView.m in Sources */, 4709C315287EA11900B4BD48 /* TxUserInfo.swift in Sources */, + C91E91AE29FFC8A1003E7883 /* ExtendedPublicKeysViewController.swift in Sources */, 2A7AF3182480E35A001D74F9 /* DWContactsFetchedDataSource.m in Sources */, 47AE8BFE28C1306000490F5E /* AtmListViewController.swift in Sources */, 47A514602848F75B005A8E3E /* TxDetailViewController.swift in Sources */, @@ -6468,6 +6457,7 @@ 2A4431E622D73617009BAF7F /* DWSeedPhraseTitledView.m in Sources */, 2A7AF38924829AF2001D74F9 /* UICollectionView+DWDPItemDequeue.m in Sources */, 119E8D0C2907C61400D406C1 /* CrowdNodeTopUpTx.swift in Sources */, + C9F42FB429DD86FB001BC549 /* BackupInfoItemView.swift in Sources */, C3DAD2D52476886D0001624F /* DWContactsSearchInfoHeaderView.m in Sources */, 118A1393291AA21B002641E4 /* AccountCreatingController.swift in Sources */, 2A4E534422F02BC300E5168A /* UIView+DWReuseHelper.m in Sources */, @@ -6484,13 +6474,10 @@ 2A9FFEA12230FF4700956D5F /* DWUpholdMainViewController.m in Sources */, 2A7AF36324825A0C001D74F9 /* DWDPUserObject.m in Sources */, BAA4843C1B3EFFAF0075C749 /* UIImage+Utils.m in Sources */, - 475AE2BB297434CF009A1055 /* Preferences.swift in Sources */, 47083B3629893E700010AF71 /* CNCreateAccountCell.swift in Sources */, - 2A8DBA7A2630A6D6009094BD /* DWExtendedPublicKeysModel.m in Sources */, 2A4430EE22CBBAC9009BAF7F /* DWSetupViewController.m in Sources */, 47AE8BAB28BFAE5800490F5E /* ExploreDatabaseConnection.swift in Sources */, 111C3C4C296C51B500788E18 /* WithdrawalLimitsController.swift in Sources */, - 2A8B9E742302E5ED00FF8653 /* DWReceiveViewController.m in Sources */, 0F6EDFCD28C896BD000427E7 /* CoinbaseTransactionResponse.swift in Sources */, 2A7AF3152480DA51001D74F9 /* DWIncomingFetchedDataSource.m in Sources */, 4709C31F28818BAE00B4BD48 /* TxDetailModel.swift in Sources */, @@ -6518,9 +6505,8 @@ 2A0C69EB2316B344001B8C90 /* DWConfirmPaymentViewController.m in Sources */, 2A7AF3402481A1B2001D74F9 /* DWDPGenericItemView.m in Sources */, 4774DCDB28F3FA9C008CF87D /* Coinbase.swift in Sources */, + C9F42FAB29DC1098001BC549 /* ReceiveContentView.swift in Sources */, 47838B7528FFD1D10003E8AB /* AmountView.swift in Sources */, - 2ACCD86123193BE300A96B62 /* DWReceiveContentView.m in Sources */, - 2AB66E0623572358007BE825 /* DWDerivationPathKeysTableViewCell.m in Sources */, 4759D512292FD6F3002F20DC /* DWBasePayViewController.m in Sources */, 2A12E61923ABC7D3001CAF58 /* DWDemoMainTabbarViewController.m in Sources */, 1193FF3629602835004EA8D7 /* CrowdNodeTransferModel.swift in Sources */, @@ -6537,6 +6523,7 @@ 2A4431DB22D675CD009BAF7F /* DWPreviewSeedPhraseViewController.m in Sources */, 110D1781298BA9AF005BEB30 /* WKWebView+CrowdNode.swift in Sources */, 47FA3AFF29350929008D58DC /* SyncingActivityMonitor.swift in Sources */, + C9F42FB029DC27F4001BC549 /* EmptyView.swift in Sources */, 2AFCB9BE23BE3C0800FF59A6 /* DWConfirmSendPaymentViewController.m in Sources */, 2AC92C8A1FEB0B8B008CAEE0 /* DWQRScanModel.m in Sources */, 2A3DC87123972331004B3DBA /* DWHomeViewController+DWImportPrivateKeyDelegateImpl.m in Sources */, @@ -6581,7 +6568,6 @@ 4751CAC4296EFE9500F63AC4 /* AccountListModel.swift in Sources */, 2A7AF380248280CE001D74F9 /* DWDPSearchItemsFactory.m in Sources */, 2A3DC86E239717C2004B3DBA /* DWRecoverWalletCommand.m in Sources */, - 2AB66E02235711FA007BE825 /* DWWalletKeysOverviewModel.m in Sources */, 2A9FFE832230FF4700956D5F /* DWSwitcherFormTableViewCell.m in Sources */, 2A0C699C23104588001B8C90 /* DWPaymentInput.m in Sources */, 2AE9549D23D0C4F4003612B3 /* DWBaseContactsViewController.m in Sources */, @@ -6622,6 +6608,7 @@ 4708119F2990F56F003FCA3D /* TransactionDataItem.swift in Sources */, 2A44314322CF80D9009BAF7F /* DWSetPinModel.m in Sources */, 2AD1CE8D22DCB3B600C99324 /* DWVerifySeedPhraseModel.m in Sources */, + C9F42FA629DC092B001BC549 /* ReceiveViewController.swift in Sources */, 118B7A3F29865A3A00FBB6CC /* ConfirmationTransactionQRController.swift in Sources */, 2ADB396924223D9B00A6F898 /* DWDashPayAnimationView.m in Sources */, 2AEC5CBE24940EC200F4A689 /* DWDPOutgoingRequestNotificationObject.m in Sources */, @@ -6645,6 +6632,7 @@ 2AE2F0F9245C16C8001DD722 /* DWUserProfileViewController.m in Sources */, 2A0C69D723143B2F001B8C90 /* DWBaseModalViewController.m in Sources */, 2A7A7BD02348A34800451078 /* DWSecurityMenuModel.m in Sources */, + C909615929F29C9200002D82 /* KeysOverviewCell.swift in Sources */, 2ACCD86E2319609400A96B62 /* UIViewController+DWShareReceiveInfo.m in Sources */, 114D16B829828BCC009A124C /* OnlineAccountConfirmationController.swift in Sources */, 47838B8C29068F110003E8AB /* BaseResponse.swift in Sources */, @@ -6656,7 +6644,6 @@ 2A44311722CBF0B2009BAF7F /* UIFont+DWFont.m in Sources */, 47E94B97296D7D5B000FE68E /* CustodialSwapsViewController.swift in Sources */, 2A392568234CFE9D00316EA6 /* NSAttributedString+DWHighlightText.m in Sources */, - 2A8B9E5A22FF6FBD00FF8653 /* DWPayViewController.m in Sources */, 4751136F28D9B50E00223B77 /* CoinbaseInfoViewController.swift in Sources */, 2A9FFE7E2230FF4600956D5F /* DWSelectorFormCellModel.m in Sources */, FB2E5537218BA161003A1B7C /* DWVersionManager.m in Sources */, @@ -6669,7 +6656,6 @@ 111B8C00299BD973004A4129 /* WithdrawalConfirmationController.swift in Sources */, 2A7A7BC92347E0D700451078 /* DWBaseFormTableViewCell.m in Sources */, 4751CAC7296FAEBB00F63AC4 /* AccountCell.swift in Sources */, - 2A307CB622E7006600A18347 /* DWBalanceView.m in Sources */, 2A913EA823A79AD2006A2A59 /* DWTransactionListDataProviderStub.m in Sources */, 2A885FD02449F37A00B9F679 /* DWUserSearchModel.m in Sources */, 2A7AF3502482374D001D74F9 /* DWDPBasicCell.m in Sources */, @@ -6684,6 +6670,7 @@ 2A7AF31C2480E6AD001D74F9 /* DWNotificationsModel.m in Sources */, 2A9FFF192233E56E00956D5F /* DWIntrinsicTableView.m in Sources */, 2A913E6623A11DFE006A2A59 /* DWURLActions.m in Sources */, + C9903A5429E6A5F600535A4E /* KeysOverviewViewController.swift in Sources */, 47CF469F296540E40067B6EE /* AccountRepository.swift in Sources */, 2A8B9E2922FB1C5D00FF8653 /* DWSharedUIConstants.m in Sources */, 2A858A12237EE89C0097A7B5 /* BRAppleWatchTransactionData.m in Sources */, @@ -6730,7 +6717,6 @@ 2AFF01E5243F8626003718DC /* DWDPRegistrationDoneTableViewCell.m in Sources */, 47AE8BA628BFADD900490F5E /* AtmDAO.swift in Sources */, 475AE2B92974348F009A1055 /* App.swift in Sources */, - 2A4431CC22D5279A009BAF7F /* DWBackupInfoHeaderView.m in Sources */, 2A0C69A3231048DA001B8C90 /* DWPaymentProcessor.m in Sources */, 2A7AF32824814A17001D74F9 /* DWNotificationsData.m in Sources */, 114CFED2296489CD005F421B /* MinimumDepositBanner.swift in Sources */, @@ -6753,6 +6739,7 @@ 47A2A2EC293E618600938DB7 /* CBUser.swift in Sources */, 2A307CBC22E8925100A18347 /* DWHomeView.m in Sources */, 47A2A2EE293E622700938DB7 /* CBSecureTokenService.swift in Sources */, + C9F42FA129DA95F5001BC549 /* PayTableViewCell.swift in Sources */, C3DAD2C8247538AA0001624F /* DWTitleActionHeaderView.m in Sources */, 2ACCA3B524BF280A00DB32DE /* DWDPTxObject.m in Sources */, 0F71317728F436920072F454 /* ServiceOverviewTableCell.swift in Sources */, @@ -6760,7 +6747,6 @@ 47838B87290670630003E8AB /* CoinbaseEntryPointViewController.swift in Sources */, 2AD1CE8022DC92BF00C99324 /* NSString+DWTextSize.m in Sources */, 47AE8C0528C1F74A00490F5E /* PointOfUseListFiltersCell.swift in Sources */, - 2A4431C322D4CAEA009BAF7F /* DWBackupInfoViewController.m in Sources */, 47081199298CF57D003FCA3D /* TransactionListDataSource.swift in Sources */, 2A5BD5952451DCAF00688A8D /* DWAllowedCharactersUsernameValidationRule.m in Sources */, 2A7A7BB22347927700451078 /* DWMainMenuViewController.m in Sources */, @@ -6783,6 +6769,7 @@ 11AE3DD62997AA36000856EE /* MessageStatus.swift in Sources */, 2AD1CEAB22E18F1800C99324 /* DWGlobalOptions.m in Sources */, 2A4430E722CBB6EC009BAF7F /* AppDelegate.m in Sources */, + C917023F29D44E0B008C034D /* SendReceivePageController.swift in Sources */, 2A7A7BD92348CB7300451078 /* DWSettingsMenuModel.m in Sources */, 2A80F3D924DC55CD003E3B1E /* DWUserProfileSendRequestCell.m in Sources */, 478A2C7228DC909C00AD1420 /* BaseNavigationController.swift in Sources */, @@ -6790,12 +6777,10 @@ 2A5BD59E2451F39500688A8D /* DWCheckExistenceUsernameValidationRule.m in Sources */, 472D13E1299E1F2F006903F1 /* CSVBuilder.swift in Sources */, 2A5E4548243E06E7006BA067 /* DWDPRegistrationStatusTableViewCell.m in Sources */, - FB3FF0B5222642FB0059A9A5 /* DWKeysOverviewViewController.m in Sources */, 0F6EDFC428C896BD000427E7 /* CoinbaseUserAuthInformation.swift in Sources */, 2A913EB623A7E145006A2A59 /* DWTransactionStub.m in Sources */, 118C05B829928F7800717E65 /* OnlineAccountEmailController.swift in Sources */, 2A74EFE92305264200C475EB /* DWBaseActionButtonViewController.m in Sources */, - FB3FF0B822264DC60059A9A5 /* DWDerivationPathKeysViewController.m in Sources */, 0F6EDFC828C896BD000427E7 /* CoinbasePaymentMethodsResponse.swift in Sources */, 2A913E8C23A3134E006A2A59 /* UIView+DWEmbedding.m in Sources */, 2A6300492328EA8900827825 /* DWLockActionButton.m in Sources */, @@ -6803,6 +6788,7 @@ 4759D51729300212002F20DC /* ProvideAmountViewController.swift in Sources */, 2AD1CE7722DB51B500C99324 /* DWCheckbox.m in Sources */, 2ACCD8592319399100A96B62 /* DWRequestAmountViewController.m in Sources */, + C909615329F28E3700002D82 /* DerivationPathKeysModel.swift in Sources */, 2A74EFF52305333000C475EB /* DWSeedUIConstants.m in Sources */, 2A0C69B32312E8A0001B8C90 /* DWWindow.m in Sources */, 472D13E3299E23B7006903F1 /* BalanceNotifier.swift in Sources */, @@ -6814,7 +6800,6 @@ 2A0C69E323155A0E001B8C90 /* DWModalContentView.m in Sources */, 2A9FFE042230FF2B00956D5F /* DWUpholdConstants.m in Sources */, 2A5BD5982451DD0700688A8D /* DWMaxLengthUsernameValidationRule.m in Sources */, - 2A8B9E6122FF712000FF8653 /* DWPayTableViewCell.m in Sources */, 0F6EDFC728C896BD000427E7 /* CoinbaseSwapeTradeResponse.swift in Sources */, 2AC92C871FEB0AE8008CAEE0 /* DWQRScanView.m in Sources */, 4774DCDF28F43AB4008CF87D /* ServiceItem.swift in Sources */, @@ -6838,7 +6823,6 @@ 2A8B9E5622FEDF2900FF8653 /* DWControllerCollectionView.m in Sources */, 2A9FFDF52230FF1A00956D5F /* SFSafariViewController+DashWallet.m in Sources */, 2AD6E54D2487CE0100B52F14 /* DWContactsDataSourceObject.m in Sources */, - 2A8DBA702630A609009094BD /* DWExtendedPublicKeysViewController.m in Sources */, 2A6B8E542387056200A2E5FA /* DWBalanceDisplayOptions.m in Sources */, 474C7218298A422500475CA6 /* TransactionItemView.swift in Sources */, 474C7211298A1A9500475CA6 /* UIView+Reuse.swift in Sources */, @@ -6854,6 +6838,7 @@ 2A8B9E6822FFE4CC00FF8653 /* DWPayOptionModel.m in Sources */, 2A7AF36924826681001D74F9 /* DWDPRespondedIncomingRequestObject.m in Sources */, 0F6EDFC928C896BD000427E7 /* CoinbaseTokenResponse.swift in Sources */, + C9F42FB229DD5141001BC549 /* BackupInfoViewController.swift in Sources */, 2A1AE79223F468CD00179A6E /* DWPlanetarySystemView.m in Sources */, 47C6E6E5291A68B6003FEDF2 /* AppliedFiltersView.swift in Sources */, 2A7A7BAE234770C900451078 /* DWCaptureSessionManager.m in Sources */, @@ -6868,6 +6853,7 @@ 47A50F3B2913BC0900C70123 /* TransferAmountModel.swift in Sources */, 47305870295AD62B004641DA /* NavigationBarAppearanceCustomizable.swift in Sources */, 471DD1B6290A901200E030C8 /* AmountObject.swift in Sources */, + C909615129F158D700002D82 /* DerivationPathKeysViewController.swift in Sources */, 4709C31E2880247C00B4BD48 /* DSTransaction+DashWallet.m in Sources */, 2A74F0072305C60B00C475EB /* DWHomeViewController+DWJailbreakCheck.m in Sources */, 2A7A7C1D234B771400451078 /* DWLocalCurrencyModel.m in Sources */, @@ -6875,6 +6861,8 @@ FB8ACEB622E0502200EE5035 /* DWUpholdMainnetConstants.m in Sources */, 2A885FCC2449F08700B9F679 /* DWUserSearchResultViewController.m in Sources */, 2A7AF34C24823315001D74F9 /* DWDPGenericStatusItemView.m in Sources */, + C9F42FA929DC09CF001BC549 /* Style.swift in Sources */, + C917024129D462C6008C034D /* PayViewController.swift in Sources */, 479E7924287C00EC00D0F7D7 /* DatabaseConnection.swift in Sources */, 2A9FFE822230FF4700956D5F /* DWSwitcherFormCellModel.m in Sources */, 2A74EFF823053ECE00C475EB /* DWIntrinsicTextView.m in Sources */, @@ -6900,6 +6888,7 @@ 478C98372943A60000FAA0F0 /* PaymentMethodCell.swift in Sources */, 2AD6E5572487D8C000B52F14 /* DWContactsContentViewController.m in Sources */, 47EEE23B293F041E00049E0B /* CBUserManager.swift in Sources */, + C909615B29F6535300002D82 /* DerivationPathKeysHeaderView.swift in Sources */, 4751CAD02970224D00F63AC4 /* ConvertCryptoOrderPreviewModel.swift in Sources */, C3DAD2CC24757A210001624F /* DWContactsSearchDataSourceObject.m in Sources */, 47A2E3A92972B15F0032A63B /* RatesProvider.swift in Sources */, @@ -6927,7 +6916,6 @@ 47E4F7C7297596D9006BEA68 /* DSChain+DashWallet.m in Sources */, 1193FF3B2961960B004EA8D7 /* FromLabel.swift in Sources */, 2A9172D325233F4F0024B4C5 /* DWPhraseRepairChildViewController.m in Sources */, - 2A8B9E3B22FC817100FF8653 /* DWPaymentsViewController.m in Sources */, 11B8449A28F6D5480082770C /* SingleInputAddressSelector.swift in Sources */, 0F6EDFCF28C896BD000427E7 /* CoinbaseAccountAddress.swift in Sources */, 2A7A7BBE2347950700451078 /* DWMainMenuTableViewCell.m in Sources */, @@ -6951,11 +6939,13 @@ 47EE17192959CDC200BA1986 /* ColorizedText.swift in Sources */, 2A7AF37B2482756D001D74F9 /* DWDPPendingRequestObject.m in Sources */, 2A80F39524D86201003E3B1E /* DWModalUserProfileViewController.m in Sources */, + C9F42FA429DBC6E5001BC549 /* PaymentsViewController.swift in Sources */, 2A7AF3832482954C001D74F9 /* DWDPContactsItemsFactory.m in Sources */, 4774DCDD28F43A68008CF87D /* ServiceDataSource.swift in Sources */, 2A913E8523A309EA006A2A59 /* DWSyncModelStub.m in Sources */, 47838B7A2900196F0003E8AB /* ConverterView.swift in Sources */, 2A0C69CA23142E11001B8C90 /* DWModalBaseAnimation.m in Sources */, + C9F42FB829DFC507001BC549 /* SpendableTransaction.swift in Sources */, 11ED906B29681773003784F9 /* StakingInfoDialogController.swift in Sources */, 2AE8B64123CDB98A0016F221 /* DWCreateUsernameViewController.m in Sources */, 0F36937E2919A5DB007F4E91 /* TwoFactorAuthViewController.swift in Sources */, @@ -6976,16 +6966,16 @@ 2A1F6415238FEEA900A9B505 /* DWAdvancedSecurityModel.m in Sources */, 47AE8BF828C1306000490F5E /* AtmDataProvider.swift in Sources */, 110C67952921147F006B580C /* GettingStartedViewController.swift in Sources */, - 1148CED529D57E0200D0C136 /* SpendableTransaction.swift in Sources */, 477A963E292CD27D0013605B /* NetworkUnavailableView.swift in Sources */, - 2A8DBAAF2630CC2D009094BD /* DWDerivationPathKeysItemObject.m in Sources */, 2A7A7BE72348E9AA00451078 /* DWBorderedActionButton.m in Sources */, 2A63004E2328F37C00827825 /* DWLockScreenViewController.m in Sources */, 4789D2312981069700BAFEFA /* UpholdTransferViewController.swift in Sources */, 2AD1CE8422DC9B5D00C99324 /* DWVerifySeedPhraseViewController.m in Sources */, + C909615529F297DD00002D82 /* DerivationPathKeysCell.swift in Sources */, 474C721D298B65C100475CA6 /* Cells.swift in Sources */, 2A913E9823A400D3006A2A59 /* DWContainerViewController.m in Sources */, 47B30D7A290D035B0080C326 /* DashTextAttachment.swift in Sources */, + C9F067F229E4576D0022D958 /* HomeBalanceView.swift in Sources */, 47838B82290271170003E8AB /* PointOfUseListFiltersModel.swift in Sources */, 4751CAD92970509600F63AC4 /* ConvertCryptoOrderPreviewViews.swift in Sources */, 2A8F422021BEFEEA00858B91 /* DWAboutModel.m in Sources */, @@ -7448,7 +7438,7 @@ INFOPLIST_KEY_CFBundleDisplayName = Dash; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; @@ -7506,7 +7496,7 @@ INFOPLIST_KEY_CFBundleDisplayName = Dash; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "DashWallet/dashwallet-Bridging-Header.h"; @@ -7591,7 +7581,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -7613,7 +7603,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -7630,11 +7620,11 @@ buildSettings = { CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; - ENABLE_BITCODE = YES; + ENABLE_BITCODE = NO; EXCLUDED_ARCHS = ""; INFOPLIST_FILE = "WatchApp Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -7653,11 +7643,11 @@ buildSettings = { CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; - ENABLE_BITCODE = YES; + ENABLE_BITCODE = NO; EXCLUDED_ARCHS = ""; INFOPLIST_FILE = "WatchApp Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -7685,7 +7675,7 @@ INFOPLIST_FILE = TodayExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -7710,7 +7700,7 @@ INFOPLIST_FILE = TodayExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -7827,7 +7817,7 @@ INFOPLIST_KEY_CFBundleDisplayName = Dash; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "DashWallet/dashwallet-Bridging-Header.h"; @@ -7855,7 +7845,7 @@ INFOPLIST_FILE = TodayExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -7907,7 +7897,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -7924,11 +7914,11 @@ buildSettings = { CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; - ENABLE_BITCODE = YES; + ENABLE_BITCODE = NO; EXCLUDED_ARCHS = ""; INFOPLIST_FILE = "WatchApp Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; @@ -8044,7 +8034,7 @@ INFOPLIST_KEY_CFBundleDisplayName = Dash; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "DashWallet/dashwallet-Bridging-Header.h"; @@ -8071,7 +8061,7 @@ INFOPLIST_FILE = TodayExtension/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 14.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.TodayExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -8122,7 +8112,7 @@ EXCLUDED_ARCHS = ""; IBSC_MODULE = WatchApp_Extension; INFOPLIST_FILE = WatchApp/Info.plist; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp; PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = watchos; @@ -8139,11 +8129,11 @@ buildSettings = { CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 44RJ69WHFF; - ENABLE_BITCODE = YES; + ENABLE_BITCODE = NO; EXCLUDED_ARCHS = ""; INFOPLIST_FILE = "WatchApp Extension/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @executable_path/../../Frameworks"; - MARKETING_VERSION = 6.3.2; + MARKETING_VERSION = 6.3.3; PRODUCT_BUNDLE_IDENTIFIER = org.dashfoundation.dash.watchkitapp.watchkitextension; PRODUCT_NAME = "${TARGET_NAME}"; SDKROOT = watchos; diff --git a/DashWallet.xcodeproj/xcshareddata/xcschemes/DashWalletScreenshotsUITests.xcscheme b/DashWallet.xcodeproj/xcshareddata/xcschemes/DashWalletScreenshotsUITests.xcscheme index 2e5d93769..d0856941d 100644 --- a/DashWallet.xcodeproj/xcshareddata/xcschemes/DashWalletScreenshotsUITests.xcscheme +++ b/DashWallet.xcodeproj/xcshareddata/xcschemes/DashWalletScreenshotsUITests.xcscheme @@ -1,6 +1,6 @@ diff --git a/DashWallet.xcodeproj/xcshareddata/xcschemes/WatchApp Extension.xcscheme b/DashWallet.xcodeproj/xcshareddata/xcschemes/WatchApp Extension.xcscheme index 43688c233..f34e01398 100644 --- a/DashWallet.xcodeproj/xcshareddata/xcschemes/WatchApp Extension.xcscheme +++ b/DashWallet.xcodeproj/xcshareddata/xcschemes/WatchApp Extension.xcscheme @@ -1,6 +1,6 @@ (type: T.Type, for indexPath: IndexPath) -> T { dequeueReusableCell(withIdentifier: T.reuseIdentifier, for: indexPath) as! T } + + func registerClassforHeaderFooterView(for type: T.Type) { + register(T.self, forHeaderFooterViewReuseIdentifier: T.reuseIdentifier) + } + + func dequeueReusableHeaderFooterView(type: T.Type) -> T { + dequeueReusableHeaderFooterView(withIdentifier: T.reuseIdentifier) as! T + } } diff --git a/DashWallet/Sources/Foundation/DashTextAttachment.swift b/DashWallet/Sources/Foundation/DashTextAttachment.swift index 1699f8bfe..4984a5c3c 100644 --- a/DashWallet/Sources/Foundation/DashTextAttachment.swift +++ b/DashWallet/Sources/Foundation/DashTextAttachment.swift @@ -36,9 +36,9 @@ final class DashTextAttachment: NSTextAttachment { characterIndex charIndex: Int) -> CGRect { guard let imageSize = image?.size else { return .zero } - let height = lineFrag.size.height - 10 + let height = lineFrag.size.height * 0.6 let scale = height/imageSize.height - return CGRect(x: 0, y: -1, width: imageSize.width*scale, height: height); + return CGRect(x: 0, y: 0, width: imageSize.width*scale, height: height); } } diff --git a/DashWallet/Sources/Models/Explore Dash/ExploreDash.swift b/DashWallet/Sources/Models/Explore Dash/ExploreDash.swift index 0283d00da..eabb4733b 100644 --- a/DashWallet/Sources/Models/Explore Dash/ExploreDash.swift +++ b/DashWallet/Sources/Models/Explore Dash/ExploreDash.swift @@ -124,11 +124,15 @@ public class ExploreDash { } try FileManager.default.copyItem(at: dbURL, to: destinationPath) + + ExploreDatabaseSyncManager.share.exploreDatabaseLastVersion = bundleExploreDatabaseSyncTime + ExploreDatabaseSyncManager.share.exploreDatabaseLastSyncTimestamp = bundleExploreDatabaseSyncTime } private func removeCurrentDatabaseIfNeeded() { let destinationPath = FileManager.documentsDirectoryURL.appendingPathComponent(kExploreDashDatabaseName) var isDirectory: ObjCBool = true + guard FileManager.default.fileExists(atPath: destinationPath.path, isDirectory: &isDirectory) else { return } /// Remove if it's a dirrectory diff --git a/DashWallet/Sources/Models/Explore Dash/Services/ExploreDatabaseSyncManager.swift b/DashWallet/Sources/Models/Explore Dash/Services/ExploreDatabaseSyncManager.swift index effe8368b..3f57025e8 100644 --- a/DashWallet/Sources/Models/Explore Dash/Services/ExploreDatabaseSyncManager.swift +++ b/DashWallet/Sources/Models/Explore Dash/Services/ExploreDatabaseSyncManager.swift @@ -28,7 +28,7 @@ private let timestampKey = "Data-Timestamp" private let checksumKey = "Data-Checksum" // TODO: Move it to plist and note in release process -let bundleExploreDatabaseSyncTime: TimeInterval = 1680366718508/1000 +let bundleExploreDatabaseSyncTime: TimeInterval = 1682958684916/1000 // MARK: - ExploreDatabaseSyncManager diff --git a/DashWallet/Sources/Models/Taxes/Address/DAO/AddressUserInfoDAO.swift b/DashWallet/Sources/Models/Taxes/Address/DAO/AddressUserInfoDAO.swift index 2426c799b..d1e0db27f 100644 --- a/DashWallet/Sources/Models/Taxes/Address/DAO/AddressUserInfoDAO.swift +++ b/DashWallet/Sources/Models/Taxes/Address/DAO/AddressUserInfoDAO.swift @@ -39,10 +39,10 @@ class AddressUserInfoDAOImpl: NSObject, AddressUserInfoDAO { @objc func create(dto: AddressUserInfo) { do { - let userInfo = AddressUserInfo.table.insert(or: .replace, AddressUserInfo.addressColumn <- dto.address, + let userInfo = AddressUserInfo.table.insert(or: .replace, + AddressUserInfo.addressColumn <- dto.address, AddressUserInfo.txCategoryColumn <- dto.taxCategory.rawValue) try db.run(userInfo) - } catch { print(error) } diff --git a/DashWallet/Sources/Models/Taxes/Services/TaxReportGenerator.swift b/DashWallet/Sources/Models/Taxes/Services/TaxReportGenerator.swift index 5e5a58359..a8ac448f4 100644 --- a/DashWallet/Sources/Models/Taxes/Services/TaxReportGenerator.swift +++ b/DashWallet/Sources/Models/Taxes/Services/TaxReportGenerator.swift @@ -63,7 +63,10 @@ enum TaxReportGenerator { DispatchQueue.global(qos: .default).async { let transactions = transactions - let userInfos = TxUserInfoDAOImpl.shared.dictionaryOfAllItems() + let userInfosArray = TxUserInfoDAOImpl().all() + let userInfos = userInfosArray.reduce(into: [Data: TxUserInfo]()) { partialResult, dto in + partialResult[dto.txHash] = dto + } let csv = CSVBuilder() .set(columns: ReportColumns.allCases) diff --git a/DashWallet/Sources/Models/Taxes/Taxes.swift b/DashWallet/Sources/Models/Taxes/Taxes.swift index da57a6640..c4d3af5e2 100644 --- a/DashWallet/Sources/Models/Taxes/Taxes.swift +++ b/DashWallet/Sources/Models/Taxes/Taxes.swift @@ -53,14 +53,6 @@ class Taxes: NSObject { var addressesUserInfos: AddressUserInfoDAO = AddressUserInfoDAOImpl() var txUserInfos: TxUserInfoDAO = TxUserInfoDAOImpl.shared - @objc - func initialize() { - DispatchQueue.main.async { - // Prefetch all items - let _ = self.addressesUserInfos.all() - } - } - @objc func mark(address: String, with taxCategory: TxUserInfoTaxCategory) { addressesUserInfos.create(dto: AddressUserInfo(address: address, taxCategory: taxCategory)) diff --git a/DashWallet/Sources/Models/Taxes/Tx/DAO/TxUserInfoDAO.swift b/DashWallet/Sources/Models/Taxes/Tx/DAO/TxUserInfoDAO.swift index cc3f31ee8..55dc32497 100644 --- a/DashWallet/Sources/Models/Taxes/Tx/DAO/TxUserInfoDAO.swift +++ b/DashWallet/Sources/Models/Taxes/Tx/DAO/TxUserInfoDAO.swift @@ -23,7 +23,6 @@ import SQLite protocol TxUserInfoDAO { func create(dto: TxUserInfo) func get(by hash: Data) -> TxUserInfo? - func all() -> [TxUserInfo] func update(dto: TxUserInfo) func delete(dto: TxUserInfo) func deleteAll() @@ -31,12 +30,12 @@ protocol TxUserInfoDAO { // MARK: - TxUserInfoDAOImpl -@objc class TxUserInfoDAOImpl: NSObject, TxUserInfoDAO { private var db: Connection { DatabaseConnection.shared.db } private var cache: [Data: TxUserInfo] = [:] - @objc + private let queue = DispatchQueue(label: "org.dash.infrastructure.queue.tx-user-info-dao", attributes: .concurrent) + func create(dto: TxUserInfo) { do { let txUserInfo = TxUserInfo.table.insert(or: .replace, @@ -51,10 +50,11 @@ class TxUserInfoDAOImpl: NSObject, TxUserInfoDAO { print(error) } - cache[dto.txHash] = dto + queue.async(flags: .barrier) { [weak self] in + self?.cache[dto.txHash] = dto + } } - @objc func all() -> [TxUserInfo] { let txUserInfos = TxUserInfo.table @@ -63,7 +63,6 @@ class TxUserInfoDAOImpl: NSObject, TxUserInfoDAO { do { for txInfo in try db.prepare(txUserInfos) { let userInfo = TxUserInfo(row: txInfo) - cache[userInfo.txHash] = userInfo userInfos.append(userInfo) } } catch { @@ -73,9 +72,8 @@ class TxUserInfoDAOImpl: NSObject, TxUserInfoDAO { return userInfos } - @objc func get(by hash: Data) -> TxUserInfo? { - if let cached = cache[hash] { + if let cached = cachedValue(by: hash) { return cached } @@ -84,7 +82,9 @@ class TxUserInfoDAOImpl: NSObject, TxUserInfoDAO { do { for txInfo in try db.prepare(txUserInfo) { let userInfo = TxUserInfo(row: txInfo) - cache[hash] = userInfo + queue.async(flags: .barrier) { [weak self] in + self?.cache[hash] = userInfo + } return userInfo } } catch { @@ -94,31 +94,41 @@ class TxUserInfoDAOImpl: NSObject, TxUserInfoDAO { return nil } - @objc + private func cachedValue(by key: Data) -> TxUserInfo? { + var v: TxUserInfo? + + queue.sync { + v = cache[key] + } + + return v + } + func update(dto: TxUserInfo) { create(dto: dto) } - @objc func delete(dto: TxUserInfo) { - cache[dto.txHash] = nil + queue.async(flags: .barrier) { [weak self] in + self?.cache[dto.txHash] = nil + } } - @objc func deleteAll() { do { try db.run(TxUserInfo.table.delete()) - cache = [:] + queue.async(flags: .barrier) { [weak self] in + self?.cache = [:] + } } catch { print(error) } } - @objc static let shared = TxUserInfoDAOImpl() + static let shared = TxUserInfoDAOImpl() } extension TxUserInfoDAOImpl { - @objc func dictionaryOfAllItems() -> [Data: TxUserInfo] { _ = all() return cache diff --git a/DashWallet/Sources/Models/Taxes/Tx/TxUserInfo.swift b/DashWallet/Sources/Models/Taxes/Tx/TxUserInfo.swift index 33adab628..e201f3c14 100644 --- a/DashWallet/Sources/Models/Taxes/Tx/TxUserInfo.swift +++ b/DashWallet/Sources/Models/Taxes/Tx/TxUserInfo.swift @@ -53,17 +53,17 @@ extension TxUserInfoTaxCategory { // MARK: - TxUserInfo -@objc class TxUserInfo: NSObject { - @objc var txHash: Data - @objc var taxCategory: TxUserInfoTaxCategory = .unknown +struct TxUserInfo { + var txHash: Data + var taxCategory: TxUserInfoTaxCategory = .unknown var rate: Int? var rateCurrency: String? var rateMaximumFractionDigits: Int? - @objc - init(hash: Data, taxCategory: TxUserInfoTaxCategory) { - txHash = hash + init(txHash: Data, taxCategory: TxUserInfoTaxCategory) { + self.txHash = txHash + self.taxCategory = taxCategory } init(row: Row) { @@ -72,24 +72,20 @@ extension TxUserInfoTaxCategory { rate = row[TxUserInfo.txRateColumn] rateCurrency = row[TxUserInfo.txRateCurrencyCodeColumn] rateMaximumFractionDigits = row[TxUserInfo.txRateMaximumFractionDigitsColumn] - super.init() } - func update(rate: Int, currency: String, maximumFractionDigits: Int) { + mutating func update(rate: Int, currency: String, maximumFractionDigits: Int) { self.rate = rate rateCurrency = currency rateMaximumFractionDigits = maximumFractionDigits } } -@objc extension TxUserInfo { - @objc func taxCategoryString() -> String { taxCategory.stringValue } - @objc func fiatAmountString(from dashAmount: UInt64) -> String { let notAvailableString = NSLocalizedString("Not available", comment: "Fiat amount"); diff --git a/DashWallet/Sources/Models/Tx/Transactions.swift b/DashWallet/Sources/Models/Tx/Transactions.swift index ee65e2813..d6f3b624e 100644 --- a/DashWallet/Sources/Models/Tx/Transactions.swift +++ b/DashWallet/Sources/Models/Tx/Transactions.swift @@ -56,10 +56,11 @@ final class Tx: NSObject { } private func set(rate: Int, currency: String, maximumFractionDigits: Int, for transaction: DSTransaction) { - set(rate: rate, currency: currency, maximumFractionDigits: maximumFractionDigits, for: .init(hash: transaction.txHashData, taxCategory: transaction.defaultTaxCategory())) + set(rate: rate, currency: currency, maximumFractionDigits: maximumFractionDigits, for: .init(txHash: transaction.txHashData, taxCategory: transaction.defaultTaxCategory())) } private func set(rate: Int, currency: String, maximumFractionDigits: Int, for userInfo: TxUserInfo) { + var userInfo = userInfo userInfo.update(rate: rate, currency: currency, maximumFractionDigits: maximumFractionDigits) txUserInfos.update(dto: userInfo) } diff --git a/DashWallet/Sources/Models/Uphold/DWUpholdMainnetConstants.m b/DashWallet/Sources/Models/Uphold/DWUpholdMainnetConstants.m index a7f171e16..15830fe78 100644 --- a/DashWallet/Sources/Models/Uphold/DWUpholdMainnetConstants.m +++ b/DashWallet/Sources/Models/Uphold/DWUpholdMainnetConstants.m @@ -47,6 +47,7 @@ + (NSString *)transactionURLFormat { + (NSString *)logoutURLString { return @"https://uphold.com/"; + } @end diff --git a/DashWallet/Sources/UI/Assembly/UIAssembly.swift b/DashWallet/Sources/UI/Assembly/UIAssembly.swift index 74504ba35..022dfcbf1 100644 --- a/DashWallet/Sources/UI/Assembly/UIAssembly.swift +++ b/DashWallet/Sources/UI/Assembly/UIAssembly.swift @@ -21,12 +21,34 @@ func sb(_ name: String) -> UIStoryboard { UIStoryboard(name: name, bundle: .main) } -func vc(_ name: T.Type, from storyboard: UIStoryboard) -> T { +func vc(_ name: T.Type, from storyboard: UIStoryboard) -> T { viewController(name, from: storyboard) } -func viewController(_ name: T.Type, from storyBoard: UIStoryboard) -> T { +func viewController(_ name: T.Type, from storyBoard: UIStoryboard) -> T { let identifier = String(String(describing: type(of: name)).split(separator: ".").first!) return storyBoard.instantiateViewController(withIdentifier: identifier) as! T } +extension UIStoryboard { + func vc(_ name: T.Type) -> T { + viewController(name, from: self) + } +} + +extension UINib { + static func view(_ name: T.Type) -> T { + guard let view = UINib(nibName: name.reuseIdentifier, bundle: nil).instantiate(withOwner: nil).first else { + fatalError("Expect view") + } + + return view as! T + } +} + +extension UIView { + static func view() -> Self { + UINib.view(Self.self) + } +} + diff --git a/DashWallet/Sources/UI/Coinbase/Buy Dash/Payment Methods Controller/Views/PaymentMethodCell.swift b/DashWallet/Sources/UI/Coinbase/Buy Dash/Payment Methods Controller/Views/PaymentMethodCell.swift index f48c414ed..903302236 100644 --- a/DashWallet/Sources/UI/Coinbase/Buy Dash/Payment Methods Controller/Views/PaymentMethodCell.swift +++ b/DashWallet/Sources/UI/Coinbase/Buy Dash/Payment Methods Controller/Views/PaymentMethodCell.swift @@ -1,3 +1,4 @@ + // // Created by tkhp // Copyright © 2022 Dash Core Group. All rights reserved. diff --git a/DashWallet/Sources/UI/CrowdNode/Getting Started/GettingStartedViewController.swift b/DashWallet/Sources/UI/CrowdNode/Getting Started/GettingStartedViewController.swift index dcaea18cd..cdac8d49a 100644 --- a/DashWallet/Sources/UI/CrowdNode/Getting Started/GettingStartedViewController.swift +++ b/DashWallet/Sources/UI/CrowdNode/Getting Started/GettingStartedViewController.swift @@ -142,7 +142,7 @@ extension GettingStartedViewController { // MARK: DWSecureWalletDelegate -extension GettingStartedViewController: DWSecureWalletDelegate { +extension GettingStartedViewController: BackupInfoViewControllerDelegate { private func backupPassphrase() { Task { if await viewModel.authenticate(allowBiometric: false) { @@ -152,9 +152,7 @@ extension GettingStartedViewController: DWSecureWalletDelegate { } private func backupPassphraseAuthenticated() { - let model = DWPreviewSeedPhraseModel() - model.getOrCreateNewWallet() - let controller = DWBackupInfoViewController(model: model) + let controller = BackupInfoViewController.controller(with: .setup) controller.delegate = self let navigationController = BaseNavigationController(rootViewController: controller) let cancelButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.cancel, target: self, diff --git a/DashWallet/Sources/UI/Home/DWHomeViewController+DWBackupReminder.m b/DashWallet/Sources/UI/Home/DWHomeViewController+DWBackupReminder.m index af62a231c..bea52f019 100644 --- a/DashWallet/Sources/UI/Home/DWHomeViewController+DWBackupReminder.m +++ b/DashWallet/Sources/UI/Home/DWHomeViewController+DWBackupReminder.m @@ -18,7 +18,6 @@ #import "DWHomeViewController+DWBackupReminder.h" #import "DWHomeViewController+DWSecureWalletDelegateImpl.h" -#import "DWSecureWalletInfoViewController.h" #import "dashwallet-Swift.h" NS_ASSUME_NONNULL_BEGIN @@ -30,8 +29,8 @@ - (void)showWalletBackupReminderIfNeeded { return; } - DWSecureWalletInfoViewController *controller = [DWSecureWalletInfoViewController controller]; - controller.type = DWSecureWalletInfoType_Reminder; + + DWBackupInfoViewController *controller = [DWBackupInfoViewController controllerWith:DWSecureWalletInfoType_Reminder]; controller.delegate = self; DWNavigationController *navigationController = [[DWNavigationController alloc] initWithRootViewController:controller]; @@ -41,7 +40,7 @@ - (void)showWalletBackupReminderIfNeeded { if ([self.presentedViewController isKindOfClass:UINavigationController.class]) { UIViewController *controller = [(UINavigationController *)self.presentedViewController topViewController]; - if ([controller isKindOfClass:DWSecureWalletInfoViewController.class]) { + if ([controller isKindOfClass:DWBackupInfoViewController.class]) { [self.model walletBackupReminderWasShown]; } } diff --git a/DashWallet/Sources/UI/Home/DWHomeViewController+DWShortcuts.m b/DashWallet/Sources/UI/Home/DWHomeViewController+DWShortcuts.m index 02ce7977c..47d0341bc 100644 --- a/DashWallet/Sources/UI/Home/DWHomeViewController+DWShortcuts.m +++ b/DashWallet/Sources/UI/Home/DWHomeViewController+DWShortcuts.m @@ -19,7 +19,6 @@ #import -#import "DWBackupInfoViewController.h" #import "DWDashPaySetupFlowController.h" #import "DWExploreTestnetViewController.h" #import "DWGlobalOptions.h" @@ -27,11 +26,11 @@ #import "DWHomeViewController+DWSecureWalletDelegateImpl.h" #import "DWLocalCurrencyViewController.h" #import "DWPayModelProtocol.h" -#import "DWPaymentsViewController.h" #import "DWPreviewSeedPhraseModel.h" #import "DWSettingsMenuModel.h" #import "DWUpholdViewController.h" #import "dashwallet-Swift.h" + NS_ASSUME_NONNULL_BEGIN @interface DWHomeViewController (DWShortcuts_Internal) @@ -125,13 +124,12 @@ - (void)secureWalletAction { } - (void)secureWalletActionAuthenticated { - DWPreviewSeedPhraseModel *model = [[DWPreviewSeedPhraseModel alloc] init]; - [model getOrCreateNewWallet]; - - DWBackupInfoViewController *controller = - [DWBackupInfoViewController controllerWithModel:model]; + DWBackupInfoViewController *controller = [DWBackupInfoViewController controllerWith:DWSecureWalletInfoType_Setup]; controller.delegate = self; - [self presentControllerModallyInNavigationController:controller]; + + DWNavigationController *navigationController = + [[DWNavigationController alloc] initWithRootViewController:controller]; + [self presentViewController:navigationController animated:YES completion:nil]; } - (void)buySellDashAction { diff --git a/DashWallet/Sources/UI/Home/DWHomeViewController.h b/DashWallet/Sources/UI/Home/DWHomeViewController.h index 4e6b8555c..4aed260aa 100644 --- a/DashWallet/Sources/UI/Home/DWHomeViewController.h +++ b/DashWallet/Sources/UI/Home/DWHomeViewController.h @@ -18,8 +18,8 @@ #import "DWBasePayViewController.h" #import "DWHomeProtocol.h" -#import "DWPaymentsViewController.h" #import "DWWipeDelegate.h" +#import "dashwallet-Swift.h" NS_ASSUME_NONNULL_BEGIN diff --git a/DashWallet/Sources/UI/Home/Models/BalanceModel.swift b/DashWallet/Sources/UI/Home/Models/BalanceModel.swift index 2ca576088..951beb70c 100644 --- a/DashWallet/Sources/UI/Home/Models/BalanceModel.swift +++ b/DashWallet/Sources/UI/Home/Models/BalanceModel.swift @@ -34,6 +34,11 @@ final class BalanceModel: NSObject { NSAttributedString.dashAttributedString(for: value, tintColor: tintColor, font: font) } + @objc + func mainAmountString() -> String { + value.formattedDashAmount + } + @objc func fiatAmountString() -> String { CurrencyExchanger.shared.fiatAmountString(for: value.dashAmount) diff --git a/DashWallet/Sources/UI/Home/Models/DWHomeModel.m b/DashWallet/Sources/UI/Home/Models/DWHomeModel.m index b54244976..54fb444e7 100644 --- a/DashWallet/Sources/UI/Home/Models/DWHomeModel.m +++ b/DashWallet/Sources/UI/Home/Models/DWHomeModel.m @@ -56,7 +56,7 @@ static BOOL IsJailbroken(void) { return jailbroken; } -@interface DWHomeModel () +@interface DWHomeModel () @property (nonatomic, strong) dispatch_queue_t queue; @property (strong, nonatomic) DSReachabilityManager *reachability; @@ -114,7 +114,7 @@ - (instancetype)init { _receiveModel = [[DWReceiveModel alloc] init]; [_receiveModel updateReceivingInfo]; - + _shortcutsModel = [[DWShortcutsModel alloc] initWithDataSource:self]; _payModel = [[DWPayModel alloc] init]; @@ -154,6 +154,10 @@ - (instancetype)init { selector:@selector(willWipeWalletNotification) name:DWWillWipeWalletNotification object:nil]; + [notificationCenter addObserver:self + selector:@selector(fiatCurrencyDidChangeNotification) + name:DWApp.fiatCurrencyDidChangeNotification + object:nil]; [self reloadTxDataSource]; @@ -369,6 +373,11 @@ - (void)applicationWillEnterForegroundNotification { [self.balanceDisplayOptions hideBalanceIfNeeded]; } +- (void)fiatCurrencyDidChangeNotification { + [self updateBalance]; + [self reloadTxDataSource]; +} + - (void)syncStateChangedNotification { BOOL isSynced = self.syncModel.state == DWSyncModelState_SyncDone; if (isSynced) { @@ -580,6 +589,18 @@ - (void)updateBalance { return [mutableTransactions copy]; } +- (NSString *)supplementaryAmountString { + return [self.balanceModel fiatAmountString]; +} + +- (NSString *)mainAmountString { + return [self.balanceModel mainAmountString]; +} + +- (BOOL)isBalanceHidden { + return self.balanceDisplayOptions.balanceHidden; +} + @end NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Home/Protocols/DWHomeProtocol.h b/DashWallet/Sources/UI/Home/Protocols/DWHomeProtocol.h index f5c933fc0..5e0442ce1 100644 --- a/DashWallet/Sources/UI/Home/Protocols/DWHomeProtocol.h +++ b/DashWallet/Sources/UI/Home/Protocols/DWHomeProtocol.h @@ -22,6 +22,7 @@ #import "DWShortcutsProtocol.h" #import "DWSyncContainerProtocol.h" #import "DWTxDisplayModeProtocol.h" +#import "dashwallet-Swift.h" NS_ASSUME_NONNULL_BEGIN @@ -43,7 +44,7 @@ NS_ASSUME_NONNULL_BEGIN @end -@protocol DWHomeProtocol +@protocol DWHomeProtocol @property (nullable, nonatomic, weak) id updatesObserver; diff --git a/DashWallet/Sources/UI/Home/Views/DWBalanceView.h b/DashWallet/Sources/UI/Home/Views/DWBalanceView.h deleted file mode 100644 index de27d85e9..000000000 --- a/DashWallet/Sources/UI/Home/Views/DWBalanceView.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "DWBalanceProtocol.h" - -NS_ASSUME_NONNULL_BEGIN - -@class DWBalanceView; - -@protocol DWBalanceViewDelegate - -- (void)balanceView:(DWBalanceView *)view balanceLongPressAction:(UIControl *)sender; - -@end - -@interface DWBalanceView : KVOUIView - -@property (nullable, nonatomic, strong) id model; -@property (nullable, nonatomic, weak) id delegate; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Home/Views/DWBalanceView.m b/DashWallet/Sources/UI/Home/Views/DWBalanceView.m deleted file mode 100644 index 73f52a7f7..000000000 --- a/DashWallet/Sources/UI/Home/Views/DWBalanceView.m +++ /dev/null @@ -1,196 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWBalanceView.h" - -#import "DWBalanceDisplayOptionsProtocol.h" -#import "DWUIKit.h" -#import "dashwallet-Swift.h" - -NS_ASSUME_NONNULL_BEGIN - -static CGFloat const BalanceButtonMinHeight(void) { - if (IS_IPHONE_5_OR_LESS) { - return 80.0; - } - else { - return 120.0; - } -} - -static NSTimeInterval const ANIMATION_DURATION = 0.3; - -@interface DWBalanceView () - -@property (weak, nonatomic) IBOutlet UIView *contentView; -@property (strong, nonatomic) IBOutlet UIControl *balanceButton; -@property (strong, nonatomic) IBOutlet UILabel *titleLabel; -@property (strong, nonatomic) IBOutlet UIView *hidingView; -@property (strong, nonatomic) IBOutlet UIImageView *eyeSlashImageView; -@property (strong, nonatomic) IBOutlet UILabel *tapToUnhideLabel; -@property (strong, nonatomic) IBOutlet UIView *amountsView; -@property (strong, nonatomic) IBOutlet UILabel *dashBalanceLabel; -@property (strong, nonatomic) IBOutlet UILabel *fiatBalanceLabel; -@property (strong, nonatomic) IBOutlet NSLayoutConstraint *balanceViewHeightContraint; - -@end - -@implementation DWBalanceView - -- (instancetype)initWithFrame:(CGRect)frame { - self = [super initWithFrame:frame]; - if (self) { - [self commonInit]; - } - return self; -} - -- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - if (self) { - [self commonInit]; - } - return self; -} - -- (void)commonInit { - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil]; - [self addSubview:self.contentView]; - self.contentView.translatesAutoresizingMaskIntoConstraints = NO; - [NSLayoutConstraint activateConstraints:@[ - [self.contentView.topAnchor constraintEqualToAnchor:self.topAnchor], - [self.contentView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor], - [self.contentView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor], - [self.contentView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor], - [self.contentView.widthAnchor constraintEqualToAnchor:self.widthAnchor], - ]]; - - self.backgroundColor = [UIColor dw_backgroundColor]; - - self.titleLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleCaption1]; - self.titleLabel.textColor = [UIColor colorWithRed:166.0 / 255.0 green:215.0 / 255.0 blue:245.0 / 255.0 alpha:1.0]; - - self.eyeSlashImageView.tintColor = [UIColor dw_darkBlueColor]; - - self.tapToUnhideLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleCaption2]; - self.tapToUnhideLabel.textColor = [UIColor dw_lightTitleColor]; - self.tapToUnhideLabel.alpha = 0.5; - - self.dashBalanceLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleTitle1]; - self.fiatBalanceLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleCallout]; - - self.balanceViewHeightContraint.constant = BalanceButtonMinHeight(); - - UILongPressGestureRecognizer *recognizer = - [[UILongPressGestureRecognizer alloc] initWithTarget:self - action:@selector(balanceLongPressAction:)]; - [self.balanceButton addGestureRecognizer:recognizer]; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(contentSizeCategoryDidChangeNotification:) - name:UIContentSizeCategoryDidChangeNotification - object:nil]; - - // KVO - - [self mvvm_observe:DW_KEYPATH(self, model.balanceModel) - with:^(typeof(self) self, id value) { - [self reloadAttributedData]; - }]; - - [self mvvm_observe:DW_KEYPATH(self, model.balanceDisplayOptions.balanceHidden) - with:^(typeof(self) self, NSNumber *value) { - [self hideBalance:self.model.balanceDisplayOptions.balanceHidden]; - }]; - - [self mvvm_observe:DW_KEYPATH(self, model.syncModel.state) - with:^(typeof(self) self, NSNumber *value) { - [self updateBalanceTitle]; - }]; -} - -- (void)traitCollectionDidChange:(nullable UITraitCollection *)previousTraitCollection { - [super traitCollectionDidChange:previousTraitCollection]; - - [self reloadAttributedData]; -} - -#pragma mark - Actions - -- (IBAction)balanceButtonAction:(UIControl *)sender { - id balanceDisplayOptions = self.model.balanceDisplayOptions; - balanceDisplayOptions.balanceHidden = !balanceDisplayOptions.balanceHidden; -} - -- (void)balanceLongPressAction:(UIControl *)sender { - [self.delegate balanceView:self balanceLongPressAction:sender]; -} - -#pragma mark - Notifications - -- (void)contentSizeCategoryDidChangeNotification:(NSNotification *)notification { - [self reloadAttributedData]; -} - -#pragma mark - Private - -- (void)reloadAttributedData { - UIColor *balanceColor = [UIColor dw_lightTitleColor]; - DWBalanceModel *balanceModel = self.model.balanceModel; - UIFont *font = [UIFont dw_fontForTextStyle:UIFontTextStyleTitle1]; - - self.dashBalanceLabel.attributedText = [balanceModel dashAmountStringWithFont:font - tintColor:balanceColor]; - self.fiatBalanceLabel.text = [balanceModel fiatAmountString]; - self.fiatBalanceLabel.hidden = balanceModel == nil; -} - -- (void)hideBalance:(BOOL)hidden { - const BOOL animated = self.window != nil; - - [UIView animateWithDuration:animated ? ANIMATION_DURATION : 0.0 - animations:^{ - self.hidingView.alpha = hidden ? 1.0 : 0.0; - self.amountsView.alpha = hidden ? 0.0 : 1.0; - - self.tapToUnhideLabel.text = hidden - ? NSLocalizedString(@"Tap to unhide balance", nil) - : NSLocalizedString(@"Tap to hide balance", nil); - - [self updateBalanceTitle]; - }]; -} - -- (void)updateBalanceTitle { - if (self.model.balanceDisplayOptions.balanceHidden) { - self.titleLabel.text = NSLocalizedString(@"Balance hidden", nil); - } - else { - switch (self.model.syncModel.state) { - case DWSyncModelState_Syncing: - self.titleLabel.text = NSLocalizedString(@"Syncing Balance", nil); - break; - default: - self.titleLabel.text = NSLocalizedString(@"Available balance", nil); - break; - } - } -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Home/Views/DWHomeHeaderView.m b/DashWallet/Sources/UI/Home/Views/DWHomeHeaderView.m index 60f54cd95..15e8b52ea 100644 --- a/DashWallet/Sources/UI/Home/Views/DWHomeHeaderView.m +++ b/DashWallet/Sources/UI/Home/Views/DWHomeHeaderView.m @@ -17,7 +17,6 @@ #import "DWHomeHeaderView.h" -#import "DWBalanceView.h" #import "DWDPRegistrationStatus.h" #import "DWDashPayProfileView.h" #import "DWSyncView.h" @@ -27,12 +26,12 @@ static CGSize const AVATAR_SIZE = {72.0, 72.0}; -@interface DWHomeHeaderView () @property (readonly, nonatomic, strong) DWDashPayProfileView *profileView; -@property (readonly, nonatomic, strong) DWBalanceView *balanceView; +@property (readonly, nonatomic, strong) DWHomeBalanceView *balanceView; @property (readonly, nonatomic, strong) DWSyncView *syncView; @property (readonly, nonatomic, strong) ShortcutsView *shortcutsView; @property (readonly, nonatomic, strong) UIStackView *stackView; @@ -49,7 +48,7 @@ - (instancetype)initWithFrame:(CGRect)frame { [profileView addTarget:self action:@selector(profileViewAction:) forControlEvents:UIControlEventTouchUpInside]; _profileView = profileView; - DWBalanceView *balanceView = [[DWBalanceView alloc] initWithFrame:CGRectZero]; + DWHomeBalanceView *balanceView = [[DWHomeBalanceView alloc] initWithFrame:CGRectZero]; balanceView.delegate = self; _balanceView = balanceView; @@ -77,6 +76,16 @@ - (instancetype)initWithFrame:(CGRect)frame { // KVO + [self mvvm_observe:DW_KEYPATH(self, model.balanceModel) + with:^(typeof(self) self, id value) { + [self.balanceView reloadData]; + }]; + + [self mvvm_observe:DW_KEYPATH(self, model.balanceDisplayOptions.balanceHidden) + with:^(typeof(self) self, NSNumber *value) { + [self.balanceView hideBalance:self.model.balanceDisplayOptions.balanceHidden]; + }]; + [self mvvm_observe:DW_KEYPATH(self, model.syncModel.state) with:^(typeof(self) self, NSNumber *value) { if (!value) { @@ -85,6 +94,8 @@ - (instancetype)initWithFrame:(CGRect)frame { const DWSyncModelState state = self.model.syncModel.state; + self.balanceView.state = state == DWSyncModelState_Syncing ? DWHomeBalanceViewState_Syncing : DWHomeBalanceViewState_Default; + [self.syncView setSyncState:state]; if (state == DWSyncModelState_SyncFailed || state == DWSyncModelState_NoConnection) { @@ -116,9 +127,10 @@ - (instancetype)initWithFrame:(CGRect)frame { - (void)setModel:(nullable id)model { _model = model; - self.balanceView.model = model; self.shortcutsView.model = model.shortcutsModel; [self updateProfileView]; + + self.balanceView.dataSource = model; } - (nullable id)shortcutsDelegate { @@ -134,11 +146,17 @@ - (void)parentScrollViewDidScroll:(UIScrollView *)scrollView { #pragma mark - DWBalanceViewDelegate -- (void)balanceView:(DWBalanceView *)view balanceLongPressAction:(UIControl *)sender { +- (void)balanceView:(DWHomeBalanceView *)view balanceLongPressAction:(UIControl *)sender { DWShortcutAction *action = [DWShortcutAction actionWithType:DWShortcutActionTypeLocalCurrency]; [self.shortcutsDelegate shortcutsView:self.balanceView didSelectAction:action sender:sender]; } +- (void)balanceViewDidToggleBalanceVisibility:(DWHomeBalanceView *)view { + id balanceDisplayOptions = self.model.balanceDisplayOptions; + balanceDisplayOptions.balanceHidden = !balanceDisplayOptions.balanceHidden; +} + + #pragma mark - DWShortcutsViewDelegate - (void)shortcutsViewDidUpdateContentSize:(ShortcutsView *)view { @@ -172,13 +190,13 @@ - (void)updateProfileView { - (void)hideSyncView { self.syncView.hidden = YES; - + [self.delegate homeHeaderViewDidUpdateContents:self]; } - (void)showSyncView { self.syncView.hidden = NO; - + [self.delegate homeHeaderViewDidUpdateContents:self]; } diff --git a/DashWallet/Sources/UI/Home/Views/HomeBalanceView.swift b/DashWallet/Sources/UI/Home/Views/HomeBalanceView.swift new file mode 100644 index 000000000..477eb3704 --- /dev/null +++ b/DashWallet/Sources/UI/Home/Views/HomeBalanceView.swift @@ -0,0 +1,186 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +// MARK: - BalanceViewDelegate + +@objc(DWHomeBalanceViewDelegate) +protocol BalanceViewDelegate: AnyObject { + func balanceView(_ view: HomeBalanceView, balanceLongPressAction sender: UIControl) + func balanceViewDidToggleBalanceVisibility(_ view: HomeBalanceView) +} + +// MARK: - HomeBalanceViewDataSource + +@objc(DWHomeBalanceViewDataSource) +protocol HomeBalanceViewDataSource: BalanceViewDataSource { + var isBalanceHidden: Bool { get } +} + +// MARK: - HomeBalanceViewState + +@objc(DWHomeBalanceViewState) +enum HomeBalanceViewState: Int { + @objc(DWHomeBalanceViewState_Default) + case `default` + + @objc(DWHomeBalanceViewState_Syncing) + case syncing +} + +// MARK: - HomeBalanceView + +@objc(DWHomeBalanceView) +final class HomeBalanceView: UIView { + @IBOutlet private weak var contentView: UIView! + @IBOutlet private var balanceButton: UIControl! + @IBOutlet private var titleLabel: UILabel! + @IBOutlet private var hidingView: UIView! + @IBOutlet private var eyeSlashImageView: UIImageView! + @IBOutlet private var tapToUnhideLabel: UIButton! + @IBOutlet private var amountsView: UIView! + @IBOutlet private var balanceView: BalanceView! + + @objc + weak var dataSource: HomeBalanceViewDataSource? { + didSet { + balanceView.dataSource = dataSource + reloadView() + reloadData() + } + } + + @objc + weak var delegate: BalanceViewDelegate? + + @objc + var state: HomeBalanceViewState = .default { + didSet { + reloadView() + } + } + + override init(frame: CGRect) { + super.init(frame: frame) + commonInit() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + commonInit() + } + + @objc + func reloadView() { + var titleString = "" + + let isBalanceHidden = dataSource?.isBalanceHidden ?? false + + if !isBalanceHidden && state == .syncing { + titleString = NSLocalizedString("Syncing Balance", comment: "") + + titleLabel.alpha = 0.8 + titleLabel.layer.removeAllAnimations() + + UIView.animate(withDuration: 0.8, + delay:0.0, + options:[.allowUserInteraction, .curveEaseInOut, .autoreverse, .repeat], + animations: { self.titleLabel.alpha = 0.3 }, + completion: nil) + + } else { + titleLabel.layer.removeAllAnimations() + } + + titleLabel.text = titleString + } + + @objc + public func reloadData() { + balanceView.reloadData() + } + + private func commonInit() { + Bundle.main.loadNibNamed("HomeBalanceView", owner: self, options: nil) + contentView.translatesAutoresizingMaskIntoConstraints = false + addSubview(contentView) + + NSLayoutConstraint.activate([ + contentView.topAnchor.constraint(equalTo: topAnchor), + contentView.leadingAnchor.constraint(equalTo: leadingAnchor), + contentView.bottomAnchor.constraint(equalTo: bottomAnchor), + contentView.trailingAnchor.constraint(equalTo: trailingAnchor), + contentView.widthAnchor.constraint(equalTo: widthAnchor), + ]) + + backgroundColor = UIColor.dw_background() + + titleLabel.font = UIFont.dw_font(forTextStyle: .caption1) + titleLabel.textColor = UIColor.white.withAlphaComponent(0.7) + titleLabel.alpha = 0.8 + + eyeSlashImageView.tintColor = UIColor.dw_darkBlue() + + + tapToUnhideLabel.titleLabel?.font = UIFont.dw_font(forTextStyle: .caption1) + tapToUnhideLabel.setTitle(NSLocalizedString("Tap to hide balance", comment: ""), for: .normal) + tapToUnhideLabel.setTitleColor(UIColor.white.withAlphaComponent(0.5), for: .normal) + + let recognizer = UILongPressGestureRecognizer(target: self, action: #selector(balanceLongPressAction(_:))) + balanceButton.addGestureRecognizer(recognizer) + + balanceView.tint = .white + + NotificationCenter.default.addObserver(self, selector: #selector(contentSizeCategoryDidChangeNotification(_:)), name: UIContentSizeCategory.didChangeNotification, + object: nil) + } + + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + super.traitCollectionDidChange(previousTraitCollection) + + reloadData() + } + + @IBAction + private func balanceButtonAction(_ sender: UIControl) { + delegate?.balanceViewDidToggleBalanceVisibility(self) + } + + @objc + private func balanceLongPressAction(_ sender: UIControl) { + delegate?.balanceView(self, balanceLongPressAction: sender) + } + + @objc + private func contentSizeCategoryDidChangeNotification(_ notification: Notification) { + reloadData() + } + + @objc + func hideBalance(_ hidden: Bool) { + let animated = window != nil + + UIView.animate(withDuration: animated ? kAnimationDuration : 0.0) { + self.hidingView.alpha = hidden ? 1.0 : 0.0 + self.amountsView.alpha = hidden ? 0.0 : 1.0 + + self.tapToUnhideLabel.alpha = hidden ? 0.0 : 1.0 + self.reloadData() + } + } +} diff --git a/DashWallet/Sources/UI/Home/Views/DWBalanceView.xib b/DashWallet/Sources/UI/Home/Views/HomeBalanceView.xib similarity index 61% rename from DashWallet/Sources/UI/Home/Views/DWBalanceView.xib rename to DashWallet/Sources/UI/Home/Views/HomeBalanceView.xib index 6011ae090..211d095c0 100644 --- a/DashWallet/Sources/UI/Home/Views/DWBalanceView.xib +++ b/DashWallet/Sources/UI/Home/Views/HomeBalanceView.xib @@ -1,24 +1,22 @@ - + - + - + - + - - - + @@ -28,24 +26,27 @@ - + - + - @@ -94,12 +71,12 @@ - + - + @@ -121,21 +98,26 @@ - + + - - - - + + + @@ -150,12 +132,9 @@ - + - - - diff --git a/DashWallet/Sources/UI/LockScreen/QuickReceive/DWQuickReceiveViewController.h b/DashWallet/Sources/UI/LockScreen/QuickReceive/DWQuickReceiveViewController.h index 4ce0b8cfd..6a3875c9d 100644 --- a/DashWallet/Sources/UI/LockScreen/QuickReceive/DWQuickReceiveViewController.h +++ b/DashWallet/Sources/UI/LockScreen/QuickReceive/DWQuickReceiveViewController.h @@ -17,13 +17,11 @@ #import -#import "dashwallet-Swift.h" - NS_ASSUME_NONNULL_BEGIN @protocol DWReceiveModelProtocol; -@interface DWQuickReceiveViewController : UIViewController +@interface DWQuickReceiveViewController : UIViewController + (UIViewController *)controllerWithModel:(id)receiveModel; diff --git a/DashWallet/Sources/UI/LockScreen/QuickReceive/DWQuickReceiveViewController.m b/DashWallet/Sources/UI/LockScreen/QuickReceive/DWQuickReceiveViewController.m index adfcf19b0..8e76bb821 100644 --- a/DashWallet/Sources/UI/LockScreen/QuickReceive/DWQuickReceiveViewController.m +++ b/DashWallet/Sources/UI/LockScreen/QuickReceive/DWQuickReceiveViewController.m @@ -17,7 +17,6 @@ #import "DWQuickReceiveViewController.h" -#import "DWReceiveViewController.h" #import "DWUIKit.h" #import "SFSafariViewController+DashWallet.h" #import "dashwallet-Swift.h" @@ -45,7 +44,7 @@ + (UIViewController *)controllerWithModel:(id)receiveMod DWModalNavigationController *navigationController = [[DWModalNavigationController alloc] initWithRootViewController:controller]; - + [navigationController setCancelButtonHidden:NO]; return navigationController; } @@ -89,9 +88,12 @@ - (void)receiveViewControllerExitButtonAction:(DWReceiveViewController *)control - (void)setupView { self.titleLabel.text = NSLocalizedString(@"Scan this to Pay", @"A title of the quick receive screen"); - DWReceiveViewController *receiveController = [DWReceiveViewController controllerWithModel:self.receiveModel]; + // TODO: Implement quick receive + + DWReceiveViewController *receiveController = [[DWReceiveViewController alloc] initWithModel:self.receiveModel]; receiveController.viewType = DWReceiveViewType_QuickReceive; receiveController.delegate = self; + receiveController.allowedToImportPrivateKey = NO; [self dw_embedChild:receiveController inContainer:self.receiveContentView]; self.receiveController = receiveController; diff --git a/DashWallet/Sources/UI/LockScreen/QuickReceive/QuickReceive.storyboard b/DashWallet/Sources/UI/LockScreen/QuickReceive/QuickReceive.storyboard index 15d7f7c1a..6e5e19439 100644 --- a/DashWallet/Sources/UI/LockScreen/QuickReceive/QuickReceive.storyboard +++ b/DashWallet/Sources/UI/LockScreen/QuickReceive/QuickReceive.storyboard @@ -1,9 +1,9 @@ - + - + @@ -23,10 +23,10 @@ - + - - + + @@ -50,16 +50,16 @@ - + - + - + - - + @@ -82,7 +82,7 @@ - + @@ -92,6 +92,7 @@ + @@ -103,7 +104,6 @@ - @@ -117,9 +117,6 @@ - - - @@ -127,7 +124,7 @@ - + diff --git a/DashWallet/Sources/UI/Main/DWMainTabbarViewController.m b/DashWallet/Sources/UI/Main/DWMainTabbarViewController.m index 3c477d9d2..09567782e 100644 --- a/DashWallet/Sources/UI/Main/DWMainTabbarViewController.m +++ b/DashWallet/Sources/UI/Main/DWMainTabbarViewController.m @@ -21,10 +21,10 @@ #import "DWHomeViewController.h" #import "DWMainMenuViewController.h" #import "DWModalUserProfileViewController.h" -#import "DWPaymentsViewController.h" #import "DWTabBarView.h" #import "DWUIKit.h" #import "dashwallet-Swift.h" + NS_ASSUME_NONNULL_BEGIN static NSTimeInterval const ANIMATION_DURATION = 0.35; @@ -147,15 +147,17 @@ - (void)tabBarViewDidClosePayments:(DWTabBarView *)tabBarView { /// helper - (void)tabBarViewDidClosePayments:(DWTabBarView *)tabBarView completion:(void (^_Nullable)(void))completion { + [tabBarView setPaymentsButtonOpened:NO]; + if (![self.currentController.topController isKindOfClass:[DWPaymentsViewController class]]) { + self.tabBarView.userInteractionEnabled = YES; + if (completion) completion(); return; } - tabBarView.userInteractionEnabled = NO; - [tabBarView setPaymentsButtonOpened:NO]; [self.currentController.topController dismissViewControllerAnimated:YES completion:^{ @@ -168,6 +170,17 @@ - (void)tabBarViewDidClosePayments:(DWTabBarView *)tabBarView completion:(void ( #pragma mark - DWPaymentsViewControllerDelegate +- (void)paymentsViewControllerWantsToImportPrivateKey:(DWPaymentsViewController *)controller { + // Make sure we enable tabbar before showing the scanner + _tabBarView.userInteractionEnabled = YES; + [_tabBarView setPaymentsButtonOpened:NO]; + + [controller dismissViewControllerAnimated:YES + completion:^{ + [self performScanQRCodeAction]; + }]; +} + - (void)paymentsViewControllerDidCancel:(DWPaymentsViewController *)controller { [self tabBarViewDidClosePayments:self.tabBarView]; } @@ -305,17 +318,18 @@ - (void)showPaymentsControllerWithActivePage:(DWPaymentsViewControllerIndex)page id receiveModel = homeModel.receiveModel; id payModel = homeModel.payModel; id dataProvider = [homeModel getDataProvider]; + DWPaymentsViewController *controller = [DWPaymentsViewController controllerWithReceiveModel:receiveModel payModel:payModel dataProvider:dataProvider]; controller.delegate = self; - controller.currentIndex = pageIndex; + controller.currentState = pageIndex; controller.demoMode = self.demoMode; controller.demoDelegate = self.demoDelegate; DWNavigationController *navigationController = [[DWNavigationController alloc] initWithRootViewController:controller]; navigationController.delegate = self; - navigationController.modalPresentationStyle = UIModalPresentationFullScreen; + navigationController.modalInPresentation = YES; if (self.demoMode) { [self.demoDelegate presentModalController:navigationController sender:self]; diff --git a/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.h b/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.h index ded889148..14e072a6a 100644 --- a/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.h +++ b/DashWallet/Sources/UI/Menu/Main/DWMainMenuViewController.h @@ -17,9 +17,9 @@ #import -#import "DWPaymentsViewController.h" #import "DWSyncProtocol.h" #import "DWWipeDelegate.h" +#import "dashwallet-Swift.h" NS_ASSUME_NONNULL_BEGIN diff --git a/DashWallet/Sources/UI/Menu/Settings/About/DWAboutViewController.m b/DashWallet/Sources/UI/Menu/Settings/About/DWAboutViewController.m index 342088587..2c4542c96 100644 --- a/DashWallet/Sources/UI/Menu/Settings/About/DWAboutViewController.m +++ b/DashWallet/Sources/UI/Menu/Settings/About/DWAboutViewController.m @@ -176,29 +176,29 @@ - (void)deviceDidShakeNotification:(NSNotification *)sender { }]; [alert addAction:setPeerAction]; - //#warning Disable in Release - // UIAlertAction *destructAction = [UIAlertAction - // actionWithTitle:@"☠️ Exterminate!" - // style:UIAlertActionStyleDestructive - // handler:^(UIAlertAction *_Nonnull action) { - // [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]]; - // CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication); + // #warning Disable in Release + // UIAlertAction *destructAction = [UIAlertAction + // actionWithTitle:@"☠️ Exterminate!" + // style:UIAlertActionStyleDestructive + // handler:^(UIAlertAction *_Nonnull action) { + // [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:[[NSBundle mainBundle] bundleIdentifier]]; + // CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication); // - // NSArray *secItemClasses = @[ (__bridge id)kSecClassGenericPassword, - // (__bridge id)kSecClassInternetPassword, - // (__bridge id)kSecClassCertificate, - // (__bridge id)kSecClassKey, - // (__bridge id)kSecClassIdentity ]; - // for (id secItemClass in secItemClasses) { - // NSDictionary *spec = @{(__bridge id)kSecClass : secItemClass}; - // SecItemDelete((__bridge CFDictionaryRef)spec); - // } + // NSArray *secItemClasses = @[ (__bridge id)kSecClassGenericPassword, + // (__bridge id)kSecClassInternetPassword, + // (__bridge id)kSecClassCertificate, + // (__bridge id)kSecClassKey, + // (__bridge id)kSecClassIdentity ]; + // for (id secItemClass in secItemClasses) { + // NSDictionary *spec = @{(__bridge id)kSecClass : secItemClass}; + // SecItemDelete((__bridge CFDictionaryRef)spec); + // } // - // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - // exit(0); - // }); - // }]; - // [alert addAction:destructAction]; + // dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + // exit(0); + // }); + // }]; + // [alert addAction:destructAction]; UIAlertAction *okAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) style:UIAlertActionStyleCancel diff --git a/DashWallet/Sources/UI/Menu/Tools/DWToolsMenuViewController.m b/DashWallet/Sources/UI/Menu/Tools/DWToolsMenuViewController.m index f07299948..d5f3c72cf 100644 --- a/DashWallet/Sources/UI/Menu/Tools/DWToolsMenuViewController.m +++ b/DashWallet/Sources/UI/Menu/Tools/DWToolsMenuViewController.m @@ -19,14 +19,13 @@ #import "BigIntTypes.h" #import "DWEnvironment.h" -#import "DWExtendedPublicKeysViewController.h" #import "DWFormTableViewController.h" #import "DWImportWalletInfoViewController.h" -#import "DWKeysOverviewViewController.h" #import "DWToolsMenuModel.h" #import "DWUIKit.h" #import "UIView+DWHUD.h" #import "UIViewController+DWDisplayError.h" +#import "dashwallet-Swift.h" NS_ASSUME_NONNULL_BEGIN @interface DWToolsMenuViewController () @@ -164,11 +163,13 @@ - (void)showImportPrivateKey { - (void)showMasternodeKeys { DWKeysOverviewViewController *keysViewController = [[DWKeysOverviewViewController alloc] init]; + keysViewController.hidesBottomBarWhenPushed = YES; [self.navigationController pushViewController:keysViewController animated:YES]; } - (void)showExtendedPublicKeys { DWExtendedPublicKeysViewController *controller = [[DWExtendedPublicKeysViewController alloc] init]; + controller.hidesBottomBarWhenPushed = YES; [self.navigationController pushViewController:controller animated:YES]; } diff --git a/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/DWExtendedPublicKeysModel.h b/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/DWExtendedPublicKeysModel.h deleted file mode 100644 index 770b03b4e..000000000 --- a/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/DWExtendedPublicKeysModel.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2021 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "DWDerivationPathKeysItem.h" - -NS_ASSUME_NONNULL_BEGIN - -@class DSFundsDerivationPath; -@class DSDerivationPath; - -@interface DWExtendedPublicKeysModel : NSObject - -@property (readonly, nonatomic, copy) NSArray *derivationPaths; - -- (id)itemFor:(DSDerivationPath *)derivationPath; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/DWExtendedPublicKeysModel.m b/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/DWExtendedPublicKeysModel.m deleted file mode 100644 index 62aa95db7..000000000 --- a/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/DWExtendedPublicKeysModel.m +++ /dev/null @@ -1,58 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2021 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWExtendedPublicKeysModel.h" - -#import "DWEnvironment.h" - -#import "DWDerivationPathKeysItemObject.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWExtendedPublicKeysModel () - -@end - -NS_ASSUME_NONNULL_END - -@implementation DWExtendedPublicKeysModel - -- (instancetype)init { - self = [super init]; - if (self) { - DSAccount *currentAccount = [DWEnvironment sharedInstance].currentAccount; - _derivationPaths = [currentAccount.fundDerivationPaths copy]; - } - return self; -} - -- (id)itemFor:(DSDerivationPath *)derivationPath { - DWDerivationPathKeysItemObject *item = [[DWDerivationPathKeysItemObject alloc] init]; - - if ([derivationPath isKindOfClass:DSIncomingFundsDerivationPath.class]) { - item.title = [(DSIncomingFundsDerivationPath *)derivationPath contactDestinationBlockchainIdentity].currentDashpayUsername; - } - else { - item.title = [derivationPath referenceName]; - } - - item.detail = [derivationPath serializedExtendedPublicKey]; - - return item; -} - -@end diff --git a/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/DWExtendedPublicKeysViewController.m b/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/DWExtendedPublicKeysViewController.m deleted file mode 100644 index d172aef4e..000000000 --- a/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/DWExtendedPublicKeysViewController.m +++ /dev/null @@ -1,113 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2021 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWExtendedPublicKeysViewController.h" - - -#import "DWEnvironment.h" - -#import "DWDerivationPathKeysTableViewCell.h" -#import "DWExtendedPublicKeysModel.h" -#import "DWSelectorFormTableViewCell.h" -#import "DWUIKit.h" -#import "UIView+DWHUD.h" - - -NS_ASSUME_NONNULL_BEGIN - -@interface DWExtendedPublicKeysViewController () - -@property (readonly, nonatomic, strong) DWExtendedPublicKeysModel *model; - -@end - -@implementation DWExtendedPublicKeysViewController - -- (instancetype)init { - self = [super initWithStyle:UITableViewStylePlain]; - if (self) { - _model = [[DWExtendedPublicKeysModel alloc] init]; - - self.hidesBottomBarWhenPushed = YES; - } - return self; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.title = NSLocalizedString(@"Extended Public Keys", nil); - - self.view.backgroundColor = [UIColor dw_secondaryBackgroundColor]; - self.tableView.rowHeight = UITableViewAutomaticDimension; - self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; - self.tableView.tableFooterView = [[UIView alloc] init]; - - NSArray *cellClasses = @[ - DWDerivationPathKeysTableViewCell.class, - ]; - - for (Class cellClass in cellClasses) { - [self.tableView registerClass:cellClass forCellReuseIdentifier:NSStringFromClass(cellClass)]; - } -} - -- (UIStatusBarStyle)preferredStatusBarStyle { - return UIStatusBarStyleLightContent; -} - -#pragma mark - UITableViewDataSource - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return self.model.derivationPaths.count; -} - -- (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { - UIView *view = [[UIView alloc] init]; - return view; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - NSString *cellId = DWDerivationPathKeysTableViewCell.dw_reuseIdentifier; - DWDerivationPathKeysTableViewCell *cell = - (DWDerivationPathKeysTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellId - forIndexPath:indexPath]; - - DSDerivationPath *derivationPath = self.model.derivationPaths[indexPath.row]; - id item = [self.model itemFor:derivationPath]; - cell.item = item; - - return cell; -} - -#pragma mark - UITableViewDataDelegate - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - - DWDerivationPathKeysTableViewCell *cell = - (DWDerivationPathKeysTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; - id item = cell.item; - if (item && item.detail && ![item.detail isEqualToString:@""]) { - [UIPasteboard generalPasteboard].string = item.detail; - [self.view dw_showInfoHUDWithText:NSLocalizedString(@"Copied", nil)]; - } -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/ExtendedPublicKeysModel.swift b/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/ExtendedPublicKeysModel.swift new file mode 100644 index 000000000..64c6433fe --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/ExtendedPublicKeysModel.swift @@ -0,0 +1,44 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +final class ExtendedPublicKeysModel { + let derivationPaths: [DSDerivationPath] + + init() { + let currentAccount = DWEnvironment.sharedInstance().currentAccount + derivationPaths = currentAccount.fundDerivationPaths ?? [] + } +} + +extension DSDerivationPath { + var item: DerivationPathKeysItem { + let title: String + + if let dp = self as? DSIncomingFundsDerivationPath, + let username = dp.contactDestinationBlockchainIdentity.currentDashpayUsername { + title = username + }else{ + title = referenceName + } + + let value = serializedExtendedPublicKey() ?? NSLocalizedString("Not available", comment: "") + + return DerivationPathKeysItem(title: title, value: value) + } +} diff --git a/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/ExtendedPublicKeysViewController.swift b/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/ExtendedPublicKeysViewController.swift new file mode 100644 index 000000000..5afa19b7b --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/ExtendedPublicKeysViewController.swift @@ -0,0 +1,106 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +// MARK: - ExtendedPublicKeysViewController + +@objc(DWExtendedPublicKeysViewController) +final class ExtendedPublicKeysViewController: BaseViewController, NavigationStackControllable { + private let model: ExtendedPublicKeysModel + + private var tableView: UITableView! + + init() { + model = ExtendedPublicKeysModel() + + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + configureHierarchy() + } +} + +// MARK: UITableViewDelegate, UITableViewDataSource + +extension ExtendedPublicKeysViewController: UITableViewDelegate, UITableViewDataSource { + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + + guard let cell = tableView.cellForRow(at: indexPath) as? DerivationPathKeysCell, !cell.item.value.isEmpty else { + return + } + + UIPasteboard.general.string = cell.item.value + view.dw_showInfoHUD(withText: NSLocalizedString("Copied", comment: "")) + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + model.derivationPaths.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let info = model.derivationPaths[indexPath.row] + let item = info.item + + let cell = tableView.dequeueReusableCell(type: DerivationPathKeysCell.self, for: indexPath) + cell.update(with: item) + cell.separatorInset = .init(top: 0, left: 15, bottom: 0, right: 0) + return cell + } +} + +extension ExtendedPublicKeysViewController { + private func configureHierarchy() { + title = NSLocalizedString("Extended Public Keys", comment: "") + view.backgroundColor = .dw_secondaryBackground() + + tableView = UITableView(frame: .zero, style: .insetGrouped) + tableView.registerClass(for: DerivationPathKeysCell.self) + tableView.registerClassforHeaderFooterView(for: DerivationPathKeysHeaderView.self) + tableView.preservesSuperviewLayoutMargins = true + tableView.backgroundColor = .dw_secondaryBackground() + tableView.estimatedRowHeight = UITableView.automaticDimension + tableView.rowHeight = UITableView.automaticDimension + tableView.translatesAutoresizingMaskIntoConstraints = false + tableView.delegate = self + tableView.dataSource = self + view.addSubview(tableView) + + NSLayoutConstraint.activate([ + tableView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0), + tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0), + tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0), + tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0), + ]) + } +} + +// MARK: NavigationBarStyleable + +extension ExtendedPublicKeysViewController: NavigationBarStyleable { + var prefersLargeTitles: Bool { true } + var largeTitleDisplayMode: UINavigationItem.LargeTitleDisplayMode { .always } +} diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Cells/DWDerivationPathKeysTableViewCell.h b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Cells/DWDerivationPathKeysTableViewCell.h deleted file mode 100644 index d38681b59..000000000 --- a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Cells/DWDerivationPathKeysTableViewCell.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWBaseFormTableViewCell.h" - -#import "DWDerivationPathKeysItem.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWDerivationPathKeysTableViewCell : DWBaseFormTableViewCell - -@property (nullable, nonatomic, strong) id item; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Cells/DWDerivationPathKeysTableViewCell.m b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Cells/DWDerivationPathKeysTableViewCell.m deleted file mode 100644 index 4b4916de8..000000000 --- a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Cells/DWDerivationPathKeysTableViewCell.m +++ /dev/null @@ -1,102 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWDerivationPathKeysTableViewCell.h" - -#import "DWSharedUIConstants.h" -#import "DWUIKit.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWDerivationPathKeysTableViewCell () - -@property (readonly, nonatomic, strong) UILabel *titleLabel; -@property (readonly, nonatomic, strong) UILabel *detailLabel; - -@end - -@implementation DWDerivationPathKeysTableViewCell - -- (instancetype)initWithStyle:(UITableViewCellStyle)style - reuseIdentifier:(nullable NSString *)reuseIdentifier { - self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; - if (self) { - UIView *contentView = self.roundedContentView; - NSParameterAssert(contentView); - - UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - titleLabel.translatesAutoresizingMaskIntoConstraints = NO; - titleLabel.backgroundColor = [UIColor dw_backgroundColor]; - titleLabel.textColor = [UIColor dw_darkTitleColor]; - titleLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleCallout]; - titleLabel.adjustsFontForContentSizeCategory = YES; - titleLabel.minimumScaleFactor = 0.5; - titleLabel.adjustsFontSizeToFitWidth = YES; - [titleLabel setContentCompressionResistancePriority:UILayoutPriorityRequired - forAxis:UILayoutConstraintAxisVertical]; - [contentView addSubview:titleLabel]; - _titleLabel = titleLabel; - - UILabel *detailLabel = [[UILabel alloc] initWithFrame:CGRectZero]; - detailLabel.translatesAutoresizingMaskIntoConstraints = NO; - detailLabel.backgroundColor = [UIColor dw_backgroundColor]; - detailLabel.textColor = [UIColor dw_dashBlueColor]; - detailLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleSubheadline]; - detailLabel.adjustsFontForContentSizeCategory = YES; - detailLabel.minimumScaleFactor = 0.5; - detailLabel.adjustsFontSizeToFitWidth = YES; - [detailLabel setContentCompressionResistancePriority:UILayoutPriorityRequired - forAxis:UILayoutConstraintAxisVertical]; - [contentView addSubview:detailLabel]; - _detailLabel = detailLabel; - - const CGFloat margin = DWDefaultMargin(); - const CGFloat padding = DW_FORM_CELL_SPACING; - const CGFloat spacing = 4.0; - - [NSLayoutConstraint activateConstraints:@[ - [titleLabel.topAnchor constraintEqualToAnchor:contentView.topAnchor - constant:padding], - [titleLabel.leadingAnchor constraintEqualToAnchor:contentView.leadingAnchor - constant:margin], - [titleLabel.trailingAnchor constraintEqualToAnchor:contentView.trailingAnchor - constant:-margin], - - [detailLabel.topAnchor constraintEqualToAnchor:titleLabel.bottomAnchor - constant:spacing], - [detailLabel.leadingAnchor constraintEqualToAnchor:contentView.leadingAnchor - constant:margin], - [detailLabel.trailingAnchor constraintEqualToAnchor:contentView.trailingAnchor - constant:-margin], - [detailLabel.bottomAnchor constraintEqualToAnchor:contentView.bottomAnchor - constant:-padding], - ]]; - } - - return self; -} - -- (void)setItem:(nullable id)item { - _item = item; - - self.titleLabel.text = item.title; - self.detailLabel.text = item.detail; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/DWDerivationPathKeysViewController.h b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/DWDerivationPathKeysViewController.h deleted file mode 100644 index b6a9d9dcb..000000000 --- a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/DWDerivationPathKeysViewController.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// Created by Sam Westrich -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@class DSAuthenticationKeysDerivationPath; - -@interface DWDerivationPathKeysViewController : UITableViewController - -@property (nonatomic, strong) DSAuthenticationKeysDerivationPath *derivationPath; - -- (instancetype)initWithDerivationPath:(DSAuthenticationKeysDerivationPath *)derivationPath; - -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_UNAVAILABLE; -- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE; -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/DWDerivationPathKeysViewController.m b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/DWDerivationPathKeysViewController.m deleted file mode 100644 index f81504fdc..000000000 --- a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/DWDerivationPathKeysViewController.m +++ /dev/null @@ -1,157 +0,0 @@ -// -// Created by Sam Westrich -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWDerivationPathKeysViewController.h" - -#import - -#import "DWDerivationPathKeysModel.h" -#import "DWDerivationPathKeysTableViewCell.h" -#import "DWSelectorFormTableViewCell.h" -#import "DWUIKit.h" -#import "UIView+DWHUD.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWDerivationPathKeysViewController () - -@property (readonly, nonatomic, strong) DWDerivationPathKeysModel *model; -@property (nonatomic, assign) NSInteger visibleIndexes; - -@end - -@implementation DWDerivationPathKeysViewController - -- (instancetype)initWithDerivationPath:(DSAuthenticationKeysDerivationPath *)derivationPath { - self = [super initWithStyle:UITableViewStylePlain]; - if (self) { - _model = [[DWDerivationPathKeysModel alloc] initWithDerivationPath:derivationPath]; - self.derivationPath = derivationPath; - self.hidesBottomBarWhenPushed = YES; - } - return self; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.view.backgroundColor = [UIColor dw_secondaryBackgroundColor]; - self.tableView.rowHeight = UITableViewAutomaticDimension; - self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; - self.tableView.tableFooterView = [[UIView alloc] init]; - self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension; - self.tableView.estimatedSectionHeaderHeight = 30.0; - - NSArray *cellClasses = @[ - DWSelectorFormTableViewCell.class, - DWDerivationPathKeysTableViewCell.class, - ]; - - for (Class cellClass in cellClasses) { - [self.tableView registerClass:cellClass forCellReuseIdentifier:NSStringFromClass(cellClass)]; - } - - self.visibleIndexes = [self.derivationPath firstUnusedIndex] + 1; -} - -- (UIStatusBarStyle)preferredStatusBarStyle { - return UIStatusBarStyleLightContent; -} - -#pragma mark - UITableViewDataSource - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return self.visibleIndexes + 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - if (section == self.visibleIndexes) { - return 1; - } - else { - return _DWDerivationPathInfo_Count; - } -} - -- (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { - UITextView *labelTextView = [[UITextView alloc] initWithFrame:CGRectZero]; - labelTextView.backgroundColor = [UIColor dw_secondaryBackgroundColor]; - labelTextView.textColor = [UIColor dw_darkTitleColor]; - labelTextView.userInteractionEnabled = FALSE; - labelTextView.font = [UIFont dw_fontForTextStyle:UIFontTextStyleHeadline]; - labelTextView.adjustsFontForContentSizeCategory = YES; - labelTextView.textAlignment = NSTextAlignmentCenter; - labelTextView.textContainerInset = UIEdgeInsetsMake(10, 0, 10, 0); - if (section == self.visibleIndexes) { - labelTextView.text = @" "; - } - else { - labelTextView.text = [NSString stringWithFormat:NSLocalizedString(@"Keypair %ld", nil), section]; - } - return labelTextView; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - if (indexPath.section == self.visibleIndexes) { - NSString *cellId = DWSelectorFormTableViewCell.dw_reuseIdentifier; - DWSelectorFormTableViewCell *cell = (DWSelectorFormTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellId forIndexPath:indexPath]; - cell.cellModel = self.model.loadMoreItem; - return cell; - } - else { - NSString *cellId = DWDerivationPathKeysTableViewCell.dw_reuseIdentifier; - DWDerivationPathKeysTableViewCell *cell = - (DWDerivationPathKeysTableViewCell *)[tableView dequeueReusableCellWithIdentifier:cellId - forIndexPath:indexPath]; - - NSInteger index = indexPath.section; - DWDerivationPathInfo info = indexPath.row; - id item = [self.model itemForInfo:info atIndex:index]; - cell.item = item; - - return cell; - } -} - -#pragma mark - UITableViewDataDelegate - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - - if (indexPath.section == self.visibleIndexes) { - self.visibleIndexes += 1; - - [tableView beginUpdates]; - [tableView insertSections:[NSIndexSet indexSetWithIndex:self.visibleIndexes - 1] withRowAnimation:UITableViewRowAnimationAutomatic]; - [tableView endUpdates]; - - [tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:self.visibleIndexes - 1] atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; - } - else { - DWDerivationPathKeysTableViewCell *cell = - (DWDerivationPathKeysTableViewCell *)[tableView cellForRowAtIndexPath:indexPath]; - id item = cell.item; - if (item && item.detail && ![item.detail isEqualToString:@""]) { - [UIPasteboard generalPasteboard].string = item.detail; - [self.view dw_showInfoHUDWithText:NSLocalizedString(@"Copied", nil)]; - } - } -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/DerivationPathKeysViewController.swift b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/DerivationPathKeysViewController.swift new file mode 100644 index 000000000..75f28e9ad --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/DerivationPathKeysViewController.swift @@ -0,0 +1,139 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +// MARK: - DerivationPathKeysViewController + +final class DerivationPathKeysViewController: BaseViewController, NavigationStackControllable { + private let model: DerivationPathKeysModel + + private var tableView: UITableView! + + convenience init(with key: MNKey, derivationPath: DSAuthenticationKeysDerivationPath) { + self.init(with: DerivationPathKeysModel(key: key, derivationPath: derivationPath)) + } + + init(with model: DerivationPathKeysModel) { + self.model = model + + super.init(nibName: nil, bundle: nil) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + @objc + private func addNewAction() { + model.showNextKey() + + tableView.insertSections([model.visibleIndexes], with: .automatic) + } + + override func viewDidLoad() { + super.viewDidLoad() + + configureHierarchy() + } +} + +// MARK: UITableViewDelegate, UITableViewDataSource + +extension DerivationPathKeysViewController: UITableViewDelegate, UITableViewDataSource { + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let usageInfo = model.usageInfoForKey(at: section) + + let view = tableView.dequeueReusableHeaderFooterView(type: DerivationPathKeysHeaderView.self) + view.titleLabel.text = NSLocalizedString("Keypair", comment: "") + " \(section)" + view.extraInfoLabel.text = usageInfo + return view + } + + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + 40 + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + + guard let cell = tableView.cellForRow(at: indexPath) as? DerivationPathKeysCell, !cell.item.value.isEmpty else { + return + } + + UIPasteboard.general.string = cell.item.value + view.dw_showInfoHUD(withText: NSLocalizedString("Copied", comment: "")) + } + + func numberOfSections(in tableView: UITableView) -> Int { + model.numberOfSections + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + model.numberIfItems + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let info = model.infoItems[indexPath.row] + let item = model.itemForInfo(info, atIndex: indexPath.section) + + let cell = tableView.dequeueReusableCell(type: DerivationPathKeysCell.self, for: indexPath) + cell.update(with: item) + cell.separatorInset = .init(top: 0, left: 15, bottom: 0, right: 0) + return cell + } +} + +extension DerivationPathKeysViewController { + private func configureHierarchy() { + title = model.title + view.backgroundColor = .dw_secondaryBackground() + + let plusItem = UIBarButtonItem(image: UIImage(systemName: "plus"), + style: .plain, + target: self, + action: #selector(addNewAction)) + plusItem.tintColor = UIColor.dw_label() + navigationItem.rightBarButtonItem = plusItem + + tableView = UITableView(frame: .zero, style: .insetGrouped) + tableView.registerClass(for: DerivationPathKeysCell.self) + tableView.registerClassforHeaderFooterView(for: DerivationPathKeysHeaderView.self) + tableView.preservesSuperviewLayoutMargins = true + tableView.backgroundColor = .clear + tableView.estimatedRowHeight = UITableView.automaticDimension + tableView.rowHeight = UITableView.automaticDimension + tableView.translatesAutoresizingMaskIntoConstraints = false + tableView.delegate = self + tableView.dataSource = self + view.addSubview(tableView) + + NSLayoutConstraint.activate([ + tableView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0), + tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0), + tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0), + tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0), + ]) + } +} + +// MARK: NavigationBarStyleable + +extension DerivationPathKeysViewController: NavigationBarStyleable { + var prefersLargeTitles: Bool { true } + var largeTitleDisplayMode: UINavigationItem.LargeTitleDisplayMode { .always } +} diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DWDerivationPathKeysItem.h b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DWDerivationPathKeysItem.h deleted file mode 100644 index b311120dc..000000000 --- a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DWDerivationPathKeysItem.h +++ /dev/null @@ -1,29 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@protocol DWDerivationPathKeysItem - -@property (readonly, nonatomic, copy) NSString *title; -@property (readonly, nonatomic, copy) NSString *detail; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DWDerivationPathKeysItemObject.h b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DWDerivationPathKeysItemObject.h deleted file mode 100644 index 623374db0..000000000 --- a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DWDerivationPathKeysItemObject.h +++ /dev/null @@ -1,31 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2021 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "DWDerivationPathKeysItem.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWDerivationPathKeysItemObject : NSObject - -@property (nonatomic, copy) NSString *title; -@property (nonatomic, copy) NSString *detail; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DWDerivationPathKeysModel.h b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DWDerivationPathKeysModel.h deleted file mode 100644 index ff275a26e..000000000 --- a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DWDerivationPathKeysModel.h +++ /dev/null @@ -1,48 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "DWDerivationPathKeysItem.h" - -NS_ASSUME_NONNULL_BEGIN - -@class DSAuthenticationKeysDerivationPath; -@class DWSelectorFormCellModel; - -typedef NS_ENUM(NSUInteger, DWDerivationPathInfo) { - DWDerivationPathInfo_Address, - DWDerivationPathInfo_PublicKey, - DWDerivationPathInfo_PrivateKey, - DWDerivationPathInfo_WIFPrivateKey, - DWDerivationPathInfo_MasternodeInfo, - _DWDerivationPathInfo_Count, -}; - -@interface DWDerivationPathKeysModel : NSObject - -@property (readonly, nonatomic, strong) DWSelectorFormCellModel *loadMoreItem; - -- (id)itemForInfo:(DWDerivationPathInfo)info atIndex:(NSInteger)index; - -- (instancetype)initWithDerivationPath:(DSAuthenticationKeysDerivationPath *)derivationPath; - -- (instancetype)init NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DWDerivationPathKeysModel.m b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DWDerivationPathKeysModel.m deleted file mode 100644 index 30f488632..000000000 --- a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DWDerivationPathKeysModel.m +++ /dev/null @@ -1,135 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWDerivationPathKeysModel.h" - -#import -#import - -#import "DSMasternodeManager+LocalMasternode.h" -#import "DWDerivationPathKeysItemObject.h" -#import "DWEnvironment.h" -#import "DWSelectorFormCellModel.h" -NS_ASSUME_NONNULL_BEGIN - - -#pragma mark - - -@interface DWDerivationPathKeysModel () - -@property (readonly, nonatomic, strong) DSAuthenticationKeysDerivationPath *derivationPath; - -@end - -@implementation DWDerivationPathKeysModel - -- (instancetype)initWithDerivationPath:(DSAuthenticationKeysDerivationPath *)derivationPath { - self = [super init]; - if (self) { - _derivationPath = derivationPath; - - _loadMoreItem = [[DWSelectorFormCellModel alloc] initWithTitle:NSLocalizedString(@"Load more", nil)]; - } - return self; -} - -- (id)itemForInfo:(DWDerivationPathInfo)info atIndex:(NSInteger)index { - DSWallet *wallet = [DWEnvironment sharedInstance].currentWallet; - - DWDerivationPathKeysItemObject *item = [[DWDerivationPathKeysItemObject alloc] init]; - switch (info) { - case DWDerivationPathInfo_Address: { - item.title = NSLocalizedString(@"Address", nil); - item.detail = [self.derivationPath addressAtIndex:index]; - - break; - } - case DWDerivationPathInfo_PublicKey: { - item.title = NSLocalizedString(@"Public key", nil); - item.detail = [self.derivationPath publicKeyDataAtIndex:index].hexString; - - break; - } - case DWDerivationPathInfo_PrivateKey: { - item.title = NSLocalizedString(@"Private key", nil); - @autoreleasepool { - NSData *seed = [[DSBIP39Mnemonic sharedInstance] deriveKeyFromPhrase:wallet.seedPhraseIfAuthenticated - withPassphrase:nil]; - DSKey *key = [self.derivationPath privateKeyAtIndex:index fromSeed:seed]; - item.detail = key.secretKeyString; - } - - break; - } - case DWDerivationPathInfo_WIFPrivateKey: { - item.title = NSLocalizedString(@"WIF Private key", nil); - @autoreleasepool { - NSData *seed = [[DSBIP39Mnemonic sharedInstance] deriveKeyFromPhrase:wallet.seedPhraseIfAuthenticated - withPassphrase:nil]; - DSKey *key = [self.derivationPath privateKeyAtIndex:index fromSeed:seed]; - item.detail = [key serializedPrivateKeyForChain:wallet.chain]; - } - - break; - } - case DWDerivationPathInfo_MasternodeInfo: { - BOOL used = [self.derivationPath addressIsUsedAtIndex:index]; - if (used) { - DSLocalMasternode *localMasternode = [self.derivationPath.chain.chainManager.masternodeManager localMasternodeUsingIndex:index atDerivationPath:self.derivationPath]; - if (localMasternode) { - item.title = NSLocalizedString(@"Used at IP address", nil); - item.detail = localMasternode.ipAddressAndIfNonstandardPortString; - } - else { - NSArray *localMasternodesArray = [self.derivationPath.chain.chainManager.masternodeManager localMasternodesPreviouslyUsingIndex:index atDerivationPath:self.derivationPath]; - if (localMasternodesArray.count == 1) { - item.title = NSLocalizedString(@"Previously used at IP address", nil); - localMasternode = [localMasternodesArray firstObject]; - item.detail = localMasternode.ipAddressAndIfNonstandardPortString; - } - else if (localMasternodesArray.count == 0) { - item.title = NSLocalizedString(@"Used", nil); - item.detail = @""; - } - else { - item.title = NSLocalizedString(@"Previously used at IP address", nil); - localMasternode = [localMasternodesArray lastObject]; - item.detail = localMasternode.ipAddressAndIfNonstandardPortString; - } - } - } - else { - item.title = NSLocalizedString(@"Not yet used", nil); - item.detail = @""; - } - - - break; - } - default: { - NSAssert(NO, @"Inconsistent state"); - - break; - } - } - - return item; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DerivationPathKeysModel.swift b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DerivationPathKeysModel.swift new file mode 100644 index 000000000..4b9d6a861 --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DerivationPathKeysModel.swift @@ -0,0 +1,156 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +// MARK: - DerivationPathKeysItem + +struct DerivationPathKeysItem { + let title: String + let value: String + + init(title: String, value: String) { + self.title = title + self.value = value + } + + init(info: DerivationPathInfo, value: String) { + title = info.title + self.value = value + } +} + +// MARK: - DerivationPathInfo + +enum DerivationPathInfo: CaseIterable { + case address + case publicKey + case privateKey + case wifPrivateKey +} + +extension DerivationPathInfo { + var title: String { + switch self { + case .address: + return NSLocalizedString("Address", comment: "") + case .publicKey: + return NSLocalizedString("Public key", comment: "") + case .privateKey: + return NSLocalizedString("Private key", comment: "") + case .wifPrivateKey: + return NSLocalizedString("WIF Private key", comment: "") + } + } +} + +// MARK: - DerivationPathKeysModel + +final class DerivationPathKeysModel { + let key: MNKey + let derivationPath: DSAuthenticationKeysDerivationPath + + let infoItems = DerivationPathInfo.allCases + + var visibleIndexes: Int + + init(key: MNKey, derivationPath: DSAuthenticationKeysDerivationPath) { + self.key = key + self.derivationPath = derivationPath + visibleIndexes = Int(derivationPath.firstUnusedIndex()) + } + + func showNextKey() { + visibleIndexes += 1 + } +} + +// MARK: UI Helper +extension DerivationPathKeysModel { + var title: String { + key.title + } + + var numberOfSections: Int { + visibleIndexes + 1 + } + + var numberIfItems: Int { + infoItems.count + } + + func usageInfoForKey(at index: Int) -> String { + let used = derivationPath.addressIsUsed(at: UInt32(index)) + + if used { + if let localMasternode = derivationPath.chain.chainManager!.masternodeManager.localMasternode(using: UInt32(index), at: derivationPath) { + return NSLocalizedString("Used at: ", comment: "") + localMasternode.ipAddressAndIfNonstandardPortString + } else { + guard let localMasternodesArray = derivationPath.chain.chainManager!.masternodeManager.localMasternodesPreviously(using: UInt32(index), at: derivationPath) else { + return NSLocalizedString("Not yet used", comment: "") + } + + if localMasternodesArray.count == 1 { + let localMasternode = localMasternodesArray.first! + return NSLocalizedString("Previously used at: ", comment: "") + localMasternode.ipAddressAndIfNonstandardPortString + } else if localMasternodesArray.isEmpty { + return NSLocalizedString("Used", comment: "") + } else { + let localMasternode = localMasternodesArray.last! + return NSLocalizedString("Previously used at: ", comment: "") + localMasternode.ipAddressAndIfNonstandardPortString + } + } + } else { + return NSLocalizedString("Not yet used", comment: "") + } + } + + func itemForInfo(_ info: DerivationPathInfo, atIndex index: Int) -> DerivationPathKeysItem { + let wallet = DWEnvironment.sharedInstance().currentWallet + + switch info { + case .address: + let address = derivationPath.address(at: UInt32(index)) + return DerivationPathKeysItem(info: info, value: address) + case .publicKey: + let publicKeyData = derivationPath.publicKeyData(at: UInt32(index)) + return DerivationPathKeysItem(info: info, value: publicKeyData.hexEncodedString()) + case .privateKey: + return autoreleasepool { + guard let phrase = wallet.seedPhraseIfAuthenticated() else { + return DerivationPathKeysItem(info: info, value: NSLocalizedString("Not available", comment: "")) + } + let seed = DSBIP39Mnemonic.sharedInstance()!.deriveKey(fromPhrase: phrase, withPassphrase: nil) + + let key = self.derivationPath.privateKey(at: UInt32(index), fromSeed: seed)! + + return DerivationPathKeysItem(info: info, value: key.secretKeyString) + } + case .wifPrivateKey: + return autoreleasepool { + guard let phrase = wallet.seedPhraseIfAuthenticated() else { + return DerivationPathKeysItem(info: info, value: NSLocalizedString("Not available", comment: "")) + } + let seed = DSBIP39Mnemonic.sharedInstance()!.deriveKey(fromPhrase: phrase, withPassphrase: nil) + + let key = self.derivationPath.privateKey(at: UInt32(index), fromSeed: seed)! + + return DerivationPathKeysItem(info: info, value: key.serializedPrivateKey(for: wallet.chain)!) + } + } + } +} diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Views/DerivationPathKeysCell.swift b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Views/DerivationPathKeysCell.swift new file mode 100644 index 000000000..fc2d8c3a6 --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Views/DerivationPathKeysCell.swift @@ -0,0 +1,88 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +final class DerivationPathKeysCell: UITableViewCell { + private var nameLabel: UILabel! + private var valueLabel: UILabel! + private var copyButton: UIButton! + + private(set) var item: DerivationPathKeysItem! + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + configureHierarchy() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + + func update(with item: DerivationPathKeysItem) { + self.item = item + + nameLabel.text = item.title + valueLabel.text = item.value + } + + private func configureHierarchy() { + backgroundColor = .dw_background() + contentView.backgroundColor = .dw_background() + + let mainStackView = UIStackView() + mainStackView.translatesAutoresizingMaskIntoConstraints = false + mainStackView.axis = .vertical + mainStackView.spacing = 2 + contentView.addSubview(mainStackView) + + nameLabel = UILabel() + nameLabel.translatesAutoresizingMaskIntoConstraints = false + nameLabel.font = .dw_font(forTextStyle: .footnote) + nameLabel.textColor = UIColor.dw_secondaryText() + mainStackView.addArrangedSubview(nameLabel) + + valueLabel = UILabel() + valueLabel.translatesAutoresizingMaskIntoConstraints = false + valueLabel.font = .dw_font(forTextStyle: .subheadline) + valueLabel.numberOfLines = 0 + valueLabel.lineBreakMode = .byWordWrapping + valueLabel.textColor = .dw_label() + mainStackView.addArrangedSubview(valueLabel) + + copyButton = UIButton(type: .custom) + copyButton.setImage(UIImage(named: "icon_copy_outline"), for: .normal) + copyButton.translatesAutoresizingMaskIntoConstraints = false + copyButton.tintColor = .dw_label() + copyButton.isUserInteractionEnabled = false + contentView.addSubview(copyButton) + + NSLayoutConstraint.activate([ + mainStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 15), + mainStackView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 9), + mainStackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -9), + + copyButton.widthAnchor.constraint(equalToConstant: 30), + copyButton.heightAnchor.constraint(equalToConstant: 30), + copyButton.leadingAnchor.constraint(equalTo: mainStackView.trailingAnchor, constant: 5), + copyButton.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -5), + copyButton.centerYAnchor.constraint(equalTo: contentView.centerYAnchor, constant: 0), + ]) + } +} diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Views/DerivationPathKeysHeaderView.swift b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Views/DerivationPathKeysHeaderView.swift new file mode 100644 index 000000000..19dac02bb --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Views/DerivationPathKeysHeaderView.swift @@ -0,0 +1,64 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +final class DerivationPathKeysHeaderView: UITableViewHeaderFooterView { + var titleLabel: UILabel! + var extraInfoLabel: UILabel! + + override init(reuseIdentifier: String?) { + super.init(reuseIdentifier: reuseIdentifier) + + configureHierarchy() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override var intrinsicContentSize: CGSize { + .init(width: DerivationPathKeysHeaderView.noIntrinsicMetric, height: 30) + } + + private func configureHierarchy() { + contentView.backgroundColor = .dw_secondaryBackground() + + titleLabel = UILabel() + titleLabel.translatesAutoresizingMaskIntoConstraints = false + titleLabel.font = .dw_font(forTextStyle: .callout).withWeight(UIFont.Weight.semibold.rawValue) + titleLabel.textColor = UIColor.dw_label() + contentView.addSubview(titleLabel) + + extraInfoLabel = UILabel() + extraInfoLabel.translatesAutoresizingMaskIntoConstraints = false + extraInfoLabel.font = .dw_font(forTextStyle: .footnote) + extraInfoLabel.textColor = .dw_secondaryText() + extraInfoLabel.textAlignment = .right + contentView.addSubview(extraInfoLabel) + + NSLayoutConstraint.activate([ + titleLabel.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 0), + titleLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0), + titleLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0), + + extraInfoLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: 0), + extraInfoLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 0), + extraInfoLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: 0), + ]) + } +} diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/Cell/KeysOverviewCell.swift b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/Cell/KeysOverviewCell.swift new file mode 100644 index 000000000..d13d83e18 --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/Cell/KeysOverviewCell.swift @@ -0,0 +1,80 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +final class KeysOverviewCell: UITableViewCell { + private var keyNameLabel: UILabel! + private var keyCountLabel: UILabel! + private var usedLabel: UILabel! + + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { + super.init(style: style, reuseIdentifier: reuseIdentifier) + + configureHierarchy() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + func update(with keyItem: MNKey, count: Int, used: Int) { + let keyCountText = String(format: NSLocalizedString("%d key(s)", comment: "#bc-ignore!"), count) + let usedCountText = String(format: NSLocalizedString("%ld used(s)", comment: "#bc-ignore!"), used) + + keyNameLabel.text = keyItem.title + keyCountLabel.text = keyCountText + usedLabel.text = usedCountText + } + + private func configureHierarchy() { + backgroundColor = .dw_background() + contentView.backgroundColor = .dw_background() + + let mainStackView = UIStackView() + mainStackView.translatesAutoresizingMaskIntoConstraints = false + mainStackView.axis = .vertical + mainStackView.spacing = 2 + contentView.addSubview(mainStackView) + + keyNameLabel = UILabel() + keyNameLabel.translatesAutoresizingMaskIntoConstraints = false + keyNameLabel.font = .dw_font(forTextStyle: .subheadline) + mainStackView.addArrangedSubview(keyNameLabel) + + keyCountLabel = UILabel() + keyCountLabel.translatesAutoresizingMaskIntoConstraints = false + keyCountLabel.font = .dw_font(forTextStyle: .caption1) + mainStackView.addArrangedSubview(keyCountLabel) + + usedLabel = UILabel() + usedLabel.translatesAutoresizingMaskIntoConstraints = false + usedLabel.textAlignment = .right + usedLabel.font = .dw_font(forTextStyle: .footnote) + contentView.addSubview(usedLabel) + + NSLayoutConstraint.activate([ + mainStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 15), + mainStackView.centerYAnchor.constraint(equalTo: contentView.centerYAnchor, constant: 0), + + usedLabel.leadingAnchor.constraint(equalTo: mainStackView.trailingAnchor, constant: 5), + usedLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -5), + usedLabel.centerYAnchor.constraint(equalTo: contentView.centerYAnchor, constant: 0), + ]) + } +} + diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/DWKeysOverviewViewController.m b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/DWKeysOverviewViewController.m deleted file mode 100644 index b6f2befce..000000000 --- a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/DWKeysOverviewViewController.m +++ /dev/null @@ -1,207 +0,0 @@ -// -// Created by Sam Westrich -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWKeysOverviewViewController.h" - -#import "DWDerivationPathKeysViewController.h" -#import "DWFormTableViewController.h" -#import "DWUIKit.h" -#import "DWWalletKeysOverviewModel.h" -#import -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface DWKeysOverviewViewController () - -@property (null_resettable, nonatomic, strong) DWWalletKeysOverviewModel *model; -@property (nonatomic, strong) DWFormTableViewController *formController; - -@end - -@implementation DWKeysOverviewViewController - - -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil { - if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { - self.title = NSLocalizedString(@"Wallet Keys", nil); - self.hidesBottomBarWhenPushed = YES; - } - - return self; -} - -- (DWWalletKeysOverviewModel *)model { - if (_model == nil) { - _model = [[DWWalletKeysOverviewModel alloc] init]; - } - - return _model; -} - - -- (NSArray *)items { - __weak typeof(self) weakSelf = self; - - NSMutableArray *items = [NSMutableArray array]; - - { - DWSelectorFormCellModel *cellModel = [[DWSelectorFormCellModel alloc] initWithTitle:NSLocalizedString(@"Owner Keys", nil)]; - cellModel.subTitle = [NSString stringWithFormat:NSLocalizedString(@"%ld used(s)", @"#bc-ignore!"), - self.model.ownerDerivationPath.usedAddresses.count]; - cellModel.accessoryType = DWSelectorFormAccessoryType_DisclosureIndicator; - cellModel.didSelectBlock = ^(DWSelectorFormCellModel *_Nonnull cellModel, NSIndexPath *_Nonnull indexPath) { - if ([DSAuthenticationManager sharedInstance].didAuthenticate) { - __strong typeof(weakSelf) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - [strongSelf showOwnerKeys]; - } - else { - [[DSAuthenticationManager sharedInstance] authenticateWithPrompt:nil - usingBiometricAuthentication:NO - alertIfLockout:YES - completion:^(BOOL authenticatedOrSuccess, BOOL usedBiometrics, BOOL cancelled) { - __strong typeof(weakSelf) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - if (authenticatedOrSuccess) { - [strongSelf showOwnerKeys]; - } - }]; - } - }; - [items addObject:cellModel]; - } - - { - DWSelectorFormCellModel *cellModel = [[DWSelectorFormCellModel alloc] initWithTitle:NSLocalizedString(@"Voting Keys", nil)]; - cellModel.subTitle = [NSString stringWithFormat:NSLocalizedString(@"%ld used(s)", @"#bc-ignore!"), - self.model.votingDerivationPath.usedAddresses.count]; - cellModel.accessoryType = DWSelectorFormAccessoryType_DisclosureIndicator; - cellModel.didSelectBlock = ^(DWSelectorFormCellModel *_Nonnull cellModel, NSIndexPath *_Nonnull indexPath) { - if ([DSAuthenticationManager sharedInstance].didAuthenticate) { - __strong typeof(weakSelf) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - [strongSelf showVotingKeys]; - } - else { - [[DSAuthenticationManager sharedInstance] authenticateWithPrompt:nil - usingBiometricAuthentication:NO - alertIfLockout:YES - completion:^(BOOL authenticatedOrSuccess, BOOL usedBiometrics, BOOL cancelled) { - __strong typeof(weakSelf) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - if (authenticatedOrSuccess) { - [strongSelf showVotingKeys]; - } - }]; - } - }; - [items addObject:cellModel]; - } - - { - DWSelectorFormCellModel *cellModel = [[DWSelectorFormCellModel alloc] initWithTitle:NSLocalizedString(@"Operator Keys", nil)]; - cellModel.subTitle = [NSString stringWithFormat:NSLocalizedString(@"%ld used(s)", @"#bc-ignore!"), - self.model.operatorDerivationPath.usedAddresses.count]; - cellModel.accessoryType = DWSelectorFormAccessoryType_DisclosureIndicator; - cellModel.didSelectBlock = ^(DWSelectorFormCellModel *_Nonnull cellModel, NSIndexPath *_Nonnull indexPath) { - if ([DSAuthenticationManager sharedInstance].didAuthenticate) { - __strong typeof(weakSelf) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - [strongSelf showOperatorKeys]; - } - else { - [[DSAuthenticationManager sharedInstance] authenticateWithPrompt:nil - usingBiometricAuthentication:NO - alertIfLockout:YES - completion:^(BOOL authenticatedOrSuccess, BOOL usedBiometrics, BOOL cancelled) { - __strong typeof(weakSelf) strongSelf = weakSelf; - if (!strongSelf) { - return; - } - if (authenticatedOrSuccess) { - [strongSelf showOperatorKeys]; - } - }]; - } - }; - [items addObject:cellModel]; - } - - return items; -} - -- (NSArray *)sections { - DWFormSectionModel *section = [[DWFormSectionModel alloc] init]; - section.items = [self items]; - - return @[ section ]; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - self.view.backgroundColor = [UIColor dw_secondaryBackgroundColor]; - - DWFormTableViewController *formController = [[DWFormTableViewController alloc] initWithStyle:UITableViewStylePlain]; - [formController setSections:[self sections] placeholderText:nil]; - - [self dw_embedChild:formController]; - self.formController = formController; -} - -- (UIStatusBarStyle)preferredStatusBarStyle { - return UIStatusBarStyleLightContent; -} - -#pragma mark - Private - -- (void)showOwnerKeys { - [self showDerivationPathKeysViewControllerWithDerivationPath:self.model.ownerDerivationPath - title:NSLocalizedString(@"Owner Keys", nil)]; -} - -- (void)showVotingKeys { - [self showDerivationPathKeysViewControllerWithDerivationPath:self.model.votingDerivationPath - title:NSLocalizedString(@"Voting Keys", nil)]; -} - -- (void)showOperatorKeys { - [self showDerivationPathKeysViewControllerWithDerivationPath:self.model.operatorDerivationPath - title:NSLocalizedString(@"Operator Keys", nil)]; -} - -- (void)showDerivationPathKeysViewControllerWithDerivationPath:(DSAuthenticationKeysDerivationPath *)derivationPath title:(NSString *)title { - DWDerivationPathKeysViewController *controller = [[DWDerivationPathKeysViewController alloc] initWithDerivationPath:derivationPath]; - controller.title = title; - [self.navigationController pushViewController:controller animated:YES]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/DWWalletKeysOverviewModel.h b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/DWWalletKeysOverviewModel.h deleted file mode 100644 index 975a0f9f7..000000000 --- a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/DWWalletKeysOverviewModel.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@class DSAuthenticationKeysDerivationPath; - -@interface DWWalletKeysOverviewModel : NSObject - -@property (readonly, nonatomic, strong) DSAuthenticationKeysDerivationPath *ownerDerivationPath; -@property (readonly, nonatomic, strong) DSAuthenticationKeysDerivationPath *votingDerivationPath; -@property (readonly, nonatomic, strong) DSAuthenticationKeysDerivationPath *operatorDerivationPath; - - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/DWWalletKeysOverviewModel.m b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/DWWalletKeysOverviewModel.m deleted file mode 100644 index e68144661..000000000 --- a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/DWWalletKeysOverviewModel.m +++ /dev/null @@ -1,44 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWWalletKeysOverviewModel.h" - -#import -#import -#import - -#import "DWEnvironment.h" - -NS_ASSUME_NONNULL_BEGIN - -@implementation DWWalletKeysOverviewModel - -- (instancetype)init { - self = [super init]; - if (self) { - DSWallet *wallet = [DWEnvironment sharedInstance].currentWallet; - DSDerivationPathFactory *factory = [DSDerivationPathFactory sharedInstance]; - _ownerDerivationPath = [factory providerOwnerKeysDerivationPathForWallet:wallet]; - _votingDerivationPath = [factory providerVotingKeysDerivationPathForWallet:wallet]; - _operatorDerivationPath = [factory providerOperatorKeysDerivationPathForWallet:wallet]; - } - return self; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/KeysOverviewViewController.swift b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/KeysOverviewViewController.swift new file mode 100644 index 000000000..b318de41c --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/KeysOverviewViewController.swift @@ -0,0 +1,117 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +// MARK: - KeysOverviewViewController + +@objc(DWKeysOverviewViewController) +final class KeysOverviewViewController: BaseViewController { + private var tableView: UITableView! + private var model: WalletKeysOverviewModel! + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + } + + override func viewDidLoad() { + super.viewDidLoad() + + configureModel() + configureHierarchy() + } +} + +extension KeysOverviewViewController { + private func configureModel() { + model = WalletKeysOverviewModel() + } + + private func configureHierarchy() { + title = NSLocalizedString("Masternode Keys", comment: "") + view.backgroundColor = .dw_secondaryBackground() + + tableView = UITableView(frame: .zero, style: .insetGrouped) + tableView.preservesSuperviewLayoutMargins = true + tableView.rowHeight = 62 + tableView.backgroundColor = .clear + tableView.estimatedRowHeight = 62 + tableView.translatesAutoresizingMaskIntoConstraints = false + tableView.registerClass(for: KeysOverviewCell.self) + tableView.delegate = self + tableView.dataSource = self + view.addSubview(tableView) + + NSLayoutConstraint.activate([ + tableView.topAnchor.constraint(equalTo: view.topAnchor, constant: 0), + tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0), + tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 0), + tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 0), + ]) + } +} + +// MARK: UITableViewDataSource, UITableViewDelegate + +extension KeysOverviewViewController: UITableViewDataSource, UITableViewDelegate { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + model.items.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let item = model.items[indexPath.row] + let count = model.keyCount(for: item) + let used = model.usedCount(for: item) + + let cell = tableView.dequeueReusableCell(type: KeysOverviewCell.self, for: indexPath) + cell.accessoryType = .disclosureIndicator + cell.update(with: item, count: count, used: used) + return cell + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + + let showVcBlock = { [weak self] in + guard let self else { return } + + let item = model.items[indexPath.row] + let derivationPath = model.derivationPath(for: item) + let vc = DerivationPathKeysViewController(with: item, derivationPath: derivationPath) + vc.hidesBottomBarWhenPushed = true + navigationController?.pushViewController(vc, animated: true) + } + + if DSAuthenticationManager.sharedInstance().didAuthenticate { + showVcBlock() + } + else { + DSAuthenticationManager.sharedInstance().authenticate(withPrompt: nil, usingBiometricAuthentication: false, alertIfLockout: true) { authenticatedOrSuccess, _, _ in + + guard authenticatedOrSuccess else { return } + showVcBlock() + } + } + } +} + +// MARK: NavigationBarStyleable + +extension KeysOverviewViewController: NavigationBarStyleable { + var prefersLargeTitles: Bool { true } + var largeTitleDisplayMode: UINavigationItem.LargeTitleDisplayMode { .always } +} diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/Model/WalletKeysOverviewModel.swift b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/Model/WalletKeysOverviewModel.swift new file mode 100644 index 000000000..f151c8c9d --- /dev/null +++ b/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/Model/WalletKeysOverviewModel.swift @@ -0,0 +1,90 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +// MARK: - MNKey + +enum MNKey: CaseIterable { + case owner + case voting + case `operator` + case hpmnOperator +} + +extension MNKey { + var title: String { + switch self { + case .owner: + return NSLocalizedString("Owner Keys", comment: "") + case .voting: + return NSLocalizedString("Voting Keys", comment: "") + case .operator: + return NSLocalizedString("Operator Keys", comment: "") + case .hpmnOperator: + return NSLocalizedString("HPMN Operator Keys", comment: "") + } + } +} + +// MARK: - WalletKeysOverviewModel + +final class WalletKeysOverviewModel { + var items: [MNKey] = MNKey.allCases + + let ownerDerivationPath: DSAuthenticationKeysDerivationPath + let votingDerivationPath: DSAuthenticationKeysDerivationPath + let operatorDerivationPath: DSAuthenticationKeysDerivationPath + let hpmnOperatorDerivationPath: DSAuthenticationKeysDerivationPath + + init() { + let wallet = DWEnvironment.sharedInstance().currentWallet + let factory = DSDerivationPathFactory.sharedInstance()! + + ownerDerivationPath = factory.providerOwnerKeysDerivationPath(for: wallet) + votingDerivationPath = factory.providerVotingKeysDerivationPath(for: wallet) + operatorDerivationPath = factory.providerOperatorKeysDerivationPath(for: wallet) + hpmnOperatorDerivationPath = operatorDerivationPath + // hpmnOperatorDerivationPath = factory.platformNodeKeysDerivationPath(for: wallet) //We will use it in another branch + } + + func derivationPath(for type: MNKey) -> DSAuthenticationKeysDerivationPath { + switch type { + case .owner: + return ownerDerivationPath + case .voting: + return votingDerivationPath + case .operator: + return operatorDerivationPath + case .hpmnOperator: + return hpmnOperatorDerivationPath + } + } + + func keyCount(for type: MNKey) -> Int { + let derivationPath = derivationPath(for: type) + let firstUnusedIndex = derivationPath.firstUnusedIndex(); + + // NOTE: Always show at least one key + return Int(max(firstUnusedIndex, 1)) + } + + func usedCount(for type: MNKey) -> Int { + let derivationPath = derivationPath(for: type) + return derivationPath.usedAddresses.count + } +} diff --git a/DashWallet/Sources/UI/Onboarding/Stubs/DWHomeModelStub.m b/DashWallet/Sources/UI/Onboarding/Stubs/DWHomeModelStub.m index 20fbe777c..dc01ec941 100644 --- a/DashWallet/Sources/UI/Onboarding/Stubs/DWHomeModelStub.m +++ b/DashWallet/Sources/UI/Onboarding/Stubs/DWHomeModelStub.m @@ -29,7 +29,7 @@ NS_ASSUME_NONNULL_BEGIN -@interface DWHomeModelStub () +@interface DWHomeModelStub () @property (readonly, nonatomic, copy) NSArray *stubTxs; @@ -165,6 +165,18 @@ - (void)reloadTxDataSource { [self.updatesObserver homeModel:self didUpdateDataSource:self.dataSource shouldAnimate:NO]; } +- (NSString *)supplementaryAmountString { + return [self.balanceModel fiatAmountString]; +} + +- (NSString *)mainAmountString { + return [self.balanceModel mainAmountString]; +} + +- (BOOL)isBalanceHidden { + return self.balanceDisplayOptions.balanceHidden; +} + @end NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Onboarding/Stubs/DWPayModelStub.m b/DashWallet/Sources/UI/Onboarding/Stubs/DWPayModelStub.m index 75db00239..2bf2f1f4e 100644 --- a/DashWallet/Sources/UI/Onboarding/Stubs/DWPayModelStub.m +++ b/DashWallet/Sources/UI/Onboarding/Stubs/DWPayModelStub.m @@ -60,10 +60,8 @@ - (instancetype)init { _options = [options copy]; - pasteboardOption.details = @"XrUv3aniSvZEKx2VoFe5fTqFfYL5JYFkbg"; - __weak typeof(self) weakSelf = self; - [_inputBuilder payFirstFromArray:@[ pasteboardOption.details ] + [_inputBuilder payFirstFromArray:@[ @"XrUv3aniSvZEKx2VoFe5fTqFfYL5JYFkbg" ] source:DWPaymentInputSource_Pasteboard completion:^(DWPaymentInput *_Nonnull paymentInput) { __strong typeof(weakSelf) strongSelf = weakSelf; diff --git a/DashWallet/Sources/UI/Payments/DWPaymentsViewController.h b/DashWallet/Sources/UI/Payments/DWPaymentsViewController.h deleted file mode 100644 index 59fcf8c25..000000000 --- a/DashWallet/Sources/UI/Payments/DWPaymentsViewController.h +++ /dev/null @@ -1,59 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "DWDemoDelegate.h" -#import "dashwallet-Swift.h" - -NS_ASSUME_NONNULL_BEGIN - -@class DWPaymentsViewController; -@protocol DWReceiveModelProtocol; -@protocol DWPayModelProtocol; -@protocol DWTransactionListDataProviderProtocol; -@protocol DWDPBasicUserItem; - -typedef NS_ENUM(NSUInteger, DWPaymentsViewControllerIndex) { - DWPaymentsViewControllerIndex_None = -1, - DWPaymentsViewControllerIndex_Pay = 0, - DWPaymentsViewControllerIndex_Receive = 1, -}; - -@protocol DWPaymentsViewControllerDelegate - -- (void)paymentsViewControllerDidCancel:(DWPaymentsViewController *)controller; -- (void)paymentsViewControllerDidFinishPayment:(DWPaymentsViewController *)controller - contact:(nullable id)contact; - -@end - -@interface DWPaymentsViewController : UIViewController - -@property (nullable, nonatomic, weak) id delegate; -@property (nonatomic, assign) DWPaymentsViewControllerIndex currentIndex; - -@property (nonatomic, assign) BOOL demoMode; -@property (nullable, nonatomic, weak) id demoDelegate; - -+ (instancetype)controllerWithReceiveModel:(id)receiveModel - payModel:(id)payModel - dataProvider:(id)dataProvider; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Payments/DWPaymentsViewController.m b/DashWallet/Sources/UI/Payments/DWPaymentsViewController.m deleted file mode 100644 index e70f4c7a5..000000000 --- a/DashWallet/Sources/UI/Payments/DWPaymentsViewController.m +++ /dev/null @@ -1,278 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWPaymentsViewController.h" - -#import "DWControllerCollectionView.h" -#import "DWGlobalOptions.h" -#import "DWPayViewController.h" -#import "DWReceiveViewController.h" -#import "DWSegmentedControl.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWPaymentsViewController () - -@property (strong, nonatomic) IBOutlet UILabel *navigationTitleLabel; -@property (strong, nonatomic) IBOutlet DWSegmentedControl *segmentedControl; -@property (strong, nonatomic) IBOutlet DWControllerCollectionView *controllerCollectionView; - -@property (nonatomic, strong) id receiveModel; -@property (nonatomic, strong) id payModel; -@property (nonatomic, strong) id dataProvider; - -@property (nonatomic, strong) DWPayViewController *payViewController; -@property (nonatomic, strong) DWReceiveViewController *receiveViewController; - -@property (nonatomic, assign) BOOL didPerformInitialPageOpen; -@property (nullable, nonatomic, strong) NSIndexPath *prevIndexPathAtCenter; - -@end - -@implementation DWPaymentsViewController - -+ (instancetype)controllerWithReceiveModel:(id)receiveModel - payModel:(id)payModel - dataProvider:(id)dataProvider { - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Payments" bundle:nil]; - DWPaymentsViewController *controller = [storyboard instantiateInitialViewController]; - controller.receiveModel = receiveModel; - controller.payModel = payModel; - controller.dataProvider = dataProvider; - - return controller; -} - -- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - _currentIndex = DWPaymentsViewControllerIndex_None; - } - return self; -} - -- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { - self = [super initWithCoder:aDecoder]; - if (self) { - _currentIndex = DWPaymentsViewControllerIndex_None; - } - return self; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - [self setupView]; - [self setupControllers]; -} - -- (UIStatusBarStyle)preferredStatusBarStyle { - return UIStatusBarStyleDefault; -} - -- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator { - [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; - - self.prevIndexPathAtCenter = [self currentIndexPath]; - - [coordinator - animateAlongsideTransition:nil - completion:^(id _Nonnull context) { - [self.controllerCollectionView.collectionViewLayout invalidateLayout]; - [self scrollToIndexPath:self.prevIndexPathAtCenter animated:NO]; - }]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - [self.controllerCollectionView reloadData]; - - if (!self.didPerformInitialPageOpen) { - self.didPerformInitialPageOpen = YES; - - // scroll to needed index when reloadData finishes - - [self.controllerCollectionView - performBatchUpdates:^{ - } - completion:^(BOOL finished) { - DWPaymentsViewControllerIndex previousIndex = [self previouslySelectedPageIndex]; - if (self.currentIndex == DWPaymentsViewControllerIndex_None) { - self.currentIndex = previousIndex; - } - NSIndexPath *indexPath = [NSIndexPath indexPathForItem:self.currentIndex inSection:0]; - [self scrollToIndexPath:indexPath animated:NO]; - }]; - } -} - -- (void)viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - - [self saveCurrentSelectedPageIndex]; -} - -#pragma mark - DWNavigationFullscreenable - -- (BOOL)requiresNoNavigationBar { - return YES; -} - -#pragma mark - Private - -- (void)setupView { - self.navigationTitleLabel.text = NSLocalizedString(@"Payments", nil); - - NSArray *items = @[ - NSLocalizedString(@"Send", nil), - NSLocalizedString(@"Receive", nil), - ]; - self.segmentedControl.shouldAnimateSelection = NO; - self.segmentedControl.items = items; - [self.segmentedControl addTarget:self - action:@selector(segmentedControlAction:) - forControlEvents:UIControlEventValueChanged]; - - self.controllerCollectionView.delegate = self; - self.controllerCollectionView.controllerDataSource = self; - self.controllerCollectionView.containerViewController = self; - -#if SNAPSHOT -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wundeclared-selector" - NSArray *internalButtons = [(id)self.segmentedControl performSelector:@selector(buttons)]; -#pragma clang diagnostic pop - - internalButtons.lastObject.accessibilityIdentifier = @"payments_receive_segment"; -#endif /* SNAPSHOT */ -} - -- (void)setupControllers { - self.payViewController = [DWPayViewController controllerWithModel:self.payModel - dataProvider:self.dataProvider]; - self.payViewController.delegate = self; - self.payViewController.demoMode = self.demoMode; - self.payViewController.demoDelegate = self.demoDelegate; - DWReceiveViewController *receiveViewController = [DWReceiveViewController controllerWithModel:self.receiveModel]; - receiveViewController.viewType = DWReceiveViewType_Default; - self.receiveViewController = receiveViewController; -} - -#pragma mark - Actions - -- (IBAction)cancelButtonAction:(id)sender { - [self.delegate paymentsViewControllerDidCancel:self]; -} - -- (void)segmentedControlAction:(DWSegmentedControl *)sender { - NSIndexPath *indexPath = [NSIndexPath indexPathForItem:sender.selectedSegmentIndex inSection:0]; - [self scrollToIndexPath:indexPath animated:YES]; -} - -#pragma mark DWControllerCollectionViewDataSource - -- (NSInteger)numberOfItemsInControllerCollectionView:(DWControllerCollectionView *)view { - return 2; -} - -- (UIViewController *)controllerCollectionView:(DWControllerCollectionView *)view controllerForIndexPath:(NSIndexPath *)indexPath { - if (indexPath.item == DWPaymentsViewControllerIndex_Pay) { - return self.payViewController; - } - else { - NSAssert(indexPath.item == DWPaymentsViewControllerIndex_Receive, @"Invalid datasource"); - return self.receiveViewController; - } -} - -#pragma mark UICollectionViewDelegateFlowLayout - -- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { - return collectionView.bounds.size; -} - -- (CGPoint)collectionView:(UICollectionView *)collectionView targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset { - NSIndexPath *indexPath = self.prevIndexPathAtCenter; - if (!indexPath) { - return proposedContentOffset; - } - - UICollectionViewLayoutAttributes *attributes = - [collectionView layoutAttributesForItemAtIndexPath:indexPath]; - if (!attributes) { - return proposedContentOffset; - } - - const CGPoint newOriginForOldCenter = attributes.frame.origin; - return newOriginForOldCenter; -} - -#pragma mark - UIScrollViewDelegate - -- (void)scrollViewDidScroll:(UIScrollView *)scrollView { - const CGFloat offset = scrollView.contentOffset.x; - const CGFloat pageWidth = CGRectGetWidth(scrollView.bounds); - if (pageWidth == 0.0) { - return; - } - - const CGFloat percent = offset / pageWidth; - self.segmentedControl.selectedSegmentIndexPercent = percent; -} - -#pragma mark - DWPayViewControllerDelegate - -- (void)payViewControllerDidFinishPayment:(DWPayViewController *)controller contact:(nullable id)contact { - // hide payments controller after successful payment - [self.delegate paymentsViewControllerDidFinishPayment:self contact:contact]; -} - -#pragma mark - Private - -- (nullable NSIndexPath *)currentIndexPath { - const CGPoint center = [self.view convertPoint:self.controllerCollectionView.center toView:self.controllerCollectionView]; - NSIndexPath *indexPath = [self.controllerCollectionView indexPathForItemAtPoint:center]; - - return indexPath; -} - -- (void)scrollToIndexPath:(NSIndexPath *)indexPath animated:(BOOL)animated { - NSParameterAssert(indexPath); - if (!indexPath) { - return; - } - - [self.controllerCollectionView scrollToItemAtIndexPath:indexPath - atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally - animated:animated]; -} - -- (DWPaymentsViewControllerIndex)previouslySelectedPageIndex { - return [DWGlobalOptions sharedInstance].paymentsScreenCurrentTab; -} - -- (void)saveCurrentSelectedPageIndex { - const NSInteger currentIndex = self.segmentedControl.selectedSegmentIndex; - [DWGlobalOptions sharedInstance].paymentsScreenCurrentTab = currentIndex; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Payments/Pay/Cells/DWPayTableViewCell.h b/DashWallet/Sources/UI/Payments/Pay/Cells/DWPayTableViewCell.h deleted file mode 100644 index 95828d299..000000000 --- a/DashWallet/Sources/UI/Payments/Pay/Cells/DWPayTableViewCell.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@class DWPayOptionModel; -@class DWPayTableViewCell; - -@protocol DWPayTableViewCellDelegate - -- (void)payTableViewCell:(DWPayTableViewCell *)cell action:(UIButton *)sender; - -@end - -@interface DWPayTableViewCell : KVOUITableViewCell - -@property (nullable, strong, nonatomic) DWPayOptionModel *model; -@property (nullable, nonatomic, weak) id delegate; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Payments/Pay/Cells/DWPayTableViewCell.m b/DashWallet/Sources/UI/Payments/Pay/Cells/DWPayTableViewCell.m deleted file mode 100644 index e657c04d4..000000000 --- a/DashWallet/Sources/UI/Payments/Pay/Cells/DWPayTableViewCell.m +++ /dev/null @@ -1,83 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWPayTableViewCell.h" - -#import "DWPayOptionModel.h" -#import "DWUIKit.h" - -NS_ASSUME_NONNULL_BEGIN - - -static CGFloat const MAX_ALLOWED_BUTTON_WIDTH = 108.0; - -@interface DWPayTableViewCell () - -@property (strong, nonatomic) IBOutlet UIImageView *iconImageView; -@property (strong, nonatomic) IBOutlet UILabel *titleLabel; -@property (strong, nonatomic) IBOutlet UILabel *descriptionLabel; -@property (strong, nonatomic) IBOutlet UIButton *actionButton; - -@end - -@implementation DWPayTableViewCell - -- (void)awakeFromNib { - [super awakeFromNib]; - - self.titleLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleFootnote]; - self.descriptionLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleSubheadline]; -} - -- (void)setModel:(nullable DWPayOptionModel *)model { - _model = model; - - DWPayOptionModelType type = model.type; - self.titleLabel.text = model.title; - self.iconImageView.image = model.icon; - - [self.actionButton setTitle:model.actionTitle forState:UIControlStateNormal]; - [self.actionButton sizeToFit]; - - [self updateDetails]; -} - -#pragma mark - Actions - -- (IBAction)actionButtonAction:(UIButton *)sender { - [self.delegate payTableViewCell:self action:sender]; -} - -#pragma mark - Private - -- (void)updateDetails { - self.descriptionLabel.text = self.model.details; - self.descriptionLabel.textColor = self.model.descriptionColor; - self.actionButton.enabled = YES; - -#if SNAPSHOT - DWPayOptionModelType type = _model.type; - - if (type == DWPayOptionModelType_Pasteboard) { - self.actionButton.accessibilityIdentifier = @"send_pasteboard_button"; - } -#endif /* SNAPSHOT */ -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Payments/Pay/Cells/PayTableViewCell.swift b/DashWallet/Sources/UI/Payments/Pay/Cells/PayTableViewCell.swift new file mode 100644 index 000000000..3d1adb385 --- /dev/null +++ b/DashWallet/Sources/UI/Payments/Pay/Cells/PayTableViewCell.swift @@ -0,0 +1,40 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +let MAX_ALLOWED_BUTTON_WIDTH: CGFloat = 108.0 + +class PayTableViewCell: UITableViewCell { + @IBOutlet private weak var iconImageView: UIImageView! + @IBOutlet private weak var titleLabel: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + titleLabel.font = UIFont.dw_font(forTextStyle: .subheadline) + } + + var model: DWPayOptionModel? { + didSet { + guard let model = model else { return } + + let type = model.type + titleLabel.text = model.title + iconImageView.image = model.icon + } + } +} diff --git a/DashWallet/Sources/UI/Payments/Pay/Cells/DWPayTableViewCell.xib b/DashWallet/Sources/UI/Payments/Pay/Cells/PayTableViewCell.xib similarity index 59% rename from DashWallet/Sources/UI/Payments/Pay/Cells/DWPayTableViewCell.xib rename to DashWallet/Sources/UI/Payments/Pay/Cells/PayTableViewCell.xib index 977b5905a..5f58ba53e 100644 --- a/DashWallet/Sources/UI/Payments/Pay/Cells/DWPayTableViewCell.xib +++ b/DashWallet/Sources/UI/Payments/Pay/Cells/PayTableViewCell.xib @@ -1,9 +1,9 @@ - + - + @@ -11,7 +11,7 @@ - + @@ -19,63 +19,41 @@ - + - + - - + + - + - - - - - - - - - - - - - - - + - - - - - + + + + - - @@ -83,6 +61,9 @@ + + + diff --git a/DashWallet/Sources/UI/Payments/Pay/DWBasePayViewController.m b/DashWallet/Sources/UI/Payments/Pay/DWBasePayViewController.m index f222ef3b8..acf92d330 100644 --- a/DashWallet/Sources/UI/Payments/Pay/DWBasePayViewController.m +++ b/DashWallet/Sources/UI/Payments/Pay/DWBasePayViewController.m @@ -82,8 +82,9 @@ - (void)payToAddressAction { [strongSelf performPayToPasteboardAction]; } else { - NSString *message = NSLocalizedString(@"Clipboard doesn't contain a valid Dash address", nil); - UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil + NSString *title = NSLocalizedString(@"Clipboard doesn't contain a valid Dash address", nil); + NSString *message = NSLocalizedString(@"Please copy the Dash address first and try again", nil); + UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *okAction = [UIAlertAction actionWithTitle:NSLocalizedString(@"OK", nil) diff --git a/DashWallet/Sources/UI/Payments/Pay/DWPayViewController.h b/DashWallet/Sources/UI/Payments/Pay/DWPayViewController.h deleted file mode 100644 index f890c8cb2..000000000 --- a/DashWallet/Sources/UI/Payments/Pay/DWPayViewController.h +++ /dev/null @@ -1,41 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWBasePayViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -@protocol DWPayModelProtocol; -@class DWPayViewController; -@protocol DWDPBasicUserItem; - -@protocol DWPayViewControllerDelegate - -- (void)payViewControllerDidFinishPayment:(DWPayViewController *)controller contact:(nullable id)contact; - -@end - -@interface DWPayViewController : DWBasePayViewController - -@property (nullable, nonatomic, weak) id delegate; - -+ (instancetype)controllerWithModel:(id)payModel - dataProvider:(id)dataProvider; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Payments/Pay/DWPayViewController.m b/DashWallet/Sources/UI/Payments/Pay/DWPayViewController.m deleted file mode 100644 index c89502ae8..000000000 --- a/DashWallet/Sources/UI/Payments/Pay/DWPayViewController.m +++ /dev/null @@ -1,136 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWPayViewController.h" - -#import "DWConfirmPaymentViewController.h" -#import "DWPayModelProtocol.h" -#import "DWPayOptionModel.h" -#import "DWPayTableViewCell.h" -#import "DWPaymentInputBuilder.h" -#import "DWPaymentProcessor.h" -#import "DWQRScanModel.h" -#import "DWQRScanViewController.h" -#import "DWUIKit.h" -#import "UIView+DWHUD.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWPayViewController () - -@property (strong, nonatomic) IBOutlet UITableView *tableView; -@property (assign, nonatomic) CGFloat maxActionButtonWidth; - -@end - -@implementation DWPayViewController - -+ (instancetype)controllerWithModel:(id)payModel - dataProvider:(id)dataProvider { - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Pay" bundle:nil]; - DWPayViewController *controller = [storyboard instantiateInitialViewController]; - controller.payModel = payModel; - - return controller; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - [self setupView]; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - - [self.tableView flashScrollIndicators]; - - if (self.demoMode) { - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self performPayToPasteboardAction]; - }); - } -} - -- (void)payViewControllerDidHidePaymentResultToContact:(nullable id)contact { - [self.delegate payViewControllerDidFinishPayment:self contact:contact]; -} - -#pragma mark - UITableViewDataSource - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return self.payModel.options.count; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - NSString *cellId = DWPayTableViewCell.dw_reuseIdentifier; - DWPayTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId forIndexPath:indexPath]; - - DWPayOptionModel *option = self.payModel.options[indexPath.row]; - cell.delegate = self; - cell.model = option; - - return cell; -} - -#pragma mark - DWPayTableViewCellDelegate - -- (void)payTableViewCell:(DWPayTableViewCell *)cell - action:(UIButton *)sender { - DWPayOptionModel *payOption = cell.model; - NSParameterAssert(payOption); - if (!payOption) { - return; - } - - switch (payOption.type) { - case DWPayOptionModelType_ScanQR: { - [self performScanQRCodeAction]; - - break; - } - case DWPayOptionModelType_Pasteboard: { - [self payToAddressAction]; - - break; - } - case DWPayOptionModelType_NFC: { - [self performNFCReadingAction]; - - break; - } - } -} - -#pragma mark - Private - -- (void)setupView { - NSString *cellId = DWPayTableViewCell.dw_reuseIdentifier; - UINib *nib = [UINib nibWithNibName:cellId bundle:nil]; - NSParameterAssert(nib); - [self.tableView registerNib:nib forCellReuseIdentifier:cellId]; - self.tableView.estimatedRowHeight = 40.0; - self.tableView.rowHeight = UITableViewAutomaticDimension; - self.tableView.tableFooterView = [[UIView alloc] init]; -} - - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Payments/Pay/Models/DWPayModel.m b/DashWallet/Sources/UI/Payments/Pay/Models/DWPayModel.m index 08ac826ad..192bfb0d7 100644 --- a/DashWallet/Sources/UI/Payments/Pay/Models/DWPayModel.m +++ b/DashWallet/Sources/UI/Payments/Pay/Models/DWPayModel.m @@ -64,18 +64,7 @@ - (void)refreshOptions { initWithType:DWPayOptionModelType_Pasteboard]; [options addObject:pasteboardOption]; - // CoreNFC is optional framework - if ([UIApplication sharedApplication].applicationState != UIApplicationStateBackground) { - Class NFCNDEFReaderSessionClass = NSClassFromString(@"NFCNDEFReaderSession"); - if ([NFCNDEFReaderSessionClass respondsToSelector:@selector(readingAvailable)] && - [(id)NFCNDEFReaderSessionClass readingAvailable]) { - DWPayOptionModel *nfcOption = [[DWPayOptionModel alloc] - initWithType:DWPayOptionModelType_NFC]; - [options addObject:nfcOption]; - } - } - - _options = [options copy]; + _options = options; } - (void)performNFCReadingWithCompletion:(void (^)(DWPaymentInput *paymentInput))completion { diff --git a/DashWallet/Sources/UI/Payments/Pay/Models/DWPayOptionModel.h b/DashWallet/Sources/UI/Payments/Pay/Models/DWPayOptionModel.h index af2848590..04ed9f554 100644 --- a/DashWallet/Sources/UI/Payments/Pay/Models/DWPayOptionModel.h +++ b/DashWallet/Sources/UI/Payments/Pay/Models/DWPayOptionModel.h @@ -28,11 +28,8 @@ typedef NS_ENUM(NSUInteger, DWPayOptionModelType) { @interface DWPayOptionModel : NSObject @property (readonly, nonatomic, assign) DWPayOptionModelType type; -@property (nonatomic, copy) NSString *details; @property (readonly) UIImage *icon; -@property (readonly) UIColor *descriptionColor; @property (readonly) NSString *title; -@property (readonly) NSString *actionTitle; - (instancetype)initWithType:(DWPayOptionModelType)type NS_DESIGNATED_INITIALIZER; - (instancetype)init NS_UNAVAILABLE; diff --git a/DashWallet/Sources/UI/Payments/Pay/Models/DWPayOptionModel.m b/DashWallet/Sources/UI/Payments/Pay/Models/DWPayOptionModel.m index 51dddea63..ff813051f 100644 --- a/DashWallet/Sources/UI/Payments/Pay/Models/DWPayOptionModel.m +++ b/DashWallet/Sources/UI/Payments/Pay/Models/DWPayOptionModel.m @@ -22,26 +22,11 @@ static NSString *TitleForOptionType(DWPayOptionModelType type) { switch (type) { case DWPayOptionModelType_ScanQR: - return NSLocalizedString(@"Send by", @"Send by (scanning QR code)"); + return NSLocalizedString(@"Scan QR code", @"(Send by) Scanning QR code"); case DWPayOptionModelType_Pasteboard: - return NSLocalizedString(@"Send to", nil); + return NSLocalizedString(@"Send to copied address or QR code", nil); case DWPayOptionModelType_NFC: - return NSLocalizedString(@"Send to", nil); - } -} - -static UIColor *DescriptionColor(DWPayOptionModelType type) { - return [UIColor dw_darkTitleColor]; -} - -static NSString *ActionTitleForOptionType(DWPayOptionModelType type) { - switch (type) { - case DWPayOptionModelType_ScanQR: - return NSLocalizedString(@"Scan", @"should be as short as possible"); - case DWPayOptionModelType_Pasteboard: - return NSLocalizedString(@"Send", nil); - case DWPayOptionModelType_NFC: - return NSLocalizedString(@"Tap", @"Pay using NFC (should be as short as possible)"); + return NSLocalizedString(@"NFC device", nil); } } @@ -63,17 +48,6 @@ return image; } -static NSString *DescriptionForOptionType(DWPayOptionModelType type) { - switch (type) { - case DWPayOptionModelType_ScanQR: - return NSLocalizedString(@"Scanning QR code", @"(Send by) Scanning QR code"); - case DWPayOptionModelType_Pasteboard: - return NSLocalizedString(@"Сopied address or QR", nil); - case DWPayOptionModelType_NFC: - return NSLocalizedString(@"NFC device", nil); - } -} - @implementation DWPayOptionModel - (instancetype)initWithType:(DWPayOptionModelType)type { @@ -84,15 +58,6 @@ - (instancetype)initWithType:(DWPayOptionModelType)type { return self; } -- (NSString *)details { - if (_details != nil) { - return _details; - } - else { - return DescriptionForOptionType(_type); - } -} - - (UIImage *)icon { return IconForOptionType(_type); } @@ -101,13 +66,7 @@ - (NSString *)title { return TitleForOptionType(_type); } -- (NSString *)actionTitle { - return ActionTitleForOptionType(_type); -} -- (UIColor *)descriptionColor { - return DescriptionColor(_type); -} @end NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Payments/Pay/Pay.storyboard b/DashWallet/Sources/UI/Payments/Pay/Pay.storyboard index 89c24096a..55988bb8c 100644 --- a/DashWallet/Sources/UI/Payments/Pay/Pay.storyboard +++ b/DashWallet/Sources/UI/Payments/Pay/Pay.storyboard @@ -1,9 +1,9 @@ - + - + @@ -17,27 +17,26 @@ - - + + - - - + + + - - - - + + + + - - + diff --git a/DashWallet/Sources/UI/Payments/Pay/PayViewController.swift b/DashWallet/Sources/UI/Payments/Pay/PayViewController.swift new file mode 100644 index 000000000..d8566a69e --- /dev/null +++ b/DashWallet/Sources/UI/Payments/Pay/PayViewController.swift @@ -0,0 +1,163 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +@objc(DWPayViewControllerDelegate) +protocol PayViewControllerDelegate: AnyObject { + func payViewControllerDidFinishPayment(_ controller: PayViewController, contact: DWDPBasicUserItem?) +} + +@objc(DWPayViewController) +class PayViewController: BaseViewController, PayableViewController { + @IBOutlet weak var tableView: UITableView! + + @objc + var paymentController: PaymentController! + + @objc + var payModel: DWPayModelProtocol! + + var maxActionButtonWidth: CGFloat = 0 + + @objc + var demoMode: Bool = false + + @objc + var delegate: PayViewControllerDelegate? + + @objc + static func controller(with payModel: DWPayModelProtocol) -> PayViewController { + let storyboard = UIStoryboard(name: "Pay", bundle: nil) + let controller = storyboard.instantiateInitialViewController() as! PayViewController + controller.payModel = payModel + + return controller + } + + override func viewDidLoad() { + super.viewDidLoad() + + configurePaymentController() + configureHierarchy() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + tableView.flashScrollIndicators() + if demoMode { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { + self.performPayToPasteboardAction() + } + } + } +} + +private extension PayViewController { + func configurePaymentController() { + paymentController = PaymentController() + paymentController.delegate = self + paymentController.presentationContextProvider = self + } + + func configureHierarchy() { + let cellId = PayTableViewCell.reuseIdentifier + let nib = UINib(nibName: cellId, bundle: nil) + tableView.register(nib, forCellReuseIdentifier: cellId) + tableView.rowHeight = 59 + tableView.delegate = self + tableView.dataSource = self + tableView.tableFooterView = EmptyView() + tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: CGFloat.leastNormalMagnitude)) + tableView.isScrollEnabled = false + tableView.separatorStyle = .none + tableView.sectionHeaderHeight = CGFloat.leastNonzeroMagnitude + } +} + +extension PayViewController: UITableViewDataSource, UITableViewDelegate { + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return payModel.options.count + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cellId = PayTableViewCell.reuseIdentifier + let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! PayTableViewCell + let option = payModel.options[indexPath.row] + cell.model = option + return cell + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let payOption = payModel.options[indexPath.row] + + switch payOption.type { + case .scanQR: + performScanQRCodeAction(delegate: self) + case .pasteboard: + payToAddressAction() + case .NFC: + performNFCReadingAction() + @unknown default: + break + } + } +} + + + +extension PayViewController: DWQRScanModelDelegate { + func qrScanModel(_ viewModel: DWQRScanModel, didScanPaymentInput paymentInput: DWPaymentInput) { + dismiss(animated: true) { [weak self] in + self?.paymentController.performPayment(with: paymentInput) + } + } + + func qrScanModelDidCancel(_ viewModel: DWQRScanModel) { + dismiss(animated: true) + } +} + +extension PayViewController: PaymentControllerDelegate, PaymentControllerPresentationContextProviding { + func presentationAnchorForPaymentController(_ controller: PaymentController) -> PaymentControllerPresentationAnchor { + self + } + + func paymentControllerDidFinishTransaction(_ controller: PaymentController, transaction: DSTransaction) { + let model = TxDetailModel(transaction: transaction) + let vc = SuccessTxDetailViewController(model: model) + vc.modalPresentationStyle = .fullScreen + vc.contactItem = paymentController.contactItem + vc.delegate = self + self.present(vc, animated: true) + } + + func paymentControllerDidCancelTransaction(_ controller: PaymentController) { + + } + + func paymentControllerDidFailTransaction(_ controller: PaymentController) { + + } +} + +extension PayViewController: SuccessTxDetailViewControllerDelegate { + func txDetailViewControllerDidFinish(controller: SuccessTxDetailViewController) { + self.delegate?.payViewControllerDidFinishPayment(self, contact: paymentController.contactItem) + } +} diff --git a/DashWallet/Sources/UI/Payments/Pay/PayableViewController.swift b/DashWallet/Sources/UI/Payments/Pay/PayableViewController.swift new file mode 100644 index 000000000..67c8cd92a --- /dev/null +++ b/DashWallet/Sources/UI/Payments/Pay/PayableViewController.swift @@ -0,0 +1,75 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +protocol PayableViewController: DWQRScanModelDelegate { + var payModel: DWPayModelProtocol! { get } + var paymentController: PaymentController! { get } +} + +extension PayableViewController where Self: UIViewController { + func payToAddressAction() { + guard let payModel = payModel else { return } + + payModel.payToAddress { [weak self] success in + guard let strongSelf = self else { return } + + if success { + strongSelf.performPayToPasteboardAction() + } else { + let title = NSLocalizedString("Clipboard doesn't contain a valid Dash address", comment: "") + let message = NSLocalizedString("Please copy the Dash address first and try again", comment: ""); + let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) + let okAction = UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .cancel, handler: nil) + alert.addAction(okAction) + + strongSelf.present(alert, animated: true, completion: nil) + } + } + } + + func performScanQRCodeAction(delegate: DWQRScanModelDelegate) { + if let vc = presentedViewController, vc is DWQRScanViewController { + return; + } + + let controller = DWQRScanViewController() + controller.model.delegate = delegate + present(controller, animated: true, completion: nil) + } + + func performNFCReadingAction() { + payModel?.performNFCReading(completion: { [weak self] paymentInput in + guard let strongSelf = self else { return } + strongSelf.processPaymentInput(paymentInput) + }) + } + + func performPayToPasteboardAction() { + guard let paymentInput = payModel?.pasteboardPaymentInput else { return } + processPaymentInput(paymentInput) + } + + func processPaymentInput(_ input: DWPaymentInput) { + paymentController.performPayment(with: input) + } +} + +extension PayableViewController where Self: UIViewController { + +} diff --git a/DashWallet/Sources/UI/Payments/Payments.storyboard b/DashWallet/Sources/UI/Payments/Payments.storyboard index ea4cf3a52..f78c8be6d 100644 --- a/DashWallet/Sources/UI/Payments/Payments.storyboard +++ b/DashWallet/Sources/UI/Payments/Payments.storyboard @@ -1,139 +1,102 @@ - + - + - - - Montserrat-Medium - - - + - - - + + + - - - - - - - - - - - - - - - + + - - - - - - - - - + - + + + + + + + + + + + - - + + - - - + - - - - + + + - - - - - - - - - - - + - - - - - - - - - - + + + + + + + + + + - + + - - - + + + - + - + - - - + + + - - - diff --git a/DashWallet/Sources/UI/Payments/PaymentsViewController.swift b/DashWallet/Sources/UI/Payments/PaymentsViewController.swift new file mode 100644 index 000000000..5b0ea3658 --- /dev/null +++ b/DashWallet/Sources/UI/Payments/PaymentsViewController.swift @@ -0,0 +1,170 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +@objc(DWPaymentsViewControllerIndex) +enum PaymentsViewControllerState: Int { + @objc(DWPaymentsViewControllerIndex_None) + case none = -1 + + @objc(DWPaymentsViewControllerIndex_Receive) + case receive = 0 + + @objc(DWPaymentsViewControllerIndex_Pay) + case pay = 1 +} + +@objc(DWPaymentsViewControllerDelegate) +protocol PaymentsViewControllerDelegate: AnyObject { + func paymentsViewControllerWantsToImportPrivateKey(_ controller: PaymentsViewController) + func paymentsViewControllerDidCancel(_ controller: PaymentsViewController) + func paymentsViewControllerDidFinishPayment(_ controller: PaymentsViewController, contact: DWDPBasicUserItem?) +} + +@objc(DWPaymentsViewController) +class PaymentsViewController: BaseViewController { + @IBOutlet var segmentedControl: UISegmentedControl! + @IBOutlet var containerView: UIView! + @IBOutlet var closeButton: UIButton! + + @objc + weak var delegate: PaymentsViewControllerDelegate? + + @objc + var demoMode: Bool = false + + @objc + weak var demoDelegate: DWDemoDelegate? + + @objc + var currentState: PaymentsViewControllerState = .pay { + didSet { + if currentState == .none { + currentState = PaymentsViewControllerState(rawValue: DWGlobalOptions.sharedInstance().paymentsScreenCurrentTab)! + } + + let idx = currentState.rawValue + + segmentedControl?.selectedSegmentIndex = idx + pageController?.selectedIndex = idx + } + } + + private var receiveModel: DWReceiveModelProtocol! + private var payModel: DWPayModelProtocol! + private var dataProvider: DWTransactionListDataProviderProtocol? + + private var payViewController: PayViewController! + private var receiveViewController: ReceiveViewController! + + private var pageController: SendReceivePageController! + + @IBAction func segmentedControlAction() { + let idx = segmentedControl.selectedSegmentIndex + pageController.setSelectedIndex(idx, animated: true) + + DWGlobalOptions.sharedInstance().paymentsScreenCurrentTab = idx + } + + @IBAction func closeButtonAction() { + delegate?.paymentsViewControllerDidCancel(self) + } + + override func viewDidLoad() { + super.viewDidLoad() + + configureHierarchy() + } + + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + } + + @objc + class func controller(withReceiveModel receiveModel: DWReceiveModelProtocol?, + payModel: DWPayModelProtocol?, + dataProvider: DWTransactionListDataProviderProtocol?) -> PaymentsViewController { + let controller = sb("Payments").vc(PaymentsViewController.self) + controller.receiveModel = receiveModel + controller.payModel = payModel + controller.dataProvider = dataProvider + return controller + } +} + +extension PaymentsViewController { + func configureHierarchy() { + view.backgroundColor = .dw_secondaryBackground() + + segmentedControl.setTitle(NSLocalizedString("Receive", comment: "Receive/Send"), forSegmentAt: 0) + segmentedControl.setTitle(NSLocalizedString("Send", comment: "Receive/Send"), forSegmentAt: 1) + segmentedControl.selectedSegmentIndex = currentState.rawValue + + payViewController = PayViewController.controller(with: payModel) + payViewController.delegate = self + + receiveViewController = ReceiveViewController(model: receiveModel) + receiveViewController.delegate = self + + pageController = SendReceivePageController() + pageController.helperDelegate = self + addChild(pageController) + pageController.view.translatesAutoresizingMaskIntoConstraints = false + containerView.addSubview(pageController.view) + pageController.didMove(toParent: self) + pageController.controllers = [receiveViewController, payViewController] + pageController.selectedIndex = currentState.rawValue + + closeButton.layer.cornerRadius = 24 + + NSLayoutConstraint.activate([ + pageController.view.topAnchor.constraint(equalTo: containerView.topAnchor), + pageController.view.bottomAnchor.constraint(equalTo: containerView.bottomAnchor), + pageController.view.leadingAnchor.constraint(equalTo: containerView.leadingAnchor), + pageController.view.trailingAnchor.constraint(equalTo: containerView.trailingAnchor), + ]) + } +} + +extension PaymentsViewController: NavigationBarDisplayable { + var isNavigationBarHidden: Bool { true } +} + +extension PaymentsViewController: SendReceivePageControllerDelegate { + func sendReceivePageControllerWillChangeSelectedIndex(to index: Int) { + segmentedControl.selectedSegmentIndex = index + + DWGlobalOptions.sharedInstance().paymentsScreenCurrentTab = index + } +} + +extension PaymentsViewController: PayViewControllerDelegate { + func payViewControllerDidFinishPayment(_ controller: PayViewController, contact: DWDPBasicUserItem?) { + delegate?.paymentsViewControllerDidFinishPayment(self, contact: contact) + } +} + +extension PaymentsViewController: ReceiveViewControllerDelegate { + func receiveViewControllerExitButtonAction(_ controller: ReceiveViewController) { + //NOP + } + + func importPrivateKeyButtonAction(_ controller: ReceiveViewController) { + delegate?.paymentsViewControllerWantsToImportPrivateKey(self) + } +} diff --git a/DashWallet/Sources/UI/Payments/Receive/DWReceiveViewController.h b/DashWallet/Sources/UI/Payments/Receive/DWReceiveViewController.h deleted file mode 100644 index 7b1a602c1..000000000 --- a/DashWallet/Sources/UI/Payments/Receive/DWReceiveViewController.h +++ /dev/null @@ -1,45 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "DWReceiveViewType.h" - -NS_ASSUME_NONNULL_BEGIN - -@protocol DWReceiveModelProtocol; -@class DWReceiveViewController; - -/** - Used for `DWReceiveViewType_QuickReceive` type - */ -@protocol DWReceiveViewControllerDelegate - -- (void)receiveViewControllerExitButtonAction:(DWReceiveViewController *)controller; - -@end - -@interface DWReceiveViewController : UIViewController - -@property (nonatomic, assign) DWReceiveViewType viewType; -@property (nullable, nonatomic, weak) id delegate; - -+ (instancetype)controllerWithModel:(id)receiveModel; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Payments/Receive/DWReceiveViewController.m b/DashWallet/Sources/UI/Payments/Receive/DWReceiveViewController.m deleted file mode 100644 index c6cd67f7a..000000000 --- a/DashWallet/Sources/UI/Payments/Receive/DWReceiveViewController.m +++ /dev/null @@ -1,183 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWReceiveViewController.h" - -#import "DWGlobalOptions.h" -#import "DWReceiveContentView.h" -#import "DWReceiveModel.h" -#import "DWRequestAmountViewController.h" -#import "DWUIKit.h" -#import "UIView+DWHUD.h" -#import "UIViewController+DWShareReceiveInfo.h" -#import "dashwallet-swift.h" - -NS_ASSUME_NONNULL_BEGIN - -static CGFloat TopPadding(void) { - if (IS_IPHONE_5_OR_LESS || IS_IPHONE_6) { - return 8.0; - } - else { - return 24.0; - } -} - -@interface DWReceiveViewController () - -@property (nonatomic, strong) DWReceiveContentView *contentView; - -@property (nonatomic, strong) id model; - -@end - -@implementation DWReceiveViewController - -+ (instancetype)controllerWithModel:(id)receiveModel { - DWReceiveViewController *controller = [[DWReceiveViewController alloc] init]; - controller.model = receiveModel; - - return controller; -} - -- (void)setViewType:(DWReceiveViewType)viewType { - _viewType = viewType; - - NSAssert(!self.isViewLoaded, @"Controller should be configured before presenting"); -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - NSAssert(self.model, @"Use controllerWithModel: method to init the class"); - - [self setupView]; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - - [self.contentView viewDidAppear]; -} - -#pragma mark - DWReceiveContentViewDelegate - -- (void)receiveContentView:(DWReceiveContentView *)view specifyAmountButtonAction:(UIButton *)sender { - DWSpecifyAmountViewController *controller = [DWSpecifyAmountViewController controller]; - controller.delegate = self; - [self.navigationController pushViewController:controller animated:YES]; -} - -- (void)receiveContentView:(DWReceiveContentView *)view secondButtonAction:(UIButton *)sender { - switch (self.viewType) { - case DWReceiveViewType_Default: { - [self dw_shareReceiveInfo:self.model sender:sender]; - - break; - } - case DWReceiveViewType_QuickReceive: { - [self.delegate receiveViewControllerExitButtonAction:self]; - - break; - } - } -} - -#pragma mark - DWSpecifyAmountViewControllerDelegate - -- (void)specifyAmountViewController:(DWSpecifyAmountViewController *_Nonnull)vc didInput:(uint64_t)amount { - DWReceiveModel *requestModel = [[DWReceiveModel alloc] initWithAmount:amount]; - DWRequestAmountViewController *requestController = - [DWRequestAmountViewController controllerWithModel:requestModel]; - requestController.delegate = self; - [self presentViewController:requestController animated:YES completion:nil]; -} - -#pragma mark - DWRequestAmountViewControllerDelegate - -- (void)requestAmountViewController:(DWRequestAmountViewController *)controller - didReceiveAmountWithInfo:(NSString *)info { - [controller dismissViewControllerAnimated:YES - completion:^{ - [self.navigationController popViewControllerAnimated:YES]; - - const NSTimeInterval popAnimationDuration = 0.3; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(popAnimationDuration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - [self.navigationController.view dw_showInfoHUDWithText:info]; - }); - }]; -} - -#pragma mark - Private - -- (void)setupView { - self.view.backgroundColor = [UIColor dw_secondaryBackgroundColor]; - - DWReceiveContentView *contentView = [[DWReceiveContentView alloc] initWithModel:self.model]; - contentView.translatesAutoresizingMaskIntoConstraints = NO; - contentView.delegate = self; - contentView.viewType = self.viewType; - [self.view addSubview:contentView]; - self.contentView = contentView; - - NSString *username = [DWGlobalOptions sharedInstance].dashpayUsername; - if (username != nil) { - NSString *displayName = nil; // TODO: DP provide display name - - NSString *firstLine = displayName ?: username; - NSAttributedString *attributedFirstLine = [[NSAttributedString alloc] initWithString:firstLine - attributes:@{ - NSFontAttributeName : [UIFont dw_fontForTextStyle:UIFontTextStyleTitle2], - NSForegroundColorAttributeName : [UIColor dw_darkTitleColor] - }]; - NSAttributedString *attributedSecondLine = nil; - if (firstLine != username) { - attributedSecondLine = [[NSAttributedString alloc] initWithString:username - attributes:@{ - NSFontAttributeName : [UIFont dw_fontForTextStyle:UIFontTextStyleFootnote], - NSForegroundColorAttributeName : [UIColor dw_tertiaryTextColor], - }]; - } - - NSMutableAttributedString *string = [[NSMutableAttributedString alloc] init]; - [string beginEditing]; - [string appendAttributedString:attributedFirstLine]; - if (attributedSecondLine) { - [string appendAttributedString:[[NSAttributedString alloc] initWithString:@"\n"]]; - [string appendAttributedString:attributedSecondLine]; - } - [string endEditing]; - - [self.contentView setUsernameAttributedText:string]; - } - - UILayoutGuide *marginsGuide = self.view.layoutMarginsGuide; - [NSLayoutConstraint activateConstraints:@[ - [contentView.topAnchor constraintEqualToAnchor:self.view.topAnchor - constant:TopPadding()], - [contentView.leadingAnchor constraintEqualToAnchor:marginsGuide.leadingAnchor], - [contentView.trailingAnchor constraintEqualToAnchor:marginsGuide.trailingAnchor], - [contentView.bottomAnchor constraintEqualToAnchor:marginsGuide.bottomAnchor], - ]]; -} - - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Payments/Receive/DWReceiveViewType.h b/DashWallet/Sources/UI/Payments/Receive/DWReceiveViewType.h deleted file mode 100644 index 96dfe026b..000000000 --- a/DashWallet/Sources/UI/Payments/Receive/DWReceiveViewType.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#ifndef DWReceiveViewType_h -#define DWReceiveViewType_h - -typedef NS_ENUM(NSUInteger, DWReceiveViewType) { - DWReceiveViewType_Default, - DWReceiveViewType_QuickReceive, -}; - -#endif /* DWReceiveViewType_h */ diff --git a/DashWallet/Sources/UI/Payments/Receive/Models/DWReceiveModel.h b/DashWallet/Sources/UI/Payments/Receive/Models/DWReceiveModel.h index 8aab5b4cf..aabc15885 100644 --- a/DashWallet/Sources/UI/Payments/Receive/Models/DWReceiveModel.h +++ b/DashWallet/Sources/UI/Payments/Receive/Models/DWReceiveModel.h @@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN @interface DWReceiveModel : DWBaseReceiveModel - +@property (nonatomic, weak) id delegate; // NOTE: Temp solution to avoid using mvvm @end NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Payments/Receive/Models/DWReceiveModel.m b/DashWallet/Sources/UI/Payments/Receive/Models/DWReceiveModel.m index 9af92bf6d..d0a4ba67f 100644 --- a/DashWallet/Sources/UI/Payments/Receive/Models/DWReceiveModel.m +++ b/DashWallet/Sources/UI/Payments/Receive/Models/DWReceiveModel.m @@ -202,6 +202,7 @@ - (void)updateReceivingInfo { self.paymentRequest = paymentRequest; self.qrCodeImage = qrCodeImage; self.paymentAddress = paymentAddress; + [self.delegate receivingInfoDidUpdate]; }); }); } diff --git a/DashWallet/Sources/UI/Payments/Receive/Models/DWReceiveModelProtocol.h b/DashWallet/Sources/UI/Payments/Receive/Models/DWReceiveModelProtocol.h index e878732aa..fb52038a4 100644 --- a/DashWallet/Sources/UI/Payments/Receive/Models/DWReceiveModelProtocol.h +++ b/DashWallet/Sources/UI/Payments/Receive/Models/DWReceiveModelProtocol.h @@ -22,12 +22,17 @@ NS_ASSUME_NONNULL_BEGIN @class UIImage; @class DSPaymentRequest; +@protocol DWReceiveModelDelegate +- (void)receivingInfoDidUpdate; +@end + @protocol DWReceiveModelProtocol @property (nullable, readonly, nonatomic, strong) UIImage *qrCodeImage; @property (nullable, readonly, nonatomic, copy) NSString *paymentAddress; @property (readonly, nonatomic, assign) CGSize qrCodeSize; @property (readonly, nonatomic, assign) uint64_t amount; +@property (nonatomic, weak) id delegate; - (NSString *)paymentAddressOrRequestToShare; diff --git a/DashWallet/Sources/UI/Payments/Receive/ReceiveViewController.swift b/DashWallet/Sources/UI/Payments/Receive/ReceiveViewController.swift new file mode 100644 index 000000000..c0add69ae --- /dev/null +++ b/DashWallet/Sources/UI/Payments/Receive/ReceiveViewController.swift @@ -0,0 +1,175 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +@objc(DWReceiveViewType) +enum ReceiveViewType: Int { + @objc(DWReceiveViewType_Default) + case `default` + + @objc(DWReceiveViewType_QuickReceive) + case quick +} + +extension ReceiveViewType { + var secondButtonTitle: String { + if self == .default { + return NSLocalizedString("Share address", comment: "Receive screen") + }else{ + return NSLocalizedString("Exit", comment: "Receive screen") + } + } +} + +@objc(DWReceiveViewControllerDelegate) +protocol ReceiveViewControllerDelegate: AnyObject { + func receiveViewControllerExitButtonAction(_ controller: ReceiveViewController) + func importPrivateKeyButtonAction(_ controller: ReceiveViewController) +} + +@objc(DWReceiveViewController) +class ReceiveViewController: BaseViewController { + var model: DWReceiveModelProtocol! + + @objc + var viewType: ReceiveViewType = .default + + @objc + weak var delegate: ReceiveViewControllerDelegate? + + @objc + var allowedToImportPrivateKey: Bool = true + + @objc + init(model: DWReceiveModelProtocol) { + self.model = model + super.init(nibName: nil, bundle: nil) + } + + @objc + func importPrivateKeyButtonAction() { + let controller = sb("ImportWalletInfo").instantiateInitialViewController() as! DWImportWalletInfoViewController + controller.delegate = self + + let nvc = BaseNavigationController(rootViewController: controller) + present(nvc, animated: true) + + nvc.setCancelButtonHidden(false) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + configureHierarchy() + } +} + +private extension ReceiveViewController { + private func configureHierarchy() { + let mainStackView = UIStackView() + mainStackView.translatesAutoresizingMaskIntoConstraints = false + mainStackView.axis = .vertical + mainStackView.spacing = stackSpacing + view.addSubview(mainStackView) + + let receiveContentView = ReceiveContentView.view(with: model) + receiveContentView.viewType = viewType + receiveContentView.specifyAmountHandler = { [weak self] in + guard let self else { return } + + let vc = SpecifyAmountViewController.controller() + vc.delegate = self + self.navigationController?.pushViewController(vc, animated: true) + } + receiveContentView.shareHandler = { [weak self] sender in + guard let self else { return } + self.dw_shareReceiveInfo(self.model, sender: sender) + + } + receiveContentView.exitHandler = { [weak self] in + guard let self else { return } + self.delegate?.receiveViewControllerExitButtonAction(self) + } + + receiveContentView.backgroundColor = .dw_background() + receiveContentView.layer.cornerRadius = radius + mainStackView.addArrangedSubview(receiveContentView) + + let importPrivateKeyButton = UIButton(type: .custom) + importPrivateKeyButton.addTarget(self, action: #selector(importPrivateKeyButtonAction), for: .touchUpInside) + importPrivateKeyButton.backgroundColor = .dw_background() + importPrivateKeyButton.contentHorizontalAlignment = .leading + importPrivateKeyButton.imageEdgeInsets = .init(top: 0, left: 17, bottom: 0, right: 0) + importPrivateKeyButton.titleEdgeInsets = .init(top: 0, left: 39, bottom: 0, right: 0) + importPrivateKeyButton.layer.cornerRadius = radius + importPrivateKeyButton.setImage(UIImage(named: "import-icon"), for: .normal) + importPrivateKeyButton.titleLabel?.font = .dw_font(forTextStyle: .subheadline) + importPrivateKeyButton.setTitleColor(.dw_label(), for: .normal) + importPrivateKeyButton.setTitle(NSLocalizedString("Import Private Key", comment: "Import Private Key"), for: .normal) + importPrivateKeyButton.isHidden = !allowedToImportPrivateKey + mainStackView.addArrangedSubview(importPrivateKeyButton) + + mainStackView.addArrangedSubview(EmptyView()) + + NSLayoutConstraint.activate([ + mainStackView.topAnchor.constraint(equalTo: view.topAnchor), + mainStackView.bottomAnchor.constraint(equalTo: view.bottomAnchor), + mainStackView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor), + mainStackView.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor), + + receiveContentView.heightAnchor.constraint(equalToConstant: 373), + importPrivateKeyButton.heightAnchor.constraint(equalToConstant: 64), + ]) + } +} + +extension ReceiveViewController: SpecifyAmountViewControllerDelegate { + func specifyAmountViewController(_ vc: SpecifyAmountViewController, didInput amount: UInt64) { + let model = DWReceiveModel(amount: amount) + + let requestController = DWRequestAmountViewController(model: model) + requestController.delegate = self + self.present(requestController, animated: true) + } +} + +extension ReceiveViewController: DWRequestAmountViewControllerDelegate { + func requestAmountViewController(_ controller: DWRequestAmountViewController, didReceiveAmountWithInfo info: String) { + controller.dismiss(animated: true) { + self.navigationController?.popViewController(animated: true) + + let popAnimationDuration = 300 + DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .milliseconds(popAnimationDuration)) { + self.navigationController?.view.dw_showInfoHUD(withText: info) + } + } + } +} + +extension ReceiveViewController: DWImportWalletInfoViewControllerDelegate { + func importWalletInfoViewControllerScanPrivateKeyAction(_ controller: DWImportWalletInfoViewController) { + controller.dismiss(animated: true) { + self.delegate?.importPrivateKeyButtonAction(self) + } + + } +} diff --git a/DashWallet/Sources/UI/Payments/Receive/RequestAmount/DWRequestAmountViewController.m b/DashWallet/Sources/UI/Payments/Receive/RequestAmount/DWRequestAmountViewController.m index 1ca8fd394..b2337e3dc 100644 --- a/DashWallet/Sources/UI/Payments/Receive/RequestAmount/DWRequestAmountViewController.m +++ b/DashWallet/Sources/UI/Payments/Receive/RequestAmount/DWRequestAmountViewController.m @@ -64,8 +64,6 @@ - (void)viewDidLoad { - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; - - [self.requestAmountView viewDidAppear]; } #pragma mark - DWRequestAmountContentViewDelegate @@ -100,7 +98,6 @@ - (DWRequestAmountContentView *)requestAmountView { return _requestAmountView; } - @end NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Payments/Receive/RequestAmount/Views/DWRequestAmountContentView.h b/DashWallet/Sources/UI/Payments/Receive/RequestAmount/Views/DWRequestAmountContentView.h index 95a802044..73e81f8fa 100644 --- a/DashWallet/Sources/UI/Payments/Receive/RequestAmount/Views/DWRequestAmountContentView.h +++ b/DashWallet/Sources/UI/Payments/Receive/RequestAmount/Views/DWRequestAmountContentView.h @@ -32,8 +32,6 @@ NS_ASSUME_NONNULL_BEGIN @property (nullable, nonatomic, weak) id delegate; -- (void)viewDidAppear; - - (instancetype)initWithModel:(id)model; - (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE; diff --git a/DashWallet/Sources/UI/Payments/Receive/RequestAmount/Views/DWRequestAmountContentView.m b/DashWallet/Sources/UI/Payments/Receive/RequestAmount/Views/DWRequestAmountContentView.m index 9221255f5..b70947089 100644 --- a/DashWallet/Sources/UI/Payments/Receive/RequestAmount/Views/DWRequestAmountContentView.m +++ b/DashWallet/Sources/UI/Payments/Receive/RequestAmount/Views/DWRequestAmountContentView.m @@ -17,14 +17,13 @@ #import "DWRequestAmountContentView.h" -#import "DWReceiveContentView.h" #import "DWReceiveModelProtocol.h" #import "DWUIKit.h" #import "dashwallet-Swift.h" NS_ASSUME_NONNULL_BEGIN -@interface DWRequestAmountContentView () +@interface DWRequestAmountContentView () @property (nonatomic, strong) id model; @property (nonatomic, strong) DWAmountPreviewView *amountView; @@ -47,10 +46,16 @@ - (instancetype)initWithModel:(id)model { [self addSubview:amountView]; _amountView = amountView; - DWReceiveContentView *contentView = [[DWReceiveContentView alloc] initWithModel:model]; + + DWReceiveContentView *contentView = [DWReceiveContentView viewWith:model]; contentView.translatesAutoresizingMaskIntoConstraints = NO; - contentView.delegate = self; contentView.viewType = DWReceiveViewType_Default; + __weak typeof(self) weakSelf = self; + + contentView.shareHandler = ^(UIButton *sender) { + [weakSelf.delegate requestAmountContentView:weakSelf shareButtonAction:sender]; + }; + [contentView setSpecifyAmountButtonHidden:YES]; [self addSubview:contentView]; _contentView = contentView; @@ -69,20 +74,6 @@ - (instancetype)initWithModel:(id)model { return self; } -- (void)viewDidAppear { - [self.contentView viewDidAppear]; -} - -#pragma mark - DWReceiveContentViewDelegate - -- (void)receiveContentView:(DWReceiveContentView *)view specifyAmountButtonAction:(UIButton *)sender { - // NOP -} - -- (void)receiveContentView:(DWReceiveContentView *)view secondButtonAction:(UIButton *)sender { - [self.delegate requestAmountContentView:self shareButtonAction:sender]; -} - @end NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Payments/Receive/Views/DWReceiveContentView.h b/DashWallet/Sources/UI/Payments/Receive/Views/DWReceiveContentView.h deleted file mode 100644 index 9c6acc9dd..000000000 --- a/DashWallet/Sources/UI/Payments/Receive/Views/DWReceiveContentView.h +++ /dev/null @@ -1,50 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "DWReceiveViewType.h" - -NS_ASSUME_NONNULL_BEGIN - -@protocol DWReceiveModelProtocol; -@class DWReceiveContentView; - -@protocol DWReceiveContentViewDelegate - -- (void)receiveContentView:(DWReceiveContentView *)view specifyAmountButtonAction:(UIButton *)sender; -- (void)receiveContentView:(DWReceiveContentView *)view secondButtonAction:(UIButton *)sender; - -@end - -@interface DWReceiveContentView : KVOUIView - -@property (nonatomic, assign) DWReceiveViewType viewType; -@property (nullable, nonatomic, weak) id delegate; - -- (void)viewDidAppear; -- (void)setSpecifyAmountButtonHidden:(BOOL)hidden; -- (void)setUsernameAttributedText:(NSAttributedString *)string; - -- (instancetype)initWithModel:(id)model; - -- (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE; -- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_UNAVAILABLE; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Payments/Receive/Views/DWReceiveContentView.m b/DashWallet/Sources/UI/Payments/Receive/Views/DWReceiveContentView.m deleted file mode 100644 index 825cb68d2..000000000 --- a/DashWallet/Sources/UI/Payments/Receive/Views/DWReceiveContentView.m +++ /dev/null @@ -1,174 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWReceiveContentView.h" - -#import "DWReceiveModelProtocol.h" -#import "DWUIKit.h" - -NS_ASSUME_NONNULL_BEGIN - -static CGFloat ActionButtonsTopPadding(void) { - if (IS_IPHONE_5_OR_LESS) { - return 0.0; - } - else { - return 12.0; - } -} - -@interface DWReceiveContentView () - -@property (nonatomic, strong) id model; - -@property (strong, nonatomic) IBOutlet UIView *contentView; -@property (strong, nonatomic) IBOutlet UIButton *qrCodeButton; -@property (weak, nonatomic) IBOutlet UILabel *usernameLabel; -@property (strong, nonatomic) IBOutlet UIButton *addressButton; -@property (strong, nonatomic) IBOutlet UIButton *specifyAmountButton; -@property (weak, nonatomic) IBOutlet UIStackView *actionButtonsStackView; -@property (strong, nonatomic) IBOutlet UIButton *secondButton; -@property (strong, nonatomic) IBOutlet NSLayoutConstraint *actionButtonsTopPadding; - -@property (nonatomic, strong) UINotificationFeedbackGenerator *feedbackGenerator; - -@end - -@implementation DWReceiveContentView - -- (instancetype)initWithModel:(id)model { - self = [super initWithFrame:CGRectZero]; - if (self) { - _model = model; - - [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil]; - [self addSubview:self.contentView]; - self.contentView.translatesAutoresizingMaskIntoConstraints = NO; - [NSLayoutConstraint activateConstraints:@[ - [self.contentView.topAnchor constraintEqualToAnchor:self.topAnchor], - [self.contentView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor], - [self.contentView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor], - [self.contentView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor], - ]]; - - const CGSize qrSize = model.qrCodeSize; - [NSLayoutConstraint activateConstraints:@[ - [self.qrCodeButton.widthAnchor constraintEqualToConstant:qrSize.width], - [self.qrCodeButton.heightAnchor constraintEqualToConstant:qrSize.height], - ]]; - - self.usernameLabel.hidden = YES; - self.addressButton.titleLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleCaption1]; - - [self.specifyAmountButton setTitle:NSLocalizedString(@"Specify Amount", nil) forState:UIControlStateNormal]; - - self.actionButtonsTopPadding.constant = ActionButtonsTopPadding(); - - self.feedbackGenerator = [[UINotificationFeedbackGenerator alloc] init]; - - [self mvvm_observe:DW_KEYPATH(self, model.paymentAddress) - with:^(typeof(self) self, NSString *value) { - [self.addressButton setTitle:value forState:UIControlStateNormal]; - - BOOL hasValue = !!value; - self.addressButton.hidden = !hasValue; - self.specifyAmountButton.enabled = hasValue; - - if (self.viewType == DWReceiveViewType_Default) { - self.secondButton.enabled = hasValue; - } - }]; - - [self mvvm_observe:DW_KEYPATH(self, model.qrCodeImage) - with:^(typeof(self) self, UIImage *value) { - [self.qrCodeButton setImage:value forState:UIControlStateNormal]; - self.qrCodeButton.hidden = (value == nil); - }]; - } - return self; -} - -- (void)setViewType:(DWReceiveViewType)viewType { - _viewType = viewType; - - NSString *title = nil; - UIColor *backgroundColor = [UIColor clearColor]; - switch (viewType) { - case DWReceiveViewType_Default: { - title = NSLocalizedString(@"Share", nil); - - break; - } - case DWReceiveViewType_QuickReceive: { - title = NSLocalizedString(@"Exit", nil); - - break; - } - } - [self.secondButton setTitle:title - forState:UIControlStateNormal]; - self.backgroundColor = backgroundColor; - self.contentView.backgroundColor = backgroundColor; -} - -- (void)viewDidAppear { - [self.feedbackGenerator prepare]; -} - -- (void)setSpecifyAmountButtonHidden:(BOOL)hidden { - self.specifyAmountButton.hidden = hidden; - - if (hidden) { - self.actionButtonsStackView.axis = UILayoutConstraintAxisVertical; - self.actionButtonsStackView.alignment = UIStackViewAlignmentCenter; - [self.secondButton.widthAnchor constraintEqualToAnchor:self.contentView.widthAnchor multiplier:0.5].active = YES; - } - else { - NSAssert(NO, @"unused"); - } -} - -- (void)setUsernameAttributedText:(NSAttributedString *)string { - self.usernameLabel.attributedText = string; - self.usernameLabel.hidden = NO; -} - -#pragma mark - Actions - -- (IBAction)qrCodeButtonAction:(id)sender { - [self.feedbackGenerator notificationOccurred:UINotificationFeedbackTypeSuccess]; - - [self.model copyQRImageToPasteboard]; -} - -- (IBAction)addressButtonAction:(id)sender { - [self.feedbackGenerator notificationOccurred:UINotificationFeedbackTypeSuccess]; - - [self.model copyAddressToPasteboard]; -} - -- (IBAction)specifyAmountButtonAction:(UIButton *)sender { - [self.delegate receiveContentView:self specifyAmountButtonAction:sender]; -} - -- (IBAction)secondButtonAction:(UIButton *)sender { - [self.delegate receiveContentView:self secondButtonAction:sender]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Payments/Receive/Views/DWReceiveContentView.xib b/DashWallet/Sources/UI/Payments/Receive/Views/DWReceiveContentView.xib deleted file mode 100644 index eeab93775..000000000 --- a/DashWallet/Sources/UI/Payments/Receive/Views/DWReceiveContentView.xib +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DashWallet/Sources/UI/Payments/Receive/Views/ReceiveContentView.swift b/DashWallet/Sources/UI/Payments/Receive/Views/ReceiveContentView.swift new file mode 100644 index 000000000..2b7671d50 --- /dev/null +++ b/DashWallet/Sources/UI/Payments/Receive/Views/ReceiveContentView.swift @@ -0,0 +1,115 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +@objc(DWReceiveContentView) +final class ReceiveContentView: UIView { + @IBOutlet var qrCodeButton: UIButton! + @IBOutlet var actionButtonsStackView: UIStackView! + @IBOutlet var addressButton: UIButton! + @IBOutlet var specifyAmountButton: UIButton! + @IBOutlet var secondButton: UIButton! + + private var model: DWReceiveModelProtocol! + private var feedbackGenerator: UINotificationFeedbackGenerator = UINotificationFeedbackGenerator() + + @objc + public var viewType: ReceiveViewType = .default + + public var specifyAmountHandler: (() -> Void)? + + @objc + public var shareHandler: ((UIButton) -> Void)? + + @objc + public var exitHandler: (() -> Void)? + + @IBAction func addressButtonAction() { + feedbackGenerator.notificationOccurred(.success) + model.copyAddressToPasteboard() + } + + @IBAction func qrButtonAction() { + feedbackGenerator.notificationOccurred(.success) + model.copyQRImageToPasteboard() + } + + @IBAction func specifyAmountButtonAction() { + specifyAmountHandler?() + } + + @IBAction func secondButtonAction() { + if viewType == .default { + shareHandler?(secondButton) + }else{ + exitHandler?() + } + } + + @objc + func setSpecifyAmountButtonHidden(_ hidden: Bool) { + specifyAmountButton.isHidden = hidden + } + + @objc + func setSecondButtonHidden(_ hidden: Bool) { + secondButton.isHidden = hidden + } + + @objc + static func view(with model: DWReceiveModelProtocol) -> ReceiveContentView { + let view = UINib.view(Self.self) + view.model = model + + model.delegate = view + + view.configureHierarchy() + view.reloadView() + + return view + } +} + +private extension ReceiveContentView { + private func configureHierarchy() { + specifyAmountButton.setTitle(NSLocalizedString("Specify Amount", comment: "Receive screen"), for: .normal) + secondButton.setTitle(viewType.secondButtonTitle, for: .normal) + } + + private func reloadView() { + let hasValue = model.paymentAddress != nil + + addressButton.setTitle(model.paymentAddress, for: .normal) + addressButton.isHidden = !hasValue + + qrCodeButton.setImage(model.qrCodeImage, for: .normal) + qrCodeButton.isHidden = model.qrCodeImage == nil + + specifyAmountButton.isEnabled = hasValue + + if viewType == .default { + secondButton.isEnabled = hasValue + } + } +} + +extension ReceiveContentView: DWReceiveModelDelegate { + func receivingInfoDidUpdate() { + reloadView() + } +} diff --git a/DashWallet/Sources/UI/Payments/Receive/Views/ReceiveContentView.xib b/DashWallet/Sources/UI/Payments/Receive/Views/ReceiveContentView.xib new file mode 100644 index 000000000..f135c85f1 --- /dev/null +++ b/DashWallet/Sources/UI/Payments/Receive/Views/ReceiveContentView.xib @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DashWallet/Sources/UI/Payments/SendReceivePageController.swift b/DashWallet/Sources/UI/Payments/SendReceivePageController.swift new file mode 100644 index 000000000..78da21246 --- /dev/null +++ b/DashWallet/Sources/UI/Payments/SendReceivePageController.swift @@ -0,0 +1,122 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import UIKit + +protocol SendReceivePageControllerDelegate: AnyObject { + func sendReceivePageControllerWillChangeSelectedIndex(to index: Int) +} + +class SendReceivePageController: UIPageViewController { + weak var helperDelegate: SendReceivePageControllerDelegate? + + private var isControllerReady: Bool = false + + init() { + super.init(transitionStyle: .scroll, navigationOrientation: .horizontal) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + var controllers: [UIViewController]! { + didSet { + guard isControllerReady else { return } + + let vc = controllers.first! + setViewControllers([vc], direction: .forward, animated: false) + } + } + + var selectedIndex: Int = 0 + + func setSelectedIndex(_ idx: Int, animated: Bool) { + selectedIndex = idx + let vc = controllers[selectedIndex] + let direction = direction(for: vc) + setViewControllers([vc], direction: direction, animated: animated) + } + + override func viewDidLoad() { + super.viewDidLoad() + + delegate = self + dataSource = self + } + + override func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + + guard selectedIndex < controllers.count else { return } + let vc = controllers[selectedIndex] + setViewControllers([vc], direction: .forward, animated: false) + + isControllerReady = true + } +} + +extension SendReceivePageController: UIPageViewControllerDelegate { + func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) { + guard let vc = pendingViewControllers.first else { return } + + let idx = index(of: vc) + selectedIndex = idx + helperDelegate?.sendReceivePageControllerWillChangeSelectedIndex(to: idx) + } + + func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { + print("pageViewController", finished, completed, previousViewControllers) + guard finished else { return } + + if let vc = previousViewControllers.first, !completed { + let idx = index(of: vc) + selectedIndex = idx + helperDelegate?.sendReceivePageControllerWillChangeSelectedIndex(to: idx) + } + } +} + +extension SendReceivePageController: UIPageViewControllerDataSource { + func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { + if controllers.last == viewController { + return controllers.first + } + + return nil + } + + func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { + if controllers.first == viewController { + return controllers.last + } + + return nil + } +} + +extension SendReceivePageController { + // We assume that we can only have two controllers + func index(of controller: UIViewController) -> Int { + controllers.first == controller ? 0 : 1 + } + + func direction(for controller: UIViewController) -> UIPageViewController.NavigationDirection { + let idx = index(of: controller) + return idx == 0 ? .reverse : .forward + } +} diff --git a/DashWallet/Sources/UI/Setup/DWSetupViewController.m b/DashWallet/Sources/UI/Setup/DWSetupViewController.m index 4af80b4bd..8b7639a6d 100644 --- a/DashWallet/Sources/UI/Setup/DWSetupViewController.m +++ b/DashWallet/Sources/UI/Setup/DWSetupViewController.m @@ -23,7 +23,6 @@ #import "DWMainTabbarViewController.h" #import "DWPreviewSeedPhraseModel.h" #import "DWRecoverViewController.h" -#import "DWSecureWalletInfoViewController.h" #import "DWSetPinModel.h" #import "DWSetPinViewController.h" #import "dashwallet-Swift.h" @@ -149,10 +148,6 @@ - (void)secureWalletRoutineDidFinish:(DWVerifiedSuccessfullyViewController *)con [self completeSetup]; } -- (void)secureWalletInfoViewControllerDidFinish:(DWSecureWalletInfoViewController *)controller { - [self.navigationController popViewControllerAnimated:NO]; -} - #pragma mark - DWRecoverViewControllerDelegate - (void)recoverViewControllerDidRecoverWallet:(DWRecoverViewController *)controller @@ -211,10 +206,10 @@ - (UIViewController *)biometricAuthController { } - (UIViewController *)secureWalletInfoController { - DWSecureWalletInfoViewController *controller = [DWSecureWalletInfoViewController controller]; - controller.type = DWSecureWalletInfoType_Setup; + DWBackupInfoViewController *controller = [DWBackupInfoViewController controllerWith:DWSecureWalletInfoType_Setup]; controller.delegate = self; - + controller.isCloseButtonHidden = true; + controller.isSkipButtonHidden = false; return controller; } diff --git a/DashWallet/Sources/UI/Setup/RecoverWallet/DWRecoverModel.m b/DashWallet/Sources/UI/Setup/RecoverWallet/DWRecoverModel.m index 2c7f40cb8..2d38341d6 100644 --- a/DashWallet/Sources/UI/Setup/RecoverWallet/DWRecoverModel.m +++ b/DashWallet/Sources/UI/Setup/RecoverWallet/DWRecoverModel.m @@ -80,10 +80,8 @@ - (BOOL)phraseIsValid:(NSString *)phrase { } - (void)wipeWallet { - [[TxUserInfoDAOImpl shared] deleteAll]; - [[AddressUserInfoDAOImpl shared] deleteAll]; + [DWApp cleanUp]; [[DWEnvironment sharedInstance] clearAllWallets]; - [[DWGlobalOptions sharedInstance] restoreToDefaults]; [[DWAppGroupOptions sharedInstance] restoreToDefaults]; } diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/BackupInfo.storyboard b/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/BackupInfo.storyboard index 43db7dfcc..35c801dae 100644 --- a/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/BackupInfo.storyboard +++ b/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/BackupInfo.storyboard @@ -1,120 +1,120 @@ - + + - + + - + - - - + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + + + - + - - - + + + + + + - + - + - - - + + + - - - diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/BackupInfoViewController.swift b/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/BackupInfoViewController.swift new file mode 100644 index 000000000..5ef4c8583 --- /dev/null +++ b/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/BackupInfoViewController.swift @@ -0,0 +1,221 @@ +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://opensource.org/licenses/MIT +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +import Foundation + +private enum BackupInfoItem { + case notStoredByDash + case unableToRestore +} + +extension BackupInfoItem { + var title: String { + switch self { + case .notStoredByDash: return "Dash Core Group does NOT store this recovery phrase" + case .unableToRestore: return "You will NOT be able to restore the wallet without a recovery phrase" + } + } + + var description: String { + switch self { + case .notStoredByDash: return "Anyone that has your recovery phrase can access your funds." + case .unableToRestore: return "Write it in a safe place and don’t show it to anyone." + } + } + + var icon: UIImage { + switch self { + case .notStoredByDash: return UIImage(named: "backup-not-stored-icon")! + case .unableToRestore: return UIImage(named: "backup-recovery-icon")! + } + } +} + +@objc(DWSecureWalletInfoType) +enum SecureWalletInfoType: Int { + @objc(DWSecureWalletInfoType_Setup) + case setup + + @objc(DWSecureWalletInfoType_Reminder) + case reminder +} + +@objc(DWBackupInfoViewControllerDelegate) +protocol BackupInfoViewControllerDelegate: DWSecureWalletDelegate { +} + +@objc(DWBackupInfoViewController) +final class BackupInfoViewController: BaseViewController { + @IBOutlet private var titleLabel: UILabel! + @IBOutlet private var subtitleLabel: UILabel! + + @IBOutlet private var contentView: UIStackView! + + @IBOutlet private var bottomButtonStack: UIStackView! + @IBOutlet private var showRecoveryPhraseButton: UIButton! + @IBOutlet private var skipButton: UIButton! + + private var closeButton: UIBarButtonItem! + private var seedPhraseModel: DWPreviewSeedPhraseModel! + + @objc + public weak var delegate: BackupInfoViewControllerDelegate? + + public var type: SecureWalletInfoType = .setup + + @objc + var isSkipButtonHidden: Bool = true { + didSet { + if isViewLoaded { + skipButton?.isHidden = isSkipButtonHidden + } + } + } + + @objc + var isCloseButtonHidden: Bool = false { + didSet { + if isViewLoaded { + reloadCloseButton() + } + } + } + + @objc + var isAllActionHidden: Bool = false { + didSet { + if isViewLoaded { + reloadView() + } + } + } + + @objc + private func closeAction() { + delegate?.secureWalletRoutineDidCanceled(self) + } + + @IBAction func skipButtonAction() { + delegate?.secureWalletRoutineDidCanceled(self) + } + + @IBAction func backupButtonAction() { + let controller = DWBackupSeedPhraseViewController(model: seedPhraseModel) + controller.shouldCreateNewWalletOnScreenshot = shouldCreateNewWalletOnScreenshot + controller.delegate = delegate + navigationController?.pushViewController(controller, animated: true) + } + + @IBAction func closeButtonAction() { + delegate?.secureWalletRoutineDidCanceled(self) + } + + override func viewDidLoad() { + super.viewDidLoad() + + if type == .setup { + // Create wallet entry point + self.seedPhraseModel = DWPreviewSeedPhraseModel() + seedPhraseModel.getOrCreateNewWallet() + } + + + configureHierarchy() + } + + @objc + static func controller(with type: SecureWalletInfoType) -> BackupInfoViewController { + let controller = vc(BackupInfoViewController.self, from: sb("BackupInfo")) + controller.type = type + return controller + } +} + +extension BackupInfoViewController { + private func configureHierarchy() { + titleLabel.text = NSLocalizedString("Backup your recovery phrase", comment: "Back up wallet") + subtitleLabel.text = NSLocalizedString("You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device.", comment: "Back up wallet") + showRecoveryPhraseButton.setTitle(NSLocalizedString("Show Recovery Phrase", comment: "Back up wallet"), for: .normal) + skipButton.setTitle(NSLocalizedString("Skip", comment: "Back up wallet"), for: .normal) + + show(item: .notStoredByDash) + show(item: .unableToRestore) + + skipButton.isHidden = isSkipButtonHidden + reloadCloseButton() + reloadView() + } + + private func reloadView() { + if isAllActionHidden { + hideCloseButton() + bottomButtonStack.isHidden = true + }else{ + showCloseButtonIfNeeded() + bottomButtonStack.isHidden = false + } + } + + private func reloadCloseButton() { + if isCloseButtonHidden { + hideCloseButton() + }else{ + showCloseButton() + } + } + + private func show(item: BackupInfoItem) { + let view = itemView(from: item) + contentView.addArrangedSubview(view) + } + + private func itemView(from item: BackupInfoItem) -> BackupInfoItemView { + let view = BackupInfoItemView.view() + view.titleLabel.text = item.title + view.descriptionLabel.text = item.description + view.iconView.image = item.icon + return view + } + + private func showCloseButtonIfNeeded() { + if !isCloseButtonHidden { + showCloseButton() + } + } + private func showCloseButton() { + let item = UIBarButtonItem(barButtonSystemItem: .close, target: self, action: #selector(closeAction)) + navigationItem.rightBarButtonItem = item + + closeButton = item + + } + + private func hideCloseButton() { + navigationItem.rightBarButtonItem = nil + closeButton = nil + } +} + +extension BackupInfoViewController { + var shouldCreateNewWalletOnScreenshot: Bool { + return type == .reminder + } +} + +extension BackupInfoViewController: NavigationBarDisplayable { + var isBackButtonHidden: Bool { isAllActionHidden == false } +} diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/DWBackupInfoViewController.h b/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/DWBackupInfoViewController.h deleted file mode 100644 index d8d3e68b5..000000000 --- a/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/DWBackupInfoViewController.h +++ /dev/null @@ -1,35 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWSecureWalletDelegate.h" -#import - -NS_ASSUME_NONNULL_BEGIN - -@class DWPreviewSeedPhraseModel; - -@interface DWBackupInfoViewController : UIViewController - -@property (nonatomic, assign) BOOL shouldCreateNewWalletOnScreenshot; -@property (nullable, nonatomic, weak) id delegate; - -+ (instancetype)controllerWithModel:(DWPreviewSeedPhraseModel *)model; -+ (instancetype)controllerWithoutAction; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/DWBackupInfoViewController.m b/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/DWBackupInfoViewController.m deleted file mode 100644 index 23d034d64..000000000 --- a/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/DWBackupInfoViewController.m +++ /dev/null @@ -1,183 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWBackupInfoViewController.h" - -#import "DWBackupInfoHeaderView.h" -#import "DWBackupSeedPhraseViewController.h" -#import "DWInfoTextCell.h" -#import "DWUIKit.h" - -NS_ASSUME_NONNULL_BEGIN - -static UIEdgeInsets const SCROLL_INDICATOR_INSETS = {0.0, 0.0, 0.0, -3.0}; - -@interface DWBackupInfoViewController () - -@property (nonatomic, strong) DWPreviewSeedPhraseModel *seedPhraseModel; -@property (nonatomic, assign) BOOL controllerWithoutAction; - -@property (null_resettable, copy, nonatomic) NSArray *items; - -@property (strong, nonatomic) IBOutlet UITableView *tableView; -@property (strong, nonatomic) IBOutlet UIButton *showRecoveryPhraseButton; -@property (strong, nonatomic) IBOutlet NSLayoutConstraint *contentBottomConstraint; - -@end - -@implementation DWBackupInfoViewController - -+ (instancetype)controllerWithModel:(DWPreviewSeedPhraseModel *)model { - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"BackupInfo" bundle:nil]; - DWBackupInfoViewController *controller = [storyboard instantiateInitialViewController]; - controller.seedPhraseModel = model; - - return controller; -} - -+ (instancetype)controllerWithoutAction { - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"BackupInfo" bundle:nil]; - DWBackupInfoViewController *controller = [storyboard instantiateInitialViewController]; - controller.shouldCreateNewWalletOnScreenshot = NO; - controller.controllerWithoutAction = YES; - - return controller; -} - -- (void)setControllerWithoutAction:(BOOL)controllerWithoutAction { - _controllerWithoutAction = controllerWithoutAction; - - if (self.isViewLoaded) { - self.showRecoveryPhraseButton.hidden = controllerWithoutAction; - } -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - [self setupView]; - -#if SNAPSHOT - self.showRecoveryPhraseButton.accessibilityIdentifier = @"show_recovery_button"; -#endif /* SNAPSHOT */ -} - -- (UIStatusBarStyle)preferredStatusBarStyle { - return UIStatusBarStyleLightContent; -} - -- (void)viewDidAppear:(BOOL)animated { - [super viewDidAppear:animated]; - - [self.tableView flashScrollIndicators]; -} - -- (void)viewDidLayoutSubviews { - [super viewDidLayoutSubviews]; - - UIView *headerView = self.tableView.tableHeaderView; - if (headerView != nil) { - CGSize size = [headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]; - if (headerView.frame.size.height != size.height) { - CGRect frame = headerView.frame; - frame.size.height = size.height; - headerView.frame = frame; - - if ([headerView isKindOfClass:DWBackupInfoHeaderView.class]) { - DWBackupInfoHeaderView *backupInfoHeader = (DWBackupInfoHeaderView *)headerView; - backupInfoHeader.descriptionIsHidden = self.controllerWithoutAction; - } - - self.tableView.tableHeaderView = headerView; - } - } -} - -- (void)traitCollectionDidChange:(nullable UITraitCollection *)previousTraitCollection { - [super traitCollectionDidChange:previousTraitCollection]; - - [self.tableView reloadData]; -} - -#pragma mark - Actions - -- (IBAction)showRecoveryPhraseButtonAction:(id)sender { - DWBackupSeedPhraseViewController *controller = - [[DWBackupSeedPhraseViewController alloc] initWithModel:self.seedPhraseModel]; - controller.shouldCreateNewWalletOnScreenshot = self.shouldCreateNewWalletOnScreenshot; - controller.delegate = self.delegate; - [self.navigationController pushViewController:controller animated:YES]; -} - -#pragma mark - UITableViewDataSource - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return self.items.count; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - NSString *cellId = DWInfoTextCell.dw_reuseIdentifier; - DWInfoTextCell *cell = (DWInfoTextCell *)[tableView dequeueReusableCellWithIdentifier:cellId - forIndexPath:indexPath]; - NSAssert([cell isKindOfClass:DWInfoTextCell.class], @"Invalid table view configuration - unknown cell"); - cell.text = self.items[indexPath.row]; - - return cell; -} - -#pragma mark - Notifications - -- (void)contentSizeCategoryDidChangeNotification:(NSNotification *)notification { - [self.tableView reloadData]; -} - -#pragma mark - Private - -- (void)setupView { - self.title = NSLocalizedString(@"Backup Wallet", @"A noun. Used as a title."); - - NSString *cellId = DWInfoTextCell.dw_reuseIdentifier; - UINib *nib = [UINib nibWithNibName:cellId bundle:nil]; - NSParameterAssert(nib); - [self.tableView registerNib:nib forCellReuseIdentifier:cellId]; - self.tableView.scrollIndicatorInsets = SCROLL_INDICATOR_INSETS; - - [self.showRecoveryPhraseButton setTitle:NSLocalizedString(@"Show Recovery Phrase", nil) - forState:UIControlStateNormal]; - self.showRecoveryPhraseButton.hidden = self.controllerWithoutAction; - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(contentSizeCategoryDidChangeNotification:) - name:UIContentSizeCategoryDidChangeNotification - object:nil]; -} - -- (NSArray *)items { - if (!_items) { - _items = @[ - NSLocalizedString(@"This recovery phrase is your access to the funds in this wallet.", nil), - NSLocalizedString(@"We do not store this recovery phrase.", nil), - NSLocalizedString(@"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device.", nil), - ]; - } - - return _items; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/DWExtendedPublicKeysViewController.h b/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/Views/BackupInfoItemView.swift similarity index 54% rename from DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/DWExtendedPublicKeysViewController.h rename to DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/Views/BackupInfoItemView.swift index 867304838..6dae281a1 100644 --- a/DashWallet/Sources/UI/Menu/Tools/ExtendedKeys/DWExtendedPublicKeysViewController.h +++ b/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/Views/BackupInfoItemView.swift @@ -1,6 +1,6 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2021 Dash Core Group. All rights reserved. +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. // // Licensed under the MIT License (the "License"); // you may not use this file except in compliance with the License. @@ -15,12 +15,16 @@ // limitations under the License. // -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface DWExtendedPublicKeysViewController : UITableViewController - -@end +import UIKit -NS_ASSUME_NONNULL_END +final class BackupInfoItemView: UIView { + @IBOutlet var iconView: UIImageView! + @IBOutlet var titleLabel: UILabel! + @IBOutlet var descriptionLabel: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + + titleLabel.font = .dw_font(forTextStyle: .subheadline).withWeight(UIFont.Weight.semibold.rawValue) + } +} diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/Views/BackupInfoItemView.xib b/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/Views/BackupInfoItemView.xib new file mode 100644 index 000000000..3913014e5 --- /dev/null +++ b/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/Views/BackupInfoItemView.xib @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/Views/DWBackupInfoHeaderView.h b/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/Views/DWBackupInfoHeaderView.h deleted file mode 100644 index d3977bf5a..000000000 --- a/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/Views/DWBackupInfoHeaderView.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface DWBackupInfoHeaderView : UIView - -@property (nonatomic, assign) BOOL descriptionIsHidden; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/Views/DWBackupInfoHeaderView.m b/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/Views/DWBackupInfoHeaderView.m deleted file mode 100644 index 8022d1ee9..000000000 --- a/DashWallet/Sources/UI/Setup/SecureWallet/BackupInfo/Views/DWBackupInfoHeaderView.m +++ /dev/null @@ -1,62 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWBackupInfoHeaderView.h" - -#import "DWUIKit.h" - -NS_ASSUME_NONNULL_BEGIN - -static CGFloat DescriptionBottomPadding(void) { - if (IS_IPHONE_5_OR_LESS) { - return 28.0; - } - else { - return 56.0; - } -} - -@interface DWBackupInfoHeaderView () - -@property (strong, nonatomic) IBOutlet UILabel *titleLabel; -@property (strong, nonatomic) IBOutlet UILabel *descriptionLabel; -@property (strong, nonatomic) IBOutlet NSLayoutConstraint *descriptionBottomPadding; - -@end - -@implementation DWBackupInfoHeaderView - -- (void)awakeFromNib { - [super awakeFromNib]; - - self.descriptionBottomPadding.constant = DescriptionBottomPadding(); - - self.titleLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleTitle3]; - self.descriptionLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleCallout]; - - self.titleLabel.text = NSLocalizedString(@"It's Important", nil); - self.descriptionLabel.text = NSLocalizedString(@"We are about to show you the secret key to your wallet.", nil); -} - -- (void)setDescriptionIsHidden:(BOOL)descriptionIsHidden { - _descriptionIsHidden = descriptionIsHidden; - self.descriptionLabel.hidden = descriptionIsHidden; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/DWSecureWalletDelegate.h b/DashWallet/Sources/UI/Setup/SecureWallet/DWSecureWalletDelegate.h index 4c21952c6..58d85eab7 100644 --- a/DashWallet/Sources/UI/Setup/SecureWallet/DWSecureWalletDelegate.h +++ b/DashWallet/Sources/UI/Setup/SecureWallet/DWSecureWalletDelegate.h @@ -19,7 +19,6 @@ NS_ASSUME_NONNULL_BEGIN -@class DWSecureWalletInfoViewController; @class DWVerifiedSuccessfullyViewController; @protocol DWSecureWalletDelegate diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/SecureWalletInfo/DWSecureWalletInfoViewController.h b/DashWallet/Sources/UI/Setup/SecureWallet/SecureWalletInfo/DWSecureWalletInfoViewController.h deleted file mode 100644 index 241a7676b..000000000 --- a/DashWallet/Sources/UI/Setup/SecureWallet/SecureWalletInfo/DWSecureWalletInfoViewController.h +++ /dev/null @@ -1,39 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import - -#import "DWSecureWalletDelegate.h" -#import "dashwallet-Swift.h" - -NS_ASSUME_NONNULL_BEGIN - -typedef NS_ENUM(NSUInteger, DWSecureWalletInfoType) { - DWSecureWalletInfoType_Setup, - DWSecureWalletInfoType_Reminder, -}; - -@interface DWSecureWalletInfoViewController : UIViewController - -@property (nonatomic, assign) DWSecureWalletInfoType type; -@property (nullable, nonatomic, weak) id delegate; - -+ (instancetype)controller; - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/SecureWalletInfo/DWSecureWalletInfoViewController.m b/DashWallet/Sources/UI/Setup/SecureWallet/SecureWalletInfo/DWSecureWalletInfoViewController.m deleted file mode 100644 index 1ea4a1a1f..000000000 --- a/DashWallet/Sources/UI/Setup/SecureWallet/SecureWalletInfo/DWSecureWalletInfoViewController.m +++ /dev/null @@ -1,133 +0,0 @@ -// -// Created by Andrew Podkovyrin -// Copyright © 2019 Dash Core Group. All rights reserved. -// -// Licensed under the MIT License (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// https://opensource.org/licenses/MIT -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -#import "DWSecureWalletInfoViewController.h" - -#import - -#import "DWBackupInfoViewController.h" -#import "DWPreviewSeedPhraseModel.h" -#import "DWUIKit.h" - -NS_ASSUME_NONNULL_BEGIN - -@interface DWSecureWalletInfoViewController () - -@property (strong, nonatomic) DWPreviewSeedPhraseModel *seedPhraseModel; - -@property (strong, nonatomic) IBOutlet UILabel *titleLabel; -@property (strong, nonatomic) IBOutlet UILabel *descriptionLabel; -@property (strong, nonatomic) IBOutlet UIButton *secureNowButton; -@property (strong, nonatomic) IBOutlet UIButton *skipButton; -@property (strong, nonatomic) IBOutlet NSLayoutConstraint *contentBottomConstraint; - -@end - -@implementation DWSecureWalletInfoViewController - -+ (instancetype)controller { - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SecureWalletInfo" bundle:nil]; - return [storyboard instantiateInitialViewController]; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - - [self setupView]; - - if (self.type == DWSecureWalletInfoType_Setup) { - // Create wallet entry point - self.seedPhraseModel = [[DWPreviewSeedPhraseModel alloc] init]; - [self.seedPhraseModel getOrCreateNewWallet]; - } -} - -- (UIStatusBarStyle)preferredStatusBarStyle { - return UIStatusBarStyleDefault; -} - -#pragma mark - DWNavigationFullscreenable - -- (BOOL)requiresNoNavigationBar { - return YES; -} - -#pragma mark - Actions - -- (IBAction)secureNowButtonAction:(id)sender { - if (self.type == DWSecureWalletInfoType_Setup) { - [self showBackupInfoController]; - } - else { - [[DSAuthenticationManager sharedInstance] - authenticateWithPrompt:nil - usingBiometricAuthentication:NO - alertIfLockout:YES - completion:^(BOOL authenticated, BOOL usedBiometrics, BOOL cancelled) { - if (!authenticated) { - return; - } - - self.seedPhraseModel = [[DWPreviewSeedPhraseModel alloc] init]; - [self.seedPhraseModel getOrCreateNewWallet]; - - [self showBackupInfoController]; - }]; - } -} - -- (IBAction)skipButtonAction:(id)sender { - [self.delegate secureWalletRoutineDidCanceled:self]; -} - -#pragma mark - Private - -- (void)setupView { - self.titleLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleTitle3]; - self.descriptionLabel.font = [UIFont dw_fontForTextStyle:UIFontTextStyleCallout]; - - self.titleLabel.text = NSLocalizedString(@"Secure Wallet Now", nil); - - NSString *descriptionText = nil; - switch (self.type) { - case DWSecureWalletInfoType_Setup: { - descriptionText = NSLocalizedString(@"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device.", nil); - break; - } - case DWSecureWalletInfoType_Reminder: { - descriptionText = NSLocalizedString(@"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device.", nil); - break; - } - } - self.descriptionLabel.text = descriptionText; - - [self.secureNowButton setTitle:NSLocalizedString(@"Secure now", nil) - forState:UIControlStateNormal]; - [self.skipButton setTitle:NSLocalizedString(@"Skip", nil) - forState:UIControlStateNormal]; -} - -- (void)showBackupInfoController { - DWBackupInfoViewController *controller = [DWBackupInfoViewController controllerWithModel:self.seedPhraseModel]; - controller.shouldCreateNewWalletOnScreenshot = (self.type == DWSecureWalletInfoType_Setup); - controller.delegate = self.delegate; - [self.navigationController pushViewController:controller animated:YES]; -} - -@end - -NS_ASSUME_NONNULL_END diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/SecureWalletInfo/SecureWalletInfo.storyboard b/DashWallet/Sources/UI/Setup/SecureWallet/SecureWalletInfo/SecureWalletInfo.storyboard deleted file mode 100644 index 9104bf7f7..000000000 --- a/DashWallet/Sources/UI/Setup/SecureWallet/SecureWalletInfo/SecureWalletInfo.storyboard +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/DashWallet/Sources/UI/Setup/SecureWallet/Seed/DWPreviewSeedPhraseViewController.m b/DashWallet/Sources/UI/Setup/SecureWallet/Seed/DWPreviewSeedPhraseViewController.m index 8b3f56719..66fd23ce4 100644 --- a/DashWallet/Sources/UI/Setup/SecureWallet/Seed/DWPreviewSeedPhraseViewController.m +++ b/DashWallet/Sources/UI/Setup/SecureWallet/Seed/DWPreviewSeedPhraseViewController.m @@ -19,11 +19,11 @@ #import -#import "DWBackupInfoViewController.h" #import "DWPreviewSeedPhraseModel.h" #import "DWScreenshotWarningViewController.h" #import "DWSeedPhraseModel.h" #import "DWUIKit.h" +#import "dashwallet-Swift.h" NS_ASSUME_NONNULL_BEGIN @@ -148,7 +148,8 @@ - (void)previewSeedPhraseContentView:(DWPreviewSeedPhraseContentView *)view } - (void)previewSeedPhraseContentViewShowScreenshotDescription:(DWPreviewSeedPhraseContentView *)view { - DWBackupInfoViewController *controller = [DWBackupInfoViewController controllerWithoutAction]; + DWBackupInfoViewController *controller = [DWBackupInfoViewController controllerWith:DWSecureWalletInfoType_Setup]; + controller.isAllActionHidden = true; controller.hidesBottomBarWhenPushed = YES; [self.navigationController pushViewController:controller animated:YES]; } diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DWDerivationPathKeysItemObject.m b/DashWallet/Sources/UI/Style/Style.swift similarity index 73% rename from DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DWDerivationPathKeysItemObject.m rename to DashWallet/Sources/UI/Style/Style.swift index 228e96dd8..36a9536c2 100644 --- a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/DerivationPathKeys/Models/DWDerivationPathKeysItemObject.m +++ b/DashWallet/Sources/UI/Style/Style.swift @@ -1,6 +1,6 @@ // -// Created by Andrew Podkovyrin -// Copyright © 2021 Dash Core Group. All rights reserved. +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. // // Licensed under the MIT License (the "License"); // you may not use this file except in compliance with the License. @@ -15,8 +15,8 @@ // limitations under the License. // -#import "DWDerivationPathKeysItemObject.h" +import Foundation -@implementation DWDerivationPathKeysItemObject - -@end +let stackSpacing: CGFloat = 15.0 +let radius: CGFloat = 12 +let kAnimationDuration: TimeInterval = 0.35 diff --git a/DashWallet/Sources/UI/Tx/Details/Model/TxDetailModel.swift b/DashWallet/Sources/UI/Tx/Details/Model/TxDetailModel.swift index 1432153dd..fb56981f6 100644 --- a/DashWallet/Sources/UI/Tx/Details/Model/TxDetailModel.swift +++ b/DashWallet/Sources/UI/Tx/Details/Model/TxDetailModel.swift @@ -54,11 +54,18 @@ class TxDetailModel: NSObject { } func toggleTaxCategoryOnCurrentTransaction() { + if txTaxCategory == .unknown { + txTaxCategory = transaction.tx.defaultTaxCategory() + } + txTaxCategory = txTaxCategory.nextTaxCategory let txHash = transaction.txHashData + var txUserInfo = transaction.userInfo ?? TxUserInfo(txHash: txHash, taxCategory: txTaxCategory) + txUserInfo.taxCategory = txTaxCategory + // TODO: Move it to Domain layer - TxUserInfoDAOImpl.shared.update(dto: TxUserInfo(hash: txHash, taxCategory: txTaxCategory)) + TxUserInfoDAOImpl.shared.update(dto: txUserInfo) } func copyTransactionIdToPasteboard() -> Bool { diff --git a/DashWallet/Sources/UI/Views/BalanceView/BalanceView.swift b/DashWallet/Sources/UI/Views/BalanceView/BalanceView.swift index 3bed8121d..7adf500db 100644 --- a/DashWallet/Sources/UI/Views/BalanceView/BalanceView.swift +++ b/DashWallet/Sources/UI/Views/BalanceView/BalanceView.swift @@ -19,6 +19,7 @@ import UIKit // MARK: - BalanceViewDataSource +@objc(DWBalanceViewDataSource) protocol BalanceViewDataSource: AnyObject { var mainAmountString: String { get } var supplementaryAmountString: String { get } @@ -38,7 +39,7 @@ final class BalanceView: UIView { reloadView() } } - + public var tint: UIColor? { didSet { reloadView() @@ -67,12 +68,15 @@ final class BalanceView: UIView { } extension BalanceView { + public func reloadData() { + reloadView() + } + private func reloadView() { let mainAmountString = dataSource?.mainAmountString ?? NumberFormatter.dashFormatter.string(from: 0)! let supplementaryAmountString = dataSource?.supplementaryAmountString ?? NumberFormatter.fiatFormatter.string(from: 0)! let balanceColor = UIColor.label - let font = UIFont.dw_font(forTextStyle: .title1) let balanceString = mainAmountString.attributedAmountStringWithDashSymbol(tintColor: tint ?? balanceColor) dashBalanceLabel.attributedText = balanceString fiatBalanceLabel.text = supplementaryAmountString diff --git a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/DWKeysOverviewViewController.h b/DashWallet/Sources/UI/Views/EmptyView.swift similarity index 59% rename from DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/DWKeysOverviewViewController.h rename to DashWallet/Sources/UI/Views/EmptyView.swift index 2051b0ec4..cd9702d39 100644 --- a/DashWallet/Sources/UI/Menu/Tools/Masternode Keys/Overview/DWKeysOverviewViewController.h +++ b/DashWallet/Sources/UI/Views/EmptyView.swift @@ -1,6 +1,6 @@ -// -// Created by Sam Westrich -// Copyright © 2019 Dash Core Group. All rights reserved. +// +// Created by PT +// Copyright © 2023 Dash Core Group. All rights reserved. // // Licensed under the MIT License (the "License"); // you may not use this file except in compliance with the License. @@ -15,12 +15,18 @@ // limitations under the License. // -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface DWKeysOverviewViewController : UIViewController - -@end +import UIKit -NS_ASSUME_NONNULL_END +final class EmptyView: UIView { + override init(frame: CGRect) { + super.init(frame: frame) + + backgroundColor = .clear + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + + backgroundColor = .clear + } +} diff --git a/DashWallet/Sources/UI/Views/Navigation/BaseNavigationController.swift b/DashWallet/Sources/UI/Views/Navigation/BaseNavigationController.swift index f364d1f3d..4fe711b9e 100644 --- a/DashWallet/Sources/UI/Views/Navigation/BaseNavigationController.swift +++ b/DashWallet/Sources/UI/Views/Navigation/BaseNavigationController.swift @@ -23,6 +23,25 @@ protocol NavigationStackControllable: UIViewController { func shouldPopViewController() -> Bool } +extension NavigationStackControllable { + func shouldPopViewController() -> Bool { true } +} + +// MARK: - NavigationBarDisplayable + +protocol NavigationBarStyleable: UIViewController { + var backButtonTintColor: UIColor { get } + var prefersLargeTitles: Bool { get } + var largeTitleDisplayMode: UINavigationItem.LargeTitleDisplayMode { get } +} + +extension NavigationBarStyleable { + var backButtonTintColor: UIColor { .dw_label() } + var prefersLargeTitles: Bool { false } + var largeTitleDisplayMode: UINavigationItem.LargeTitleDisplayMode { .automatic } +} + + // MARK: - NavigationBarDisplayable protocol NavigationBarDisplayable: UIViewController { @@ -69,6 +88,16 @@ class BaseNavigationController: UINavigationController { fatalError("init(coder:) has not been implemented") } + @IBAction func cancelButtonAction() { + dismiss(animated: true) + } + + @objc + public func setCancelButtonHidden(_ hidden: Bool) { + let cancelButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(cancelButtonAction)) + topViewController?.navigationItem.rightBarButtonItem = cancelButton + } + override func responds(to aSelector: Selector!) -> Bool { super.responds(to: aSelector) || (_delegate?.responds(to: aSelector!) ?? false) } @@ -121,21 +150,31 @@ extension BaseNavigationController: UINavigationControllerDelegate { animated: Bool) { var hideBackButton = viewController == navigationController.viewControllers.first var hideNavigationBar = false - + var backButtonTintColor = UIColor.dw_label() + var prefersLargeTitles = false + var largeTitleDisplayMode = UINavigationItem.LargeTitleDisplayMode.automatic; + if let viewController = viewController as? NavigationBarDisplayable { hideBackButton = viewController.isBackButtonHidden hideNavigationBar = viewController.isNavigationBarHidden + } else if let vc = viewController as? NavigationFullscreenable { hideNavigationBar = vc.requiresNoNavigationBar } + if let viewController = viewController as? NavigationBarStyleable { + backButtonTintColor = viewController.backButtonTintColor + prefersLargeTitles = viewController.prefersLargeTitles + largeTitleDisplayMode = viewController.largeTitleDisplayMode + } + delegate?.navigationController?(navigationController, willShow: viewController, animated: animated) if !hideBackButton && viewController.navigationItem.leftBarButtonItem == nil { let backButton = UIButton(type: .custom) backButton.frame = .init(x: 0, y: 0, width: 30, height: 30) backButton.setImage(UIImage(systemName: "arrow.backward"), for: .normal) - backButton.tintColor = .dw_label() + backButton.tintColor = backButtonTintColor backButton.imageEdgeInsets = .init(top: 0, left: -10, bottom: 0, right: 0) backButton.addTarget(self, action: #selector(backButtonAction), for: .touchUpInside) let item = UIBarButtonItem(customView: backButton) @@ -145,12 +184,15 @@ extension BaseNavigationController: UINavigationControllerDelegate { } viewController.navigationItem.hidesBackButton = true - + if let vc = viewController as? NavigationBarAppearanceCustomizable { vc.setNavigationBarAppearance() } navigationController.setNavigationBarHidden(hideNavigationBar, animated: animated) + navigationController.navigationBar.prefersLargeTitles = prefersLargeTitles + + viewController.navigationItem.largeTitleDisplayMode = largeTitleDisplayMode } func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) { diff --git a/DashWallet/bg.lproj/Localizable.strings b/DashWallet/bg.lproj/Localizable.strings index 5e8594e48..e0e4b495e 100644 --- a/DashWallet/bg.lproj/Localizable.strings +++ b/DashWallet/bg.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Add a New Contact"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Добави пряк път"; - /* No comment provided by engineer. */ "Address" = "Адрес"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Автоматично скриване на баланса"; -/* No comment provided by engineer. */ -"Available balance" = "Наличен баланс"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Backup Passphrase"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Backup your passphrase to create a CrowdNode account"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Грешна възстановяваща фраза"; /* Send Screen: to address */ "Balance" = "Баланс"; -/* No comment provided by engineer. */ -"Balance hidden" = "Скрит баланс"; - /* CrowdNode */ "Balance: " = "Balance: "; @@ -245,12 +242,12 @@ buy */ "Buy" = "Buy"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Купи & Продай Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Купи/Продай Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "How to Use a Gift Card"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "I Accept"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "Написах го долу"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Ако загубите това устройство, ще загубите средствата си. Вземете своята фраза за възстановяване, така че да можете да възстановите портфейла си на друго устройство."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?"; -/* No comment provided by engineer. */ -"It's Important" = "Важно е"; - /* No comment provided by engineer. */ "Join Evolution" = "Join Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Ключова фраза %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Last device sync"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Link your Uphold account"; -/* No comment provided by engineer. */ -"Load more" = "Зареди още"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Местна валута"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Map"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "masternode list #%1$d of %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Payment Type"; -/* No comment provided by engineer. */ -"Payments" = "Плащания"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Please check your network connection"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Моля въведете ПИН за обновяване на портфейла"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Моля запишете го долу"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Преди използван на IP адрес"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Частен ключ"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Сканирай QR кода"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Сканирай това на Pay"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Сканирай на Pay"; - /* No comment provided by engineer. */ "Scan to Send" = "Сканиране за изпращане"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Сканиране на QR код"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Засечен е Screenshot. Нова фраза за възстановяване:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Searching for username %@ on the Dash Network"; -/* No comment provided by engineer. */ -"Secure now" = "Подсигури сега"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Подсигури портфейл сега"; - /* No comment provided by engineer. */ "Security" = "Сигурност"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Send %@ from your primary Dash address that you currently use for your CrowdNode account"; -/* Send by (scanning QR code) */ -"Send by" = "Изпращане от"; - /* No comment provided by engineer. */ "Send Contact Request" = "Send Contact Request"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Изпрати на"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Изпрати до адрес"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Изпрати с NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Конфигуриране на портфейла"; -/* No comment provided by engineer. */ -"Share" = "Сподели"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Shop with DASH at over 150k merchants"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Syncing…"; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Докосни"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Докоснете, за да скриете баланса"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Докоснете, за да покажете баланса"; - /* No comment provided by engineer. */ "Tax Category" = "Tax Category"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "This QR already contains the payment request for %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Тази фраза за възстановяване Ви дава достъп до средствата в този портфейл."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Този портфейл не е празен или синхронизирането не е приключило, не можете да го изтриете без фразата за възстановяване"; @@ -1704,7 +1677,7 @@ "Used" = "Използван"; /* No comment provided by engineer. */ -"Used at IP address" = "Използван от IP адрес"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Username taken"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Портфейлът е изключен"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Ключове на портфейла"; - /* No comment provided by engineer. */ "Warning" = "Внимание"; /* No comment provided by engineer. */ "WARNING" = "ВНИМАНИЕ"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "Предстои да Ви покажем секретния ключ на портфейла ви."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "We couldn’t create your CrowdNode account."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "We couldn’t withdraw from your CrowdNode account."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "Ние не съхраняваме тази фраза за възстановяване."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "We have 2 types of merchants"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "You receive"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Вие получихте Dash! Ако загубите това устройство, ще загубите средствата си. Вземете своята фраза за възстановяване, така че да можете да възстановите портфейла си на друго устройство."; - /* Coinbase */ "You send" = "You send"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "You will lose all your manually reclassified transactions types"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "Тази фраза за възстановяване ще ви трябва за достъп до вашите средства, ако това устройство е загубено, повредено или ако Dash Wallet някога случайно бъде деинсталиран от това устройство."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Вашият портфейл сега е защитен. Можете да използвате вашата фраза за възстановяване по всяко време, за да възстановите акаунта си на друго устройство."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Сopied address or QR"; diff --git a/DashWallet/cs.lproj/Localizable.strings b/DashWallet/cs.lproj/Localizable.strings index d6275c34e..9fd5fe885 100644 --- a/DashWallet/cs.lproj/Localizable.strings +++ b/DashWallet/cs.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Přidat nový kontakt"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Přidat zkratku"; - /* No comment provided by engineer. */ "Address" = "Adresa"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Automaticky skrýt zůstatek"; -/* No comment provided by engineer. */ -"Available balance" = "Dostupný zůstatek"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Backup Passphrase"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Backup your passphrase to create a CrowdNode account"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Špátná fráze pro obnovení"; /* Send Screen: to address */ "Balance" = "Bilance"; -/* No comment provided by engineer. */ -"Balance hidden" = "Skrytý zůstatek"; - /* CrowdNode */ "Balance: " = "Balance: "; @@ -245,12 +242,12 @@ buy */ "Buy" = "Nákup"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Nákup a prodej Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Koupit / Prodat Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Nákup dárkového poukazu"; @@ -413,7 +410,7 @@ "Create a New Wallet" = "Vytvořit novou peněženku"; /* CrowdNode */ -"Create Account" = "Create Account"; +"Create Account" = "Vytvořit účet"; /* CrowdNode CrowdNode Portal */ @@ -423,7 +420,7 @@ "Credit Card" = "Kreditní karta"; /* Crowdnode */ -"CrowdNode Account" = "CrowdNode Account"; +"CrowdNode Account" = "CrowdNode Účet"; /* CrowdNode Portal */ "CrowdNode Support" = "CrowdNode Support"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "Jak použít dárkový poukaz"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "Přijímám"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "Mám poznamenáno"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Pokud toto zařízení ztratíte, přijdete o všechny prostředky. Získejte vaší frázi pro obnovení, takže budete moci peněženku obnovit na jiném zařízení."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "Pokoušíte se obnovit peněženku pomocí 12 slovní fráze pro obnovení, ale zadali jste pouze 11 slov, chcete automaticky obnovit chybějící slova?"; -/* No comment provided by engineer. */ -"It's Important" = "Je důležité"; - /* No comment provided by engineer. */ "Join Evolution" = "Připojte se k Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Klíčový pár %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Last device sync"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Link your Uphold account"; -/* No comment provided by engineer. */ -"Load more" = "Načíst více"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Místní Měna"; @@ -891,7 +882,7 @@ "Locked" = "Blokováno"; /* CrowdNode WebView */ -"Log in to CrowdNode" = "Log in to CrowdNode"; +"Log in to CrowdNode" = "Přihlásit do CrowdNode"; /* No comment provided by engineer. */ "Log Out" = "Odhlásit"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Mapa"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "seznam masternodů #%1$d z %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Payment Type"; -/* No comment provided by engineer. */ -"Payments" = "Platby"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Zkontrolujte připojení k síti"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Pro aktualizaci peněženky zadejte PIN kód"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Poznamenejte si ji"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Naposledy použito na IP adrese"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Privátní klíč"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Skenovat QR kód"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Skenovat pro zaplacení"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Platit skenováním"; - /* No comment provided by engineer. */ "Scan to Send" = "Poslat skenováním"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Skenování QR kódu"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Byl zachycen screenshot. Tady je nová fráze pro obnovení:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Hledání uživatele %@ na Dash Network"; -/* No comment provided by engineer. */ -"Secure now" = "Ihned zabezpečit"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Ihned peněženku zabezpečit"; - /* No comment provided by engineer. */ "Security" = "Zabezpečení"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Send %@ from your primary Dash address that you currently use for your CrowdNode account"; -/* Send by (scanning QR code) */ -"Send by" = "Odeslat pomocí"; - /* No comment provided by engineer. */ "Send Contact Request" = "Odeslat žádost o přidání mezi kontakty"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Odeslat prostřednictvím"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Odeslat na adresu"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Odeslat prostřednictvím NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Vytvořit peněženku"; -/* No comment provided by engineer. */ -"Share" = "Sdílet"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Shop with DASH at over 150k merchants"; @@ -1468,7 +1450,7 @@ "Sign up error" = "Sign up error"; /* CrowdNode */ -"Sign up to CrowdNode" = "Sign up to CrowdNode"; +"Sign up to CrowdNode" = "Registrovat se na CrowdNode"; /* CrowdNode Portal */ "Sign up to finish setting up account" = "Sign up to finish setting up account"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Syncing…"; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Začít"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Klepněte pro skrytí zůstatku"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Klepněte pro zobrazení zůstatku"; - /* No comment provided by engineer. */ "Tax Category" = "Tax Category"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "This QR already contains the payment request for %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Tato fráze pro obnovení slouží jako přístup k prostředkům na peněžence."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Peněženka není prázdná nebo synchronizace se sítí není ještě dokončena, nesmíte ji smazat bez fráze pro obnovení."; @@ -1704,7 +1677,7 @@ "Used" = "Použito"; /* No comment provided by engineer. */ -"Used at IP address" = "Použito na IP adrese"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Uživatelské jméno už není dostupné"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Peněženka deaktivována"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Klíče peněženky"; - /* No comment provided by engineer. */ "Warning" = "Varování"; /* No comment provided by engineer. */ "WARNING" = "UPOZORNĚNÍ"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "Ukážeme vám privátní klíč od vaší peněženky."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "We couldn’t create your CrowdNode account."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "We couldn’t withdraw from your CrowdNode account."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "Neuschováváme tuto frázi pro obnovení."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "Máme 2 typy obchodníků"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "You receive"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Obdrželi jste Dash! Pokud toto zařízení ztratíte, přijdete o všechny prostředky. Získejte vaší frázi pro obnovení, takže budete moci peněženku obnovit na jiném zařízení."; - /* Coinbase */ "You send" = "You send"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "You will lose all your manually reclassified transactions types"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "Pokud toto zařízení ztratíte, poškodíte nebo odinstalujete Dash Wallet, budete potřebovat frázi pro obnovení, abyste znovu mohli nakládat s vašimi prostředky."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Peněženka je teď zabezpečena. Frázi pro obnovení můžete kdykoliv použít pro obnovení na jiném zařízení."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Zkopírovaná adresa nebo QR"; diff --git a/DashWallet/dashwallet-Bridging-Header.h b/DashWallet/dashwallet-Bridging-Header.h index 8d49bc510..02a6beb13 100644 --- a/DashWallet/dashwallet-Bridging-Header.h +++ b/DashWallet/dashwallet-Bridging-Header.h @@ -20,6 +20,7 @@ static const bool _SNAPSHOT = 0; #import "DSPriceOperationProvider.h" #import "DSOperation.h" #import "DSOperationQueue.h" +#import "DSDerivationPathFactory.h" //MARK: DashWallet #import "DWActionButton.h" @@ -40,7 +41,6 @@ static const bool _SNAPSHOT = 0; //MARK: CrowdNode #import "DWCheckbox.h" -#import "DWBackupInfoViewController.h" #import "DWPreviewSeedPhraseModel.h" #import "DWSeedPhraseModel.h" #import "DWSecureWalletDelegate.h" @@ -48,11 +48,8 @@ static const bool _SNAPSHOT = 0; #import "NSData+Dash.h" // end CrowdNode -#import "DWUpholdViewController.h" -#import "DWUpholdClient.h" -#import "DWUpholdCardObject.h" + #import "DWBaseActionButtonViewController.h" -#import "DWBaseViewController.h" #import "DWNumberKeyboardInputViewAudioFeedback.h" #import "DWInputValidator.h" #import "DWAmountInputValidator.h" @@ -64,8 +61,6 @@ static const bool _SNAPSHOT = 0; #import "DWLocalCurrencyViewController.h" #import "DWPayModelProtocol.h" #import "DWDemoDelegate.h" -#import "DWQRScanViewController.h" -#import "DWQRScanModel.h" #import "DWModalPopupTransition.h" #import "DWModalTransition.h" #import "UIView+DWHUD.h" @@ -80,6 +75,25 @@ static const bool _SNAPSHOT = 0; #import "DWAlertController.h" +//MARK: Backup Wallet +#import "DWBackupSeedPhraseViewController.h" +#import "DWSecureWalletDelegate.h" + +//MARK: Payment flow +#import "DWQRScanModel.h" +#import "DWPayOptionModel.h" +#import "DWPayModelProtocol.h" +#import "DWReceiveModelProtocol.h" +#import "DWReceiveModel.h" +#import "DWTransactionListDataProviderProtocol.h" +#import "DWQuickReceiveViewController.h" +#import "DWQRScanViewController.h" +#import "DWQRScanModel.h" +#import "DWRequestAmountViewController.h" +#import "UIViewController+DWShareReceiveInfo.h" +#import "DWImportWalletInfoViewController.h" + + //MARK: Uphold #import "DWUpholdTransactionObject.h" #import "DWUpholdViewController.h" @@ -93,5 +107,7 @@ static const bool _SNAPSHOT = 0; //MARK: 3rd Party #import - #import "DWPhoneWCSessionManager.h" + +//MARK: Platform +#import "DWDPBasicUserItem.h" diff --git a/DashWallet/de.lproj/Localizable.strings b/DashWallet/de.lproj/Localizable.strings index b294f9207..8ac7d65a2 100644 --- a/DashWallet/de.lproj/Localizable.strings +++ b/DashWallet/de.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Neuen Kontakt hinzufügen"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Shortcut hinzufügen"; - /* No comment provided by engineer. */ "Address" = "Adresse"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Guthaben automatisch verstecken"; -/* No comment provided by engineer. */ -"Available balance" = "Verfügbares Guthaben"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Passphrase sichern"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Sichere deine Passphrase um ein Crowdnode Konto zu erstellen"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Fehlerhafte Wiederherstellungs-Wortfolge"; /* Send Screen: to address */ "Balance" = "Guthaben"; -/* No comment provided by engineer. */ -"Balance hidden" = "Guthaben nicht angezeigt"; - /* CrowdNode */ "Balance: " = "Guthaben:"; @@ -245,12 +242,12 @@ buy */ "Buy" = "Kaufen"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Kaufe & Verkaufe Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Kaufe / Verkaufe Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Gutscheinkarte kaufen"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "Wie man eine Gutscheinkarte verwendet"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "Ich akzeptiere"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "Ich habe es aufgeschrieben"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Wenn Du dieses Gerät verlierst, verlierst Du dein Geld. Sicher Deine Wiederherstellungsphrase, damit Du Deine Wallet auf einem anderen Gerät wiederherstellen kannst."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "Wenn du die Passphrase für diese Wallet verlierst und das Gerät verloren geht oder die Dash Wallet deinstalliert wird, wirst du auch den Zugang zu Crowdnode und all dein Guthaben verlieren."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "Anscheinend versuchst du deine Wallet mit einer Wiederherstellungsphrase aus 12 Wörtern wiederherzustellen, allerdings hast du nur 11 Wörter eingegeben. Möchtest du das fehlende Wort automatisch wiederherstellen?"; -/* No comment provided by engineer. */ -"It's Important" = "Dies ist wichtig"; - /* No comment provided by engineer. */ "Join Evolution" = "An Evolution teilnehmen"; /* No comment provided by engineer. */ -"Keypair %ld" = "Keypair %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Letzte Gerätesynchronisierung"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Dein Uphold Konto verknüpfen"; -/* No comment provided by engineer. */ -"Load more" = "Mehr laden"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Lokale Währung"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Karte"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "Masternode-Liste #%1$d von %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Zahlungsart"; -/* No comment provided by engineer. */ -"Payments" = "Zahlungen"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Bitte überprüfe deine Netzwerksverbindung"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "PIN eingeben zum upgraden der Wallet"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Bitte aufschreiben"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Zuvor verwendet über die IP-Adresse"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Privater Schlüssel"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "QR-Code scannen"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Scannen"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Scannen"; - /* No comment provided by engineer. */ "Scan to Send" = "Zum Senden scannen"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "QR-Code scannen"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Screenshot festgestellt. Neue Wiederherstellungsphrase:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Nach Benutzernamen %@ im Dash-Netzwerk suchen"; -/* No comment provided by engineer. */ -"Secure now" = "Jetzt sichern"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Wallet jetzt absichern"; - /* No comment provided by engineer. */ "Security" = "Sicherheit"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Sende %@ Dash von deiner primären Dash Adresse, die du derzeit für dein CrowdNode Konto nutzt."; -/* Send by (scanning QR code) */ -"Send by" = "Gesendet von"; - /* No comment provided by engineer. */ "Send Contact Request" = "Kontaktanfrage senden"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Senden an"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "An Adresse senden"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Mit NFC senden"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Wallet erstellen"; -/* No comment provided by engineer. */ -"Share" = "Teilen"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Bezahle mit DASH bei über 150.000 Händlern"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Synchronisieren..."; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Tippe"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Zum Verbergen des Guthabens tippen"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Zum Anzeigen des Guthabens tippen"; - /* No comment provided by engineer. */ "Tax Category" = "Steuerliche Kategorie"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "Dieser QR Code enthält die Zahlungsaufforderung für %@."; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Diese Wiederherstellungsphrase stellt den Zugang zu dieser Wallet dar."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Diese Wallet ist nicht leer oder die Synchronisierung wurde noch nicht abgeschlossen, ohne die Wiederherstellungsphrase können Sie diese nicht löschen."; @@ -1704,7 +1677,7 @@ "Used" = "Benutzt"; /* No comment provided by engineer. */ -"Used at IP address" = "Benutzt von IP-Adresse"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Benutzername bereits vergeben"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Wallet deaktiviert"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Wallet-Schlüssel"; - /* No comment provided by engineer. */ "Warning" = "Warnung"; /* No comment provided by engineer. */ "WARNING" = "WARNUNG"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "Wir zeigen dir nun den geheimen Zugangsschlüssel zu deiner Wallet."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "Wir konnten dein CrowdNode Konto nicht erstellen."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "Wir konnten keine Auszahlung von deinem CrowdNode Konto durchführen."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "Wir speichern diese Wiederherstellungsphrase nicht."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "Wir haben 2 Arten von Händlern"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "Du erhältst"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Du hast Dash erhalten! Wenn Du dieses Gerät verlierst, verlierst Du dein Geld. Sicher Deine Wiederherstellungsphrase, damit Du Deine Wallet auf einem anderen Gerät wiederherstellen kannst."; - /* Coinbase */ "You send" = "Du sendest"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "Du verlierst alle manuell umklassifizierten Transaktionsarten."; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "Diese Wiederherstellungsphrase wird zum Zugriff auf das Guthaben benötigt, sollte das Gerät verloren oder kaputt gehen, oder falls die App fälschlicherweise deinstalliert wird."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "Du erhältst %@ Dash auf deiner Dash Wallet auf diesem Gerät. Bitte beachte, dass es bis zu 2 bis 3 Minuten dauern kann, bis eine Übertragung abgeschlossen ist."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Deine Wallet ist jetzt gesichert. Du kannst die Phrase jederzeit nutzen, um die Wallet auf einem anderen Gerät wiederherzustellen."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Adresse oder QR kopiert"; diff --git a/DashWallet/el.lproj/Localizable.strings b/DashWallet/el.lproj/Localizable.strings index 625dc0644..b9da60c8b 100644 --- a/DashWallet/el.lproj/Localizable.strings +++ b/DashWallet/el.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Προσθήκη Νέας Επαφής"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Προσθήκη Συντόμευσης"; - /* No comment provided by engineer. */ "Address" = "Διεύθυνση"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Αυτόματη απόκρυψη Υπολοίπου"; -/* No comment provided by engineer. */ -"Available balance" = "Διαθέσιμο υπόλοιπο"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Backup της φράσης πρόσβασης"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Δημιουργήστε αντίγραφο ασφαλείας της φράσης πρόσβασης για να δημιουργήσετε έναν λογαριασμό CrowdNode"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Λάθος φράση ανάκτησης"; /* Send Screen: to address */ "Balance" = "Υπόλοιπο"; -/* No comment provided by engineer. */ -"Balance hidden" = "Το υπόλοιπο αποκρύφτηκε"; - /* CrowdNode */ "Balance: " = "Υπόλοιπο:"; @@ -245,12 +242,12 @@ buy */ "Buy" = "Αγορά"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Αγορά και Πώληση Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Αγορά / Πώληση Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Αγοράστε μια δωροκάρτα"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "Πώς να χρησιμοποιήσετε μια δωροκάρτα"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "Αποδέχομαι"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "Το έγραψα"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Αν χάσετε αυτή τη συσκευή, θα χάσετε και τα χρήματά σας. Πάρτε τη φράση ανάκτησης σας για να μπορέσετε να επαναφέρετε το πορτοφόλι σας σε άλλη συσκευή."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "Εάν χάσετε τη φράση πρόσβασης για αυτό το πορτοφόλι και χάσετε αυτή τη συσκευή ή απεγκαταστήσετε το Dash Wallet, θα χάσετε την πρόσβαση στα χρήματά σας στο CrowdNode και τα χρήματα σε αυτό το πορτοφόλι."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "Φαίνεται ότι προσπαθείτε να επαναφέρετε το πορτοφόλι σας χρησιμοποιώντας μια φράση ανάκτησης 12 λέξεων, ωστόσο έχετε εισαγάγει μόνο 11 λέξεις, θα θέλατε να ανακτήσετε αυτόματα τη λέξη που λείπει;"; -/* No comment provided by engineer. */ -"It's Important" = "Είναι σημαντικό"; - /* No comment provided by engineer. */ "Join Evolution" = "Εγγραφείτε στο Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Keypair %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Τελευταίος συγχρονισμός συσκευής"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Σύνδεση Uphold λογαριασμού"; -/* No comment provided by engineer. */ -"Load more" = "Φόρτωσε περισσότερα"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Τοπικό νόμισμα"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Χάρτης"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "Λίστα masternode #%1$d of %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Τύπος πληρωμής"; -/* No comment provided by engineer. */ -"Payments" = "Πληρωμές"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Ελέγξτε τη σύνδεση δικτύου σας"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Παρακαλώ εισάγετε το PIN για να αναβαθμίσετε το πορτοφόλι"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Παρακαλώ να το γράψετε"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Χρησιμοποιήθηκε προηγουμένως στη διεύθυνση IP"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Ιδιωτικό κλειδί"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "σάρωση QR κωδικού"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Σαρώστε το για να πληρώσετε"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Σαρώστε για να πληρώσετε"; - /* No comment provided by engineer. */ "Scan to Send" = "Σαρώστε για να Στείλετε"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Σάρωση QR κωδικού"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Εντοπίστηκε στιγμιότυπο οθόνης. Νέα φράση ανάκτησης:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Αναζήτηση για όνομα χρήστη %@ στο Dash Δικτυο"; -/* No comment provided by engineer. */ -"Secure now" = "Ασφαλίστε τώρα"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Ασφαλίστε το πορτοφόλι τώρα"; - /* No comment provided by engineer. */ "Security" = "Ασφάλεια"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Στείλτε %@ Dash από την κύρια διεύθυνση Dash που χρησιμοποιείτε σήμερα για τον λογαριασμό σας στην CrowdNode"; -/* Send by (scanning QR code) */ -"Send by" = "Εστάλη από"; - /* No comment provided by engineer. */ "Send Contact Request" = "Αποστολή Αιτήματος Επαφής"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Εστάλη στο"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Αποστολή στη διεύθυνση"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Αποστολή μέσω NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Εγκατάσταση πορτοφολιού"; -/* No comment provided by engineer. */ -"Share" = "Μοιραστείτε"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Αγοράστε με το DASH σε πάνω από 150 χιλιάδες εμπόρους"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Συγχρονισμός..."; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Πατήστε"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Πατήστε για να κρύψετε το υπόλοιπο"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Πατήστε για να αποκαλύψετε το υπόλοιπο"; - /* No comment provided by engineer. */ "Tax Category" = "Φορολογική κατηγορία"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "Αυτό το QR περιέχει ήδη την αίτηση πληρωμής για %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Αυτή η φράση ανάκτησης σας δίνει πρόσβασή στα χρήματα αυτού του πορτοφολιού."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Αυτό το πορτοφόλι δεν είναι άδειο η ο συγχρονισμός δεν έχει ολοκληρωθεί , δεν θα πρέπει να το καθαρίσετε χωρίς την φράση ανάκτησης"; @@ -1704,7 +1677,7 @@ "Used" = "Χρησιμοποιήθηκε"; /* No comment provided by engineer. */ -"Used at IP address" = "Χρησιμοποιήθηκε στη διεύθυνση IP"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Το όνομα χρήστη είναι κατειλημμένο"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Το πορτοφόλι απενεργοποιήθηκε"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Κλειδιά Πορτοφολιού"; - /* No comment provided by engineer. */ "Warning" = "Προειδοποίηση"; /* No comment provided by engineer. */ "WARNING" = "ΠΡΟΕΙΔΟΠΟΙΗΣΗ"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "Θα σας αποκαλύψουμε το μυστικό κλειδί του πορτοφολιού σας."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "Δεν μπορέσαμε να δημιουργήσουμε το λογαριασμό σας στο CrowdNode."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "Δεν μπορέσαμε να κάνουμε ανάληψη από το λογαριασμό σας στο CrowdNode."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "Δεν αποθηκεύουμε αυτήν την φράση ανάκτησης"; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "Έχουμε 2 τύπους εμπόρων"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "Θα λάβετε"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Λάβατε Dash! Αν χάσετε αυτή τη συσκευή, θα χάσετε τα χρήματά σας. Πάρτε τη φράση ανάκτησης για να μπορέσετε να επαναφέρετε το πορτοφόλι σας σε άλλη συσκευή."; - /* Coinbase */ "You send" = "Θα στείλετε"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "Θα χάσετε όλους τους χειροκίνητα αναταξινομημένους τύπους συναλλαγών σας"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "Θα χρειαστείτε αυτή τη φράση ανάκτησης για να αποκτήσετε πρόσβαση στα χρήματά σας εάν αυτή η συσκευή χαθεί, καταστραφεί ή εάν το Πορτοφόλι Dash απεγκατασταθει τυχαία από αυτήν τη συσκευή."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "Θα λάβετε Dash %@ στο Dash Wallet σας σε αυτή τη συσκευή. Λάβετε υπόψη ότι μπορεί να χρειαστούν έως και 2-3 λεπτά για να ολοκληρωθεί η μεταφορά."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Το πορτοφόλι σας είναι ασφαλές τώρα. Μπορείτε να χρησιμοποιήσετε τη φράση ανάκτησης ανά πάσα στιγμή για να ανακτήσετε το λογαριασμό σας σε άλλη συσκευή."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Αντιγραμμένη διεύθυνση ή QR"; diff --git a/DashWallet/en.lproj/Localizable.strings b/DashWallet/en.lproj/Localizable.strings index 6d72e558e..334da3cd9 100644 --- a/DashWallet/en.lproj/Localizable.strings +++ b/DashWallet/en.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Add a New Contact"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Add Shortcut"; - /* No comment provided by engineer. */ "Address" = "Address"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Autohide Balance"; -/* No comment provided by engineer. */ -"Available balance" = "Available balance"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Backup Passphrase"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Backup your passphrase to create a CrowdNode account"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Bad recovery phrase"; /* Send Screen: to address */ "Balance" = "Balance"; -/* No comment provided by engineer. */ -"Balance hidden" = "Balance hidden"; - /* CrowdNode */ "Balance: " = "Balance: "; @@ -245,12 +242,12 @@ buy */ "Buy" = "Buy"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Buy / Sell Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "How to Use a Gift Card"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "I Accept"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "I wrote it down"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?"; -/* No comment provided by engineer. */ -"It's Important" = "It's Important"; - /* No comment provided by engineer. */ "Join Evolution" = "Join Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Keypair %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Last device sync"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Link your Uphold account"; -/* No comment provided by engineer. */ -"Load more" = "Load more"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Local Currency"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Map"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "masternode list #%1$d of %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Payment Type"; -/* No comment provided by engineer. */ -"Payments" = "Payments"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Please check your network connection"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Please enter PIN to upgrade wallet"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Please write it down"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Previously used at IP address"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Private key"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Scan QR Code"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Scan this to Pay"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Scan to Pay"; - /* No comment provided by engineer. */ "Scan to Send" = "Scan to Send"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Scanning QR code"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Screenshot detected. New recovery phrase:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Searching for username %@ on the Dash Network"; -/* No comment provided by engineer. */ -"Secure now" = "Secure now"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Secure Wallet Now"; - /* No comment provided by engineer. */ "Security" = "Security"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Send %@ from your primary Dash address that you currently use for your CrowdNode account"; -/* Send by (scanning QR code) */ -"Send by" = "Send by"; - /* No comment provided by engineer. */ "Send Contact Request" = "Send Contact Request"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Send to"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Send to Address"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Send with NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Setup Wallet"; -/* No comment provided by engineer. */ -"Share" = "Share"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Shop with DASH at over 150k merchants"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Syncing…"; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Tap"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Tap to hide balance"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Tap to unhide balance"; - /* No comment provided by engineer. */ "Tax Category" = "Tax Category"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "This QR already contains the payment request for %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "This recovery phrase is your access to the funds in this wallet."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase"; @@ -1704,7 +1677,7 @@ "Used" = "Used"; /* No comment provided by engineer. */ -"Used at IP address" = "Used at IP address"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Username taken"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Wallet disabled"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Wallet Keys"; - /* No comment provided by engineer. */ "Warning" = "Warning"; /* No comment provided by engineer. */ "WARNING" = "WARNING"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "We are about to show you the secret key to your wallet."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "We couldn’t create your CrowdNode account."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "We couldn’t withdraw from your CrowdNode account."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "We do not store this recovery phrase."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "We have 2 types of merchants"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "You receive"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device."; - /* Coinbase */ "You send" = "You send"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "You will lose all your manually reclassified transactions types"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Сopied address or QR"; diff --git a/DashWallet/en.lproj/Localizable.stringsdict b/DashWallet/en.lproj/Localizable.stringsdict index 7a9357b3b..21dc0be7e 100644 --- a/DashWallet/en.lproj/Localizable.stringsdict +++ b/DashWallet/en.lproj/Localizable.stringsdict @@ -50,21 +50,37 @@ %d merchants - %d transaction(s) - - NSStringLocalizedFormatKey - %#@transactions@ - transactions - - NSStringFormatSpecTypeKey - NSStringPluralRuleType - NSStringFormatValueTypeKey - d - one - %d transaction - other - %d transactions - - + %d transaction(s) + + NSStringLocalizedFormatKey + %#@transactions@ + transactions + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %d transaction + other + %d transactions + + + %d key(s) + + NSStringLocalizedFormatKey + %#@keys@ + keys + + NSStringFormatSpecTypeKey + NSStringPluralRuleType + NSStringFormatValueTypeKey + d + one + %d key + other + %d keys + + diff --git a/DashWallet/es.lproj/Localizable.strings b/DashWallet/es.lproj/Localizable.strings index 3c5b56c40..22aa3569f 100644 --- a/DashWallet/es.lproj/Localizable.strings +++ b/DashWallet/es.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Agregar un nuevo contacto"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Agregar atajo"; - /* No comment provided by engineer. */ "Address" = "Dirección"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Esconder saldo automáticamente"; -/* No comment provided by engineer. */ -"Available balance" = "Saldo disponible"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Contraseña de respaldo"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Haz una copia de seguridad de tu contraseña para crear una cuenta de CrowdNode"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Frase de recuperación incorrecta"; /* Send Screen: to address */ "Balance" = "Saldo"; -/* No comment provided by engineer. */ -"Balance hidden" = "Saldo oculto"; - /* CrowdNode */ "Balance: " = "Balance:"; @@ -245,12 +242,12 @@ buy */ "Buy" = "Comprar"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Comprar y Vender Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Comprar / Vender Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Comprar una Tarjeta de regalo"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "Como usar una tarjeta de regalo"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "Yo acepto"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "Ya la escribí"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Si pierdes este dispositivo, podrás perder tus fondos. Obtén tu frase de recuperación para que puedas restaurar tu billetera en otro dispositivo."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "Si pierdes tu contraseña para esta billetera y pierdes este dispositivo o desinstalas la billetera de Dash, perderás el acceso a tus fondos en CrowdNode y a los fondos dentro de esta billetera."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "Parece que estás intentando restaurar tu billetera usando una frase de recuperación de 12 palabras, sin embargo, solo has ingresado 11 palabras. ¿Te gustaría recuperar automáticamente la palabra que falta?"; -/* No comment provided by engineer. */ -"It's Important" = "Es importante"; - /* No comment provided by engineer. */ "Join Evolution" = "Únete a Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Par de llaves %Id"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Sincronización del último dispositivo"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Vincula tu cuenta de Uphold"; -/* No comment provided by engineer. */ -"Load more" = "Cargar más"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Moneda Local"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Mapa"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "Lista de masternode #%1$d de %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Tipo de pago"; -/* No comment provided by engineer. */ -"Payments" = "Pago"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Comprueba tu conexión de red"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Por favor ingrese su PIN para actualizar la billetera"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Anótala, por favor"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Usado anteriormente en la dirección de IP"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Llave privada"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Escanear Código QR"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Escanear para Pagar"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Escanear para Paga"; - /* No comment provided by engineer. */ "Scan to Send" = "Escanear para Envia"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Escaneando código QR"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Pantallazo detectado. Nueva frase de recuperación:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Buscando nombre de usuaro %@en la red Dash "; -/* No comment provided by engineer. */ -"Secure now" = "Asegurar ahora"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Asegurar Billetera Ahora"; - /* No comment provided by engineer. */ "Security" = "Seguridad"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Envía %@ desde tu dirección principal de Dash que usas actualmente para tu cuenta de CrowdNode"; -/* Send by (scanning QR code) */ -"Send by" = "Enviado por"; - /* No comment provided by engineer. */ "Send Contact Request" = "Enviar solicitud de contacto"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Enviar para"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Enviar a Dirección"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Enviar por NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Configurar Billetera"; -/* No comment provided by engineer. */ -"Share" = "Compartir"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Compra con DASH en más de 150.000 comercios"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Sincronizando..."; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Toca"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Tocar para ocultar saldo"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Tocar para mostrar saldo"; - /* No comment provided by engineer. */ "Tax Category" = "Categoría de impuestos"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "Este QR ya contiene la solicitud de pago de %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Esta frase de recuperación es tu acceso para los fondos en esta billetera."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Esta cartera no esta vacía o la sincronización no ha terminado, no podrás limpiarla sin la frase de recuperación"; @@ -1704,7 +1677,7 @@ "Used" = "Utilizado"; /* No comment provided by engineer. */ -"Used at IP address" = "Utilizado en la dirección de IP"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Nombre de usuario ya ha sido tomado"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Billetera deshabilitada"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Llaves de billetera"; - /* No comment provided by engineer. */ "Warning" = "Aviso"; /* No comment provided by engineer. */ "WARNING" = "ADVERTENCIA"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "Estamos a punto de mostrar la frase de recuperación de tu billetera."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "No pudimos crear tu cuenta de CrowdNode."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "No pudimos retirar dinero de tu cuenta de CrowdNode."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "Nosotros no guardamos esta frase de recuperación."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "Tenemos 2 tipos de comerciantes"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "Tu recibes"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Recibiste Dash! Si pierdes este dispositivo, podrás perder sus fondos. Obtén tu frase de recuperación para que puedas restaurar tu billetera en otro dispositivo."; - /* Coinbase */ "You send" = "Tu envías"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "Perderás todos tus tipos de transacciones reclasificadas manualmente"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "Necesitarás esta frase de recuperación para acceder a tus fondos si este dispositivo se pierde, daña o si la billetera de Dash se desinstala accidentalmente de este dispositivo."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "Tu recibirás %@ Dash en tu billetera de Dash en este dispositivo. Ten en cuenta que puede tomar hasta 2-3 minutos completar una transferencia."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Tu billetera está segura ahora. Podrás utilizar tu frase de recuperación en cualquier momento para recuperar tu cuenta en otro dispositivo."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Dirección o QR copiado"; diff --git a/DashWallet/explore.db b/DashWallet/explore.db index 40adf45e6..30eb46e06 100644 Binary files a/DashWallet/explore.db and b/DashWallet/explore.db differ diff --git a/DashWallet/fr.lproj/Localizable.strings b/DashWallet/fr.lproj/Localizable.strings index 6c0495e9e..d9a5343ac 100644 --- a/DashWallet/fr.lproj/Localizable.strings +++ b/DashWallet/fr.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Ajouter un nouveau contact"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Ajouter un raccourci"; - /* No comment provided by engineer. */ "Address" = "Adresse"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Cacher autom. le solde"; -/* No comment provided by engineer. */ -"Available balance" = "Solde disponible"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Sauvegarder la phrase de passe"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Sauvegardez votre phrase de passe pour créer un compte CrowdNode"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Phrase de récupération incorrecte"; /* Send Screen: to address */ "Balance" = "Solde"; -/* No comment provided by engineer. */ -"Balance hidden" = "Solde caché"; - /* CrowdNode */ "Balance: " = "Solde :"; @@ -245,12 +242,12 @@ buy */ "Buy" = "Acheter"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Acheter & vendre des dashs"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Acheter/vendre des dashs"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Acheter une carte-cadeau"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "Comment utiliser une carte-cadeau"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "J'accepte"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "Je l'ai écrite sur papier"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Si vous perdez cet appareil, vous perdrez vos fonds. Veuillez noter votre phrase de récupération pour pouvoir restaurer votre portefeuille sur un autre appareil."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "Si vous perdez votre phrase de passe pour ce portefeuille, ou si vous perdez cet appareil, ou si vous désinstallez Dash Wallet, vous perdrez l'accès à vos fonds sur CrowdNode ainsi que les fonds dans ce portefeuille."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "Il semble que vous tentiez de restaurer votre portefeuille avec une phrase de récupération de 12 mots. Cependant vous n'avez indiqué que 11 mots. Voulez-vous retrouver automatiquement le mot manquant ?"; -/* No comment provided by engineer. */ -"It's Important" = "C'est important"; - /* No comment provided by engineer. */ "Join Evolution" = "Rejoindre Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Paire de clés %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Dernière synchro de l'appareil"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Liez votre compte Uphold"; -/* No comment provided by engineer. */ -"Load more" = "Charger plus"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Monnaie locale"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Carte"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "liste de masternodes #%1$d sur %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Type de paiement"; -/* No comment provided by engineer. */ -"Payments" = "Paiements"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Veuillez vérifier votre connexion réseau"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Veuillez saisir votre code PIN pour mettre à jour le portefeuille"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Veuillez l'écrire quelque part"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Utilisé précédemment à l'adresse IP"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Clé privée"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Scanner un QR-code"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Scanner ceci pour payer"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Scanner pour payer"; - /* No comment provided by engineer. */ "Scan to Send" = "Scanner pour envoyer"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Scan du QR-code"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Capture d'écran détectée. Nouvelle phrase de récupération :"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Recherche du nom d'utilisateur %@ sur le réseau Dash"; -/* No comment provided by engineer. */ -"Secure now" = "Sécuriser maintenant"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Sécuriser le portefeuille maintenant"; - /* No comment provided by engineer. */ "Security" = "Sécurité"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Envoyer %@ depuis l'adresse principale Dash que vous utilisez actuellement pour votre compte CrowdNode"; -/* Send by (scanning QR code) */ -"Send by" = "Envoyé par"; - /* No comment provided by engineer. */ "Send Contact Request" = "Envoyer une demande de contact"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Envoyer à"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Envoyer à l'adresse"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Envoyer avec NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Mettre en place le portefeuille"; -/* No comment provided by engineer. */ -"Share" = "Partager"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Acheter avec Dash chez plus de 150 000 vendeurs"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Synchronisation…"; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Touchez"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Touchez pour masquer le solde"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Touchez pour afficher le solde"; - /* No comment provided by engineer. */ "Tax Category" = "Catégorie de taxe"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "Ce QR-code contient déjà la requête de paiement pour %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Cette phrase de récupération vous permet d'accéder aux fonds de ce portefeuille."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Ce portefeuille n'est pas vide, ou bien la synchronisation n'est pas terminée. Vous ne pouvez pas l'effacer sans la phrase de récupération."; @@ -1704,7 +1677,7 @@ "Used" = "Utilisé"; /* No comment provided by engineer. */ -"Used at IP address" = "Utilisé à l'adresse IP"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Nom d'utilisateur déjà pris"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Portefeuille désactivé"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Clés de portefeuille"; - /* No comment provided by engineer. */ "Warning" = "Avertissement"; /* No comment provided by engineer. */ "WARNING" = "AVERTISSEMENT"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "Nous allons vous afficher la clé secrète de votre portefeuille."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "Nous n'avons pas pu créer votre compte CrowdNode."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "Nous n'avons pu faire un retrait depuis votre compte CrowdNode."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "Nous ne stockons pas cette phrase de récupération."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "Nous avons 2 types de vendeurs"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "Vous recevez"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Vous avez reçu des dashs ! Si vous perdez cet appareil, vous perdrez vos fonds. Veuillez noter votre phrase de récupération pour pouvoir restaurer votre portefeuille sur un autre appareil."; - /* Coinbase */ "You send" = "Vous envoyez"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "Vous perdrez tous vos types de transaction reclassifiés manuellement"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "Vous aurez besoin de cette phrase de récupération pour accéder à vos fonds si votre appareil est perdu ou endommagé, ou si Dash Wallet en est désinstallé accidentellement."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "Vous recevrez %@ dashs sur votre Dash Wallet sur cet appareil. Veuillez noter qu'achever un transfert peut demander jusqu'à 2 à 3 minutes."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Votre portefeuille est désormais sécurisé. Vous pouvez utiliser cette phrase de récupération à tout moment pour récupérer votre compte sur un autre appareil."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Adresse copiée ou QR"; diff --git a/DashWallet/id.lproj/Localizable.strings b/DashWallet/id.lproj/Localizable.strings index d349c2be0..10a9148d3 100644 --- a/DashWallet/id.lproj/Localizable.strings +++ b/DashWallet/id.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Tambahkan Kontak Baru"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Tambah Pintasan"; - /* No comment provided by engineer. */ "Address" = "Alamat"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Otomatis sembunyikan saldo"; -/* No comment provided by engineer. */ -"Available balance" = "Saldo tersedia"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Cadangkan Frasa Sandi"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Cadangkan frasa sandi Anda untuk membuat akun CrowdNode"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Frasa pemulihan yang buruk"; /* Send Screen: to address */ "Balance" = "Saldo"; -/* No comment provided by engineer. */ -"Balance hidden" = "Saldo disembunyikan"; - /* CrowdNode */ "Balance: " = "Saldo:"; @@ -245,12 +242,12 @@ buy */ "Buy" = "Beli"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Beli & Jual Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Beli / Jual Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Beli Kartu Hadiah"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "Cara Menggunakan Kartu Hadiah"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "Saya terima"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "Saya telah mencatat"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Jika Anda kehilangan perangkat ini, Anda akan kehilangan dana Anda. Dapatkan UniqueSecretKey Anda sehingga Anda dapat memulihkan dompet di perangkat lain."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "Jika Anda kehilangan frasa sandi untuk dompet ini dan kehilangan perangkat ini atau mencopot Dash Wallet, Anda akan kehilangan akses ke dana Anda di CrowdNode dan dana di dalam dompet ini."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "Sepertinya Anda mencoba mengembalikan dompet Anda menggunakan frasa pemulihan 12 kata, namun Anda hanya memasukkan 11 kata, apakah Anda ingin memulihkan kata yang hilang secara otomatis?"; -/* No comment provided by engineer. */ -"It's Important" = "Ini penting"; - /* No comment provided by engineer. */ "Join Evolution" = "bergabunglah dengan evolusi"; /* No comment provided by engineer. */ -"Keypair %ld" = "Keypair %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Sinkronisasi perangkat terakhir"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Tautkan akun Uphold anda"; -/* No comment provided by engineer. */ -"Load more" = "Muat lebih"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Mata uang lokal"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Peta"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "daftar masternode #%1$d of %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Tipe Pembayaran"; -/* No comment provided by engineer. */ -"Payments" = "Pembayaran"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Silakan periksa koneksi jaringan Anda"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Silakan masukkan PIN untuk meningkatkan dompet"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Tolong catat"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Sebelumnya digunakan di alamat IP"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Kunci pribadi"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Pindai kode QR"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Pindai ini untuk membayar"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Pindai untuk membayar"; - /* No comment provided by engineer. */ "Scan to Send" = "Pindai untuk mengirim"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Memindai kode QR"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Tangkapan layar terdeteksi. Frasa pemulihan baru:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Mencari nama pengguna %@ di jaringan Dash"; -/* No comment provided by engineer. */ -"Secure now" = "Amankan sekarang"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Amankan Dompet Sekarang"; - /* No comment provided by engineer. */ "Security" = "Keamanan"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Kirim %@ dari alamat Dash utama yang saat ini Anda gunakan untuk akun CrowdNode Anda"; -/* Send by (scanning QR code) */ -"Send by" = "Dikirim oleh"; - /* No comment provided by engineer. */ "Send Contact Request" = "Kirim Permintaan Kontak"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Kirim ke"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Kirim ke alamat"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Kirim dengan NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Siapkan Dompet"; -/* No comment provided by engineer. */ -"Share" = "Berbagi"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Berbelanja dengan DASH di lebih dari 150 ribu pedagang"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Menyinkronkan…"; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Ketuk"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Ketuk untuk menyembunyikan saldo"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Ketuk untuk melihat saldo"; - /* No comment provided by engineer. */ "Tax Category" = "Kategori Pajak"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "QR ini sudah berisi permintaan pembayaran untuk %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Frasa pemulihan ini adalah akses Anda ke dana di dompet ini."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Dompet ini tidak kosong atau sinkronisasi belum selesai, Anda tidak dapat menghapusnya tanpa frasa pemulihan"; @@ -1704,7 +1677,7 @@ "Used" = "Digunakan"; /* No comment provided by engineer. */ -"Used at IP address" = "Digunakan di alamat IP"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Nama pengguna telah diambil"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Dompet dinonaktifkan"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Kunci Dompet"; - /* No comment provided by engineer. */ "Warning" = "Peringatan"; /* No comment provided by engineer. */ "WARNING" = "PERINGATAN"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "Kami akan menunjukkan kepada Anda kunci rahasia ke dompet Anda."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "Kami tidak dapat membuat akun CrowdNode Anda."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "Kami tidak dapat menarik dana dari akun CrowdNode Anda."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "Kami tidak menyimpan frasa pemulihan ini."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "Kami memiliki 2 jenis pedagang"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "Anda menerima"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Anda menerima Dash! Jika Anda kehilangan perangkat ini, Anda akan kehilangan dana Anda. Dapatkan Frasa pemulihan Anda sehingga Anda dapat memulihkan dompet di perangkat lain."; - /* Coinbase */ "You send" = "Anda mengirim"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "Anda akan kehilangan semua jenis transaksi yang diklasifikasikan ulang secara manual"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "Anda akan memerlukan frasa pemulihan ini untuk mengakses dana Anda jika perangkat ini hilang, rusak, atau jika Dash Wallet secara tidak sengaja dihapus dari perangkat ini."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "Anda akan menerima %@ Dash di Wallet Anda di perangkat ini. Perlu diketahui bahwa butuh waktu hingga 2-3 menit untuk menyelesaikan transfer."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Dompet Anda aman sekarang. Anda dapat menggunakan frasa pemulihan kapan saja untuk memulihkan akun di perangkat lain."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "copy alamat atau QR"; diff --git a/DashWallet/it.lproj/Localizable.strings b/DashWallet/it.lproj/Localizable.strings index 4001880f0..6423469e5 100644 --- a/DashWallet/it.lproj/Localizable.strings +++ b/DashWallet/it.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Aggiungi un nuovo contatto"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Aggiungi Scorciatoia"; - /* No comment provided by engineer. */ "Address" = "Indirizzo"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Mascheramento Automatico Bilancio "; -/* No comment provided by engineer. */ -"Available balance" = "Bilancio Disponibile"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Passphrase di backup"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Esegui il backup della tua passphrase per creare un account CrowdNode"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Frase di recupero errata"; /* Send Screen: to address */ "Balance" = "Saldo"; -/* No comment provided by engineer. */ -"Balance hidden" = "Bilancio nascosto"; - /* CrowdNode */ "Balance: " = "Bilancio:"; @@ -245,12 +242,12 @@ buy */ "Buy" = "Compra"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Compra & Vendi Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Compra / Vendi Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Acquista una carta regalo "; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "Come utilizzare una carta regalo"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "Accetto"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "L'ho scritto"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Se perdi questo dispositivo, perderai i tuoi fondi. Ottieni la tua frase di recupero in modo da poter ripristinare il tuo portafoglio su un altro dispositivo."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "Se perdi la passphrase per questo portafoglio e perdi questo dispositivo o disinstalli Dash Wallet, perderai l'accesso ai tuoi fondi su CrowdNode e ai fondi all'interno di questo portafoglio."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "Pare che tu stia tentando di rigenerare il tuo portafoglio utilizzando una frase di recupero con 12 parole, tuttavia ne hai inserite solamente 11, vorresti recuperare automaticamente la parole mancante?"; -/* No comment provided by engineer. */ -"It's Important" = "È importante"; - /* No comment provided by engineer. */ "Join Evolution" = "Aderisci a Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Keypair %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Ultima sincronizzazione del dispositivo"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Collega il tuo account Uphold"; -/* No comment provided by engineer. */ -"Load more" = "Carica di più"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Moneta Locale"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Mappa"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "lista masternode #%1$d di %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Tipo di Pagamento"; -/* No comment provided by engineer. */ -"Payments" = "Pagamenti"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Si prega di controllare la connessione di rete"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Inserisci il PIN per aggiornare il portafoglio"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Per favore scrivilo di seguito"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Utilizzato in precedenza all'indirizzo IP"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Chiave privata"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Scansiona il codice QR"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Scansiona questo per Pagare"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Scansiona per pagare"; - /* No comment provided by engineer. */ "Scan to Send" = "Scansiona per inviare"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Scansiona QR Code"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Screenshot rilevato. Nuova frase di recupero:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Ricerca del nome utente %@ nel network di Dash"; -/* No comment provided by engineer. */ -"Secure now" = "Rendilo sicuro ora"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Il Portafoglio ora è sicuro "; - /* No comment provided by engineer. */ "Security" = "Sicurezza"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Invia %@ dal tuo indirizzo Dash principale registrato e validato nel tuo account CrowdNode"; -/* Send by (scanning QR code) */ -"Send by" = "Inviato da"; - /* No comment provided by engineer. */ "Send Contact Request" = "Invia richiesta di contatto"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Manda a"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Invia all'indirizzo"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Invia con NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Imposta il portafoglio"; -/* No comment provided by engineer. */ -"Share" = "Condividi"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Fai acquisti con DASH presso oltre 150.000 commercianti"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Sincronizzazione..."; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Tocca"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Tocca per nascondere il saldo"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Tocca per visualizzare il saldo"; - /* No comment provided by engineer. */ "Tax Category" = "Categoria fiscale"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "Questo QR contiene già la richiesta di pagamento per %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Questa frase di recupero è il tuo accesso ai fondi in questo portafoglio."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Questo portafoglio non è vuoto o la sincronizzazione non è terminata, non puoi cancellarlo senza la frase di recupero"; @@ -1704,7 +1677,7 @@ "Used" = "Usato"; /* No comment provided by engineer. */ -"Used at IP address" = "Utilizzato all'indirizzo IP"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Username già in uso"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Portafoglio disabilitato"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Chiavi Portafoglio"; - /* No comment provided by engineer. */ "Warning" = "Attenzione"; /* No comment provided by engineer. */ "WARNING" = "ATTENZIONE"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "Stiamo per mostrarti la chiave segreta del tuo portafoglio."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "Non siamo riusciti a creare il tuo account CrowdNode."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "Non siamo riusciti a prelevare dal tuo account CrowdNode."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "Noi non memorizziamo la frase di recupero."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "Abbiamo 2 tipi di commercianti"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "Ricevi"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Hai ricevuto Dash! Se perdi questo dispositivo, perderai i tuoi fondi. Ottieni la tua frase di recupero in modo da poter ripristinare il tuo portafoglio su un altro dispositivo."; - /* Coinbase */ "You send" = "Invia"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "Perderai tutti i tipi di transazione riclassificati manualmente"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "Questa frase di recupero sarà necessaria per accedere ai tuoi fondi in caso di smarrimento, danneggiamento del dispositivo o in caso di disinstallazione accidentale del Wallet Dash da questo dispositivo."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "Riceverai %@ Dash sul tuo portafoglio in questo dispositivo. Tieni presente che possono essere necessari fino a 2-3 minuti per completare un trasferimento."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Il tuo wallet ora è protetto. Puoi utilizzare la frase di recupero in qualsiasi momento per ripristinare il tuo account su un altro dispositivo."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "indirizzo o QR copiato"; diff --git a/DashWallet/ja.lproj/Localizable.strings b/DashWallet/ja.lproj/Localizable.strings index e3e0f7779..fec8e7465 100644 --- a/DashWallet/ja.lproj/Localizable.strings +++ b/DashWallet/ja.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "新しい連絡先を追加"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "ショートカットを追加する"; - /* No comment provided by engineer. */ "Address" = "アドレス"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "残高を自動的に非表示にする"; -/* No comment provided by engineer. */ -"Available balance" = "ご利用可能な残高"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "バックアップのパスフレーズ"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "CrowdNodeのアカウントを作成するためのパスフレーズをバックアップします"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "正しくない復元フレーズ"; /* Send Screen: to address */ "Balance" = "残高"; -/* No comment provided by engineer. */ -"Balance hidden" = "非表示にされた残高"; - /* CrowdNode */ "Balance: " = "残高:"; @@ -245,12 +242,12 @@ buy */ "Buy" = "購入"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Dashを売買する"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Dashを買う/売る"; - /* Buy a Gift Card */ "Buy a Gift Card" = "ギフトカードを購入する"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "ギフトカードの使用方法"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "承認しました"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "紙に書き留めました"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "もしこの端末を紛失すると、あなたの資金も失われてしまいます。\n他のデバイスでも自分のウォレットを復元できるように復元フレーズを\n取得してください"; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "このウォレットのパスフレーズを紛失したり、このデバイスをなくしたり、Dash Walletをアンインストールすると、CrowdNode上の資金とこのウォレット内の資金にアクセスできなくなります。"; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "12個の語句からなるリカバリーフレーズを使ってウォレットを復元しようとしているようですが、11個の語句しか入力されていません。不足している語句を自動的に復元しますか。"; -/* No comment provided by engineer. */ -"It's Important" = "それが重要です"; - /* No comment provided by engineer. */ "Join Evolution" = "エボリューションに参加する"; /* No comment provided by engineer. */ -"Keypair %ld" = "キーペア %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "前回のデバイス同期"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "お客様のUpholdアカウントをリンクする"; -/* No comment provided by engineer. */ -"Load more" = "さらにロードする"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "通貨表示"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "マップ"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "%2$dのマスターノードリスト#%1$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "支払い方法"; -/* No comment provided by engineer. */ -"Payments" = "お支払い"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "ネットワーク接続を確認してください"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "ウォレットをアップグレードするためPINを入力してください"; @@ -1173,7 +1167,7 @@ "Please write it down" = "紙に書き留めて下さい"; /* No comment provided by engineer. */ -"Previously used at IP address" = "IPアドレスで以前使われていた"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "プライベートキー"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "QRコードをスキャン"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "これをスキャンして支払う"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "スキャンして支払う"; - /* No comment provided by engineer. */ "Scan to Send" = "スキャンして送金する"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "QRコードをスキャン"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "スクリーンショットは削除されました。新しい復元フレーズ:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Dashネットワークで%@というユーザー名を検索"; -/* No comment provided by engineer. */ -"Secure now" = "すぐに安全な状態にする"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "ウォレットをすぐに安全な状態にする"; - /* No comment provided by engineer. */ "Security" = "セキュリティ"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "現在CrowdNodeアカウントで使用しているメインのDashアドレスから%@を送金します。"; -/* Send by (scanning QR code) */ -"Send by" = "で送金する"; - /* No comment provided by engineer. */ "Send Contact Request" = "連絡先リクエストを送信する"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "に送信する"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "アドレスに送金する"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "NFCで送金する"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "ウォレットをセットアップする"; -/* No comment provided by engineer. */ -"Share" = "共有"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "150,000店以上の加盟店でDASHを使ってお買い物"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "同期中…"; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "タップする"; - /* No comment provided by engineer. */ "Tap to hide balance" = "タップして残高を非表示にする"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "タップして残高を表示する"; - /* No comment provided by engineer. */ "Tax Category" = "税金の区分"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "このQRには、すでに%@の支払い請求が含まれています。"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "この復元フレーズがあれば、このウォレットの中の資金へのアクセスできます"; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "このウォレットは何も入っていないか、もしくは同期が終わっていません。復元フレーズがない場合は削除しないでください。"; @@ -1704,7 +1677,7 @@ "Used" = "使用済み"; /* No comment provided by engineer. */ -"Used at IP address" = "IPアドレスで使用済みです"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "ユーザー名を取得しました"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "ウォレットは機能停止しています"; -/* No comment provided by engineer. */ -"Wallet Keys" = "ウォレットの諸々のキー"; - /* No comment provided by engineer. */ "Warning" = "警告"; /* No comment provided by engineer. */ "WARNING" = "警告"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "これからあなたのウォレットの秘密鍵を表示します"; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "お客様のCrowdNodeアカウントを作成できませんでした。"; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "お客様のCrowdNodeアカウントから出金できませんでした。"; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "この復元フレーズは保存されません"; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "2種類の加盟店があります。"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "入金する"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Dashが入金されました! もしこの端末を紛失すると、あなたの資金も\n失われてしまいます。他のデバイスでも自分のウォレットを復元できる\nように復元フレーズを取得してください"; - /* Coinbase */ "You send" = "送信する"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "手動で再分類した取引をすべて失うことになります。"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "この端末を紛失したり故障した場合やこの端末からDashウォレットを\n誤まってアンインストールしてしまった場合に、あなたの資金にアクセス\nするためには、この復元フレーズが必要となります。"; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "この端末のDashウォレットで%@Dashを受け取ります。送金完了まで最長2-3分かかることがあります。 "; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "現在あなたのウォレットは安全です。復元フレーズを使えばいつでも\n他の端末であなたのアカウントを復元できます。"; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "アドレスまたはQRコードをコピーしました"; diff --git a/DashWallet/ko.lproj/Localizable.strings b/DashWallet/ko.lproj/Localizable.strings index 19213d9b8..7840405c6 100644 --- a/DashWallet/ko.lproj/Localizable.strings +++ b/DashWallet/ko.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "새로운 연락처 추가하기"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "단축키 추가"; - /* No comment provided by engineer. */ "Address" = "주소"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "잔고 자동숨김"; -/* No comment provided by engineer. */ -"Available balance" = "이용 가능한 잔고"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "암호 문구 백업하기"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "크라우드노드 계정을 생성하려면 암호 문구를 백업하세요"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "잘못된 복원 문구"; /* Send Screen: to address */ "Balance" = "잔액"; -/* No comment provided by engineer. */ -"Balance hidden" = "숨긴 잔고"; - /* CrowdNode */ "Balance: " = "잔고:"; @@ -245,12 +242,12 @@ buy */ "Buy" = "구매"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "대시 매수 & 매도"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "대시 매수 / 매도"; - /* Buy a Gift Card */ "Buy a Gift Card" = "기프트 카드 구매"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "기프트 카드 사용 방법"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "수락합니다"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "옮겨 적었습니다"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "이 기기를 분실하시게 되면 당신의 자금 역시 잃게 됩니다. 다른 기기에서 당신의 지갑을 복원할 수 있도록 복구 문구를 설정하세요."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "이 지갑의 암호 문구를 잃어버리고 기기를 잃는 경우 혹은 대시 지갑을 삭제하는 경우에는 크라우드노드의 자금 및 이 지갑 내 자금에 대한 액세스를 잃게 됩니다."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "12 단어로 구성된 복구 문구를 이용하여 지갑을 복구하려고 시도하셨으나, 11 단어만을 입력하셨습니다. 입력되지 않은 단어를 자동으로 복구하시겠습니까?"; -/* No comment provided by engineer. */ -"It's Important" = "중요"; - /* No comment provided by engineer. */ "Join Evolution" = "에볼루션에 합류합니다"; /* No comment provided by engineer. */ -"Keypair %ld" = "키페어 %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "마지막 기기 동기화"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "업홀드 계정 연결 연결하기"; -/* No comment provided by engineer. */ -"Load more" = "더 보기"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "현지 통화"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "지도"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "마스터노드 리스트%2$d 중 #%1$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "지불 유형"; -/* No comment provided by engineer. */ -"Payments" = "지불"; - /* Coinbase/Payment Methods */ "PayPal" = "페이팔"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "네트워크 연결을 확인하세요"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "지갑을 업그레이드하시려면 PIN을 입력하십시오"; @@ -1173,7 +1167,7 @@ "Please write it down" = "적어주세요"; /* No comment provided by engineer. */ -"Previously used at IP address" = "IP 주소에서 이전에 사용됨"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "비밀 키"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "QR 코드 스캔"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "지불을 위해 이를 스캔합니다"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "지불을 위해 스캔합니다"; - /* No comment provided by engineer. */ "Scan to Send" = "전송을 위해 스캔합니다"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "QR 코드를 스캔합니다"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "스크린샷이 삭제되었습니다. 새로운 복원 문구:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "대시 네트워크에서 사용자 이름 %@ 검색 중"; -/* No comment provided by engineer. */ -"Secure now" = "현재 안전합니다"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "현재 지갑이 안전합니다"; - /* No comment provided by engineer. */ "Security" = "보안"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "현재 당신의 크라우드노드 계정에 사용하고 있는 주요 대시 주소에서 %@ 를 송금합니다"; -/* Send by (scanning QR code) */ -"Send by" = "다음에서 전송하였습니다"; - /* No comment provided by engineer. */ "Send Contact Request" = "연락처 요청 전송"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "다음에 전송합니다"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "주소로 전송합니다"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "NFC를 통해 전송합니다"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "지갑 설정하기"; -/* No comment provided by engineer. */ -"Share" = "공유"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "15만개 이상의 상점에서 DASH로 쇼핑하세요"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "동기화중..."; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "탭"; - /* No comment provided by engineer. */ "Tap to hide balance" = "잔고를 숨기시려면 탭하세요"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "잔고를 확인하시려면 탭하세요"; - /* No comment provided by engineer. */ "Tax Category" = "세금 카테고리"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "이 QR은 이미 %@ 에 대한 지불 요청을 포함합니다"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "이 지갑 내에서 자금에 접근하기 위해서는 이 복원 문구가 필요합니다"; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "이 지갑은 비어 있지 않거나 동기화가 완료되지 않았습니다. 복구 문구없이 삭제할 수 없습니다."; @@ -1704,7 +1677,7 @@ "Used" = "사용됨"; /* No comment provided by engineer. */ -"Used at IP address" = "이 IP 주소에서 사용됨"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "이미 사용 중인 사용자 이름"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "지갑 사용 중지됨"; -/* No comment provided by engineer. */ -"Wallet Keys" = "지갑 키"; - /* No comment provided by engineer. */ "Warning" = "경고"; /* No comment provided by engineer. */ "WARNING" = "경고"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "곧 당신의 지갑에 따른 비밀 키를 표시할 예정입니다."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "당신의 크라우드노드 계정을 생성하지 못했습니다."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "당신의 크라우드노드 계정에서 출금하지 못했습니다."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "이 복원 문구를 저장하지 마십시오."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "두 가지 유형의 상점이 있습니다"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "다음을 받습니다"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "당신은 대시를 수령하셨습니다! 이 기기를 분실하시게 되면 당신의 자금 역시 잃게 됩니다. 다른 기기에서 당신의 지갑을 복원할 수 있도록 복구 문구를 설정하세요."; - /* Coinbase */ "You send" = "다음을 보냅니다"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "수동으로 재분류한 모든 거래 유형을 잃게 됩니다"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "이 기기를 분실하거나 기기가 파손되는 경우, 혹은 대시 지갑이 이 기기에서 실수로 삭제되는 경우에는 당신의 자금에 접근하기 위해서 이 복구 문구가 필요합니다."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "이 기기의 대시 지갑에 %@ 대시를 받게 됩니다. 거래를 완료하는 데에는 2-3분 가량 소요될 수 있다는 점에 주의 해주십시오."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "이제 당신의 지갑은 안전합니다. 언제든 당신의 복원 문구를 사용하셔서 당신의 계정을 다른 기기에서 복원하실 수 있습니다."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "복사된 주소 혹은 QR"; diff --git a/DashWallet/nl.lproj/Localizable.strings b/DashWallet/nl.lproj/Localizable.strings index e58da4d28..fb6631bc1 100644 --- a/DashWallet/nl.lproj/Localizable.strings +++ b/DashWallet/nl.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Voeg een nieuw contact toe"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Voeg snelkoppeling toe"; - /* No comment provided by engineer. */ "Address" = "Adres"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Automatisch saldo verbergen"; -/* No comment provided by engineer. */ -"Available balance" = "Beschikbaar saldo"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Back-up wachtwoordzin"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Maak een back-up van je wachtwoordzin om een CrowdNode account aan te maken"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Incorrecte herstelzin"; /* Send Screen: to address */ "Balance" = "Saldo"; -/* No comment provided by engineer. */ -"Balance hidden" = "Saldo verborgen"; - /* CrowdNode */ "Balance: " = "Saldo:"; @@ -245,12 +242,12 @@ buy */ "Buy" = "Koop"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Koop & verkoop Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Koop / verkoop Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Koop een geschenkbon"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "Hoe een geschenkbon te gebruiken"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "Ik accepteer"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "ik heb het opgeschreven"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Als u dit apparaat verliest, verliest je jouw Dash. Download de herstelzin zodat je jouw portemonnee op een ander apparaat kunt herstellen."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "Als je de wachtwoordzin voor deze portemonnee verliest, dit apparaat verliest of de Dash portemonnee app verwijdert, verliest je de toegang tot je geld op CrowdNode en ook het geld in deze portemonnee."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "Het ziet er naar uit dat je probeert een portemonnee te herstellen met een herstelzin van 12 woorden, maar je hebt maar 11 woorden ingevoerd, wil je automatisch de ontbrekende woorden herstellen?"; -/* No comment provided by engineer. */ -"It's Important" = "Het is belangrijk"; - /* No comment provided by engineer. */ "Join Evolution" = "Sluit je aan bij Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Sleutelpaar %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Laatste apparaatsynchronisatie"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Koppel Uphold account"; -/* No comment provided by engineer. */ -"Load more" = "Laad meer"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Lokale munteenheid"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Kaart"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "lijst masternodes #%1$d of %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Betalingswijze"; -/* No comment provided by engineer. */ -"Payments" = "Betalingen"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Controleer de netwerkverbinding"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Voer a.u.b. PIN in om de portemonnee bij te werken"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Schrijf het a.u.b. op"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Eerder gebruikt op IP-adres"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "persoonlijke sleutel"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Scan QR Code"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Scan dit om te betalen"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Scan om te verzenden"; - /* No comment provided by engineer. */ "Scan to Send" = "Scan om te verzenden"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "QR Code scannen"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Schermafbeelding gedetecteerd. Nieuwe herstelzin:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Zoeken naar gebruikersnaam %@op het Dash netwerk"; -/* No comment provided by engineer. */ -"Secure now" = "Beveilig nu"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Beveilig portemonnee nu"; - /* No comment provided by engineer. */ "Security" = "Beveiliging"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Stuur %@ vanaf het primaire Dash adres dat je momenteel gebruikt voor je CrowdNode account"; -/* Send by (scanning QR code) */ -"Send by" = "Verstuurd door"; - /* No comment provided by engineer. */ "Send Contact Request" = "Contactverzoek verzenden"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Verstuur naar"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Versturen naar adres"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Versturen met NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Portemonnee instellen"; -/* No comment provided by engineer. */ -"Share" = "Delen"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Winkel met DASH bij meer dan 150k acceptanten"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Synchroniseren..."; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Tik"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Tik om saldo te verbergen"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Tik om saldo te zien"; - /* No comment provided by engineer. */ "Tax Category" = "Belastingcategorie"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "Deze QR bevat al het betalingsverzoek voor %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Deze herstelzin is uw toegang tot het saldo in deze portemonnee."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Deze portemonnee is niet leeg of sync is nog niet klaar, je mag het niet wissen zonder de herstelzin."; @@ -1704,7 +1677,7 @@ "Used" = "Gebruikt"; /* No comment provided by engineer. */ -"Used at IP address" = "Gebruikt op IP-adres"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Gebruikersnaam al in gebruik"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Portemonnee is uitgeschakeld"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Portemonnee sleutels"; - /* No comment provided by engineer. */ "Warning" = "Waarschuwing"; /* No comment provided by engineer. */ "WARNING" = "WAARSCHUWING"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "We gaan u de geheime sleutel van uw portemonnee laten zien."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "We kunnen je CrowdNode account niet aanmaken."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "We konden niet opnemen uit je CrowdNode account."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "We slaan deze herstelzin niet op."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "We hebben 2 typen acceptanten"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "Je ontvangt"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Je hebt Dash ontvangen! Als u dit apparaat verliest, verliest u uw Dash. Download de herstelzin zodat u uw portemonnee op een ander apparaat kunt herstellen."; - /* Coinbase */ "You send" = "je verstuurt"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "Je verliest alle handmatig geclassificeerde transactiesoorten"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "U hebt deze herstelzin nodig om toegang te krijgen tot uw saldo als dit apparaat is verloren of beschadigd, of als Dash Wallet ooit per ongeluk van dit apparaat wordt verwijderd."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "Je ontvangt %@ Dash in je Dash portemonnee op dit apparaat. Houd er rekening mee dat het tot 2-3 minuten kan duren om een overdracht te voltooien."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Uw portemonnee is nu beveiligd. U kunt uw herstelzin op elk gewenst moment gebruiken om uw account op een ander apparaat te herstellen."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Adres is naar QR gekopieerd"; diff --git a/DashWallet/pl.lproj/Localizable.strings b/DashWallet/pl.lproj/Localizable.strings index 5dadbec40..16b168be7 100644 --- a/DashWallet/pl.lproj/Localizable.strings +++ b/DashWallet/pl.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Dodaj Nowy Kontakt"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Dodaj skrót"; - /* No comment provided by engineer. */ "Address" = "Adres"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Automatyczne Ukrywanie Salda"; -/* No comment provided by engineer. */ -"Available balance" = "Dostępne saldo"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Stwórz kopię zapasową hasła"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Stwórz kopię zapsową hasła aby utworzyć konto na CrowdNode"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Złe hasło odzyskiwania"; /* Send Screen: to address */ "Balance" = "Saldo"; -/* No comment provided by engineer. */ -"Balance hidden" = "Saldo ukryte"; - /* CrowdNode */ "Balance: " = "Saldo:"; @@ -245,12 +242,12 @@ buy */ "Buy" = "Kup"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Kupuj i Sprzedawaj Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Kupuj / Sprzedawaj Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Kup Kartę Podarunkową"; @@ -539,7 +536,7 @@ "Easily shop with your DASH at over 155,000 locations and online merchants" = "Rób zakupy z łatwością w ponad 155 000 sklepach i stronach internetowych."; /* No comment provided by engineer. */ -"Easily stake Dash and earn passive income with a few simple clicks." = "Z łatwością ulokuj swoje monety Dash i zarabiaj pasywny dochód za pomocą kilku prostych kliknięć myszką. "; +"Easily stake Dash and earn passive income with a few simple clicks." = "Z łatwością ulokuj swoje monety Dash i zarabiaj pasywny dochód za pomocą kilku prostych kliknięć. "; /* Input username textfield placeholder */ "eg: johndoe" = "np. jankowalski"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "Jak Używać Kart Podarunkowych"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "Akceptuję"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "Zapisałem to"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Jeśli zgubisz to urządzenie, stracisz swoje fundusze. Zapisz słowa odzyskiwania, aby móc przywrócić portfel na innym urządzeniu."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "Jeśli stracisz hasło do tego portfela oraz stracisz dostęp do tego urządzenia lub odinstalujesz Portfel Dash, stracisz również dostęp do konta CrowdNode oraz przechowywanych tam funduszy."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "Wygląda na to, że próbujesz przywrócić swój portfel za pomocą 12-wyrazowej frazy odzyskiwania, jednak wprowadziłeś tylko 11 słów, czy chcesz automatycznie odzyskać brakujące słowa? "; -/* No comment provided by engineer. */ -"It's Important" = "To Ważne"; - /* No comment provided by engineer. */ "Join Evolution" = "Dołącz do Ewolucji"; /* No comment provided by engineer. */ -"Keypair %ld" = "Para Kluczy %Id"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Ostatnia synchronizacja urządzenia"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Połącz z kontem Uphold"; -/* No comment provided by engineer. */ -"Load more" = "Załaduj więcej"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Lokalna Waluta"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Mapa"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "lista masternodów #%1$d z %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Typ płatności"; -/* No comment provided by engineer. */ -"Payments" = "Płatności"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Sprawdź połączenie z siecią"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Proszę podaj PIN aby aktualizować portfel"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Proszę to zapisać"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Wcześniej użyty IP address"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Klucz prywatny"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Zeskanuj Kod QR"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Zeskanuj to by Zapłacić"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Zeskanuj by Zapłacić"; - /* No comment provided by engineer. */ "Scan to Send" = "Skanuj by Wysłać"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Zeskanuj QR Kod"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Wykryto Zrzut Ekranu. Nowe Frazy Odzyskiwania:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Szukanie użytkownika o nazwie %@ na Sieci Dash"; -/* No comment provided by engineer. */ -"Secure now" = "Zabezpiecz Teraz"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Zabezpiecz Portfel Teraz"; - /* No comment provided by engineer. */ "Security" = "Bezpieczeństwo"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Wyślij %@ Dash z głównego adresu Dash, który jest obecnie połączony z twoim kontem CrowdNode"; -/* Send by (scanning QR code) */ -"Send by" = "Wyślij przez"; - /* No comment provided by engineer. */ "Send Contact Request" = "Wyślij zaproszenie do kontaktów"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Wyślij do"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Zapłać na Adres"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Wyślij z NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Ustaw Portfel"; -/* No comment provided by engineer. */ -"Share" = "Udostępnij"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Rób zakupy z Dash u ponad 150k handlowców"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Synchronizowanie..."; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Stuknij"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Stuknij by ukryć saldo"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Stuknij by odkryć saldo"; - /* No comment provided by engineer. */ "Tax Category" = "Kategoria Podatkowa"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "Ten QR już zawiera żądanie płatności %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Ta fraza odzyskiwania jest Twoim dostępem do środków w tym portfelu."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Portfel ten dalej ma fundusze lub synchronizacja nie jeszcze nie została ukończona. Nie możesz wymazać tego portfela bez listy słów wymaganych do odzysku portfela."; @@ -1704,7 +1677,7 @@ "Used" = "Użyty"; /* No comment provided by engineer. */ -"Used at IP address" = "Użyty w adresie IP"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Nazwa użytkownika jest już zajęta"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Portfel zdezaktywowany"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Klucze portfela"; - /* No comment provided by engineer. */ "Warning" = "Ostrzeżenie"; /* No comment provided by engineer. */ "WARNING" = "UWAGA"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "Za chwilę pokażemy Ci tajny klucz do twojego portfela."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "Nie mogliśmy stworzyć Twojego konta CrowdNode."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "Nie mogliśmy wypłacić środków z Twojego konta CrowdNode."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "Nie przechowujemy tej frazy odzyskiwania."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "Mamy 2 rodzaje sprzedawców"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "Otrzymujesz"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Otrzymałeś Dash! Jeśli zgubisz to urządzenie, stracisz swoje fundusze. Uzyskaj frazę odzyskiwania, aby móc przywrócić portfel na innym urządzeniu."; - /* Coinbase */ "You send" = "Wysyłasz"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "Stracisz wszystkie ręcznie reklasyfikowane typy transakcji"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "Fraza odzysku danych będzie potrzebna aby mieć dostęp do funduszy w wypadku utraty tego urządzenia lub jeśli Dash Wallet zostanie przypadkowo odinstalowany. "; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "Otrzymasz %@ do portfela Dash na tym urządzeniu. Transfer może zająć 2-3 minuty. "; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Twój portfel jest teraz zabezpieczony. Możesz użyć swojej frazy odzyskiwania w dowolnym momencie, aby odzyskać konto na innym urządzeniu."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Skopiowano adres lub QR kod"; diff --git a/DashWallet/pt.lproj/Localizable.strings b/DashWallet/pt.lproj/Localizable.strings index 2ddb3b3bc..0c796deaa 100644 --- a/DashWallet/pt.lproj/Localizable.strings +++ b/DashWallet/pt.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Adicione um Novo Contato"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Adicionar atalho"; - /* No comment provided by engineer. */ "Address" = "Endereço"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Auto-esconder Saldo"; -/* No comment provided by engineer. */ -"Available balance" = "Saldo disponível"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Backup da frase de recuperação"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Faça backup da sua frase de recuperação para criar uma conta CrowdNode"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Frase de recuperação incorreta"; /* Send Screen: to address */ "Balance" = "Saldo"; -/* No comment provided by engineer. */ -"Balance hidden" = "Saldo escondido"; - /* CrowdNode */ "Balance: " = "Saldo:"; @@ -245,12 +242,12 @@ buy */ "Buy" = "Comprar"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Comprar & Vender Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Comprar / Vender Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Comprar um Cartão Presente"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "Como Usar um Cartão Presente"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "Eu Aceito"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "Eu anotei"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Se você perder este dispositivo, perderá seus fundos. Obtenha a sua frase de recuperação para que você possa restaurar sua carteira em outro dispositivo."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "Se você perder sua frase de recuperação para esta carteira, perder este dispositivo ou desinstalar a Carteira Dash, você perderá o acesso aos seus fundos no CrowdNode e aos fundos desta carteira."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "Parece que você está tentando restaurar sua carteira usando uma frase de recuperação de 12 palavras, no entanto, você inseriu apenas 11 palavras, você gostaria de recuperar automaticamente as palavras que faltam?"; -/* No comment provided by engineer. */ -"It's Important" = "É Importante"; - /* No comment provided by engineer. */ "Join Evolution" = "Junte-se ao Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Par de chaves %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Última sincronização do dispositivo"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Conecte sua conta Uphold"; -/* No comment provided by engineer. */ -"Load more" = "Carregar mais"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Moeda Local"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Mapa"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "lista de masternode #%1$d de %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Tipo de Pagamento"; -/* No comment provided by engineer. */ -"Payments" = "Pagamentos"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Por favor, verifique sua conexão de rede"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Por favor, insira seu PIN para atualizar a carteira"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Por favor, anote"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Anteriormente usada no endereço de IP"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Chave privada"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Scanear Código QR"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Scanear isso para Pagar"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Escanear para Pagar"; - /* No comment provided by engineer. */ "Scan to Send" = "Scanear para Enviar"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Scaneando código QR"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Screenshot detectado. Nova frase de recuperação:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Pesquisar pelo usuário %@ na Rede Dash"; -/* No comment provided by engineer. */ -"Secure now" = "Proteger agora"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Proteger Carteira Agora"; - /* No comment provided by engineer. */ "Security" = "Segurança"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Envie %@ do seu endereço primário Dash utilizado atualmente para sua conta CrowdNode"; -/* Send by (scanning QR code) */ -"Send by" = "Enviar por"; - /* No comment provided by engineer. */ "Send Contact Request" = "Enviar Solicitação de Contato"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Enviar para"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Enviar para Endereço"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Enviar com NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Configurar Carteira"; -/* No comment provided by engineer. */ -"Share" = "Compartilhar"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Compre com DASH em mais de 150 mil comércios"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Sincronizando..."; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Tocar"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Toque para esconder o saldo"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Toque para mostrar o saldo"; - /* No comment provided by engineer. */ "Tax Category" = "Categoria fiscal"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "Este QR já contém a solicitação de pagamento de %@ Dash"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Esta frase de recuperação é o seu acesso aos fundos desta carteira."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Essa carteira não está vazia ou a sincronização ainda não terminou, você não deve limpá-la sem a frase de recuperação"; @@ -1704,7 +1677,7 @@ "Used" = "Utilizado"; /* No comment provided by engineer. */ -"Used at IP address" = "Utilizado no endereço de IP"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Nome de usuário já foi registrado"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Carteira desabilitada"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Chaves da Carteira"; - /* No comment provided by engineer. */ "Warning" = "Advertência"; /* No comment provided by engineer. */ "WARNING" = "AVISO"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "Estamos prestes a te mostrar a chave secreta para a sua carteira."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "Não foi possível criar sua conta CrowdNode."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "Não foi possível realizar um saque da sua conta CrowdNode."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "Nós não guardamos esta frase de recuperação."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "Temos 2 tipos de comércios"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "Você recebe"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Você recebeu Dash! Caso perca este dispositivo, você perderá seus fundos. Obtenha a sua frase de recuperação para que você possa recuperar a sua carteira em outro dispositivo."; - /* Coinbase */ "You send" = "Você envia"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "Você perderá todos os tipos de transações reclassificadas manualmente"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "Você precisará de esta frase de recuperação para acessar os seus fundos se este dispositivo se perca, danifique ou se Dash Wallet seja desinstalada acidentalmente de este dispositivo."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "Você receberá %@ Dash em sua Carteira Dash neste dispositivo. Por favor, observe que pode levar de 2 a 3 minutos para completar a transferência. "; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = " Sua carteira está segura agora. Você pode usar sua frase de recuperação em qualquer momento para recuperar sua conta em outro dispositivo."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Endereço ou QR copiado"; diff --git a/DashWallet/ru.lproj/Localizable.strings b/DashWallet/ru.lproj/Localizable.strings index 861777772..b0390ef7e 100644 --- a/DashWallet/ru.lproj/Localizable.strings +++ b/DashWallet/ru.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Добавить новый контакт"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Добавить"; - /* No comment provided by engineer. */ "Address" = "Адрес"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Авто-скрытие баланса"; -/* No comment provided by engineer. */ -"Available balance" = "Доступный баланс"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Сохранить"; /* No comment provided by engineer. */ "Backup Passphrase" = "Создать резервную копию кодовой фразы"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Чтобы создать аккаунт CrowdNode, сделайте резервную копию кодовой фразы"; +/* Back up wallet */ +"Backup your recovery phrase" = "Сохранить фразу восстановления"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Некорректная фраза восстановления"; /* Send Screen: to address */ "Balance" = "Баланс"; -/* No comment provided by engineer. */ -"Balance hidden" = "Баланс скрыт"; - /* CrowdNode */ "Balance: " = "Баланс:"; @@ -245,12 +242,12 @@ buy */ "Buy" = "Купить"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Купить и Продать"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Купить и продать"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Купить / Продать"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Купить подарочную карту"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "Как использовать подарочную карту"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Ключи оператора"; + /* No comment provided by engineer. */ "I Accept" = "Принимаю"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "Я записал"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Если Вы потеряете это устройство, то Вы потеряете доступ к вашим средствам. Сохраните Вашу фразу восстановления, чтобы иметь возможность восстановить кошелек на другом устройстве."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "В случае, если вы потеряете кодовую фразу от этого кошелька, потеряете устройство или удалите Dash Wallet, вы потеряете доступ к средствам на CrowdNode и средствам внутри этого кошелька."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "Кажется, вы пытаетесь восстановить свой кошелёк с помощью фразы восстановления из 12 слов. Однако, вы ввели только 11 слов. Хотите автоматически восстановить пропущенное слово? "; -/* No comment provided by engineer. */ -"It's Important" = "Это важно"; - /* No comment provided by engineer. */ "Join Evolution" = "Присоединиться к Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Ключи %ld"; +"Keypair" = "Пара ключей"; /* Explore Dash */ "Last device sync" = "Синхронизация с последним устройством"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Привяжите ваш аккаунт Uphold"; -/* No comment provided by engineer. */ -"Load more" = "Загрузить ещё"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Валюта"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Карта"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode ключи"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "список мастернод #%1$d из %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Способ оплаты"; -/* No comment provided by engineer. */ -"Payments" = "Платежи"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Пожалуйста, проверьте ваше подключение к сети"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Пожалуйста, скопируйте адрес DASH и попробуйте ещё раз"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Пожалуйста, введите PIN для обновления кошелька"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Пожалуйста, запишите её"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Ранее использовалось с IP адресом"; +"Previously used at: " = "Ранее использовалось с:"; /* No comment provided by engineer. */ "Private key" = "Приватный ключ"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Сканировать QR-код"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Сканировать QR-код"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Отсканируйте для оплаты"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Оплатить по QR-коду"; - /* No comment provided by engineer. */ "Scan to Send" = "Сканировать"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "QR-коду"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Произошел снимок экрана. НОВАЯ фраза восстановления:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Поиск имени пользователя %@ в сети Dash"; -/* No comment provided by engineer. */ -"Secure now" = "Сохранить кошелек"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Сохраните кошелек"; - /* No comment provided by engineer. */ "Security" = "Безопасность"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Отправьте %@ Dash с основного Dash адреса, который вы сейчас используете с аккаунтом CrowdNode"; -/* Send by (scanning QR code) */ -"Send by" = "Оплатить по"; - /* No comment provided by engineer. */ "Send Contact Request" = "Отправить запрос на добавление в контакты"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Отправить"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Отправить на адрес"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Отправить на скопированный адрес или QR код"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Отправить через NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Настроить кошелек"; -/* No comment provided by engineer. */ -"Share" = "Поделиться"; +/* Receive screen */ +"Share address" = "Поделиться адресом"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Покупайте за DASH в более чем 150 000 магазинах"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Синхронизация..."; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Вкл."; - /* No comment provided by engineer. */ "Tap to hide balance" = "Нажмите, чтобы скрыть баланс"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Нажмите, чтобы показать баланс"; - /* No comment provided by engineer. */ "Tax Category" = "Категория"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "Этот QR уже содержит запрос на оплату в размере %@Dash"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Эта фраза восстановления - Ваш доступ к средствам на этом кошельке."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "В кошельке есть средства или синхронизация не была завершена. Вы не сможете удалить его без фразы восстановления."; @@ -1704,7 +1677,7 @@ "Used" = "Использовано"; /* No comment provided by engineer. */ -"Used at IP address" = "Использовано с IP адресом"; +"Used at: " = "Использовалось с:"; /* No comment provided by engineer. */ "Username taken" = "Имя пользователя уже занято"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Кошелёк отключён"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Ключи кошелька"; - /* No comment provided by engineer. */ "Warning" = "Предупреждение"; /* No comment provided by engineer. */ "WARNING" = "ВНИМАНИЕ"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "Сейчас мы покажем секретный ключ к Вашему кошельку."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "Мы не смогли создать вам аккаунт на CrowdNode."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "Мы не смогли вывести средства с вашего аккаунта на CrowdNode."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "Мы не храним эту фразу восстановления."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "У нас есть 2 типа продавцов"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "Вы получите"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Вы получили Dash! Если Вы потеряете это устройство, то Вы потеряете доступ к Вашим средствам. Сохраните Вашу фразу восстановления, чтобы иметь возможность восстановить кошелек на другом устройстве."; - /* Coinbase */ "You send" = "Вы отправляете"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "Все введённые вручную типы транзакций потеряются"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "Вам понадобится эта фраза восстановления для доступа к Вашим средствам, если это устройство будет утеряно, повреждено или приложение Dash Wallet будет случайно удалено."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "Вам понадобится эта фраза восстановления для доступа к Вашим средствам, если это устройство будет утеряно, повреждено или приложение Dash Wallet будет случайно удалено."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "Вы получите %@Dash на Dash Wallet на этом устройстве. Пожалуйста, обратите внимание, что перевод займёт 2-3 минуты."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Ваш кошелёк защищён. Вы можете использовать фразу восстановления в любое время, чтобы получить доступ к Вашему кошельку на другом устройстве."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Скопированный адрес или QR"; diff --git a/DashWallet/sk.lproj/Localizable.strings b/DashWallet/sk.lproj/Localizable.strings index c7443d554..e6672fcff 100644 --- a/DashWallet/sk.lproj/Localizable.strings +++ b/DashWallet/sk.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Pridať nový kontakt"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Pridať odkaz"; - /* No comment provided by engineer. */ "Address" = "Adresa"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Automaticky skryť zostatok"; -/* No comment provided by engineer. */ -"Available balance" = "Dostupný zostatok"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Zálohovať prístupovú frázu"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Zálohujte si svoju prístupovú frázu a vytvorte si účet CrowdNode"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Zlá fráza pre obnovenie"; /* Send Screen: to address */ "Balance" = "Zostatok"; -/* No comment provided by engineer. */ -"Balance hidden" = "Zostatok skrytý"; - /* CrowdNode */ "Balance: " = "Zostatok: "; @@ -245,12 +242,12 @@ buy */ "Buy" = "Kúpiť"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Kúpiť a predať Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Kúpiť/Predať Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Kúpiť darčekovú kartu"; @@ -578,7 +575,7 @@ "Error Upgrading" = "Chyba pri inovácii"; /* No comment provided by engineer. */ -"Exit" = "Ukončiť"; +"Exit" = "Zatvoriť"; /* No comment provided by engineer. */ "Expense" = "Výdavok"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "Ako používať darčekovú poukážku"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "Súhlasím"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "Zapísal som si ju"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Ak toto zariadenie stratíte, stratíte vaše prostriedky. Získajte frázu pre obnovenie, aby ste mohli peňaženku obnoviť na inom zariadení."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "Ak stratíte prístupovú frázu pre túto peňaženku a stratíte toto zariadenie alebo odinštalujete Dash peňaženku, stratíte prístup k svojim finančným prostriedkom v CrowdNode a k prostriedkom v tejto peňaženke."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "Zdá sa, že sa pokúšate obnoviť svoju peňaženku pomocou 12-slovnej frázy na obnovenie, avšak zadali ste iba 11 slov. Chcete automaticky obnoviť chýbajúce slovo?"; -/* No comment provided by engineer. */ -"It's Important" = "Je to dôležité"; - /* No comment provided by engineer. */ "Join Evolution" = "Pridajte sa k evolúcii"; /* No comment provided by engineer. */ -"Keypair %ld" = "Pár kľúčov %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Posledná synchronizácia zariadenia"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Pripojiť váš Uphold účet"; -/* No comment provided by engineer. */ -"Load more" = "Načítať viac"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Miestna mena"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Mapa"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "zoznam mastenódov: %1$d z %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Typ platby"; -/* No comment provided by engineer. */ -"Payments" = "Platby"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Skontrolujte svoje sieťové pripojenie"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Pre inováciu peňaženky zadajte PIN"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Prosím, zapíšte si ju"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Predtým použité na IP adrese"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Privátny kľúč"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Skenovať QR kód"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Skenovať toto pre platbu"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Skenovať a platiť"; - /* No comment provided by engineer. */ "Scan to Send" = "Skenovať a poslať"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Skenovaním QR kódu"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Snímka obrazovky detekovaná. Nová fráza pre obnovenie účtu:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Hľadá sa používateľské meno %@ v sieti Dash"; -/* No comment provided by engineer. */ -"Secure now" = "Teraz zabezbečiť"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Zabezpečiť peňaženku teraz"; - /* No comment provided by engineer. */ "Security" = "Bezpečnosť"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Pošlite %@ zo svojej primárnej Dash adresy, ktorú momentálne používate pre svoj účet CrowdNode"; -/* Send by (scanning QR code) */ -"Send by" = "Poslať"; - /* No comment provided by engineer. */ "Send Contact Request" = "Poslať žiadosť o kontakt"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Poslať ku"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Poslať na adresu"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Poslať s NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Nastaviť peňaženku"; -/* No comment provided by engineer. */ -"Share" = "Zdieľať"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Nakupujte s DASH u viac ako 150 tisíc obchodníkov"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Synchronizácia..."; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Klepnúť"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Klepnutím skryť zostatok"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Klepnutím odkryť zostatok"; - /* No comment provided by engineer. */ "Tax Category" = "Daňová kategória"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "Tento QR kód už obsahuje žiadosť k platbe pre %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Táto fráza pre obnovenie predstavuje váš prístup k finančným prostriedkom v tejto peňaženke."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Táto peňaženka nie je prázdna, alebo synchronizácia nie je dokončená. Nemali by ste ju vymazať bez frázy na obnovenie"; @@ -1704,7 +1677,7 @@ "Used" = "Použité"; /* No comment provided by engineer. */ -"Used at IP address" = "Použité na IP adrese"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Používateľské meno sa už používa"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Peňaženka neaktívna"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Kľúče peňaženky"; - /* No comment provided by engineer. */ "Warning" = "Upozornenie"; /* No comment provided by engineer. */ "WARNING" = "UPOZORNENIE"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "Chystáme sa vám ukázať tajný kľúč k vašej peňaženke."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "Nepodarilo sa nám vytvoriť váš CrowdNode účet."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "Nepodarilo sa nám vybrať z vášho CrowdNode účtu."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "Túto frázu pre obnovenie neuchovávame."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "Máme dva typy obchodníkov"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "Dostanete"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Obdržali ste Dash. Ak toto zariadenie stratíte, stratíte vaše prostriedky. Získajte frázu pre obnovenie, aby ste mohli peňaženku obnoviť na inom zariadení."; - /* Coinbase */ "You send" = "Pošlete"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "Stratíte všetky svoje manuálne preklasifikované typy transakcií"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "Túto frázu pre obnovenie budete potrebovať na prístup k vašim finančným prostriedkom, ak dôjde k strate či poškodeniu tohto zariadenia, alebo k náhodnému odinštalovaniu Dash Wallet z tohoto zariadenia."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "Na tomto zariadení dostanete %@ Dash do svojej Dash peňaženky . Upozorňujeme, že dokončenie prevodu môže trvať 2 až 3 minúty."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Vaša peňaženka je zabezpečená. Frázu pre obnovenie môžete kedykoľvek použiť na obnovenie svojho účtu na inom zariadení."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Skopírovaná adresa alebo QR"; diff --git a/DashWallet/sq.lproj/Localizable.strings b/DashWallet/sq.lproj/Localizable.strings index 2deee80e7..e566a87d5 100644 --- a/DashWallet/sq.lproj/Localizable.strings +++ b/DashWallet/sq.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Add a New Contact"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Add Shortcut"; - /* No comment provided by engineer. */ "Address" = "Adresa"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Autohide Balance"; -/* No comment provided by engineer. */ -"Available balance" = "Available balance"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Backup Passphrase"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Backup your passphrase to create a CrowdNode account"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Bad recovery phrase"; /* Send Screen: to address */ "Balance" = "Balanca"; -/* No comment provided by engineer. */ -"Balance hidden" = "Balance hidden"; - /* CrowdNode */ "Balance: " = "Balance: "; @@ -245,12 +242,12 @@ buy */ "Buy" = "Buy"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Buy / Sell Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "How to Use a Gift Card"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "I Accept"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "I wrote it down"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?"; -/* No comment provided by engineer. */ -"It's Important" = "It's Important"; - /* No comment provided by engineer. */ "Join Evolution" = "Join Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Keypair %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Last device sync"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Link your Uphold account"; -/* No comment provided by engineer. */ -"Load more" = "Load more"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Local Currency"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Map"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "masternode list #%1$d of %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Payment Type"; -/* No comment provided by engineer. */ -"Payments" = "Payments"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Please check your network connection"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Please enter PIN to upgrade wallet"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Please write it down"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Previously used at IP address"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Private key"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "skano QR kodin"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Scan this to Pay"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Scan to Pay"; - /* No comment provided by engineer. */ "Scan to Send" = "Scan to Send"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Scanning QR code"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Screenshot detected. New recovery phrase:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Searching for username %@ on the Dash Network"; -/* No comment provided by engineer. */ -"Secure now" = "Secure now"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Secure Wallet Now"; - /* No comment provided by engineer. */ "Security" = "Security"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Send %@ from your primary Dash address that you currently use for your CrowdNode account"; -/* Send by (scanning QR code) */ -"Send by" = "Send by"; - /* No comment provided by engineer. */ "Send Contact Request" = "Send Contact Request"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Send to"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Send to Address"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Send with NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Setup Wallet"; -/* No comment provided by engineer. */ -"Share" = "Shpërndaje"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Shop with DASH at over 150k merchants"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Syncing…"; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Tap"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Tap to hide balance"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Tap to unhide balance"; - /* No comment provided by engineer. */ "Tax Category" = "Tax Category"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "This QR already contains the payment request for %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "This recovery phrase is your access to the funds in this wallet."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase"; @@ -1704,7 +1677,7 @@ "Used" = "Used"; /* No comment provided by engineer. */ -"Used at IP address" = "Used at IP address"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Username taken"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Wallet disabled"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Wallet Keys"; - /* No comment provided by engineer. */ "Warning" = "Warning"; /* No comment provided by engineer. */ "WARNING" = "PARALAJMËRIM"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "We are about to show you the secret key to your wallet."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "We couldn’t create your CrowdNode account."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "We couldn’t withdraw from your CrowdNode account."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "We do not store this recovery phrase."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "We have 2 types of merchants"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "You receive"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device."; - /* Coinbase */ "You send" = "You send"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "You will lose all your manually reclassified transactions types"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Сopied address or QR"; diff --git a/DashWallet/sv.lproj/Localizable.strings b/DashWallet/sv.lproj/Localizable.strings index 771f25780..bb5c9f670 100644 --- a/DashWallet/sv.lproj/Localizable.strings +++ b/DashWallet/sv.lproj/Localizable.strings @@ -110,7 +110,7 @@ "Activity" = "Activity"; /* No comment provided by engineer. */ -"Add" = "Add"; +"Add" = "Lägg till"; /* Add as your contact... */ "Add %@ as your contact to Pay Directly to Username and Retain Mutual Transaction History" = "Add %@ as your contact to Pay Directly to Username and Retain Mutual Transaction History"; @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Add a New Contact"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Lägg till genväg"; - /* No comment provided by engineer. */ "Address" = "Adress"; @@ -182,7 +179,7 @@ "Are you sure?" = "Är du säker?"; /* No comment provided by engineer. */ -"ATM search works better with Location Services turned on." = "ATM search works better with Location Services turned on."; +"ATM search works better with Location Services turned on." = "ATM search works better with Location Services turned on"; /* No comment provided by engineer. */ "ATMs" = "ATMs"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Autodölj Belopp"; -/* No comment provided by engineer. */ -"Available balance" = "Tillgängligt belopp"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Backup Passphrase"; @@ -211,14 +208,14 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Backup your passphrase to create a CrowdNode account"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Bad recovery phrase"; /* Send Screen: to address */ -"Balance" = "Balance"; - -/* No comment provided by engineer. */ -"Balance hidden" = "Belopp dolt"; +"Balance" = "Saldo"; /* CrowdNode */ "Balance: " = "Balance: "; @@ -245,12 +242,12 @@ buy */ "Buy" = "Buy"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Köp & Sälj Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Köp / Sälj Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "How to Use a Gift Card"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "I Accept"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "Jag har skrivit ned den"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?"; -/* No comment provided by engineer. */ -"It's Important" = "It's Important"; - /* No comment provided by engineer. */ "Join Evolution" = "Join Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Keypair %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Last device sync"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Link your Uphold account"; -/* No comment provided by engineer. */ -"Load more" = "Load more"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Local Currency"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Map"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "masternode list #%1$d of %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Payment Type"; -/* No comment provided by engineer. */ -"Payments" = "Betalningar"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Please check your network connection"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Please enter PIN to upgrade wallet"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Please write it down"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Previously used at IP address"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Private key"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "läs av QR-kod"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Scan this to Pay"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Scan to Pay"; - /* No comment provided by engineer. */ "Scan to Send" = "Scan to Send"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Skannar QR kod"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Screenshot detected. New recovery phrase:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Searching for username %@ on the Dash Network"; -/* No comment provided by engineer. */ -"Secure now" = "Secure now"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Secure Wallet Now"; - /* No comment provided by engineer. */ "Security" = "Security"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Send %@ from your primary Dash address that you currently use for your CrowdNode account"; -/* Send by (scanning QR code) */ -"Send by" = "Send by"; - /* No comment provided by engineer. */ "Send Contact Request" = "Send Contact Request"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Send to"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Send to Address"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Send with NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Setup Wallet"; -/* No comment provided by engineer. */ -"Share" = "Dela"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Shop with DASH at over 150k merchants"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Syncing…"; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Tap"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Tap to hide balance"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Tap to unhide balance"; - /* No comment provided by engineer. */ "Tax Category" = "Tax Category"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "This QR already contains the payment request for %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "This recovery phrase is your access to the funds in this wallet."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Denna plånbok är inte tom eller så är den inte färdigsynkroniserad, du kan inte radera den utan att ha din återställningsfras"; @@ -1686,7 +1659,7 @@ "Updated: %@" = "Updated: %@"; /* Updating Price */ -"Updating Price" = "Updating Price"; +"Updating Price" = "Uppdaterar pris"; /* No comment provided by engineer. */ "Upgrade Fee" = "Upgrade Fee"; @@ -1704,7 +1677,7 @@ "Used" = "Used"; /* No comment provided by engineer. */ -"Used at IP address" = "Used at IP address"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Username taken"; @@ -1740,7 +1713,7 @@ "View all locations" = "View all locations"; /* No comment provided by engineer. */ -"View in Block Explorer" = "View in Block Explorer"; +"View in Block Explorer" = "View in Explorer"; /* No comment provided by engineer. */ "View passphrase, backup wallet…" = "View passphrase, backup wallet…"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Wallet disabled"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Wallet Keys"; - /* No comment provided by engineer. */ "Warning" = "Warning"; /* No comment provided by engineer. */ "WARNING" = "VARNING"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "We are about to show you the secret key to your wallet."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "We couldn’t create your CrowdNode account."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "We couldn’t withdraw from your CrowdNode account."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "We do not store this recovery phrase."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "We have 2 types of merchants"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "You receive"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device."; - /* Coinbase */ "You send" = "You send"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "You will lose all your manually reclassified transactions types"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Сopied address or QR"; diff --git a/DashWallet/th.lproj/Localizable.strings b/DashWallet/th.lproj/Localizable.strings index 245b850ef..b772ad69e 100644 --- a/DashWallet/th.lproj/Localizable.strings +++ b/DashWallet/th.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "เพิ่มรายชื่อใหม่"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "เพิ่มทางลัด"; - /* No comment provided by engineer. */ "Address" = "ที่อยู่"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "ซ่อนยอดคงเหลืออัตโนมัติ"; -/* No comment provided by engineer. */ -"Available balance" = "ยอดเงินคงเหลือ"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "สำรองวลีรหัสผ่าน"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "สำรองข้อมูลรหัสผ่านของคุณเพื่อสร้างบัญชี CrowdNode"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "วลีกู้คืนไม่ดี"; /* Send Screen: to address */ "Balance" = "ยอดคงเหลือ"; -/* No comment provided by engineer. */ -"Balance hidden" = "ยอดคงเหลือถูกซ่อน"; - /* CrowdNode */ "Balance: " = "ยอดคงเหลือ: "; @@ -245,12 +242,12 @@ buy */ "Buy" = "ซื้อ"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "ซื้อ & ขาย Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "ซื้อ / ขาย Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "ซื้อบัตรของขวัญ"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "การใช้บัตรของขวัญ"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "ฉันยอมรับ"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "ฉันได้เขียนลงไปแล้ว"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "หากคุณทำอุปกรณ์นี้สูญหาย คุณก็จะสูญเสียเงินของคุณ รับวลีการกู้คืนเพื่อให้คุณสามารถกู้คืนกระเป๋าสตางค์ของคุณบนอุปกรณ์อื่นอุปกรณ์อื่น"; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "หากคุณสูญเสียวลีรหัสผ่านสำหรับกระเป๋าเงินนี้และสูญเสียอุปกรณ์นี้หรือถอนการติดตั้งกระเป๋าเงิน Dash คุณจะสูญเสียการเข้าถึงเงินทุนของคุณใน CrowdNode และเงินทุนภายในกระเป๋าเงินนี้"; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "ดูเหมือนว่าคุณกำลังพยายามกู้คืนกระเป๋าเงินของคุณโดยใช้วลีการกู้คืน 12 คำ แต่คุณได้ป้อน 11 คำเท่านั้นคุณต้องการกู้คืนคำที่หายไปโดยอัตโนมัติหรือไม่"; -/* No comment provided by engineer. */ -"It's Important" = "สำคัญ"; - /* No comment provided by engineer. */ "Join Evolution" = "เข้าร่วมกับวิวัฒนาการ"; /* No comment provided by engineer. */ -"Keypair %ld" = "Keypair %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "การซิงค์อุปกรณ์ล่าสุด"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "เชื่อมต่อบัญชี Uphold ของคุณ"; -/* No comment provided by engineer. */ -"Load more" = "โหลดเพิ่ม"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "สกุลเงินท้องถิ่น"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "แผนที่"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "รายการมาสเตอร์โหนด #%1$d of %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "ประเภทการชำระเงิน"; -/* No comment provided by engineer. */ -"Payments" = "การชำระเงิน"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "โปรดตรวจสอบการเชื่อมต่อเครือข่ายของคุณ"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "โปรดป้อน PIN เพื่ออัปเกรด Wallet"; @@ -1173,7 +1167,7 @@ "Please write it down" = "กรุณาเขียนลงไป"; /* No comment provided by engineer. */ -"Previously used at IP address" = "ใช้ก่อนหน้านี้ที่ที่อยู่ IP"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Private key"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "สแกนโค้ด QR"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "สแกนสิ่งนี้เพื่อจ่าย"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "สแกนเพื่อจ่าย"; - /* No comment provided by engineer. */ "Scan to Send" = "สแกนเพื่อส่ง"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "สแกนโค้ด QR"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "ตรวจพบการบันทึกภาพหน้าจอ วลีกู้คืนใหม่::"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "กำลังหาชื่อผู้ใช้ %@ บนเครือข่าย Dash"; -/* No comment provided by engineer. */ -"Secure now" = "ปลอดภัย"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "ทำให้ Wallet ปลอดภัยตอนนี้"; - /* No comment provided by engineer. */ "Security" = "ความปลอดภัย"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "ส่ง %@ จากที่อยู่หลักของ Dash ของคุณที่คุณใช้สำหรับบัญชี CrowdNode ของคุณในปัจจุบัน"; -/* Send by (scanning QR code) */ -"Send by" = "ส่งจาก"; - /* No comment provided by engineer. */ "Send Contact Request" = "ส่งคำขอการติดต่อ"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "ส่งไปยัง"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "ส่งไปยังที่อยู่"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "ส่งกับ NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "ตั้งค่า wallet"; -/* No comment provided by engineer. */ -"Share" = "แบ่งปัน"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "ซื้อสินค้าด้วย DASH ที่มีร้านค้ามากกว่า 150k ร้าน"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "กำลังซิงค์ ..."; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "กด"; - /* No comment provided by engineer. */ "Tap to hide balance" = "กดเพื่อซ่อนยอดคงเหลือ"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "กดเพื่อเลิกซ่อนยอดคงเหลือ"; - /* No comment provided by engineer. */ "Tax Category" = "หมวดภาษี"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "QR นี้มีคำขอชำระเงินแล้ว %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "วลีกู้คืนนี้จะทำให้คุณเข้าถึงจำนวนเงินในวอลเล็ท"; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Wallet นี้ยังมีข้อมูลหรือการซิงค์ที่ยังไม่เสร็จสิ้น คุณไม่สามารถลบข้อมูลได้โดยไม่ใช้วลีกู้คืน"; @@ -1704,7 +1677,7 @@ "Used" = "ใช้แล้ว"; /* No comment provided by engineer. */ -"Used at IP address" = "ใช้ที่ที่อยู่ IP"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "ใช้ชื่อผู้ใช้แล้ว"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "wallet ถูกปิดการใช้งาน"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Wallet Keys"; - /* No comment provided by engineer. */ "Warning" = "คำเตือน"; /* No comment provided by engineer. */ "WARNING" = "คำเตือน"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "เรากำลังจะแสดงให้คุณเห็นถึง การเข้ารหัสและถอดรหัสโดยใช้กุญแจรหัสตัวเดียวกันในการเข้าถึงกระเป๋าสตางค์ของคุณ"; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "เราไม่สามารถสร้างบัญชี CrowdNode ของคุณได้"; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "เราไม่สามารถถอนตัวจากบัญชี CrowdNode ของคุณได้"; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "เราไม่เก็บรักษาวลีกู้คืนนี้"; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "เรามีร้านค้า 2 ประเภท"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "คุณได้รับ"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "คุณได้รับ Dash! หากคุณทำอุปกรณ์นี้หายคุณจะเสียเงิน รับวลีการกู้คืนเพื่อให้คุณสามารถกู้คืนกระเป๋าเงินของคุณบนอุปกรณ์อื่น"; - /* Coinbase */ "You send" = "คุณส่ง"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "คุณจะสูญเสียประเภทธุรกรรมที่จัดประเภทใหม่ด้วยตนเองทั้งหมดของคุณ"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "คุณจะต้องใช้วลีกู้คืนนี้เพื่อเข้าถึงเงินทุนของคุณหากอุปกรณ์นี้สูญหายได้รับความเสียหายหรือหาก Dash Wallet เคยถอนการติดตั้งโดยไม่ได้ตั้งใจจากอุปกรณ์นี้"; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "คุณจะได้รับ %@ Dash บนกระเป๋าของคุณบนอุปกรณ์นี้ โปรดทราบว่าอาจใช้เวลาสูงสุด 2-3 นาทีในการโอน"; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "กระเป๋าเงินของคุณปลอดภัยแล้ว คุณสามารถใช้วลีกู้คืนได้ทุกเวลาเพื่อกู้คืนบัญชีของคุณบนอุปกรณ์อื่น"; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "คัดลอกที่อยู่หรือ QR"; diff --git a/DashWallet/tr.lproj/Localizable.strings b/DashWallet/tr.lproj/Localizable.strings index 29da0abbe..3fb3e3fb2 100644 --- a/DashWallet/tr.lproj/Localizable.strings +++ b/DashWallet/tr.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Yeni Kişi Ekle"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Kısayol Ekle"; - /* No comment provided by engineer. */ "Address" = "Adres"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Otomatik Bakiye Gizleme"; -/* No comment provided by engineer. */ -"Available balance" = "Mevcut bakiye"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Parolayı Yedekle"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "CrowdNode hesabı oluşturmak için parolanızı yedekleyin"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Hatalı kurtarma cümlesi"; /* Send Screen: to address */ "Balance" = "Bakiye"; -/* No comment provided by engineer. */ -"Balance hidden" = "Bakiye gizlendi"; - /* CrowdNode */ "Balance: " = "Bakiye:"; @@ -245,12 +242,12 @@ buy */ "Buy" = "Al"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Dash Al & Sat"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Dash Al / Sat"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Hediye Kartı Satın Alın"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "Hediye Kartı Nasıl Kullanılır"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "Kabul ediyorum"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "Not aldım"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Bu cihazı kaybederseniz, paranızı kaybedersiniz. Cüzdanınızı başka bir cihaza geri yükleyebilmeniz için kurtarma sözcük grubunuzu sahip olun."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "Bu cüzdan için parolanızı kaybederseniz ve bu cihazı kaybederseniz veya Dash Cüzdanını kaldırırsanız, CrowdNode'daki fonlarınıza ve bu cüzdandaki fonlara erişiminizi kaybedersiniz."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "Görünüşe göre cüzdanınızın 12 kelimelik bir kurtarma sözcük grubu kullanarak geri kurtarmaya çalışıyorsunuz, ancak yalnızca 11 kelime girdiniz, eksik kelimeyi otomatik olarak kurtarmak ister misiniz?"; -/* No comment provided by engineer. */ -"It's Important" = "Bu önemli"; - /* No comment provided by engineer. */ "Join Evolution" = "Evolution'a katıl"; /* No comment provided by engineer. */ -"Keypair %ld" = "Anahtar çifti %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Son cihaz senkronizasyonu"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Uphold hesabınızı bağlayın"; -/* No comment provided by engineer. */ -"Load more" = "Daha fazla yükle"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Yerel Para Birimi"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Harita"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "Anadüğüm listesi #%1$d / %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Ödeme türü"; -/* No comment provided by engineer. */ -"Payments" = "Ödemeler"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Lütfen ağ bağlantınızı kontrol edin"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Cüzdanı yükseltmek için lütfen PİN kodunu girin"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Lütfen bir yere yazın"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Daha önce kullanılmış IP adresi"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Özel anahtar"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "QR kodunu tara"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Ödemek için tarayın"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Ödemek için Tara"; - /* No comment provided by engineer. */ "Scan to Send" = "Göndermek için Tara"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "QR kodu taranıyor"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Ekran görüntüsünün çekildi algılandı. Yeni kurtarma sözcük grubu:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Dash ağında %@ kullanıcı adı aranıyor"; -/* No comment provided by engineer. */ -"Secure now" = "Şimdi Korumaya Al"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Şimdi Cüzdanını Korumaya Al"; - /* No comment provided by engineer. */ "Security" = "Güvenlik"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Şu anda CrowdNode hesabınız için kullandığınız birincil Dash adresinizden %@ gönderin"; -/* Send by (scanning QR code) */ -"Send by" = "Tarafından Gönderildi"; - /* No comment provided by engineer. */ "Send Contact Request" = "İletişim İsteği Gönderin"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Gönder"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Adrese Gönder"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "NFC ile Gönder"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Cüzdan Kurulumu"; -/* No comment provided by engineer. */ -"Share" = "Paylaş"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "150 binden fazla satıcıda DASH ile alışveriş yapın"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Senkronize ediliyor…"; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Dokun"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Bakiyeyi gizlemek için tıkla"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Bakiyeyi görmek için tıkla"; - /* No comment provided by engineer. */ "Tax Category" = "Vergi Kategorisi"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "Bu QR zaten %@ için ödeme talebini içeriyor"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Bu kurtarma sözcük grubu cüzdanınızdaki paranıza erişmenizi sağlar."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Bu cüzdan boş değil veya eşleşme daha bitmedi, kurtarma metni olmadan sıfırlayamazsınız"; @@ -1704,7 +1677,7 @@ "Used" = "Kullanıldı"; /* No comment provided by engineer. */ -"Used at IP address" = "IP adresinde kullanıldı"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Kullanıcı adı alınmış"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Cüzdan devredışı"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Cüzdan Anahtarları"; - /* No comment provided by engineer. */ "Warning" = "Uyarı"; /* No comment provided by engineer. */ "WARNING" = "UYARI"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "Size cüzdanınızın gizli anahtarını göstermek üzereyiz."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "CrowdNode hesabınızı oluşturamadık."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "CrowdNode hesabınızdan para çekemedik."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "Kurtarma sözcük grubunuzu saklamıyoruz."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "2 tip tüccarımız var"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "Aldığınız"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Dash aldınız! Bu cihazı kaybederseniz, paranızı kaybedersiniz. Cüzdanınızı başka bir cihaza geri yükleyebilmeniz için kurtarma sözcük grubunuza sahip çıkın."; - /* Coinbase */ "You send" = "Gönderdiğiniz"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "Manuel olarak yeniden sınıflandırılan tüm işlem türlerinizi kaybedeceksiniz"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "Bu cihazın kaybolması / hasar görmesi, Dash cüzdanının bu cihazdan yanlışlıkla silinmesi durumunda paranıza erişmek için bu kurtarma ifadesine ihtiyacınız olacaktır."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "Bu cihazdaki Dash Cüzdan'ınızda %@ Dash alacaksınız. Bir transfer işleminin tamamlanmasının 2-3 dakika kadar sürebileceğini lütfen unutmayın."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Cüzdanınız artık güvende. Hesabınızı başka bir cihaza aktarmak için kurtarma sözcük grubunuzu istediğiniz zaman kullanabilirsiniz."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Adres veya QR kopyalandı"; diff --git a/DashWallet/uk.lproj/Localizable.strings b/DashWallet/uk.lproj/Localizable.strings index 62248b8fb..948ac8f88 100644 --- a/DashWallet/uk.lproj/Localizable.strings +++ b/DashWallet/uk.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Додати новий контакт"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Додати ярлик"; - /* No comment provided by engineer. */ "Address" = "Адреса"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Автоматично приховати баланс"; -/* No comment provided by engineer. */ -"Available balance" = "Доступний баланс"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Створити резервну копію фрази"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Створіть резервну копію фрази відновлення, щоб створити обліковий запис CrowdNode"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Некоректна фраза відновлення"; /* Send Screen: to address */ "Balance" = "Баланс"; -/* No comment provided by engineer. */ -"Balance hidden" = "Баланс приховано"; - /* CrowdNode */ "Balance: " = "Balance: "; @@ -245,12 +242,12 @@ buy */ "Buy" = "Купити"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Купити & Продати Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Купити / Продати Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Купити подарункову карту"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "Як використовувати подарункову карту"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "Я приймаю"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "Я записав її"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Якщо ви втратите цей пристрій, ви втратите свої кошти. Отримайте свою фразу відновлення, щоб ви могли відновити свій гаманець на іншому пристрої."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "У випадку, якщо ви втратите кодову фразу від цього гаманця, втратите пристрій або видалите Dash Wallet, ви втратите доступ CrowdNode і коштів всередині цього гаманця."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "Ви намагаєтеся відновити свій гаманець за допомогою фрази відновлення з 12 слів. Однак, ви ввели лише 11 слів. Бажаєте автоматично відновити пропущене слово?"; -/* No comment provided by engineer. */ -"It's Important" = "Це важливо"; - /* No comment provided by engineer. */ "Join Evolution" = "Приєднатись до Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Ключі %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Last device sync"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Link your Uphold account"; -/* No comment provided by engineer. */ -"Load more" = "Завантажити більше"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Локальна валюта"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Карта"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "список Мастернод #%1$d з %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Payment Type"; -/* No comment provided by engineer. */ -"Payments" = "Платежі"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Будь ласка, перевірте підключення до мережі"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Введіть PIN-код, щоб оновити гаманець"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Будь ласка, запишіть її"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Раніше використовувався з IP-адресою"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Приватний ключ"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Сканувати QR код"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Відскануйте це, щоб оплатити"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Сканувати для оплати"; - /* No comment provided by engineer. */ "Scan to Send" = "Сканувати для відправки"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Сканування QR коду"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Виявлено знімок екрана. Нова фраза відновлення:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Пошук по імені користувача %@ в Dash Network"; -/* No comment provided by engineer. */ -"Secure now" = "Захистити"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Захистіть гаманець зараз"; - /* No comment provided by engineer. */ "Security" = "Безпека"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Send %@ from your primary Dash address that you currently use for your CrowdNode account"; -/* Send by (scanning QR code) */ -"Send by" = "Надіслати"; - /* No comment provided by engineer. */ "Send Contact Request" = "Надіслати запит на додавання до контактів"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Відправити"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Відправити на адресу"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "NFC переказ"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Налаштувати гаманець"; -/* No comment provided by engineer. */ -"Share" = "Поділитися"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Shop with DASH at over 150k merchants"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Syncing…"; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Вкл."; - /* No comment provided by engineer. */ "Tap to hide balance" = "Торкніться, щоб приховати баланс"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Торкніться, щоб показати баланс"; - /* No comment provided by engineer. */ "Tax Category" = "Податкова категорія"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "This QR already contains the payment request for %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Ця фраза відновлення - ваш доступ до коштів у цьому гаманці."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Цей гаманець не порожній або синхронізація не завершена, ви не можете стерти його без фрази відновлення"; @@ -1704,7 +1677,7 @@ "Used" = "Використано"; /* No comment provided by engineer. */ -"Used at IP address" = "Використано за IP-адресою"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Ім'я користувача зайняте"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Гаманець вимкнено"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Ключі до гаманця"; - /* No comment provided by engineer. */ "Warning" = "Попередження"; /* No comment provided by engineer. */ "WARNING" = "УВАГА"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "Зараз ми покажемо секретний ключ до вашого гаманця."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "Не вдалося створити обліковий запис CrowdNode."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "Не вдалося зняти кошти з вашого облікового запису CrowdNode."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "Ми не зберігаємо цю фразу відновлення."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "У нас є 2 види продавців"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "You receive"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Ви отримали Dash! Якщо ви втратите цей пристрій, ви втратите свої кошти. Отримайте свою фразу відновлення, щоб ви могли відновити свій гаманець на іншому пристрої."; - /* Coinbase */ "You send" = "You send"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "Ви втратите всі перекласифіковані вручну типи транзакцій"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "Вам знадобиться ця фраза відновлення, щоб отримати доступ до своїх коштів, якщо цей пристрій буде втрачено, пошкоджено або якщо Dash Wallet буде випадково видалено з цього пристрою."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Тепер ваш гаманець у безпеці. Ви можете будь-коли використати свою фразу відновлення, щоб відновити обліковий запис на іншому пристрої."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Скопійована адреса або QR"; diff --git a/DashWallet/vi.lproj/Localizable.strings b/DashWallet/vi.lproj/Localizable.strings index ed7aba489..d96691ce1 100644 --- a/DashWallet/vi.lproj/Localizable.strings +++ b/DashWallet/vi.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Thêm một liên hệ"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Thêm shortcut"; - /* No comment provided by engineer. */ "Address" = "Địa chỉ"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Tự ẩn số dư"; -/* No comment provided by engineer. */ -"Available balance" = "Số dư hiện có"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Backup Passphrase"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Backup your passphrase to create a CrowdNode account"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Câu phục hồi không đúng"; /* Send Screen: to address */ "Balance" = "Số dư"; -/* No comment provided by engineer. */ -"Balance hidden" = "Số dư được ẩn"; - /* CrowdNode */ "Balance: " = "Balance: "; @@ -245,12 +242,12 @@ buy */ "Buy" = "Buy"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Mua & Bán Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Mua & Bán Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "How to Use a Gift Card"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "Tôi chấp nhận"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "Tôi đã viết xuống"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Nếu bạn mất thiết bị này, bạn sẽ mất số tiền trong đó. Hãy thiết lập cụm từ phục hồi để bạn có thể khôi phục được ví trên một thiết bị khác."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?"; -/* No comment provided by engineer. */ -"It's Important" = "Điều này là quan trọng"; - /* No comment provided by engineer. */ "Join Evolution" = "Tham gia Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Cặp khoá %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Last device sync"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Link your Uphold account"; -/* No comment provided by engineer. */ -"Load more" = "Nạp thêm"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Tiền địa phương"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Map"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "masternode list #%1$d of %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Payment Type"; -/* No comment provided by engineer. */ -"Payments" = "Các giao dịch"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Please check your network connection"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Hãy nhập mã PIN để nâng cấp ví"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Hãy vui lòng ghi xuống"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Trước đó được dùng tại địa chỉ IP"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Khoá riêng"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Quét mã QR"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Quét cái này để thanh toán"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Quét để thanh toán"; - /* No comment provided by engineer. */ "Scan to Send" = "Quét để gửi"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Quét mã QR"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Phát hiện bị chụp ảnh màn hình: Cụm từ phục hồi mới:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Tìm kiếm tên người dùng %@ trên mạng lưới Dash"; -/* No comment provided by engineer. */ -"Secure now" = "Bảo mật ngay"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Bảo mật ví ngay"; - /* No comment provided by engineer. */ "Security" = "Bảo mật"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Send %@ from your primary Dash address that you currently use for your CrowdNode account"; -/* Send by (scanning QR code) */ -"Send by" = "Gửi bởi"; - /* No comment provided by engineer. */ "Send Contact Request" = "Gửi yêu cầu liên hệ"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Gửi đến"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Gửi đến địa chỉ"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Gửi với NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Thiết lập ví"; -/* No comment provided by engineer. */ -"Share" = "Chia sẻ"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Shop with DASH at over 150k merchants"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Syncing…"; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Bấm"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Bấm để ẩn số dư"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Bấm để hiện số dư"; - /* No comment provided by engineer. */ "Tax Category" = "Tax Category"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "This QR already contains the payment request for %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "Cụm từ phục hồi này là quyền truy cập của bạn đến số tiền trong ví này."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "Ví này không rỗng hoặc quá trình đồng bộ chưa xong, bạn không thể xoá nó mà không có dòng khôi phục"; @@ -1704,7 +1677,7 @@ "Used" = "Đã dùng"; /* No comment provided by engineer. */ -"Used at IP address" = "Được sử dụng tại địa chỉ IP"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Tên người dùng đã được chọn"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Ví đã bị vô hiệu hoá"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Khoá của ví"; - /* No comment provided by engineer. */ "Warning" = "Cảnh báo"; /* No comment provided by engineer. */ "WARNING" = "CẢNH BÁO"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "Chúng tôi sẽ hiển thị cho bạn xem khoá bí mật của ví của bạn"; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "We couldn’t create your CrowdNode account."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "We couldn’t withdraw from your CrowdNode account."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "Chúng tôi không lưu giữ dòng chữ phục hồi này."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "We have 2 types of merchants"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "You receive"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "Bạn đã nhận được Dash! Nếu bạn mất thiết bị này, bạn sẽ mất số tiền của mình. Hãy chọn cụm từ phục hồi để bạn có thể khôi phục ví của mình trên một thiết bị khác."; - /* Coinbase */ "You send" = "You send"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "You will lose all your manually reclassified transactions types"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "Bạn cần cụm từ phục hồi để truy cập đến khoản tiền của bạn nếu thiết bị này bị mất, hỏng hoặc ví Dash Wallet vô tình bị gỡ bỏ khỏi thiết bị này."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Bây giờ ví của bạn đã được an toàn. Bạn có thể sử dụng dòng chữ phục hồi bất kỳ khi nào để khôi phục số tiền của mình trên một thiết bị khác."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Сopied address or QR"; diff --git a/DashWallet/zh-Hans.lproj/Localizable.strings b/DashWallet/zh-Hans.lproj/Localizable.strings index 7b062f1be..45b8a6e37 100644 --- a/DashWallet/zh-Hans.lproj/Localizable.strings +++ b/DashWallet/zh-Hans.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Add a New Contact"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Add Shortcut"; - /* No comment provided by engineer. */ "Address" = "Address"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Autohide Balance"; -/* No comment provided by engineer. */ -"Available balance" = "Available balance"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Backup Passphrase"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Backup your passphrase to create a CrowdNode account"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Bad recovery phrase"; /* Send Screen: to address */ "Balance" = "Balance"; -/* No comment provided by engineer. */ -"Balance hidden" = "Balance hidden"; - /* CrowdNode */ "Balance: " = "Balance: "; @@ -245,12 +242,12 @@ buy */ "Buy" = "Buy"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Buy / Sell Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "How to Use a Gift Card"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "I Accept"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "I wrote it down"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?"; -/* No comment provided by engineer. */ -"It's Important" = "It's Important"; - /* No comment provided by engineer. */ "Join Evolution" = "Join Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Keypair %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Last device sync"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Link your Uphold account"; -/* No comment provided by engineer. */ -"Load more" = "Load more"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Local Currency"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Map"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "masternode list #%1$d of %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Payment Type"; -/* No comment provided by engineer. */ -"Payments" = "Payments"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Please check your network connection"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Please enter PIN to upgrade wallet"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Please write it down"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Previously used at IP address"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Private key"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Scan QR Code"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Scan this to Pay"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Scan to Pay"; - /* No comment provided by engineer. */ "Scan to Send" = "Scan to Send"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Scanning QR code"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Screenshot detected. New recovery phrase:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Searching for username %@ on the Dash Network"; -/* No comment provided by engineer. */ -"Secure now" = "Secure now"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Secure Wallet Now"; - /* No comment provided by engineer. */ "Security" = "Security"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Send %@ from your primary Dash address that you currently use for your CrowdNode account"; -/* Send by (scanning QR code) */ -"Send by" = "Send by"; - /* No comment provided by engineer. */ "Send Contact Request" = "Send Contact Request"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Send to"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Send to Address"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Send with NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Setup Wallet"; -/* No comment provided by engineer. */ -"Share" = "Share"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Shop with DASH at over 150k merchants"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Syncing…"; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Tap"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Tap to hide balance"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Tap to unhide balance"; - /* No comment provided by engineer. */ "Tax Category" = "Tax Category"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "This QR already contains the payment request for %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "This recovery phrase is your access to the funds in this wallet."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "此钱包并不是空的或同步尚未完成, 如果没有恢复密语, 请不要清空钱包"; @@ -1704,7 +1677,7 @@ "Used" = "Used"; /* No comment provided by engineer. */ -"Used at IP address" = "Used at IP address"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Username taken"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Wallet disabled"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Wallet Keys"; - /* No comment provided by engineer. */ "Warning" = "Warning"; /* No comment provided by engineer. */ "WARNING" = "警告"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "We are about to show you the secret key to your wallet."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "We couldn’t create your CrowdNode account."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "We couldn’t withdraw from your CrowdNode account."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "We do not store this recovery phrase."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "We have 2 types of merchants"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "You receive"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device."; - /* Coinbase */ "You send" = "You send"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "You will lose all your manually reclassified transactions types"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Сopied address or QR"; diff --git a/DashWallet/zh-Hant-TW.lproj/Localizable.strings b/DashWallet/zh-Hant-TW.lproj/Localizable.strings index 3cea730f7..e607103d2 100644 --- a/DashWallet/zh-Hant-TW.lproj/Localizable.strings +++ b/DashWallet/zh-Hant-TW.lproj/Localizable.strings @@ -118,9 +118,6 @@ /* No comment provided by engineer. */ "Add a New Contact" = "Add a New Contact"; -/* Translate it as short as possible! (24 symbols max) */ -"Add Shortcut" = "Add Shortcut"; - /* No comment provided by engineer. */ "Address" = "Address"; @@ -199,8 +196,8 @@ /* No comment provided by engineer. */ "Autohide Balance" = "Autohide Balance"; -/* No comment provided by engineer. */ -"Available balance" = "Available balance"; +/* Translate it as short as possible! (24 symbols max) */ +"Backup" = "Backup"; /* No comment provided by engineer. */ "Backup Passphrase" = "Backup Passphrase"; @@ -211,15 +208,15 @@ /* No comment provided by engineer. */ "Backup your passphrase to create a CrowdNode account" = "Backup your passphrase to create a CrowdNode account"; +/* Back up wallet */ +"Backup your recovery phrase" = "Backup your recovery phrase"; + /* No comment provided by engineer. */ "Bad recovery phrase" = "Bad recovery phrase"; /* Send Screen: to address */ "Balance" = "Balance"; -/* No comment provided by engineer. */ -"Balance hidden" = "Balance hidden"; - /* CrowdNode */ "Balance: " = "Balance: "; @@ -245,12 +242,12 @@ buy */ "Buy" = "Buy"; +/* Translate it as short as possible! (24 symbols max) */ +"Buy & Sell" = "Buy & Sell"; + /* No comment provided by engineer. */ "Buy & Sell Dash" = "Buy & Sell Dash"; -/* Translate it as short as possible! (24 symbols max) */ -"Buy / Sell Dash" = "Buy / Sell Dash"; - /* Buy a Gift Card */ "Buy a Gift Card" = "Buy a Gift Card"; @@ -727,6 +724,9 @@ /* No comment provided by engineer. */ "How to Use a Gift Card" = "How to Use a Gift Card"; +/* No comment provided by engineer. */ +"HPMN Operator Keys" = "HPMN Operator Keys"; + /* No comment provided by engineer. */ "I Accept" = "I Accept"; @@ -739,9 +739,6 @@ /* No comment provided by engineer. */ "I wrote it down" = "I wrote it down"; -/* No comment provided by engineer. */ -"If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device."; - /* No comment provided by engineer. */ "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet." = "If you lose your passphrase for this wallet and lose this device or uninstall Dash Wallet, you will lose access to your funds on CrowdNode and the funds within this wallet."; @@ -823,14 +820,11 @@ /* No comment provided by engineer. */ "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?" = "It would seem like you are attempting to restore your wallet a using a 12 word recovery phrase, however you have only entered 11 words, would you like to automatically recover the missing word?"; -/* No comment provided by engineer. */ -"It's Important" = "It's Important"; - /* No comment provided by engineer. */ "Join Evolution" = "Join Evolution"; /* No comment provided by engineer. */ -"Keypair %ld" = "Keypair %ld"; +"Keypair" = "Keypair"; /* Explore Dash */ "Last device sync" = "Last device sync"; @@ -875,9 +869,6 @@ /* Dash Service Overview */ "Link your Uphold account" = "Link your Uphold account"; -/* No comment provided by engineer. */ -"Load more" = "Load more"; - /* Translate it as short as possible! (24 symbols max) */ "Local Currency" = "Local Currency"; @@ -926,6 +917,9 @@ /* Map */ "Map" = "Map"; +/* No comment provided by engineer. */ +"Masternode Keys" = "Masternode Keys"; + /* No comment provided by engineer. */ "masternode list #%d of %d" = "masternode list #%1$d of %2$d"; @@ -1115,9 +1109,6 @@ /* Explore Dash/Merchants/Filters */ "Payment Type" = "Payment Type"; -/* No comment provided by engineer. */ -"Payments" = "Payments"; - /* Coinbase/Payment Methods */ "PayPal" = "PayPal"; @@ -1142,6 +1133,9 @@ /* Network Unavailable */ "Please check your network connection" = "Please check your network connection"; +/* No comment provided by engineer. */ +"Please copy the Dash address first and try again" = "Please copy the Dash address first and try again"; + /* No comment provided by engineer. */ "Please enter PIN to upgrade wallet" = "Please enter PIN to upgrade wallet"; @@ -1173,7 +1167,7 @@ "Please write it down" = "Please write it down"; /* No comment provided by engineer. */ -"Previously used at IP address" = "Previously used at IP address"; +"Previously used at: " = "Previously used at: "; /* No comment provided by engineer. */ "Private key" = "Private key"; @@ -1310,18 +1304,15 @@ /* No comment provided by engineer. */ "Scan QR Code" = "Scan QR Code"; +/* (Send by) Scanning QR code */ +"Scan QR code" = "Scan QR code"; + /* A title of the quick receive screen */ "Scan this to Pay" = "Scan this to Pay"; -/* Translate it as short as possible! (24 symbols max) */ -"Scan to Pay" = "Scan to Pay"; - /* No comment provided by engineer. */ "Scan to Send" = "Scan to Send"; -/* (Send by) Scanning QR code */ -"Scanning QR code" = "Scanning QR code"; - /* No comment provided by engineer. */ "Screenshot detected. New recovery phrase:" = "Screenshot detected. New recovery phrase:"; @@ -1346,12 +1337,6 @@ /* No comment provided by engineer. */ "Searching for username %@ on the Dash Network" = "Searching for username %@ on the Dash Network"; -/* No comment provided by engineer. */ -"Secure now" = "Secure now"; - -/* Translate it as short as possible! (24 symbols max) */ -"Secure Wallet Now" = "Secure Wallet Now"; - /* No comment provided by engineer. */ "Security" = "Security"; @@ -1385,9 +1370,6 @@ /* CrowdNode Confirm */ "Send %@ from your primary Dash address that you currently use for your CrowdNode account" = "Send %@ from your primary Dash address that you currently use for your CrowdNode account"; -/* Send by (scanning QR code) */ -"Send by" = "Send by"; - /* No comment provided by engineer. */ "Send Contact Request" = "Send Contact Request"; @@ -1398,8 +1380,8 @@ /* No comment provided by engineer. */ "Send to" = "Send to"; -/* Translate it as short as possible! (24 symbols max) */ -"Send to Address" = "Send to Address"; +/* No comment provided by engineer. */ +"Send to copied address or QR code" = "Send to copied address or QR code"; /* Translate it as short as possible! (24 symbols max) */ "Send with NFC" = "Send with NFC"; @@ -1449,8 +1431,8 @@ /* No comment provided by engineer. */ "Setup Wallet" = "Setup Wallet"; -/* No comment provided by engineer. */ -"Share" = "Share"; +/* Receive screen */ +"Share address" = "Share address"; /* No comment provided by engineer. */ "Shop with DASH at over 150k merchants" = "Shop with DASH at over 150k merchants"; @@ -1542,15 +1524,9 @@ /* Balance */ "Syncing…" = "Syncing…"; -/* Pay using NFC (should be as short as possible) */ -"Tap" = "Tap"; - /* No comment provided by engineer. */ "Tap to hide balance" = "Tap to hide balance"; -/* No comment provided by engineer. */ -"Tap to unhide balance" = "Tap to unhide balance"; - /* No comment provided by engineer. */ "Tax Category" = "Tax Category"; @@ -1599,9 +1575,6 @@ /* CrowdNode Confirm */ "This QR already contains the payment request for %@" = "This QR already contains the payment request for %@"; -/* No comment provided by engineer. */ -"This recovery phrase is your access to the funds in this wallet." = "This recovery phrase is your access to the funds in this wallet."; - /* No comment provided by engineer. */ "This wallet is not empty or sync has not finished, you may not wipe it without the recovery phrase" = "此錢包不是空的或同步尚未完成,如果沒有恢復詞組請不要進行擦除"; @@ -1704,7 +1677,7 @@ "Used" = "Used"; /* No comment provided by engineer. */ -"Used at IP address" = "Used at IP address"; +"Used at: " = "Used at: "; /* No comment provided by engineer. */ "Username taken" = "Username taken"; @@ -1763,18 +1736,12 @@ /* No comment provided by engineer. */ "Wallet disabled" = "Wallet disabled"; -/* No comment provided by engineer. */ -"Wallet Keys" = "Wallet Keys"; - /* No comment provided by engineer. */ "Warning" = "Warning"; /* No comment provided by engineer. */ "WARNING" = "警告"; -/* No comment provided by engineer. */ -"We are about to show you the secret key to your wallet." = "We are about to show you the secret key to your wallet."; - /* CrowdNode */ "We couldn’t create your CrowdNode account." = "We couldn’t create your CrowdNode account."; @@ -1784,9 +1751,6 @@ /* CrowdNode */ "We couldn’t withdraw from your CrowdNode account." = "We couldn’t withdraw from your CrowdNode account."; -/* No comment provided by engineer. */ -"We do not store this recovery phrase." = "We do not store this recovery phrase."; - /* No comment provided by engineer. */ "We have 2 types of merchants" = "We have 2 types of merchants"; @@ -1878,9 +1842,6 @@ /* Coinbase */ "You receive" = "You receive"; -/* No comment provided by engineer. */ -"You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device." = "You received Dash! If you lose this device, you will lose your funds. Get your recovery phrase so that you can restore your wallet on another device."; - /* Coinbase */ "You send" = "You send"; @@ -1899,8 +1860,8 @@ /* No comment provided by engineer. */ "You will lose all your manually reclassified transactions types" = "You will lose all your manually reclassified transactions types"; -/* No comment provided by engineer. */ -"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet ever is accidentally uninstalled from this device."; +/* Back up wallet */ +"You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device." = "You will need this recovery phrase to access your funds if this device is lost, damaged or if Dash Wallet is uninstalled from this device."; /* Coinbase/Buy Dash/Confirm Order */ "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer." = "You will receive %@ Dash on your Dash Wallet on this device. Please note that it can take up to 2-3 minutes to complete a transfer."; @@ -1946,6 +1907,3 @@ /* No comment provided by engineer. */ "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device." = "Your wallet is secured now. You can use your recovery phrase anytime to recover your account on another device."; - -/* No comment provided by engineer. */ -"Сopied address or QR" = "Сopied address or QR"; diff --git a/Gemfile.lock b/Gemfile.lock index 799b6e87f..520bdcc1f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,30 +1,29 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.5) + CFPropertyList (3.0.6) rexml - activesupport (6.1.5) + activesupport (7.0.4.3) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) - zeitwerk (~> 2.3) - addressable (2.8.0) - public_suffix (>= 2.0.2, < 5.0) + addressable (2.8.4) + public_suffix (>= 2.0.2, < 6.0) algoliasearch (1.27.5) httpclient (~> 2.8, >= 2.8.3) json (>= 1.5.1) atomos (0.1.3) claide (1.1.0) - cocoapods (1.11.2) + cocoapods (1.12.1) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.11.2) + cocoapods-core (= 1.12.1) cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.4.0, < 2.0) + cocoapods-downloader (>= 1.6.0, < 2.0) cocoapods-plugins (>= 1.0.0, < 2.0) cocoapods-search (>= 1.0.0, < 2.0) - cocoapods-trunk (>= 1.4.0, < 2.0) + cocoapods-trunk (>= 1.6.0, < 2.0) cocoapods-try (>= 1.1.0, < 2.0) colored2 (~> 3.1) escape (~> 0.0.4) @@ -32,10 +31,10 @@ GEM gh_inspector (~> 1.0) molinillo (~> 0.8.0) nap (~> 1.0) - ruby-macho (>= 1.0, < 3.0) + ruby-macho (>= 2.3.0, < 3.0) xcodeproj (>= 1.21.0, < 2.0) - cocoapods-core (1.11.2) - activesupport (>= 5.0, < 7) + cocoapods-core (1.12.1) + activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) concurrent-ruby (~> 1.1) @@ -45,7 +44,7 @@ GEM public_suffix (~> 4.0) typhoeus (~> 1.0) cocoapods-deintegrate (1.0.5) - cocoapods-downloader (1.5.1) + cocoapods-downloader (1.6.3) cocoapods-plugins (1.0.0) nap cocoapods-search (1.0.1) @@ -54,32 +53,32 @@ GEM netrc (~> 0.11) cocoapods-try (1.2.0) colored2 (3.1.2) - concurrent-ruby (1.1.9) + concurrent-ruby (1.2.2) escape (0.0.4) - ethon (0.15.0) + ethon (0.16.0) ffi (>= 1.15.0) ffi (1.15.5) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) httpclient (2.8.3) - i18n (1.10.0) + i18n (1.13.0) concurrent-ruby (~> 1.0) - json (2.6.1) - minitest (5.15.0) + json (2.6.3) + minitest (5.18.0) molinillo (0.8.0) nanaimo (0.3.0) nap (1.1.0) netrc (0.11.0) - public_suffix (4.0.6) + public_suffix (4.0.7) rexml (3.2.5) rouge (2.0.7) ruby-macho (2.5.1) typhoeus (1.4.0) ethon (>= 0.9.0) - tzinfo (2.0.4) + tzinfo (2.0.6) concurrent-ruby (~> 1.0) - xcodeproj (1.21.0) + xcodeproj (1.22.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -88,11 +87,9 @@ GEM rexml (~> 3.2.4) xcpretty (0.3.0) rouge (~> 2.0.7) - zeitwerk (2.5.4) PLATFORMS - arm64-darwin-21 - x86_64-darwin-19 + arm64-darwin-22 DEPENDENCIES cocoapods (>= 1.11.2) @@ -101,4 +98,4 @@ DEPENDENCIES xcpretty BUNDLED WITH - 2.3.8 + 2.4.12 diff --git a/Podfile b/Podfile index fd1c8c43d..861dc9a19 100644 --- a/Podfile +++ b/Podfile @@ -75,4 +75,5 @@ post_install do |installer| # update info about current DashSync version # the command runs in the background after 1 sec, when `pod install` updates Podfile.lock system("(sleep 1; sh ./scripts/dashsync_version.sh) &") + end diff --git a/Podfile.lock b/Podfile.lock index 88738d15a..5649c85c9 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -578,22 +578,22 @@ PODS: - CocoaLumberjack (3.7.2): - CocoaLumberjack/Core (= 3.7.2) - CocoaLumberjack/Core (3.7.2) - - DAPI-GRPC (0.24.0-dev): + - DAPI-GRPC (0.22.0-dev.8): - "!ProtoCompiler-gRPCPlugin (~> 1.0)" - - DAPI-GRPC/Messages (= 0.24.0-dev) - - DAPI-GRPC/Services (= 0.24.0-dev) - - DAPI-GRPC/Messages (0.24.0-dev): + - DAPI-GRPC/Messages (= 0.22.0-dev.8) + - DAPI-GRPC/Services (= 0.22.0-dev.8) + - DAPI-GRPC/Messages (0.22.0-dev.8): - "!ProtoCompiler-gRPCPlugin (~> 1.0)" - Protobuf - - DAPI-GRPC/Services (0.24.0-dev): + - DAPI-GRPC/Services (0.22.0-dev.8): - "!ProtoCompiler-gRPCPlugin (~> 1.0)" - DAPI-GRPC/Messages - gRPC-ProtoRPC - DashSharedCore (0.2.8) - - DashSync (2.3.0): + - DashSync (0.1.0): - bls-signatures-pod (= 1.0.7) - CocoaLumberjack (= 3.7.2) - - DAPI-GRPC (= 0.24.0-dev) + - DAPI-GRPC (= 0.22.0-dev.8) - DashSharedCore (= 0.2.8) - DSDynamicOptions (= 0.1.2) - DWAlertController (= 0.2.1) @@ -620,13 +620,13 @@ PODS: - FirebaseStorage (8.15.0): - FirebaseCore (~> 8.0) - GTMSessionFetcher/Core (~> 1.5) - - GoogleDataTransport (9.2.1): + - GoogleDataTransport (9.2.2): - GoogleUtilities/Environment (~> 7.7) - nanopb (< 2.30910.0, >= 2.30908.0) - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Environment (7.11.0): + - GoogleUtilities/Environment (7.11.1): - PromisesObjC (< 3.0, >= 1.2) - - GoogleUtilities/Logger (7.11.0): + - GoogleUtilities/Logger (7.11.1): - GoogleUtilities/Environment - gRPC-Core (1.49.0): - gRPC-Core/Implementation (= 1.49.0) @@ -702,7 +702,7 @@ PODS: - nanopb/decode (2.30908.0) - nanopb/encode (2.30908.0) - PromisesObjC (2.2.0) - - Protobuf (3.22.1) + - Protobuf (3.22.3) - SDWebImage (5.13.2): - SDWebImage/Core (= 5.13.2) - SDWebImage/Core (5.13.2) @@ -806,9 +806,9 @@ SPEC CHECKSUMS: CloudInAppMessaging: 5dde21e2e67e173e3803ca7532eacaa77e19d744 CocoaImageHashing: 8656031d0899abe6c1c415827de43e9798189c53 CocoaLumberjack: b7e05132ff94f6ae4dfa9d5bce9141893a21d9da - DAPI-GRPC: 750f8a4e6805141d65698737e77ea36fb92b6858 + DAPI-GRPC: 138d62523bbfe7e88a39896f1053c0bc12390d9f DashSharedCore: 79b38b97b4bff3d14467f4c997229225df4c5a83 - DashSync: 065242c83fcd2c2edfff77e443976879f3d007af + DashSync: 076af723d7c44bd3e65daa7c8122dc607ad95edf DSDynamicOptions: 347cc5d2c4e080eb3de6a86719ad3d861b82adfc DWAlertController: 5f4cd8adf90336331c054857f709f5f8d4b16a5b Firebase: 5f8193dff4b5b7c5d5ef72ae54bb76c08e2b841d @@ -816,8 +816,8 @@ SPEC CHECKSUMS: FirebaseCoreDiagnostics: 92e07a649aeb66352b319d43bdd2ee3942af84cb FirebaseDynamicLinks: 1dc816ef789c5adac6fede0b46d11478175c70e4 FirebaseStorage: 8019af461599b2c3bc61c6a5dbdfa3d2de66a4d9 - GoogleDataTransport: ea169759df570f4e37bdee1623ec32a7e64e67c4 - GoogleUtilities: c2bdc4cf2ce786c4d2e6b3bcfd599a25ca78f06f + GoogleDataTransport: 8378d1fa8ac49753ea6ce70d65a7cb70ce5f66e6 + GoogleUtilities: 9aa0ad5a7bc171f8bae016300bfcfa3fb8425749 gRPC: 64f36d689b2ecd99c4351f74e6f91347cdc65d9f gRPC-Core: 3a9fdb5967d42211e875826f3f6fc163ea02c2a1 gRPC-ProtoRPC: 1c223e0f1732bb8d0b9e9e0ea60cc0fe995b8e2d @@ -829,7 +829,7 @@ SPEC CHECKSUMS: Moya: 138f0573e53411fb3dc17016add0b748dfbd78ee nanopb: a0ba3315591a9ae0a16a309ee504766e90db0c96 PromisesObjC: 09985d6d70fbe7878040aa746d78236e6946d2ef - Protobuf: d7f7c8329edf5eb8af65547a8ba3e9c1cee927d5 + Protobuf: d03938d5f7e974a97964fb0567771e36fbe9ecce SDWebImage: 72f86271a6f3139cc7e4a89220946489d4b9a866 secp256k1_dash: bd60e467aa853e145cf680dd0f8b196df20f0a62 SQLite.swift: 903bfa3bc9ab06345fdfbb578e34f47cfcf417da @@ -841,4 +841,4 @@ SPEC CHECKSUMS: PODFILE CHECKSUM: 070344e2828a74f647aaa0ce756a1fba3489659b -COCOAPODS: 1.12.0 +COCOAPODS: 1.12.1 diff --git a/WatchApp Extension/DWWatchDataManager.swift b/WatchApp Extension/DWWatchDataManager.swift index d420f367d..d96187026 100644 --- a/WatchApp Extension/DWWatchDataManager.swift +++ b/WatchApp Extension/DWWatchDataManager.swift @@ -182,16 +182,16 @@ final class DWWatchDataManager: NSObject { if let data = replyMessage[AW_SESSION_RESPONSE_KEY] as? Data { if let unwrappedAppleWatchData = NSKeyedUnarchiver.unarchiveObject(with: data) as? BRAppleWatchData { - let previousAppleWatchData = self.appleWatchData - let previousWalletStatus = self.walletStatus - self.appleWatchData = unwrappedAppleWatchData + let previousAppleWatchData = appleWatchData + let previousWalletStatus = walletStatus + appleWatchData = unwrappedAppleWatchData let notificationCenter = NotificationCenter.default - if previousAppleWatchData != self.appleWatchData { - self.archiveData(unwrappedAppleWatchData) + if previousAppleWatchData != appleWatchData { + archiveData(unwrappedAppleWatchData) notificationCenter.post(name: DWWatchDataManager.ApplicationDataDidUpdateNotification, object: nil) } - if self.walletStatus != previousWalletStatus { + if walletStatus != previousWalletStatus { notificationCenter.post(name: DWWatchDataManager.WalletStatusDidChangeNotification, object: nil) } diff --git a/fastlane/metadata/en-US/release_notes.txt b/fastlane/metadata/en-US/release_notes.txt index c768c7d23..1995f9abc 100644 --- a/fastlane/metadata/en-US/release_notes.txt +++ b/fastlane/metadata/en-US/release_notes.txt @@ -1 +1,7 @@ -Dash Wallet v4.0 brings with it a completely redesigned experience that seeks to enhance ease of use in an intuitive and familiar way across all your devices. We reimagined our passphrase verification process to highlight the importance of safeguarding a user’s passphrase for later wallet recovery while also allowing new users to postpone doing so; for example, if the location where they installed the app is not suitable to write down their 12-word passphrase. We have also added shortcuts to the home screen for quicker access to features commonly used. Our settings menu has also been repositioned in the app and organized to help users configure their wallet faster and easier. Users now have much broader control over their security settings and the ability to decide how frequently entering their PIN is required. +# Minor Update: + +The latest version contains stability and performance improvements. + +# Major release: + +Version brings the introduction of on iOS. \ No newline at end of file