diff --git a/Authenticator.xcodeproj/project.pbxproj b/Authenticator.xcodeproj/project.pbxproj index 30f19511..3780871d 100644 --- a/Authenticator.xcodeproj/project.pbxproj +++ b/Authenticator.xcodeproj/project.pbxproj @@ -45,7 +45,6 @@ 51EEC536246D38B700061A8F /* YKFKeyVersionExtensionsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51EEC535246D38B700061A8F /* YKFKeyVersionExtensionsTests.swift */; }; 51F8E3BD263847BD0010686B /* ManagementViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51F8E3BC263847BD0010686B /* ManagementViewModel.swift */; }; 51F8E3BF263848E30010686B /* Connection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51F8E3BE263848E30010686B /* Connection.swift */; }; - 811CD95722FB276A00E2BCBB /* HelpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 811CD95622FB276A00E2BCBB /* HelpViewController.swift */; }; 816C684623430E0700209342 /* SecureStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 816C684523430E0700209342 /* SecureStore.swift */; }; 816C684823430F8E00209342 /* SecureStoreQueryable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 816C684723430F8E00209342 /* SecureStoreQueryable.swift */; }; 816C685023440D2200209342 /* SecureStoreError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 816C684F23440D2200209342 /* SecureStoreError.swift */; }; @@ -61,15 +60,11 @@ 81FA3C34231AF2D8009C22AB /* AdvancedSettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FA3C33231AF2D8009C22AB /* AdvancedSettingsViewController.swift */; }; 81FA3C39231AF4F0009C22AB /* UIViewControllerAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81FA3C38231AF4F0009C22AB /* UIViewControllerAdditions.swift */; }; A525965B23A45501006AA3C0 /* UIImageAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A525965A23A45501006AA3C0 /* UIImageAdditions.swift */; }; - A544948E23CE546B003E1E07 /* TutorialViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A544948B23CE546B003E1E07 /* TutorialViewController.swift */; }; - A544948F23CE546B003E1E07 /* TutorialPagesViewControllers.swift in Sources */ = {isa = PBXBuildFile; fileRef = A544948C23CE546B003E1E07 /* TutorialPagesViewControllers.swift */; }; A5588BF9239B0A7F003E4CA5 /* FavoritesStorage.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5588BF8239B0A7F003E4CA5 /* FavoritesStorage.swift */; }; A591411D23830EB800CCCF67 /* UIApplicationExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A591411C23830EB800CCCF67 /* UIApplicationExtension.swift */; }; A591412123835F4600CCCF67 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = A591412023835F4600CCCF67 /* Constants.swift */; }; - A5B531F22437CD16008C501C /* VersionHistoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5B531F12437CD16008C501C /* VersionHistoryViewController.swift */; }; A5D4E86D24083CF300FD63A0 /* OTPConfigurationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5D4E86C24083CF300FD63A0 /* OTPConfigurationController.swift */; }; A5E9DEB0237DE1660011FBF4 /* SettingsConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5E9DEAF237DE1660011FBF4 /* SettingsConfig.swift */; }; - B40327742847AB5000DF4DB0 /* LicensingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40327732847AB5000DF4DB0 /* LicensingViewController.swift */; }; B40327762847AE0A00DF4DB0 /* Licensing.md in Resources */ = {isa = PBXBuildFile; fileRef = B40327752847AE0A00DF4DB0 /* Licensing.md */; }; B40D61A02AE7F37900467AE9 /* DisableOTPView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D619F2AE7F37900467AE9 /* DisableOTPView.swift */; }; B40D61A22AE7F89500467AE9 /* DisableOTPModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B40D61A12AE7F89500467AE9 /* DisableOTPModel.swift */; }; @@ -94,8 +89,12 @@ B4719B1B298AB641006CDAEA /* MainViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4719B1A298AB641006CDAEA /* MainViewModel.swift */; }; B4719B2C29914051006CDAEA /* AccountRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4719B2B29914051006CDAEA /* AccountRowView.swift */; }; B4719B322993EFEE006CDAEA /* AccountDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4719B312993EFEE006CDAEA /* AccountDetailsView.swift */; }; + B474865C2CEB7A000031A504 /* AboutView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B474865B2CEB79FD0031A504 /* AboutView.swift */; }; + B47486602CEC83F90031A504 /* VersionHistoryView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B474865F2CEC83F50031A504 /* VersionHistoryView.swift */; }; + B47486622CECC2190031A504 /* TutorialView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B47486612CECC2150031A504 /* TutorialView.swift */; }; + B47486642CECC2F50031A504 /* LicensingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B47486632CECC2F00031A504 /* LicensingView.swift */; }; + B47486662CECE36A0031A504 /* UIFont+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B47486652CECE3640031A504 /* UIFont+Extensions.swift */; }; B4901AE42BD697620092E7A2 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = B4901AE32BD697620092E7A2 /* Localizable.xcstrings */; }; - B4901AE92BD7DCC70092E7A2 /* Tutorial.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B4901AE82BD7DCC70092E7A2 /* Tutorial.storyboard */; }; B4901AED2BD7DD160092E7A2 /* AddCredential.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B4901AEC2BD7DD160092E7A2 /* AddCredential.storyboard */; }; B4901AF12BD7DD350092E7A2 /* EditCredential.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B4901AF02BD7DD350092E7A2 /* EditCredential.storyboard */; }; B4901AF42BD7DF960092E7A2 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = B4901AF32BD7DF960092E7A2 /* Localizable.xcstrings */; }; @@ -115,11 +114,9 @@ B4C93E63299FB51A00C2A8B8 /* Account.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4C93E62299FB51A00C2A8B8 /* Account.swift */; }; B4C93E65299FC67800C2A8B8 /* View+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4C93E64299FC67800C2A8B8 /* View+Extensions.swift */; }; B4C93E8929B89DE300C2A8B8 /* DetachedMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4C93E8829B89DE300C2A8B8 /* DetachedMenu.swift */; }; - B4C93E9329C1B2BC00C2A8B8 /* AboutWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4C93E9229C1B2BC00C2A8B8 /* AboutWrapper.swift */; }; B4C93E9529C1B90900C2A8B8 /* AddAccountWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4C93E9429C1B90900C2A8B8 /* AddAccountWrapper.swift */; }; B4D71E812CE4E6E6004D4C29 /* YubiKit in Frameworks */ = {isa = PBXBuildFile; productRef = B4D71E802CE4E6E6004D4C29 /* YubiKit */; }; B4DB228A299BC373003110ED /* OATHSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4DB2289299BC373003110ED /* OATHSession.swift */; }; - B4FE90D02A42028400B59170 /* VersionHistoryWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4FE90CF2A42028400B59170 /* VersionHistoryWrapper.swift */; }; B4FE90D22A4431AB00B59170 /* NotificationsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4FE90D12A4431AB00B59170 /* NotificationsViewModel.swift */; }; B4FE90D42A443D8400B59170 /* TokenRequestWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4FE90D32A443D8400B59170 /* TokenRequestWrapper.swift */; }; B9F0FF11F842A39183974083 /* (null) in Frameworks */ = {isa = PBXBuildFile; }; @@ -200,7 +197,6 @@ 51EEC535246D38B700061A8F /* YKFKeyVersionExtensionsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YKFKeyVersionExtensionsTests.swift; sourceTree = ""; }; 51F8E3BC263847BD0010686B /* ManagementViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagementViewModel.swift; sourceTree = ""; }; 51F8E3BE263848E30010686B /* Connection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Connection.swift; sourceTree = ""; }; - 811CD95622FB276A00E2BCBB /* HelpViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HelpViewController.swift; sourceTree = ""; }; 816C684523430E0700209342 /* SecureStore.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureStore.swift; sourceTree = ""; }; 816C684723430F8E00209342 /* SecureStoreQueryable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureStoreQueryable.swift; sourceTree = ""; }; 816C684F23440D2200209342 /* SecureStoreError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureStoreError.swift; sourceTree = ""; }; @@ -222,15 +218,11 @@ 81FA3C33231AF2D8009C22AB /* AdvancedSettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdvancedSettingsViewController.swift; sourceTree = ""; }; 81FA3C38231AF4F0009C22AB /* UIViewControllerAdditions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIViewControllerAdditions.swift; sourceTree = ""; }; A525965A23A45501006AA3C0 /* UIImageAdditions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIImageAdditions.swift; sourceTree = ""; }; - A544948B23CE546B003E1E07 /* TutorialViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TutorialViewController.swift; sourceTree = ""; }; - A544948C23CE546B003E1E07 /* TutorialPagesViewControllers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TutorialPagesViewControllers.swift; sourceTree = ""; }; A5588BF8239B0A7F003E4CA5 /* FavoritesStorage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FavoritesStorage.swift; sourceTree = ""; }; A591411C23830EB800CCCF67 /* UIApplicationExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIApplicationExtension.swift; sourceTree = ""; }; A591412023835F4600CCCF67 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; - A5B531F12437CD16008C501C /* VersionHistoryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionHistoryViewController.swift; sourceTree = ""; }; A5D4E86C24083CF300FD63A0 /* OTPConfigurationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OTPConfigurationController.swift; sourceTree = ""; }; A5E9DEAF237DE1660011FBF4 /* SettingsConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsConfig.swift; sourceTree = ""; }; - B40327732847AB5000DF4DB0 /* LicensingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LicensingViewController.swift; sourceTree = ""; }; B40327752847AE0A00DF4DB0 /* Licensing.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = Licensing.md; sourceTree = ""; }; B40D619F2AE7F37900467AE9 /* DisableOTPView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisableOTPView.swift; sourceTree = ""; }; B40D61A12AE7F89500467AE9 /* DisableOTPModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DisableOTPModel.swift; sourceTree = ""; }; @@ -254,9 +246,12 @@ B4719B1A298AB641006CDAEA /* MainViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewModel.swift; sourceTree = ""; }; B4719B2B29914051006CDAEA /* AccountRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountRowView.swift; sourceTree = ""; }; B4719B312993EFEE006CDAEA /* AccountDetailsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountDetailsView.swift; sourceTree = ""; }; + B474865B2CEB79FD0031A504 /* AboutView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutView.swift; sourceTree = ""; }; + B474865F2CEC83F50031A504 /* VersionHistoryView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionHistoryView.swift; sourceTree = ""; }; + B47486612CECC2150031A504 /* TutorialView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TutorialView.swift; sourceTree = ""; }; + B47486632CECC2F00031A504 /* LicensingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LicensingView.swift; sourceTree = ""; }; + B47486652CECE3640031A504 /* UIFont+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+Extensions.swift"; sourceTree = ""; }; B4901AE32BD697620092E7A2 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = Localizable.xcstrings; path = Authenticator/Localizable.xcstrings; sourceTree = SOURCE_ROOT; }; - B4901AE72BD7DCC70092E7A2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Tutorial.storyboard; sourceTree = ""; }; - B4901AEA2BD7DCC70092E7A2 /* mul */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = mul; path = mul.lproj/Tutorial.xcstrings; sourceTree = ""; }; B4901AEB2BD7DD160092E7A2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/AddCredential.storyboard; sourceTree = ""; }; B4901AEE2BD7DD160092E7A2 /* mul */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = mul; path = mul.lproj/AddCredential.xcstrings; sourceTree = ""; }; B4901AEF2BD7DD350092E7A2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/EditCredential.storyboard; sourceTree = ""; }; @@ -277,11 +272,9 @@ B4C93E62299FB51A00C2A8B8 /* Account.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Account.swift; sourceTree = ""; }; B4C93E64299FC67800C2A8B8 /* View+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+Extensions.swift"; sourceTree = ""; }; B4C93E8829B89DE300C2A8B8 /* DetachedMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetachedMenu.swift; sourceTree = ""; }; - B4C93E9229C1B2BC00C2A8B8 /* AboutWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutWrapper.swift; sourceTree = ""; }; B4C93E9429C1B90900C2A8B8 /* AddAccountWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddAccountWrapper.swift; sourceTree = ""; }; B4DB2289299BC373003110ED /* OATHSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OATHSession.swift; sourceTree = ""; }; B4E9D46228B65B5100D51FFC /* yubikit-ios */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "yubikit-ios"; path = "../yubikit-ios"; sourceTree = ""; }; - B4FE90CF2A42028400B59170 /* VersionHistoryWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VersionHistoryWrapper.swift; sourceTree = ""; }; B4FE90D12A4431AB00B59170 /* NotificationsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationsViewModel.swift; sourceTree = ""; }; B4FE90D32A443D8400B59170 /* TokenRequestWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenRequestWrapper.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -422,6 +415,7 @@ 817DBA0E2368B7BE001FC18D /* Helpers */ = { isa = PBXGroup; children = ( + B47486652CECE3640031A504 /* UIFont+Extensions.swift */, 515542872656F64100B19C59 /* Data+Extensions.swift */, 515542892656F79500B19C59 /* SecCertificate+Extensions.swift */, 51D1E84B264134F300BDA3FF /* UIAlertController+Extensions.swift */, @@ -500,9 +494,8 @@ 818BE8DA22F3485600061026 /* UI */ = { isa = PBXGroup; children = ( - 81FA3C30231AF198009C22AB /* Help */, + 81FA3C30231AF198009C22AB /* About */, 513D4DEF2660D5960022C53D /* Authentication */, - A544948A23CE546B003E1E07 /* Tutorial */, 513D4DF32660D8DC0022C53D /* TokenSession */, 513D4DF02660D5AB0022C53D /* YubiKeyConfiguration */, 817DBA0E2368B7BE001FC18D /* Helpers */, @@ -567,26 +560,15 @@ path = AddCredential; sourceTree = ""; }; - 81FA3C30231AF198009C22AB /* Help */ = { + 81FA3C30231AF198009C22AB /* About */ = { isa = PBXGroup; children = ( - B4C93E9229C1B2BC00C2A8B8 /* AboutWrapper.swift */, - 811CD95622FB276A00E2BCBB /* HelpViewController.swift */, - B4FE90CF2A42028400B59170 /* VersionHistoryWrapper.swift */, - A5B531F12437CD16008C501C /* VersionHistoryViewController.swift */, - B40327732847AB5000DF4DB0 /* LicensingViewController.swift */, + B474865B2CEB79FD0031A504 /* AboutView.swift */, + B47486612CECC2150031A504 /* TutorialView.swift */, + B474865F2CEC83F50031A504 /* VersionHistoryView.swift */, + B47486632CECC2F00031A504 /* LicensingView.swift */, ); - path = Help; - sourceTree = ""; - }; - A544948A23CE546B003E1E07 /* Tutorial */ = { - isa = PBXGroup; - children = ( - A544948B23CE546B003E1E07 /* TutorialViewController.swift */, - A544948C23CE546B003E1E07 /* TutorialPagesViewControllers.swift */, - B4901AE82BD7DCC70092E7A2 /* Tutorial.storyboard */, - ); - path = Tutorial; + path = About; sourceTree = ""; }; B4E9D45928B65A6E00D51FFC /* Packages */ = { @@ -695,6 +677,7 @@ Base, fr, ja, + sk, ); mainGroup = 818866AA22DFD729006BC0A8; packageReferences = ( @@ -730,7 +713,6 @@ B4901AF12BD7DD350092E7A2 /* EditCredential.storyboard in Resources */, B4901AED2BD7DD160092E7A2 /* AddCredential.storyboard in Resources */, 818866C022DFD72C006BC0A8 /* Assets.xcassets in Resources */, - B4901AE92BD7DCC70092E7A2 /* Tutorial.storyboard in Resources */, B4901B082BD91DA60092E7A2 /* InfoPlist.xcstrings in Resources */, B4901AE42BD697620092E7A2 /* Localizable.xcstrings in Resources */, 818866BE22DFD729006BC0A8 /* Main.storyboard in Resources */, @@ -782,30 +764,31 @@ B4719B17298AA6E7006CDAEA /* MainView.swift in Sources */, B452EC442A2A06940045E5D9 /* ToastPresenter.swift in Sources */, 5156D05D265D2602007A94F8 /* TokenRequestViewController.swift in Sources */, - B4FE90D02A42028400B59170 /* VersionHistoryWrapper.swift in Sources */, A525965B23A45501006AA3C0 /* UIImageAdditions.swift in Sources */, 515542622649C88900B19C59 /* PasswordConfigurationViewModel.swift in Sources */, B40F44452B27033A000D5E02 /* TokenRequestYubiOTPViewController.swift in Sources */, B4C93E60299D156C00C2A8B8 /* ErrorAlertView.swift in Sources */, A591411D23830EB800CCCF67 /* UIApplicationExtension.swift in Sources */, 81FA3C34231AF2D8009C22AB /* AdvancedSettingsViewController.swift in Sources */, + B47486602CEC83F90031A504 /* VersionHistoryView.swift in Sources */, 817DBA0D2368B7B7001FC18D /* UIColorAdditions.swift in Sources */, 513F34C82464658F00FCE030 /* SettingsRowView.swift in Sources */, 51F8E3BF263848E30010686B /* Connection.swift in Sources */, B46E378729C348F100CA0B67 /* EditAccountWrapper.swift in Sources */, B4696F3F2CB6CE5800604F6F /* ConfigurationView.swift in Sources */, B4712B7028DDB5F6009B270D /* AccessKeyCache.swift in Sources */, + B47486642CECC2F50031A504 /* LicensingView.swift in Sources */, 513F34DC246B144300FCE030 /* UIViewAdditions.swift in Sources */, + B47486662CECE36A0031A504 /* UIFont+Extensions.swift in Sources */, A5E9DEB0237DE1660011FBF4 /* SettingsConfig.swift in Sources */, B4719B2C29914051006CDAEA /* AccountRowView.swift in Sources */, B4BB02E82C81C7A700B72904 /* FIDOResetView.swift in Sources */, - B40327742847AB5000DF4DB0 /* LicensingViewController.swift in Sources */, B4DB228A299BC373003110ED /* OATHSession.swift in Sources */, - 811CD95722FB276A00E2BCBB /* HelpViewController.swift in Sources */, B4719B322993EFEE006CDAEA /* AccountDetailsView.swift in Sources */, 51D1E84C264134F300BDA3FF /* UIAlertController+Extensions.swift in Sources */, B4FE90D42A443D8400B59170 /* TokenRequestWrapper.swift in Sources */, 5155428D2657015D00B19C59 /* TokenCertificateStorage.swift in Sources */, + B474865C2CEB7A000031A504 /* AboutView.swift in Sources */, 513F34C22463F44300FCE030 /* EditCredentialController.swift in Sources */, 513D4DF22660D6570022C53D /* AddCredentialController.swift in Sources */, B40D61A22AE7F89500467AE9 /* DisableOTPModel.swift in Sources */, @@ -814,12 +797,10 @@ 5156D05F265D3CEF007A94F8 /* TokenRequestViewModel.swift in Sources */, B4BB02D92C80987B00B72904 /* SettingsButton.swift in Sources */, 5155426A26554CAB00B19C59 /* SmartCardViewModel.swift in Sources */, - B4C93E9329C1B2BC00C2A8B8 /* AboutWrapper.swift in Sources */, B4BB02DE2C80BC8500B72904 /* OATHSavedPasswordsViewModel.swift in Sources */, 515542682654413600B19C59 /* SmartCardConfigurationController.swift in Sources */, 5155428326569ADD00B19C59 /* UIControl+Extensions.swift in Sources */, B452EC1F2A1E4F460045E5D9 /* YubiOtpRowView.swift in Sources */, - A544948F23CE546B003E1E07 /* TutorialPagesViewControllers.swift in Sources */, B4719B19298AA757006CDAEA /* AuthenticatorApp.swift in Sources */, 51394C5C26D4D460009F366D /* MenuGestureRecognizer.swift in Sources */, A5588BF9239B0A7F003E4CA5 /* FavoritesStorage.swift in Sources */, @@ -834,16 +815,15 @@ 513D4DF7266634280022C53D /* ShowTime.swift in Sources */, B4C93E8929B89DE300C2A8B8 /* DetachedMenu.swift in Sources */, 81C4E43D22F94B7B003AFBB8 /* KeySessionError.swift in Sources */, - A544948E23CE546B003E1E07 /* TutorialViewController.swift in Sources */, 51F8E3BD263847BD0010686B /* ManagementViewModel.swift in Sources */, B4BB02E62C81C75E00B72904 /* FIDOResetViewModel.swift in Sources */, 51EEC532246D34ED00061A8F /* YKFKeyVersion+Extensions.swift in Sources */, + B47486622CECC2190031A504 /* TutorialView.swift in Sources */, B4BB02E22C81A82300B72904 /* FIDOPINViewModel.swift in Sources */, B4696F412CB6CF2B00604F6F /* ConfigurationViewModel.swift in Sources */, B4719B1B298AB641006CDAEA /* MainViewModel.swift in Sources */, 51394C5826CFE15F009F366D /* YubiMenu.swift in Sources */, B4BB02DA2C809BE800B72904 /* NFCSettingsController.swift in Sources */, - A5B531F22437CD16008C501C /* VersionHistoryViewController.swift in Sources */, B4C93E65299FC67800C2A8B8 /* View+Extensions.swift in Sources */, 816C685023440D2200209342 /* SecureStoreError.swift in Sources */, 515542602649BDDB00B19C59 /* PasswordStatusViewModel.swift in Sources */, @@ -900,15 +880,6 @@ name = LaunchScreen.storyboard; sourceTree = ""; }; - B4901AE82BD7DCC70092E7A2 /* Tutorial.storyboard */ = { - isa = PBXVariantGroup; - children = ( - B4901AE72BD7DCC70092E7A2 /* Base */, - B4901AEA2BD7DCC70092E7A2 /* mul */, - ); - name = Tutorial.storyboard; - sourceTree = ""; - }; B4901AEC2BD7DD160092E7A2 /* AddCredential.storyboard */ = { isa = PBXVariantGroup; children = ( @@ -944,7 +915,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.8.1; + MARKETING_VERSION = 1.9; PRODUCT_BUNDLE_IDENTIFIER = com.yubico.Authenticator.TokenExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -968,7 +939,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.8.1; + MARKETING_VERSION = 1.9; PRODUCT_BUNDLE_IDENTIFIER = com.yubico.Authenticator.TokenExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -1107,6 +1078,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = Authenticator/Authenticator.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 167; @@ -1119,7 +1091,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MARKETING_VERSION = 1.8.1; + MARKETING_VERSION = 1.9; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = com.yubico.Authenticator; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1137,6 +1109,7 @@ buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_ENTITLEMENTS = Authenticator/Authenticator.entitlements; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 167; @@ -1149,7 +1122,7 @@ "@executable_path/Frameworks", ); LIBRARY_SEARCH_PATHS = ""; - MARKETING_VERSION = 1.8.1; + MARKETING_VERSION = 1.9; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = com.yubico.Authenticator; PRODUCT_NAME = "$(TARGET_NAME)"; diff --git a/Authenticator/Assets.xcassets/AccentColor.colorset/Contents.json b/Authenticator/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000..15925006 --- /dev/null +++ b/Authenticator/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0", + "green" : "0", + "red" : "0" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "255", + "green" : "255", + "red" : "255" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Authenticator/Assets.xcassets/AppIcon.appiconset/Contents.json b/Authenticator/Assets.xcassets/AppIcon.appiconset/Contents.json index 3f79a8e6..69c9e36d 100644 --- a/Authenticator/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Authenticator/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,116 +1,116 @@ { "images" : [ - { - "size" : "20x20", - "idiom": "iphone", - "filename" : "AppIcon-20@2x.png", - "scale": "2x" - }, - { - "size" : "20x20", - "idiom": "iphone", - "filename" : "AppIcon-20@3x.png", - "scale": "3x" - }, - { - "size" : "20x20", - "idiom": "ipad", - "filename" : "AppIcon-20.png", - "scale": "1x" - }, { - "size" : "20x20", - "idiom": "ipad", - "filename" : "AppIcon-20@2x.png", - "scale": "2x" + "filename" : "AppIcon-20@2x.png", + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" }, { - "size" : "29x29", + "filename" : "AppIcon-20@3x.png", "idiom" : "iphone", - "filename" : "AppIcon-29@2x.png", - "scale" : "2x" + "scale" : "3x", + "size" : "20x20" }, { - "size" : "29x29", + "filename" : "AppIcon-29@2x.png", "idiom" : "iphone", - "filename" : "AppIcon-29@3x.png", - "scale" : "3x" + "scale" : "2x", + "size" : "29x29" }, { - "size" : "40x40", + "filename" : "AppIcon-29@3x.png", "idiom" : "iphone", - "filename" : "AppIcon-40@2x.png", - "scale" : "2x" + "scale" : "3x", + "size" : "29x29" }, { - "size" : "40x40", + "filename" : "AppIcon-40@2x.png", "idiom" : "iphone", - "filename" : "AppIcon-40@3x.png", - "scale" : "3x" + "scale" : "2x", + "size" : "40x40" }, { - "size" : "60x60", + "filename" : "AppIcon-40@3x.png", "idiom" : "iphone", - "filename" : "AppIcon-60@2x.png", - "scale" : "2x" + "scale" : "3x", + "size" : "40x40" }, { - "size" : "60x60", + "filename" : "AppIcon-60@2x.png", "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { "filename" : "AppIcon-60@3x.png", - "scale" : "3x" + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" }, { - "size" : "29x29", + "filename" : "AppIcon-20.png", "idiom" : "ipad", - "filename" : "AppIcon-29.png", - "scale" : "1x" + "scale" : "1x", + "size" : "20x20" }, { - "size" : "29x29", + "filename" : "AppIcon-20@2x.png", "idiom" : "ipad", - "filename" : "AppIcon-29@2x.png", - "scale" : "2x" + "scale" : "2x", + "size" : "20x20" }, { - "size" : "40x40", + "filename" : "AppIcon-29.png", "idiom" : "ipad", - "filename" : "AppIcon-40.png", - "scale" : "1x" + "scale" : "1x", + "size" : "29x29" }, { - "size" : "40x40", + "filename" : "AppIcon-29@2x.png", "idiom" : "ipad", - "filename" : "AppIcon-40@2x.png", - "scale" : "2x" + "scale" : "2x", + "size" : "29x29" }, { - "size" : "76x76", + "filename" : "AppIcon-40.png", "idiom" : "ipad", - "filename" : "AppIcon-76.png", - "scale" : "1x" + "scale" : "1x", + "size" : "40x40" }, { - "size" : "76x76", + "filename" : "AppIcon-40@2x.png", "idiom" : "ipad", - "filename" : "AppIcon-76@2x.png", - "scale" : "2x" + "scale" : "2x", + "size" : "40x40" + }, + { + "filename" : "AppIcon-76.png", + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" }, { - "size" : "83.5x83.5", + "filename" : "AppIcon-76@2x.png", "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { "filename" : "AppIcon-83.5@2x.png", - "scale" : "2x" + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" }, { - "size" : "1024x1024", - "idiom" : "ios-marketing", "filename" : "AppIcon-1024.png", - "scale" : "1x" + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } } diff --git a/Authenticator/Assets.xcassets/CustomColors/SheetBackgroundColor.colorset/Contents.json b/Authenticator/Assets.xcassets/CustomColors/SheetBackgroundColor.colorset/Contents.json index 9507b775..730ac1a8 100644 --- a/Authenticator/Assets.xcassets/CustomColors/SheetBackgroundColor.colorset/Contents.json +++ b/Authenticator/Assets.xcassets/CustomColors/SheetBackgroundColor.colorset/Contents.json @@ -23,9 +23,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0", - "green" : "0", - "red" : "0" + "blue" : "30", + "green" : "28", + "red" : "28" } }, "idiom" : "universal" diff --git a/Authenticator/Assets.xcassets/CustomColors/TableBackgroundColor.colorset/Contents.json b/Authenticator/Assets.xcassets/CustomColors/TableBackgroundColor.colorset/Contents.json new file mode 100644 index 00000000..9507b775 --- /dev/null +++ b/Authenticator/Assets.xcassets/CustomColors/TableBackgroundColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.961", + "green" : "0.945", + "red" : "0.949" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0", + "green" : "0", + "red" : "0" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Authenticator/Assets.xcassets/SymbolColor.colorset/Contents.json b/Authenticator/Assets.xcassets/SymbolColor.colorset/Contents.json new file mode 100644 index 00000000..a514b862 --- /dev/null +++ b/Authenticator/Assets.xcassets/SymbolColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0x66", + "green" : "0x66", + "red" : "0x66" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0xCC", + "green" : "0xCC", + "red" : "0xCC" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Authenticator/InfoPlist.xcstrings b/Authenticator/InfoPlist.xcstrings index 9e1e7d67..8c84a117 100644 --- a/Authenticator/InfoPlist.xcstrings +++ b/Authenticator/InfoPlist.xcstrings @@ -22,6 +22,12 @@ "state" : "translated", "value" : "認証" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Autentifikátor" + } } } }, @@ -46,6 +52,12 @@ "state" : "translated", "value" : "アプリケーションはYubiKeyと通信するためにNFC読み取りへのアクセスが必要です。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aplikácia potrebuje prístup k čítaniu NFC, aby mohla komunikovať s vaším YubiKey." + } } } }, @@ -70,6 +82,12 @@ "state" : "translated", "value" : "QRコードをスキャンするには、アプリケーションがカメラにアクセスできる必要があります." } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aplikácia potrebuje prístup ku kamere, aby mohla skenovať QR kódy." + } } } }, @@ -94,6 +112,12 @@ "state" : "translated", "value" : "パスワードボールトのロックを解除するには、アプリケーションがFace IDにアクセスできる必要があります." } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Na odomknutie trezoru s heslom potrebuje aplikácia prístup k službe Face ID." + } } } } diff --git a/Authenticator/Localizable.xcstrings b/Authenticator/Localizable.xcstrings index 8d9c958f..235d225e 100644 --- a/Authenticator/Localizable.xcstrings +++ b/Authenticator/Localizable.xcstrings @@ -14,6 +14,12 @@ "state" : "new", "value" : " " } + }, + "sk" : { + "stringUnit" : { + "state" : "new", + "value" : " " + } } } }, @@ -31,6 +37,12 @@ "state" : "translated", "value" : " このバージョンの" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : " v tejto verzii" + } } } }, @@ -47,6 +59,12 @@ "state" : "translated", "value" : "*** *** " } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "*** *** " + } } } }, @@ -63,6 +81,62 @@ "state" : "translated", "value" : "%@" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@" + } + } + } + }, + "%@ (build %@)" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ (build %2$@)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ (construire %2$@)" + } + }, + "ja" : { + "stringUnit" : { + "state" : "new", + "value" : "%1$@ (build %2$@)" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "%1$@ (zostava %2$@)" + } + } + } + }, + "•" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "•" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "•" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "•" + } } } }, @@ -79,11 +153,17 @@ "state" : "translated", "value" : "888 888" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "888 888" + } } } }, "About" : { - "comment" : "About view navigation title", + "comment" : "About navigation title", "localizations" : { "fr" : { "stringUnit" : { @@ -96,6 +176,12 @@ "state" : "translated", "value" : "概要" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "O aplikácii" + } } } }, @@ -113,6 +199,12 @@ "state" : "translated", "value" : "アカウントが削除されました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Účet bol odstránený" + } } } }, @@ -130,6 +222,12 @@ "state" : "translated", "value" : "アカウント名は空白にできません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Názov účtu nemôže byť prázdny" + } } } }, @@ -147,6 +245,12 @@ "state" : "translated", "value" : "アカウントが設定されていません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Účet nie je nastavený" + } } } }, @@ -164,6 +268,12 @@ "state" : "translated", "value" : "アカウントの名前が変更されました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Účet bol premenovaný" + } } } }, @@ -181,6 +291,12 @@ "state" : "translated", "value" : "アカウント" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Účty" + } } } }, @@ -198,6 +314,12 @@ "state" : "translated", "value" : "NFCを有効化" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivovať NFC" + } } } }, @@ -215,6 +337,12 @@ "state" : "translated", "value" : "アカウントを追加" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pridať účet" + } } } }, @@ -232,6 +360,12 @@ "state" : "translated", "value" : "資格情報を追加" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pridať poverenie" + } } } }, @@ -249,6 +383,12 @@ "state" : "translated", "value" : "アルゴリズム" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algoritmus" + } } } }, @@ -266,6 +406,34 @@ "state" : "translated", "value" : "他のアプリケーションで使用できます" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "a môžu ich používať aj iné aplikácie" + } + } + } + }, + "Application" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Application" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "アプリケーション" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aplikácia" + } } } }, @@ -283,6 +451,12 @@ "state" : "translated", "value" : "認証が必要です" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vyžaduje sa overenie" + } } } }, @@ -300,6 +474,12 @@ "state" : "translated", "value" : "計算" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vypočítať" + } } } }, @@ -317,6 +497,12 @@ "state" : "translated", "value" : "キャンセル" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zrušiť" + } } } }, @@ -334,6 +520,12 @@ "state" : "translated", "value" : "このYubiKeyの証明書を使用して、他のアプリケーションからのリクエストが追加された場合に認証して署名することができます" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Certifikáty na tomto kľúči YubiKey možno použiť na overovanie a podpisovanie požiadaviek z iných aplikácií, ak sa pridajú do tohto" + } } } }, @@ -351,6 +543,12 @@ "state" : "translated", "value" : "YubiKeyの証明書" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Certifikáty na YubiKey" + } } } }, @@ -367,6 +565,12 @@ "state" : "translated", "value" : "変更" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zmeniť" + } } } }, @@ -383,6 +587,12 @@ "state" : "translated", "value" : "パスワードを管理" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zmeniť heslo" + } } } }, @@ -399,6 +609,12 @@ "state" : "translated", "value" : "PINを変更" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zmeniť PIN" + } } } }, @@ -415,6 +631,12 @@ "state" : "translated", "value" : "パスワードを消去する" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vyčistiť heslá" + } } } }, @@ -431,6 +653,12 @@ "state" : "translated", "value" : "このデバイスに保存されているパスワードを消去します。これにより、次回パスワード保護されたYubiKeyを使用する際にパスワードの入力を求められます。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vyčistiť heslá uložené v tomto zariadení. Pri ďalšom použití heslom chráneného kľúča YubiKey sa zobrazí výzva na zadanie hesla." + } } } }, @@ -447,6 +675,12 @@ "state" : "translated", "value" : "保存したパスワードを消去" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vymazať uložené OATH heslá" + } } } }, @@ -463,6 +697,12 @@ "state" : "translated", "value" : "保存したパスワードを消去" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vymazať uložené heslá" + } } } }, @@ -480,6 +720,12 @@ "state" : "translated", "value" : "閉じる" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zavrieť" + } } } }, @@ -497,6 +743,12 @@ "state" : "translated", "value" : "コードが計算されました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kód vypočítaný" + } } } }, @@ -514,6 +766,12 @@ "state" : "translated", "value" : "コードが期限切れです" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kód vypršal" + } } } }, @@ -531,6 +789,12 @@ "state" : "translated", "value" : "コードが計算されていません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kód nie je vypočítaný" + } } } }, @@ -548,6 +812,12 @@ "state" : "translated", "value" : "設定" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastavenie" + } } } }, @@ -565,6 +835,12 @@ "state" : "translated", "value" : "OATHリセットの確認" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Potvrdiť obnovenie OATH" + } } } }, @@ -582,6 +858,34 @@ "state" : "translated", "value" : "ユーザーによる接続のキャンセル" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pripojenie zrušené používateľom" + } + } + } + }, + "Contact support" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Contacter le support" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "サポートへのお問い合わせ" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontaktovať podporu" + } } } }, @@ -598,6 +902,12 @@ "state" : "translated", "value" : "使用制限ありで続行" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pokračovať s obmedzenou použiteľnosťou" + } } } }, @@ -615,6 +925,12 @@ "state" : "translated", "value" : "クリップボードにコピーされました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skopírované do schránky" + } } } }, @@ -632,6 +948,12 @@ "state" : "translated", "value" : "コピー" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kopírovať" + } } } }, @@ -649,6 +971,12 @@ "state" : "translated", "value" : "現在" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktuálne" + } } } }, @@ -665,6 +993,12 @@ "state" : "translated", "value" : "現在のPIN" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktuálny PIN" + } } } }, @@ -681,6 +1015,12 @@ "state" : "translated", "value" : "データから文字列への変換エラー" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chyba prevodu údajov na reťazec" + } } } }, @@ -698,6 +1038,12 @@ "state" : "translated", "value" : "削除" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vymazať" + } } } }, @@ -714,6 +1060,12 @@ "state" : "translated", "value" : "アカウントを削除しますか??" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vymazať účet?" + } } } }, @@ -730,6 +1082,12 @@ "state" : "translated", "value" : "デバイスタイプ" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Typ zariadenia" + } } } }, @@ -747,6 +1105,12 @@ "state" : "translated", "value" : "桁" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Číslice" + } } } }, @@ -763,6 +1127,12 @@ "state" : "translated", "value" : "Yubico OTPを無効にする(推奨)" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zakázať Yubico OTP (odporúčané)" + } } } }, @@ -779,6 +1149,12 @@ "state" : "translated", "value" : "Yubico OTPを無効にすると、YubiKeyがキーボードとして表示されなくなります。Yubico OTPを使用しない場合は、これが推奨される解決策です。Yubico OTPは、設定ページから再度有効にできます." } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zakázanie funkcie Yubico OTP zabráni tomu, aby sa YubiKey zobrazoval ako klávesnica. Ak nepoužívate Yubico OTP, toto je odporúčané riešenie. Túto funkciu môžete znovu povoliť na stránke nastavení." + } } } }, @@ -796,6 +1172,12 @@ "state" : "translated", "value" : "詳細ビューを閉じる" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zrušiť zobrazenie podrobností" + } } } }, @@ -813,6 +1195,12 @@ "state" : "translated", "value" : "アカウントが重複しています" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Duplicitné účty!" + } } } }, @@ -830,6 +1218,12 @@ "state" : "translated", "value" : "有効" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Povolené" + } } } }, @@ -846,6 +1240,12 @@ "state" : "translated", "value" : "現在のパスワード" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "zadajte aktuálne heslo" + } } } }, @@ -862,6 +1262,12 @@ "state" : "translated", "value" : "現在の暗証番号を入力" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "zadajte aktuálny PIN kód" + } } } }, @@ -879,6 +1285,12 @@ "state" : "translated", "value" : "手動で入力" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zadať ručne" + } } } }, @@ -895,6 +1307,12 @@ "state" : "translated", "value" : "新しいパスワード" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "zadajte heslo" + } } } }, @@ -912,6 +1330,12 @@ "state" : "translated", "value" : "パスワードを入力" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zadajte heslo" + } } } }, @@ -928,6 +1352,12 @@ "state" : "translated", "value" : "暗証番号を入力" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "zadajte PIN" + } } } }, @@ -945,6 +1375,12 @@ "state" : "translated", "value" : "証明書にアクセスするにはPINを入力してください。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zadajte PIN kód na prístup k certifikátu." + } } } }, @@ -962,6 +1398,12 @@ "state" : "translated", "value" : "エラー" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chyba" + } } } }, @@ -979,6 +1421,12 @@ "state" : "translated", "value" : "YubiKey読み取りエラー" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chyba pri čítaní YubiKey" + } } } }, @@ -996,6 +1444,12 @@ "state" : "translated", "value" : "設定書き込みエラー" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chyba pri zápise konfigurácie" + } } } }, @@ -1013,6 +1467,12 @@ "state" : "translated", "value" : "証明書の保存に失敗しました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zlyhalo ukladanie certifikátu" + } } } }, @@ -1029,6 +1489,12 @@ "state" : "translated", "value" : "データへのオブジェクトのキャスト失敗エラー" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nepodarilo sa previesť objekt na chybu Data" + } } } }, @@ -1045,6 +1511,12 @@ "state" : "translated", "value" : "FIDO" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIDO" + } } } }, @@ -1062,6 +1534,12 @@ "state" : "translated", "value" : "工場出荷時の状態にリセット" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obnoviť výrobné nastavenia FIDO" + } } } }, @@ -1078,6 +1556,12 @@ "state" : "translated", "value" : "USB-C経由のFIDO管理はiOSではサポートされていません。代わりにNFCまたはデスクトップのYubico Authenticatorをご利用ください。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Systém iOS nepodporuje spravovanie FIDO cez USB-C. Namiesto toho použite NFC alebo Yubico Authenticator na počítači." + } } } }, @@ -1095,6 +1579,12 @@ "state" : "translated", "value" : "USB-C経由のFIDOはiOSではサポートされていません。代わりにNFCまたはデスクトップのYubico Authenticatorをご利用ください。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Systém iOS nepodporuje FIDO cez USB-C. Namiesto toho použite NFC alebo Yubico Authenticator na počítači." + } } } }, @@ -1111,6 +1601,12 @@ "state" : "translated", "value" : "FIDO PIN" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "PIN kód FIDO" + } } } }, @@ -1128,6 +1624,12 @@ "state" : "translated", "value" : "FIDO PIN保護" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ochrana FIDO PIN kódom" + } } } }, @@ -1145,6 +1647,12 @@ "state" : "translated", "value" : "FIDOリセット" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obnoviť FIDO" + } } } }, @@ -1162,6 +1670,12 @@ "state" : "translated", "value" : "証明書の読み取りが終了しました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Čítanie certifikátov dokončené" + } } } }, @@ -1178,6 +1692,12 @@ "state" : "translated", "value" : "ファームウェアバージョン" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verzia firmvéru" + } } } }, @@ -1193,40 +1713,80 @@ "ja" : { "stringUnit" : { "state" : "translated", - "value" : "さらにセキュリティを高め、不正アクセスを防ぐために、FIDOアプリケーションはPINで保護することができる。" + "value" : "さらにセキュリティを高め、不正アクセスを防ぐために、FIDOアプリケーションはPINで保護することができる。" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Na dodatočné zabezpečenie a zabránenie neoprávnenému prístupu môže byť aplikácia FIDO chránená PIN kódom." + } + } + } + }, + "For additional security and to prevent unauthorized access the YubiKey can be password protected." : { + "extractionState" : "stale", + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pour plus de sécurité et pour empêcher tout accès non autorisé, le YubiKey peut être protégé par un mot de passe." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "さらにセキュリティを高め、不正アクセスを防ぐために、YubiKeyはパスワードで保護することができます。" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Na dodatočné zabezpečenie a zabránenie neoprávnenému prístupu môže byť YubiKey chránený heslom." } } } }, - "For additional security and to prevent unauthorized access the YubiKey can be password protected." : { - "extractionState" : "stale", + "GENERAL" : { "localizations" : { "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Pour plus de sécurité et pour empêcher tout accès non autorisé, le YubiKey peut être protégé par un mot de passe." + "value" : "GÉNÉRALITÉS" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "さらにセキュリティを高め、不正アクセスを防ぐために、YubiKeyはパスワードで保護することができます。" + "value" : "一般" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "VŠEOBECNÉ" } } } }, - "GENERAL" : { + "How does it work" : { "localizations" : { "fr" : { "stringUnit" : { "state" : "translated", - "value" : "GÉNÉRALITÉS" + "value" : "Comment cela fonctionne-t-il ?" } }, "ja" : { "stringUnit" : { "state" : "translated", - "value" : "一般" + "value" : "どのように機能するのか" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ako to funguje" } } } @@ -1245,6 +1805,12 @@ "state" : "translated", "value" : "パスワードが正しくありません。パスワードを再入力してください。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nesprávne heslo. Znovu zadajte heslo." + } } } }, @@ -1261,6 +1827,12 @@ "state" : "translated", "value" : "YubiKeyを挿入" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vložte YubiKey" + } } } }, @@ -1277,6 +1849,12 @@ "state" : "translated", "value" : "YubiKeyを挿入してください。またはプルダウンしてNFCを有効にしてください" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vložte kľúč YubiKey alebo potiahnite nadol, aby ste aktivovali NFC" + } } } }, @@ -1294,6 +1872,12 @@ "state" : "translated", "value" : "無効な署名" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Neplatný podpis" + } } } }, @@ -1311,6 +1895,12 @@ "state" : "translated", "value" : "無効なURIフォーマット" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Neplatný formát URI" + } } } }, @@ -1327,6 +1917,12 @@ "state" : "translated", "value" : "アイテムが安全なストレージで見つかりません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Položka sa nenašla v zabezpečenom úložisku" + } } } }, @@ -1344,6 +1940,12 @@ "state" : "translated", "value" : "キーはパスワードで保護されています" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kľúč je chránený heslom" + } } } }, @@ -1361,6 +1963,12 @@ "state" : "translated", "value" : "ライセンス" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Licencie" + } } } }, @@ -1377,6 +1985,12 @@ "state" : "translated", "value" : "パスワードを管理" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spravovať heslo" + } } } }, @@ -1393,6 +2007,12 @@ "state" : "translated", "value" : "PINを変更" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spravovať PIN" + } } } }, @@ -1409,6 +2029,12 @@ "state" : "translated", "value" : "メニュー" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ponuka" + } } } }, @@ -1426,6 +2052,12 @@ "state" : "translated", "value" : "このYubiKeyには使用しないでください" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nikdy pre tento YubiKey" + } } } }, @@ -1443,6 +2075,12 @@ "state" : "translated", "value" : "新しい" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nové" + } } } }, @@ -1460,6 +2098,34 @@ "state" : "translated", "value" : "新しいOTP設定が保存されました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nové nastavenie OTP bolo uložené" + } + } + } + }, + "Next" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Suivant" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "次のページ" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ďalej" + } } } }, @@ -1476,6 +2142,12 @@ "state" : "translated", "value" : "NFC設定" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastavenia NFC" + } } } }, @@ -1493,6 +2165,12 @@ "state" : "translated", "value" : "アカウント情報が見つかりません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nenašli sa žiadne informácie o účte!" + } } } }, @@ -1509,6 +2187,12 @@ "state" : "translated", "value" : "YubiKeyにアカウントがありません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žiadne účty na YubiKey" + } } } }, @@ -1526,6 +2210,12 @@ "state" : "translated", "value" : "カメラの権限がありません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žiadne povolenia na používanie fotoaparátu" + } } } }, @@ -1543,6 +2233,12 @@ "state" : "translated", "value" : "YubiKeyに証明書がありません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žiadne certifikáty na YubiKey" + } } } }, @@ -1559,6 +2255,12 @@ "state" : "translated", "value" : "YubiKeyに一致するアカウントがありません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žiadne zodpovedajúce účty na YubiKey" + } } } }, @@ -1576,6 +2278,12 @@ "state" : "translated", "value" : "名前がありません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žiadne meno" + } } } }, @@ -1593,6 +2301,12 @@ "state" : "translated", "value" : "キーチェーンに公開鍵の証明書がありません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žiadne certifikáty verejného kľúča vo zväzku kľúčov" + } } } }, @@ -1610,6 +2324,12 @@ "state" : "translated", "value" : "QRコードがありませんか?" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Žiadny QR kód?" + } } } }, @@ -1627,6 +2347,12 @@ "state" : "translated", "value" : "有効化されていません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nie je zapnuté" + } } } }, @@ -1644,6 +2370,12 @@ "state" : "translated", "value" : "今はできません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Teraz nie" + } } } }, @@ -1661,6 +2393,12 @@ "state" : "translated", "value" : "有効な資格情報ではありません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Neplatné informácie o poverení" + } } } }, @@ -1678,6 +2416,12 @@ "state" : "translated", "value" : "通知が無効になっています" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Oznámenia sú vypnuté" + } } } }, @@ -1694,6 +2438,12 @@ "state" : "translated", "value" : "OATH" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "OATH" + } } } }, @@ -1711,6 +2461,12 @@ "state" : "translated", "value" : "OATHアカウントが削除され、OATHアプリケーションが工場出荷時のデフォルトにリセットされています。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Účty OATH boli odstránené a aplikácia OATH bola obnovená na predvolené výrobné nastavenia." + } } } }, @@ -1727,6 +2483,12 @@ "state" : "translated", "value" : "OATHパスワード" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Heslo OATH" + } } } }, @@ -1744,6 +2506,12 @@ "state" : "translated", "value" : "オプションのパスワード保護" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ochrana OATH heslom" + } } } }, @@ -1760,6 +2528,12 @@ "state" : "translated", "value" : "OATHパスワード" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Heslá OATH" + } } } }, @@ -1777,6 +2551,12 @@ "state" : "translated", "value" : "OK" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ok" + } } } }, @@ -1794,6 +2574,12 @@ "state" : "translated", "value" : "OK" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "OK" + } } } }, @@ -1811,6 +2597,12 @@ "state" : "translated", "value" : "このYubiKeyで" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "na tomto YubiKey" + } } } }, @@ -1828,6 +2620,12 @@ "state" : "translated", "value" : "iOS設定アプリを開く" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Otvoriť aplikáciu Nastavenia iOS" + } } } }, @@ -1844,6 +2642,12 @@ "state" : "translated", "value" : "オペレーションがタイムアウトしました。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Operácia vypršala." + } } } }, @@ -1860,6 +2664,12 @@ "state" : "translated", "value" : "またはプルダウンしてNFCを有効にします" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "alebo potiahnite nadol, aby ste aktivovali NFC" + } } } }, @@ -1876,6 +2686,12 @@ "state" : "translated", "value" : "またはNFC YubiKeyをスキャンします" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "alebo naskenujte NFC YubiKey" + } } } }, @@ -1892,6 +2708,12 @@ "state" : "translated", "value" : "その他" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Iné" + } } } }, @@ -1910,6 +2732,12 @@ "state" : "translated", "value" : "他のアプリケーションが認証および署名の目的でYubiKeyのクライアント証明書を使用できます。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Iné aplikácie môžu používať klientske certifikáty na vašom YubiKey na účely overovania a podpisovania." + } } } }, @@ -1927,6 +2755,12 @@ "state" : "translated", "value" : "パスワード" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Heslo" + } } } }, @@ -1945,6 +2779,12 @@ "state" : "translated", "value" : "パスワードの文字列は空白にできません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Heslo nemôže byť prázdny reťazec" + } } } }, @@ -1962,6 +2802,12 @@ "state" : "translated", "value" : "パスワードが変更されました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Heslo bolo zmenené" + } } } }, @@ -1979,6 +2825,12 @@ "state" : "translated", "value" : "パスワードが削除されました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Heslo bolo odstránené" + } } } }, @@ -1996,6 +2848,12 @@ "state" : "translated", "value" : "パスワードが設定されました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Heslo bolo nastavené" + } } } }, @@ -2012,6 +2870,12 @@ "state" : "translated", "value" : "パスワード状態の読み取り" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stav hesiel prečítaný" + } } } }, @@ -2028,6 +2892,12 @@ "state" : "translated", "value" : "パスワードが一致しない" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Heslá sa nezhodujú" + } } } }, @@ -2045,6 +2915,12 @@ "state" : "translated", "value" : "期間" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obdobie" + } } } }, @@ -2062,6 +2938,12 @@ "state" : "translated", "value" : "ピン" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pripnúť" + } } } }, @@ -2078,6 +2960,12 @@ "state" : "translated", "value" : "暗証番号が変更されました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "PIN kód bol zmenený" + } } } }, @@ -2094,6 +2982,12 @@ "state" : "translated", "value" : "暗証番号が設定されている" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "PIN bol nastavený" + } } } }, @@ -2110,6 +3004,12 @@ "state" : "translated", "value" : "PINは永久にブロックされます。FIDOアプリケーションを工場出荷時にリセットしてください。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "PIN je trvalo zablokovaný. Ak chcete pokračovať, obnovte výrobné nastavenie aplikácie FIDO." + } } } }, @@ -2121,10 +3021,16 @@ "value" : "Le code PIN est temporairement bloqué. Retirez et réinsérez YubiKey pour réessayer." } }, - "ja" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "PINが一時的にブロックされています。YubiKeyを取り外して再度挿入してください。" + } + }, + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "PINが一時的にブロックされています。YubiKeyを取り外して再度挿入してください。" + "value" : "PIN je dočasne zablokovaný. Vyberte a znovu vložte kľúč YubiKey a skúste to znova." } } } @@ -2142,6 +3048,12 @@ "state" : "translated", "value" : "暗証番号は少なくとも %llu。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "PIN kód by mal mať aspoň %llu znakov." + } } } }, @@ -2158,6 +3070,12 @@ "state" : "translated", "value" : "PIN状態読み取り" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stav PIN kódov prečítaný" + } } } }, @@ -2174,6 +3092,12 @@ "state" : "translated", "value" : "ピン留め" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pripnuté" + } } } }, @@ -2191,6 +3115,12 @@ "state" : "translated", "value" : "PIN が一致しません." } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "PIN kódy sa nezhodujú." + } } } }, @@ -2207,6 +3137,12 @@ "state" : "translated", "value" : "PIN が一致しません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "PIN kódy sa nezhodujú" + } } } }, @@ -2223,6 +3159,12 @@ "state" : "translated", "value" : "PIV" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "PIV" + } } } }, @@ -2240,6 +3182,12 @@ "state" : "translated", "value" : "YubiKeyをその操作のために接続してください" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zapojte svoj YubiKey pre túto operáciu" + } } } }, @@ -2257,6 +3205,34 @@ "state" : "translated", "value" : "スキャンするにはカメラをQRコードに向けてください" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nasmerujte kameru na QR kód a naskenujte ho" + } + } + } + }, + "Privacy policy" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confidentialité" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "プライバシーポリシー" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zásady ochrany osobných údajov" + } } } }, @@ -2274,6 +3250,12 @@ "state" : "translated", "value" : "公開鍵証明書の対象" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Certifikáty verejného kľúča na" + } } } }, @@ -2290,6 +3272,12 @@ "state" : "translated", "value" : "パスワード再入力" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "znovu zadajte heslo" + } } } }, @@ -2306,6 +3294,12 @@ "state" : "translated", "value" : "暗証番号の再入力" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "opätovne zadajte PIN" + } } } }, @@ -2323,6 +3317,12 @@ "state" : "translated", "value" : "詳細を読む..." } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Čítajte viac..." + } } } }, @@ -2340,6 +3340,12 @@ "state" : "translated", "value" : "YubiKey OTP設定を読み取る" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Načítať nastavenie YubiKey OTP" + } } } }, @@ -2357,6 +3363,12 @@ "state" : "translated", "value" : "YubiKeyを再挿入してください." } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Opätovne vložte svoj YubiKey." + } } } }, @@ -2373,6 +3385,12 @@ "state" : "translated", "value" : "削除" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odstrániť" + } } } }, @@ -2389,6 +3407,12 @@ "state" : "translated", "value" : "YubiKeyを取り外して再挿入してください" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odstráňte a znovu vložte váš YubiKey" + } } } }, @@ -2406,6 +3430,12 @@ "state" : "translated", "value" : "YubiKeyを取り外して再挿入してください" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odstráňte a znovu vložte váš YubiKey" + } } } }, @@ -2423,6 +3453,12 @@ "state" : "translated", "value" : "パスワードを削除" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odstrániť heslo" + } } } }, @@ -2440,6 +3476,12 @@ "state" : "translated", "value" : "名前変更" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Premenovať" + } } } }, @@ -2457,6 +3499,12 @@ "state" : "translated", "value" : "リセット" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obnoviť" + } } } }, @@ -2473,6 +3521,12 @@ "state" : "translated", "value" : "YubiKeyに保存されているすべてのアカウントをリセットします。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obnovte všetky účty uložené na YubiKey. Predtým sa uistite, že sa nikde nepoužívajú." + } } } }, @@ -2489,6 +3543,12 @@ "state" : "translated", "value" : "FIDOのリセット" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obnoviť FIDO" + } } } }, @@ -2506,6 +3566,12 @@ "state" : "translated", "value" : "FIDOアプリケーションのリセット" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obnoviť aplikáciu FIDO" + } } } }, @@ -2522,6 +3588,12 @@ "state" : "translated", "value" : "誓いのリセット" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obnoviť OATH" + } } } }, @@ -2538,6 +3610,12 @@ "state" : "translated", "value" : "OATHアプリケーションのリセット" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obnoviť aplikáciu OATH" + } } } }, @@ -2555,6 +3633,12 @@ "state" : "translated", "value" : "を使用して保存および保護" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uložiť a chrániť pomocou" + } } } }, @@ -2571,6 +3655,12 @@ "state" : "translated", "value" : "%@を使用して保存および保護" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uložiť a chrániť pomocou %@" + } } } }, @@ -2588,6 +3678,12 @@ "state" : "translated", "value" : "パスワードを保存" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uložiť heslo" + } } } }, @@ -2605,6 +3701,12 @@ "state" : "translated", "value" : "パスワードを保存" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uložiť heslo" + } } } }, @@ -2622,6 +3724,12 @@ "state" : "translated", "value" : "パスワードを保存しますか?" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uložiť heslo?" + } } } }, @@ -2639,6 +3747,12 @@ "state" : "translated", "value" : "保存されたパスワードがクリアされました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uložené heslá boli vymazané" + } } } }, @@ -2655,6 +3769,12 @@ "state" : "translated", "value" : "NFC YubiKeyをスキャン" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skenovať NFC YubiKey" + } } } }, @@ -2672,6 +3792,12 @@ "state" : "translated", "value" : "YubiKeyをスキャン" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Naskenujte svoj YubiKey" + } } } }, @@ -2688,6 +3814,12 @@ "state" : "translated", "value" : "検索" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hľadať" + } } } }, @@ -2705,6 +3837,12 @@ "state" : "translated", "value" : "参照 " } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pozrite " + } } } }, @@ -2721,6 +3859,12 @@ "state" : "translated", "value" : "シリアル番号" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sériové číslo" + } } } }, @@ -2737,6 +3881,12 @@ "state" : "translated", "value" : "セット" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastaviť" + } } } }, @@ -2753,6 +3903,12 @@ "state" : "translated", "value" : "パスワードを設定" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastaviť heslo" + } } } }, @@ -2769,6 +3925,12 @@ "state" : "translated", "value" : "PINを設定" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastaviť PIN" + } } } }, @@ -2786,6 +3948,12 @@ "state" : "translated", "value" : "設定" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastavenia" + } } } }, @@ -2803,6 +3971,12 @@ "state" : "translated", "value" : "署名に失敗しました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podpisovanie sa nepodarilo" + } } } }, @@ -2820,6 +3994,12 @@ "state" : "translated", "value" : "スマートカード拡張機能" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rozšírenie čipovej karty" + } } } }, @@ -2838,6 +4018,12 @@ "state" : "translated", "value" : "スマートカード拡張機能は、iOS 14.5以降でのみ使用できます。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rozšírenie inteligentnej karty je k dispozícii len v systéme iOS 14.5 a novších." + } } } }, @@ -2854,6 +4040,12 @@ "state" : "translated", "value" : "問題が発生しました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Niečo sa pokazilo" + } } } }, @@ -2871,6 +4063,12 @@ "state" : "translated", "value" : "問題が発生し、キーが応答しません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Niečo sa pokazilo a kľúč nereaguje" + } } } }, @@ -2887,6 +4085,12 @@ "state" : "translated", "value" : "文字列からデータへの変換エラー" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chyba prevodu reťazca na dáta" + } } } }, @@ -2904,6 +4108,12 @@ "state" : "translated", "value" : "成功" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hotovo" + } } } }, @@ -2921,6 +4131,12 @@ "state" : "translated", "value" : "成功しました。\nヒント:下にスワイプして閉じます" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Úspech! \nTip: potiahnite prstom nadol pre zrušenie" + } } } }, @@ -2938,6 +4154,12 @@ "state" : "translated", "value" : "読み取りに成功しました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Úspešne prečítané" + } } } }, @@ -2950,10 +4172,60 @@ "value" : "Données signées avec succès" } }, - "ja" : { + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "データの署名に成功しました" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Úspešne podpísané údaje" + } + } + } + }, + "Support" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Soutien" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "サポート" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podpora" + } + } + } + }, + "Terms of use" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Conditions d'utilisation" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "利用規約" + } + }, + "sk" : { "stringUnit" : { "state" : "translated", - "value" : "データの署名に成功しました" + "value" : "Podmienky používania" } } } @@ -2972,6 +4244,12 @@ "state" : "translated", "value" : "YubiKeyのFIDOアプリケーションは工場出荷時の状態にリセットされています。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aplikácia FIDO na vašom kľúči YubiKey bola obnovená na predvolené výrobné nastavenia." + } } } }, @@ -2989,6 +4267,12 @@ "state" : "translated", "value" : "キーが応答しません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kľúč nereaguje" + } } } }, @@ -3007,6 +4291,12 @@ "state" : "translated", "value" : "パスワードが一致しません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Heslá sa nezhodujú" + } } } }, @@ -3024,6 +4314,12 @@ "state" : "translated", "value" : "YubiKeyの秘密鍵が証明書と一致しないか、YubiKeyに秘密鍵が保存されていません。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Súkromný kľúč na YubiKey sa nezhoduje s certifikátom alebo na YubiKey nie je uložený žiadny súkromný kľúč." + } } } }, @@ -3041,6 +4337,12 @@ "state" : "translated", "value" : "YubiKeyの秘密鍵が証明書と一致しません。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Súkromný kľúč na YubiKey sa nezhoduje s certifikátom." + } } } }, @@ -3058,6 +4360,12 @@ "state" : "translated", "value" : "スマートカード拡張機能では、Yubico Authenticatorの通知を有効にする必要があります。iOS設定で有効にしてください。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rozšírenie čipovej karty vyžaduje, aby boli pre Yubico Authenticator povolené oznámenia. Povoľte ich v nastaveniach iOS." + } } } }, @@ -3074,6 +4382,12 @@ "state" : "translated", "value" : "YubiKeyにはもうOATHアカウント用のストレージはない。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "YubiKey už nemá miesto na úložisku pre účty OATH." + } } } }, @@ -3091,6 +4405,12 @@ "state" : "translated", "value" : "という名前のアカウントがすでに存在します" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Už existuje účet s názvom" + } } } }, @@ -3108,6 +4428,12 @@ "state" : "translated", "value" : "これらの証明書はこれに追加されています" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tieto certifikáty boli pridané do tohto" + } } } }, @@ -3124,6 +4450,12 @@ "state" : "translated", "value" : "本YubiKeyでは、Lightning経由でのこの操作はサポートされていません。FIDOアプリケーションをリセットするには、Yubico Authenticator for desktopをご利用ください。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Táto operácia nie je podporovaná cez Lightning na tomto YubiKey. Na obnovenie aplikácie FIDO použite Yubico Authenticator pre počítač." + } } } }, @@ -3141,6 +4473,34 @@ "state" : "translated", "value" : "このQRコードはサポートされていません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tento QR kód nie je podporovaný" + } + } + } + }, + "This translation is a community effort, please visit [crowdin.com](https://crowdin.com/project/yubico-authenticator-ios) to contribute." : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cette traduction est le fruit d'un effort communautaire, veuillez visiter [crowdin.com](https://crowdin.com/project/yubico-authenticator-ios) pour y contribuer." + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "この翻訳はコミュニティーの努力の賜物です。[crowdin.com](https://crowdin.com/project/yubico-authenticator-ios)にアクセスして貢献してください。" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tento preklad je výsledkom komunity, ak chcete prispieť, navštívte stránku [crowdin.com](https://crowdin.com/project/yubico-authenticator-ios)." + } } } }, @@ -3158,6 +4518,12 @@ "state" : "translated", "value" : "このバージョンのiOSでは、LightningやNFCでのYubiKeyを使用した操作はサポートされていません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Táto verzia iOS nepodporuje operácie s YubiKey cez Lightning ani cez NFC" + } } } }, @@ -3174,6 +4540,12 @@ "state" : "translated", "value" : "これにより、すべてのOATH TOTP/HOTPアカウントがYubiKeyから削除されます。削除は取り消すことができません。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tým sa z vášho YubiKey nenávratne vymažú všetky účty OATH TOTP/HOTP." + } } } }, @@ -3190,6 +4562,12 @@ "state" : "translated", "value" : "警告!これにより、すべてのU2FおよびFIDO2アカウントがパスキーを含めてYubiKeyから削除されます。削除は取り消すことができません。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tým sa z vášho YubiKey nenávratne odstránia všetky účty U2F a FIDO2 vrátane prístupových kľúčov." + } } } }, @@ -3206,6 +4584,12 @@ "state" : "translated", "value" : "これにより、YubiKeyからアカウントが完全に削除され、コードを生成できなくなります!" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Týmto sa účet natrvalo odstráni z YubiKey a vaša možnosť generovať preň kódy!" + } } } }, @@ -3222,6 +4606,12 @@ "state" : "translated", "value" : "このYubiKeyはYubico OTPが有効になっているため、iPhoneへの外付けキーボードとして表示されます。これが原因で、標準のオンスクリーンキーボードで問題が発生します." } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tento kľúč YubiKey má aktivovanú funkciu Yubico OTP, vďaka ktorej sa javí ako externá klávesnica pre iPhone. Bohužiaľ to spôsobuje problém s normálnou klávesnicou na obrazovke." + } } } }, @@ -3238,6 +4628,12 @@ "state" : "translated", "value" : "不正アクセスを防ぐため、FIDOアプリケーションはPINで保護することができる。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aby sa zabránilo neoprávnenému prístupu, aplikácia FIDO môže byť chránená PIN kódom." + } } } }, @@ -3254,6 +4650,12 @@ "state" : "translated", "value" : "不正アクセスを防ぐため、OATHアプリケーションはパスワードで保護することができます。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aby sa zabránilo neoprávnenému prístupu, aplikácia OATH môže byť chránená heslom." + } } } }, @@ -3271,6 +4673,12 @@ "state" : "translated", "value" : "不正アクセスを防止するため、このYubiKeyはパスワードで保護されます。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aby sa zabránilo neoprávnenému prístupu, je tento kľúč YubiKey chránený heslom." + } } } }, @@ -3288,6 +4696,12 @@ "state" : "translated", "value" : "QRコードをスキャンするには、Authenticatorアプリのカメラ権限を有効にする必要があります。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ak chcete naskenovať QR kód, musíte zapnúť povolenia kamery pre aplikáciu Authenticator." + } } } }, @@ -3304,6 +4718,12 @@ "state" : "translated", "value" : "ワンタイムパスワードの切り替え" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prepnúť jednorazové heslo" + } } } }, @@ -3321,6 +4741,12 @@ "state" : "translated", "value" : "ここでYubiKeyのボタンをタッチしてください." } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Teraz sa dotknite tlačidla na YubiKey." + } } } }, @@ -3338,6 +4764,12 @@ "state" : "translated", "value" : "タイプ" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Typ" + } } } }, @@ -3354,6 +4786,12 @@ "state" : "translated", "value" : "未処理エラー" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nespracovaná chyba" + } } } }, @@ -3370,6 +4808,12 @@ "state" : "translated", "value" : "不明なエラー" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Neznáma chyba" + } } } }, @@ -3387,6 +4831,12 @@ "state" : "translated", "value" : "YubiKeyのロックを解除" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odomknút YubiKey" + } } } }, @@ -3404,6 +4854,12 @@ "state" : "translated", "value" : "ピン解除" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zrušiť pripnutie" + } } } }, @@ -3421,6 +4877,12 @@ "state" : "translated", "value" : "YubiKeyを抜いてください." } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odpojte svoj YubiKey." + } } } }, @@ -3438,6 +4900,34 @@ "state" : "translated", "value" : "PUKコードを使用してPINをリセットします。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Na obnovenie PIN kódu použite PUK kód." + } + } + } + }, + "User guide" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Guide d'utilisation" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "ユーザーガイド" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Používateľská príručka" + } } } }, @@ -3455,11 +4945,17 @@ "state" : "translated", "value" : "ベリファイ" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Overiť" + } } } }, "Version history" : { - "comment" : "Version history navigation title", + "comment" : "About navigation title", "localizations" : { "fr" : { "stringUnit" : { @@ -3472,6 +4968,12 @@ "state" : "translated", "value" : "バージョン履歴" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "História verzie" + } } } }, @@ -3488,6 +4990,12 @@ "state" : "translated", "value" : "警告だ!" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Varovanie!" + } } } }, @@ -3505,11 +5013,41 @@ "state" : "translated", "value" : "新機能" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "čo je nové" + } + } + } + }, + "What's new" : { + "comment" : "About navigation title", + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nouveautés" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "新着情報" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Čo je nové" + } } } }, "What's new in\nYubico Authenticator" : { - "comment" : "Version history title", + "comment" : "About navigation title", + "extractionState" : "stale", "localizations" : { "fr" : { "stringUnit" : { @@ -3522,6 +5060,12 @@ "state" : "translated", "value" : "Yubico Authenticator\nの新機能" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Čo je nové v aplikácii\nYubico Authenticator" + } } } }, @@ -3538,6 +5082,12 @@ "state" : "translated", "value" : "YubiKeyが挿入されている間は、オンスクリーンキーボードが表示されません。キーボードを表示するにはYubiKeyを取り外し、その後再挿入する必要があります." } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kým je YubiKey vložený, klávesnica na obrazovke sa nezobrazí. Ak chcete zobraziť klávesnicu, musíte vybrať YubiKey a potom ho znova vložiť." + } } } }, @@ -3555,6 +5105,12 @@ "state" : "translated", "value" : "YubiKeyのこのパスワードを保存して、このアプリケーションで次回使用しますか?" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chcete toto heslo pre YubiKey uložiť na ďalšie použitie v tejto aplikácii?" + } } } }, @@ -3572,6 +5128,12 @@ "state" : "translated", "value" : "パスワードが正しくありません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nesprávne heslo" + } } } }, @@ -3589,6 +5151,12 @@ "state" : "translated", "value" : "PINコードが正しくありません" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nesprávny PIN kód" + } } } }, @@ -3606,6 +5174,12 @@ "state" : "translated", "value" : "保存されたパスワードは設定で削除できます。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uložené heslo môžete odstrániť v Nastaveniach." + } } } }, @@ -3622,6 +5196,12 @@ "state" : "translated", "value" : "認証情報とPINセットがこのYubiKeyから削除されます。アカウントからロックアウトされないよう、初めに各Webサイトからこれらを無効にしてください。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vaše poverovacie údaje, ako aj všetky nastavené PIN kódy budú z tohto kľúča YubiKey odstránené. Uistite sa, že ste ich najprv deaktivovali na príslušných webových stránkach, aby ste sa vyhli vymknutiu zo svojich účtov." + } } } }, @@ -3639,6 +5219,34 @@ "state" : "translated", "value" : "PINがブロックされました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Váš PIN bol zablokovaný" + } + } + } + }, + "Yubico Authenticator" : { + "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yubico Authenticator" + } + }, + "ja" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yubico Authenticator" + } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yubico Authenticator" + } } } }, @@ -3655,6 +5263,12 @@ "state" : "translated", "value" : "Yubico OTP" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yubico OTP" + } } } }, @@ -3672,6 +5286,12 @@ "state" : "translated", "value" : "Yubico OTP有効" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yubico OTP povolené" + } } } }, @@ -3688,6 +5308,12 @@ "state" : "translated", "value" : "Yubico OTPが無効になっています" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yubico OTP bolo vypnuté" + } } } }, @@ -3705,6 +5331,12 @@ "state" : "translated", "value" : "YubiKeyがリセットされました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "YubiKey bol obnovený" + } } } }, @@ -3722,6 +5354,12 @@ "state" : "translated", "value" : "YubiKeyの情報が読み込まれました" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "YubiKey informácie prečítané" + } } } } diff --git a/Authenticator/UI/About/AboutView.swift b/Authenticator/UI/About/AboutView.swift new file mode 100644 index 00000000..47397588 --- /dev/null +++ b/Authenticator/UI/About/AboutView.swift @@ -0,0 +1,137 @@ +/* + * Copyright (C) Yubico. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 SwiftUI + +struct AboutView: View { + + @Environment(\.dismiss) private var dismiss + + var body: some View { + NavigationView { + List { + VStack(alignment: .center) { + Image(.icon) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 100, height: 100) + .clipShape(RoundedRectangle(cornerRadius: 20, style: .continuous)) + .padding(15) + .accessibilityHidden(true) + Text("Yubico Authenticator") + .font(.title) + .multilineTextAlignment(.center) + Text("\(UIApplication.appVersion) (build \(UIApplication.appBuildNumber))") + .font(.body) + AboutLanguageView() + } + .frame(maxWidth: .infinity) + .padding(.top, 10) + .padding(.horizontal, 20) + .listRowBackground(Color.black.opacity(0)) + + Section("Application") { + NavigationLink { + TutorialView() + } label: { + ListIconView(image: Image(systemName: "lightbulb"), color: Color(.systemOrange)) + Text("How does it work") + } + NavigationLink { + VersionHistoryView(presentedFromMainView: false) + .navigationTitle(String(localized: "Version history", comment: "About navigation title")) + } label: { + ListIconView(image: Image(systemName: "list.clipboard"), color: Color(.systemGreen)) + Text("Version history") + } + Button { + UIApplication.shared.open(URL(string: "https://www.yubico.com/support/terms-conditions/yubico-license-agreement/")!) + } label: { + HStack { + ListIconView(image: Image(systemName: "doc.text"), color: Color(.secondaryLabel)) + Text("Terms of use") + } + } + Button { + UIApplication.shared.open(URL(string: "https://www.yubico.com/support/terms-conditions/privacy-notice/")!) + } label: { + HStack { + ListIconView(image: Image(systemName: "person.badge.shield.checkmark"), color: Color(.secondaryLabel)) + Text("Privacy policy") + } + } + NavigationLink { + LicensingView() + } label: { + HStack { + ListIconView(image: Image(systemName: "doc.text"), color: Color(.secondaryLabel)) + Text("Licensing") + } + } + } + Section("Support") { + Button { + UIApplication.shared.open(URL(string: "https://docs.yubico.com/software/yubikey/tools/authenticator/auth-guide/index.html")!) + } label: { + HStack { + ListIconView(image: Image(systemName: "book"), color: Color(.systemPink)) + Text("User guide") + } + } + Button { + UIApplication.shared.open(URL(string: "https://support.yubico.com/support/tickets/new")!) + } label: { + HStack { + ListIconView(image: Image(systemName: "person.crop.circle.badge.questionmark"), color: Color(.systemRed), padding: 5) + Text("Contact support") + } + } + } + } + .navigationTitle(String(localized: "About", comment: "About navigation title")) + .toolbar { + ToolbarItem(placement: .primaryAction) { + Button("Close") { + dismiss() + } + } + } + } + } +} + +struct AboutLanguageView: View { + + var shouldShowLanguageNote: Bool { + guard let langCode = Bundle.main.preferredLocalizations.first else { return false } + return langCode.lowercased() == "sk" + } + + var body: some View { + if shouldShowLanguageNote { + Text("This translation is a community effort, please visit [crowdin.com](https://crowdin.com/project/yubico-authenticator-ios) to contribute.") + .multilineTextAlignment(.center) + .font(.footnote) + .foregroundStyle(.secondary) + .padding(.top, 15) + } else { + EmptyView() + } + } + +} diff --git a/Authenticator/UI/About/LicensingView.swift b/Authenticator/UI/About/LicensingView.swift new file mode 100644 index 00000000..acdd85d6 --- /dev/null +++ b/Authenticator/UI/About/LicensingView.swift @@ -0,0 +1,36 @@ +/* + * Copyright (C) Yubico. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 SwiftUI + +struct LicensingView: View { + var body: some View { + List { + Text(self.licensingText()) + .font(.footnote) + } + .navigationTitle("Licensing") + } +} + +extension LicensingView { + private func licensingText() -> AttributedString { + guard let filepath = Bundle.main.path(forResource: "Licensing", ofType: "md"), + let licensingMarkdown = try? String(contentsOfFile: filepath) else { fatalError() } + return try! AttributedString(markdown: licensingMarkdown, options: AttributedString.MarkdownParsingOptions(interpretedSyntax: .inlineOnlyPreservingWhitespace)) + } +} diff --git a/Authenticator/UI/About/TutorialView.swift b/Authenticator/UI/About/TutorialView.swift new file mode 100644 index 00000000..8e77c460 --- /dev/null +++ b/Authenticator/UI/About/TutorialView.swift @@ -0,0 +1,109 @@ +/* + * Copyright (C) Yubico. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 SwiftUI + +struct TutorialView: View { + + @State var page: Int = 0 + + var body: some View { + NavigationView { + TabView(selection: $page) { + ForEach(Array(self.tutorialPages.enumerated()), id: \.element) { index, tutorialPage in + ScrollView { + VStack { + Text(tutorialPage.title) + .multilineTextAlignment(.center) + .font(.title) + .bold() + tutorialPage.image.padding(30) + Text(tutorialPage.text) + .multilineTextAlignment(.center).foregroundStyle(.secondary) + tutorialPage.link.map { link in + Button { + UIApplication.shared.open(link) + } label: { + Text("Read more...").bold() + } + .padding(.top, 30) + } + Spacer() + } + .padding(30) + + }.tag(index) + } + } + } + .onAppear() { + // Page indicator is white in light mode and is not visible on white background. + UIPageControl.appearance().currentPageIndicatorTintColor = .label + UIPageControl.appearance().pageIndicatorTintColor = .secondaryLabel + } + .tabViewStyle(.page(indexDisplayMode: .always)) + .toolbar { + ToolbarItem(placement: .primaryAction) { + Button("Next") { + withAnimation { + page += 1 + } + }.disabled(page >= self.tutorialPages.count - 1) + } + } + } +} + +struct TutorialPageModel: Hashable, Identifiable { + var id: Int { self.hashValue } + + func hash(into hasher: inout Hasher) { + hasher.combine(title) + hasher.combine(text) + hasher.combine(link) + } + + let title: String + let image: Image + let text: String + let link: URL? +} + +extension TutorialView { + var tutorialPages: [TutorialPageModel] { + [TutorialPageModel(title: "How it works", + image: Image(.authAppImgLight), + text: "Get a shared secret from any service you wish to secure, store it on the YubiKey and use it to generate your security codes." + "\n\n" + "You will need a YubiKey 5Ci or a compatible YubiKey with NFC to get started.", + link: URL(string: "https://www.yubico.com/")!), + + TutorialPageModel(title: "YubiKey 5Ci authentication", + image: Image(.authAppIntro2Yk5Ci), + text: "If you have a YubiKey 5Ci, plug it in." + "\n\n" + "Touch the contacts on the sides when prompted.", + link: nil), + + TutorialPageModel(title: "YubiKey 5 Series NFC authentication", + image: Image(.authAppIntro3YkNfc), + text: "If you have a YubiKey with NFC, pull down the main view to activate NFC." + "\n\n" + "Hold the key horizontally and tilt the iPhone towards the key.\n\nTouch the center of the key to the edge of the phone.", + link: nil), + + TutorialPageModel(title: "Where to get QR codes", + image: Image(.authAppIntro4QrCode), + text: "QR codes are available from the services you wish to secure." + "\n\n" + "Simply scan the QR code when you add your YubiKey and generate your own security codes.", + link: nil) + ] + } +} diff --git a/Authenticator/UI/About/VersionHistoryView.swift b/Authenticator/UI/About/VersionHistoryView.swift new file mode 100644 index 00000000..6d120453 --- /dev/null +++ b/Authenticator/UI/About/VersionHistoryView.swift @@ -0,0 +1,157 @@ +/* + * Copyright (C) Yubico. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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 SwiftUI + +struct VersionHistoryView: View { + + @Environment(\.dismiss) private var dismiss + var presentedFromMainView: Bool + private static var changes: [Change] = { [Change].init(withChangesFrom: "VersionHistory.plist") ?? [Change]() }() + + var body: some View { + List { + if presentedFromMainView { + VStack(alignment: .center) { + Image(.icon) + .resizable() + .aspectRatio(contentMode: .fit) + .frame(width: 80, height: 80) + .clipShape(RoundedRectangle(cornerRadius: 20, style: .continuous)) + .padding(15) + .accessibilityHidden(true) + Text("Yubico Authenticator") + .font(.title) + .multilineTextAlignment(.center) + Text("\(UIApplication.appVersion) (build \(UIApplication.appBuildNumber))") + .font(.body) + } + .frame(maxWidth: .infinity) + .listRowBackground(Color(.sheetBackground)) + } + Section { + ForEach(VersionHistoryView.changes) { change in + VersionHistoryRowView(version: change.version, releaseDate: change.date, note: change.text, bullets: change.rows) + } + } + } + .toolbar { + if presentedFromMainView { + ToolbarItem(placement: .primaryAction) { + Button("Close") { + dismiss() + } + } + } + } + } +} + +struct VersionHistoryRowView: View { + let version: String + let releaseDate: Date + let note: String? + let bullets: [String] + + let dateFormatter = { + let dateFormatter = DateFormatter() + dateFormatter.dateStyle = .medium + dateFormatter.doesRelativeDateFormatting = true + return dateFormatter + }() + + var body: some View { + VStack { + HStack { + Text(version).bold() + Spacer() + Text(dateFormatter.string(from: releaseDate)).foregroundStyle(.secondary) + }.padding(.bottom, 5) + note.map { + Text($0) + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity, alignment: .leading) + } + ForEach(bullets, id: \.self) { bullet in + HStack(alignment: .top) { + Text("•").bold().padding(.trailing, 0) + Text(bullet) + .multilineTextAlignment(.leading) + .frame(maxWidth: .infinity, alignment: .leading) + .padding(.trailing, 5) + }.padding(.top, 5) + } + } + } +} + +extension VersionHistoryView { + static var shouldShowOnAppLaunch: Bool { + // Wait for first application update before showing whats new on app launch + // Go back in history until we reach the update last shown and search for changes that should be prompted + guard let lastVersionPrompted = SettingsConfig.lastWhatsNewVersionShown else { + SettingsConfig.lastWhatsNewVersionShown = UIApplication.appVersion + return false + } + + for change in changes { + if change.version == lastVersionPrompted { return false } + if change.shouldPromptUser { return true } + } + return false + } +} + +fileprivate extension Array where Element == Change { + init?(withChangesFrom: String) { + guard + let resource = withChangesFrom.split(separator: ".").first, + let fileExtension = withChangesFrom.split(separator: ".").last, + let url = Bundle.main.url(forResource: String(resource), withExtension: String(fileExtension)), + let changes = NSArray(contentsOf: url) as? [[String:Any]] + else { return nil } + self = changes.map { Change($0) }.compactMap { $0 } + } +} + +fileprivate struct Change: Identifiable { + var id: String { version } + let shouldPromptUser: Bool + let version: String + let date: Date + let text: String? + let rows: [String] + + init?(_ dictionary: [String:Any]) { + guard + let version = dictionary["version"] as? String, + let text = dictionary["changes"] as? String, + let date = dictionary["date"] as? Date, + let shouldPromptUser = dictionary["shouldPromptUser"] as? Bool + else { return nil } + self.version = version + self.date = date + self.shouldPromptUser = shouldPromptUser + let parts = text.components(separatedBy: " - ") + self.text = parts.first.map { String($0).trimmingCharacters(in: .whitespacesAndNewlines) } + self.rows = parts.dropFirst().compactMap { row in + guard !row.isEmpty else { return nil } + return String(row).trimmingCharacters(in: .whitespacesAndNewlines) + } + } + +} diff --git a/Authenticator/UI/Authentication/AddCredential/AddAccountWrapper.swift b/Authenticator/UI/Authentication/AddCredential/AddAccountWrapper.swift index 612809d6..e444b370 100644 --- a/Authenticator/UI/Authentication/AddCredential/AddAccountWrapper.swift +++ b/Authenticator/UI/Authentication/AddCredential/AddAccountWrapper.swift @@ -28,9 +28,6 @@ struct AddAccountView: View { _showAddAccount = showAddCredential self.oathURL = oathURL self.accountSubject = accountSubject - navigationBarAppearance.shadowColor = .secondarySystemBackground - navigationBarAppearance.backgroundColor = .secondarySystemBackground - UINavigationBar.appearance().scrollEdgeAppearance = navigationBarAppearance } var body: some View { @@ -68,9 +65,3 @@ struct AddCredentialWrapper: UIViewControllerRepresentable { typealias UIViewControllerType = UINavigationController } - -struct AddCredentialWrapper_Previews: PreviewProvider { - static var previews: some View { - HelpWrapper() - } -} diff --git a/Authenticator/UI/Authentication/AddCredential/Base.lproj/AddCredential.storyboard b/Authenticator/UI/Authentication/AddCredential/Base.lproj/AddCredential.storyboard index e2e38556..49fa8dbf 100644 --- a/Authenticator/UI/Authentication/AddCredential/Base.lproj/AddCredential.storyboard +++ b/Authenticator/UI/Authentication/AddCredential/Base.lproj/AddCredential.storyboard @@ -1,9 +1,9 @@ - + - + @@ -151,7 +151,7 @@ - + @@ -329,10 +329,10 @@ - + - - + + diff --git a/Authenticator/UI/Authentication/AddCredential/ScanAccountView.swift b/Authenticator/UI/Authentication/AddCredential/ScanAccountView.swift index 636f5e70..b809e212 100644 --- a/Authenticator/UI/Authentication/AddCredential/ScanAccountView.swift +++ b/Authenticator/UI/Authentication/AddCredential/ScanAccountView.swift @@ -107,12 +107,12 @@ class ScanAccountView: UIView, AVCaptureMetadataOutputObjectsDelegate { private let checkboxImageView: UIImageView = { var configuration = UIImage.SymbolConfiguration(pointSize: 250) - if #available(iOS 15.0, *) { - configuration = configuration.applying(UIImage.SymbolConfiguration(paletteColors: [.white, .yubiGreen])) - } +// if #available(iOS 15.0, *) { +// configuration = configuration.applying(UIImage.SymbolConfiguration(paletteColors: [.white, .yubiGreen])) +// } let image = UIImage(systemName: "checkmark.circle.fill")?.withConfiguration(configuration) let imageView = UIImageView(image: image) - imageView.tintColor = .yubiGreen +// imageView.tintColor = .yubiGreen imageView.transform = CGAffineTransform(scaleX: 2.5, y: 2.5) imageView.alpha = 0 return imageView @@ -367,7 +367,7 @@ extension ScanAccountView { return result } - private func createOverlay(frameColor: UIColor = .yubiGreen, background: UIColor = UIColor.black.withAlphaComponent(0.6)) -> UIView { + private func createOverlay(frameColor: UIColor = .systemGreen, background: UIColor = UIColor.black.withAlphaComponent(0.6)) -> UIView { let overlayView = UIView(frame: CGRect(x: frame.origin.x, y: frame.origin.y, width: frame.size.width, height: frame.size.height * 1.5)) // make size 50% larger than needed to handle orientation changes from landscape to portrait overlayView.backgroundColor = background diff --git a/Authenticator/UI/Authentication/AddCredential/mul.lproj/AddCredential.xcstrings b/Authenticator/UI/Authentication/AddCredential/mul.lproj/AddCredential.xcstrings index 8c23c020..81e02536 100644 --- a/Authenticator/UI/Authentication/AddCredential/mul.lproj/AddCredential.xcstrings +++ b/Authenticator/UI/Authentication/AddCredential/mul.lproj/AddCredential.xcstrings @@ -22,6 +22,12 @@ "state" : "translated", "value" : "桁" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Číslice" + } } } }, @@ -46,6 +52,12 @@ "state" : "translated", "value" : "タイプ" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Typ" + } } } }, @@ -70,6 +82,12 @@ "state" : "translated", "value" : "発行者" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vydavateľ" + } } } }, @@ -94,6 +112,12 @@ "state" : "translated", "value" : "6" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "6" + } } } }, @@ -118,6 +142,12 @@ "state" : "translated", "value" : "アカウントを追加" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pridať účet" + } } } }, @@ -142,6 +172,12 @@ "state" : "translated", "value" : "期間" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obdobie" + } } } }, @@ -166,6 +202,12 @@ "state" : "translated", "value" : "タッチが必要" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vyžadovať dotyk" + } } } }, @@ -190,6 +232,12 @@ "state" : "translated", "value" : "30" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "30" + } } } }, @@ -214,6 +262,12 @@ "state" : "translated", "value" : "通常、これらの設定は変更しないでください。変更すると、コードが想定どおりに動作しなくなる可能性があります" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Za normálnych okolností by sa tieto nastavenia nemali meniť, pretože to môže spôsobiť, že kód nebude fungovať tak, ako sa očakáva" + } } } }, @@ -238,6 +292,12 @@ "state" : "translated", "value" : "高度な設定" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rozšírené nastavenia" + } } } }, @@ -262,6 +322,12 @@ "state" : "translated", "value" : "TOTP" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "TOTP" + } } } }, @@ -286,6 +352,12 @@ "state" : "translated", "value" : "秘密鍵" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tajný údaj" + } } } }, @@ -310,6 +382,12 @@ "state" : "translated", "value" : "john@doe.com" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "john@doe.com" + } } } }, @@ -334,6 +412,12 @@ "state" : "translated", "value" : "SHA1" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "SHA1" + } } } }, @@ -358,6 +442,12 @@ "state" : "translated", "value" : "秘密鍵" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tajný údaj" + } } } }, @@ -382,6 +472,12 @@ "state" : "translated", "value" : "アカウント名" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Názov účtu" + } } } }, @@ -406,6 +502,12 @@ "state" : "translated", "value" : "オプション" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Voliteľné" + } } } }, @@ -430,6 +532,12 @@ "state" : "translated", "value" : "アカウント詳細" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podrobnosti o účte" + } } } }, @@ -454,6 +562,12 @@ "state" : "translated", "value" : "アルゴリズム" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Algoritmus" + } } } } diff --git a/Authenticator/UI/Authentication/EditCredential/Base.lproj/EditCredential.storyboard b/Authenticator/UI/Authentication/EditCredential/Base.lproj/EditCredential.storyboard index 6f763f91..65c43aa5 100644 --- a/Authenticator/UI/Authentication/EditCredential/Base.lproj/EditCredential.storyboard +++ b/Authenticator/UI/Authentication/EditCredential/Base.lproj/EditCredential.storyboard @@ -1,9 +1,9 @@ - + - + @@ -106,7 +106,7 @@ - + diff --git a/Authenticator/UI/Authentication/EditCredential/mul.lproj/EditCredential.xcstrings b/Authenticator/UI/Authentication/EditCredential/mul.lproj/EditCredential.xcstrings index d9404c76..79e8139a 100644 --- a/Authenticator/UI/Authentication/EditCredential/mul.lproj/EditCredential.xcstrings +++ b/Authenticator/UI/Authentication/EditCredential/mul.lproj/EditCredential.xcstrings @@ -3,7 +3,7 @@ "strings" : { "1gZ-3p-mE7.text" : { "comment" : "Class = \"UITextField\"; text = \"jens.utbult@yubico.com\"; ObjectID = \"1gZ-3p-mE7\";", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -22,6 +22,12 @@ "state" : "translated", "value" : "jens.utbult@yubico.com" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "jens.utbult@yubico.com" + } } } }, @@ -46,6 +52,12 @@ "state" : "translated", "value" : "名前変更" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Premenovať" + } } } }, @@ -70,6 +82,12 @@ "state" : "translated", "value" : "キャンセル" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zrušiť" + } } } }, @@ -94,6 +112,12 @@ "state" : "translated", "value" : "保存" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uložiť" + } } } } diff --git a/Authenticator/UI/Base.lproj/Main.storyboard b/Authenticator/UI/Base.lproj/Main.storyboard index 90234e99..ac23acef 100644 --- a/Authenticator/UI/Base.lproj/Main.storyboard +++ b/Authenticator/UI/Base.lproj/Main.storyboard @@ -1,289 +1,15 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -946,7 +672,6 @@ All rights reserved. - diff --git a/Authenticator/UI/Help/AboutWrapper.swift b/Authenticator/UI/Help/AboutWrapper.swift deleted file mode 100644 index b3d30d45..00000000 --- a/Authenticator/UI/Help/AboutWrapper.swift +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) Yubico. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * 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 SwiftUI - - -struct AboutView: View { - - @Binding var showAbout: Bool - let navigationBarAppearance = UINavigationBarAppearance() - - init(showHelp: Binding ) { - navigationBarAppearance.shadowColor = .secondarySystemBackground - navigationBarAppearance.backgroundColor = .secondarySystemBackground - UINavigationBar.appearance().scrollEdgeAppearance = navigationBarAppearance - _showAbout = showHelp - } - - var body: some View { - NavigationView { - HelpWrapper() - .navigationTitle(String(localized: "About", comment: "About view navigation title")) - .navigationBarItems(trailing: Button(String(localized: "Close", comment: "View close button")) { - showAbout.toggle() - }) - .ignoresSafeArea(.all, edges: .bottom) - } - } -} - -struct HelpWrapper: UIViewControllerRepresentable { - func makeUIViewController(context: Context) -> HelpViewController { - let sb = UIStoryboard(name: "Main", bundle: nil) - let vc = sb.instantiateViewController(identifier: "HelpViewController") as! HelpViewController - return vc - } - - func updateUIViewController(_ uiViewController: HelpViewController, context: Context) { - } - - typealias UIViewControllerType = HelpViewController -} - -struct HelpWrapper_Previews: PreviewProvider { - static var previews: some View { - HelpWrapper() - } -} diff --git a/Authenticator/UI/Help/HelpViewController.swift b/Authenticator/UI/Help/HelpViewController.swift deleted file mode 100644 index d7a5010b..00000000 --- a/Authenticator/UI/Help/HelpViewController.swift +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2022 Yubico. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * 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 - -class HelpViewController: UITableViewController { - - // MARK: - Table view data source - - @IBOutlet weak var versionLabel: UILabel! - - override func viewDidLoad() { - super.viewDidLoad() - versionLabel.text = "\(UIApplication.appVersion) (build \(UIApplication.appBuildNumber))" - } - - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - switch (indexPath.section, indexPath.row) { - case (0, 1): - let whatsNewController = VersionHistoryViewController() - self.present(whatsNewController, animated: true) - case (0, 2): - if let url = URL(string: "https://www.yubico.com/support/terms-conditions/yubico-license-agreement/") { - UIApplication.shared.open(url) - } - case (0, 3): - if let url = URL(string: "https://www.yubico.com/support/terms-conditions/privacy-notice/") { - UIApplication.shared.open(url) - } - case (0, 4): - let licensingViewController = LicensingViewController() - self.navigationController?.pushViewController(licensingViewController, animated: true) - case (1, 0): - if let url = URL(string: "https://support.yubico.com/") { - UIApplication.shared.open(url) - } - case (1, 1): - if let url = URL(string: "https://support.yubico.com/support/tickets/new") { - UIApplication.shared.open(url) - } - default: - break - } - tableView.deselectRow(at: indexPath, animated: true) - } -} diff --git a/Authenticator/UI/Help/LicensingViewController.swift b/Authenticator/UI/Help/LicensingViewController.swift deleted file mode 100644 index b6cda45d..00000000 --- a/Authenticator/UI/Help/LicensingViewController.swift +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2022 Yubico. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * 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 - -class LicensingViewController: UIViewController { - - let textView = UITextView() - - override func viewDidLoad() { - super.viewDidLoad() - self.title = String(localized: "Licensing", comment: "Licensing view navigation title") - self.view = textView - self.navigationItem.largeTitleDisplayMode = .never - textView.textContainerInset = UIEdgeInsets(top: 15, left: 15, bottom: 15, right: 15) - guard let filepath = Bundle.main.path(forResource: "Licensing", ofType: "md"), - let licensingMarkdown = try? String(contentsOfFile: filepath) else { return } - if #available(iOS 15, *) { - var attributedString = try! AttributedString(markdown: licensingMarkdown, options: AttributedString.MarkdownParsingOptions(interpretedSyntax: .inlineOnlyPreservingWhitespace)) - attributedString.foregroundColor = .primaryText - textView.attributedText = NSAttributedString(attributedString) - } else { - textView.text = licensingMarkdown - } - } -} diff --git a/Authenticator/UI/Help/VersionHistoryViewController.swift b/Authenticator/UI/Help/VersionHistoryViewController.swift deleted file mode 100644 index c6870119..00000000 --- a/Authenticator/UI/Help/VersionHistoryViewController.swift +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright (C) 2022 Yubico. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * 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 -import QuartzCore -import Combine - -class VersionHistoryViewController: UIViewController { - - private var cancellable: Cancellable? - private var closeButton = UIButton() - private var titleLabel = UILabel() - var closeBlock: (() -> ())? - - var closeButtonText: String = String(localized: "Close", comment: "View close button") { - didSet { - closeButton.setTitle(closeButtonText, for: .normal) - } - } - - var titleText: String = String(localized: "Version history", comment: "Version history navigation title") { - didSet { - titleLabel.text = titleText - } - } - - static var shouldShowOnAppLaunch: Bool { - // Wait for first application update before showing whats new on app launch - // Go back in history until we reach the update last shown and search for changes that should be prompted - guard let lastVersionPrompted = SettingsConfig.lastWhatsNewVersionShown else { - SettingsConfig.lastWhatsNewVersionShown = UIApplication.appVersion - return false - } - - for change in changes { - if change.version == lastVersionPrompted { return false } - if change.shouldPromptUser { return true } - } - return false - } - - private static var changes: [Change] = { [Change].init(withChangesFrom: "VersionHistory.plist") ?? [Change]() }() - - override func viewDidLoad() { - super.viewDidLoad() - - SettingsConfig.lastWhatsNewVersionShown = UIApplication.appVersion - - view.backgroundColor = .systemBackground - - let scrollView = UIScrollView() - scrollView.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(scrollView) - - let maskView = GradientView() - maskView.translatesAutoresizingMaskIntoConstraints = false - view.addSubview(maskView) - - cancellable = closeButton.addHandler(for: .touchUpInside) { [weak self] in - self?.dismiss(animated: true) { - self?.closeBlock?() - } - } - closeButton.backgroundColor = .yubiBlue - closeButton.translatesAutoresizingMaskIntoConstraints = false - closeButton.layer.cornerRadius = 15 - closeButton.setTitle(closeButtonText, for: .normal) - closeButton.titleLabel?.font = .preferredFont(forTextStyle: .title3) - closeButton.contentEdgeInsets = UIEdgeInsets(top: 12, left: 12, bottom: 12, right: 12) - view.addSubview(closeButton) - NSLayoutConstraint.activate([scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor), - scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor), - scrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor), - scrollView.bottomAnchor.constraint(equalTo: closeButton.topAnchor), - closeButton.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 20), - closeButton.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -20), - closeButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -10), - maskView.bottomAnchor.constraint(equalTo: closeButton.topAnchor), - maskView.leadingAnchor.constraint(equalTo: view.leadingAnchor), - maskView.trailingAnchor.constraint(equalTo: view.trailingAnchor), - maskView.heightAnchor.constraint(equalToConstant: 100) - ]) - - let appIcon = UIImageView(image: UIImage(named: "icon")) - appIcon.translatesAutoresizingMaskIntoConstraints = false - appIcon.layer.cornerRadius = 10 - appIcon.clipsToBounds = true - scrollView.addSubview(appIcon) - - titleLabel.translatesAutoresizingMaskIntoConstraints = false - titleLabel.text = titleText - - titleLabel.font = .preferredFont(forTextStyle: .title1).withSymbolicTraits(.traitBold) - titleLabel.textAlignment = .center - titleLabel.numberOfLines = 0 -// titleLabel.minimumScaleFactor = 0.5 -// titleLabel.adjustsFontSizeToFitWidth = true - scrollView.addSubview(titleLabel) - - let stack = UIStackView() - stack.translatesAutoresizingMaskIntoConstraints = false - stack.axis = .vertical - scrollView.addSubview(stack) - - NSLayoutConstraint.activate([appIcon.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: 60), - appIcon.centerXAnchor.constraint(equalTo: scrollView.centerXAnchor), - appIcon.bottomAnchor.constraint(equalTo: titleLabel.topAnchor, constant: -20), - titleLabel.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 10), - titleLabel.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: -10), - titleLabel.bottomAnchor.constraint(equalTo: stack.topAnchor, constant: -25), - stack.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor, constant: 20), - stack.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor, constant: -20), - stack.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor), - stack.widthAnchor.constraint(equalTo: scrollView.widthAnchor, constant: -40) - ]) - - let dateFormatter = DateFormatter() - dateFormatter.dateStyle = .medium - dateFormatter.doesRelativeDateFormatting = true - - Self.changes.forEach { change in - let changeHeaderStack = UIStackView() - let versionLabel = UILabel() - versionLabel.font = .preferredFont(forTextStyle: .body).withSymbolicTraits(.traitBold) - versionLabel.text = change.version - changeHeaderStack.addArrangedSubview(versionLabel) - let dateLabel = UILabel() - dateLabel.font = .preferredFont(forTextStyle: .body).withSymbolicTraits(.traitBold) - dateLabel.text = dateFormatter.string(from: change.date) - dateLabel.textAlignment = .right - dateLabel.textColor = .secondaryText - changeHeaderStack.addArrangedSubview(dateLabel) - stack.addArrangedSubview(changeHeaderStack) - stack.setCustomSpacing(5, after: changeHeaderStack) - - if let changeText = change.text { - let changeLabel = UILabel() - changeLabel.font = .preferredFont(forTextStyle: .body) - changeLabel.text = changeText - changeLabel.numberOfLines = 0 - changeLabel.lineBreakMode = .byWordWrapping - stack.addArrangedSubview(changeLabel) - stack.setCustomSpacing(5, after: changeLabel) - } - - change.rows.forEach { - let rowStack = UIStackView() - rowStack.alignment = .top - - let bulletLabel = UILabel() - bulletLabel.font = .preferredFont(forTextStyle: .body) - bulletLabel.text = " • " - - bulletLabel.setContentHuggingPriority(.required, for: .horizontal) - bulletLabel.setContentCompressionResistancePriority(.required, for: .horizontal) - rowStack.addArrangedSubview(bulletLabel) - - let label = UILabel() - label.font = .preferredFont(forTextStyle: .body) - label.text = $0 - label.numberOfLines = 0 - label.lineBreakMode = .byWordWrapping - rowStack.addArrangedSubview(label) - stack.addArrangedSubview(rowStack) - } - - - stack.setCustomSpacing(20, after: stack.arrangedSubviews.last!) - - let dividerView = UIView() - dividerView.translatesAutoresizingMaskIntoConstraints = false - dividerView.backgroundColor = UIColor(named: "MenuDivider") - stack.addArrangedSubview(dividerView) - NSLayoutConstraint.activate([dividerView.heightAnchor.constraint(equalToConstant: 1), - dividerView.widthAnchor.constraint(equalTo: stack.widthAnchor) - ]) - stack.setCustomSpacing(20, after: dividerView) - } - stack.setCustomSpacing(50, after: stack.arrangedSubviews.last!) - stack.addArrangedSubview(UIView()) - } -} - - -extension Array where Element == Change { - init?(withChangesFrom: String) { - guard - let resource = withChangesFrom.split(separator: ".").first, - let fileExtension = withChangesFrom.split(separator: ".").last, - let url = Bundle.main.url(forResource: String(resource), withExtension: String(fileExtension)), - let changes = NSArray(contentsOf: url) as? [[String:Any]] - else { return nil } - self = changes.map { Change($0) }.compactMap { $0 } - } -} - -struct Change { - - let shouldPromptUser: Bool - let version: String - let date: Date - let text: String? - let rows: [String] - - init?(_ dictionary: [String:Any]) { - guard - let version = dictionary["version"] as? String, - let text = dictionary["changes"] as? String, - let date = dictionary["date"] as? Date, - let shouldPromptUser = dictionary["shouldPromptUser"] as? Bool - else { return nil } - self.version = version - self.date = date - self.shouldPromptUser = shouldPromptUser - let parts = text.components(separatedBy: " - ") - self.text = parts.first.map { String($0).trimmingCharacters(in: .whitespacesAndNewlines) } - self.rows = parts.dropFirst().compactMap { row in - guard !row.isEmpty else { return nil } - return String(row).trimmingCharacters(in: .whitespacesAndNewlines) - } - } - -} - - -extension UIFont { - /// Returns a new font in the same family with the given symbolic traits, - /// or `nil` if none found in the system. - func withSymbolicTraits(_ traits: UIFontDescriptor.SymbolicTraits) -> UIFont? { - guard let descriptorWithTraits = fontDescriptor.withSymbolicTraits(traits) - else { return nil } - return UIFont(descriptor: descriptorWithTraits, size: 0) - } -} - - -class GradientView: UIView { - - init() { - super.init(frame: .zero) - backgroundColor = .systemBackground - let gradientLayer = CAGradientLayer() - gradientLayer.colors = [UIColor.clear.cgColor, UIColor.black.cgColor] - layer.mask = gradientLayer - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func layoutSubviews() { - layer.mask?.frame = self.bounds - } -} diff --git a/Authenticator/UI/Help/VersionHistoryWrapper.swift b/Authenticator/UI/Help/VersionHistoryWrapper.swift deleted file mode 100644 index cb3ea782..00000000 --- a/Authenticator/UI/Help/VersionHistoryWrapper.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// VersionHistoryWrapper.swift -// Authenticator -// -// Created by Jens Utbult on 2023-06-20. -// Copyright © 2023 Yubico. All rights reserved. -// - -import SwiftUI - -struct VersionHistoryView: View { - - let title: String - - var body: some View { - VersionHistoryWrapper(title: title) - } -} - -struct VersionHistoryWrapper: UIViewControllerRepresentable { - - let title: String - - func makeUIViewController(context: Context) -> VersionHistoryViewController { - let vc = VersionHistoryViewController() - vc.titleText = title - return vc - } - - func updateUIViewController(_ uiViewController: VersionHistoryViewController, context: Context) { - } - - typealias UIViewControllerType = VersionHistoryViewController -} diff --git a/Authenticator/UI/Helpers/UIFont+Extensions.swift b/Authenticator/UI/Helpers/UIFont+Extensions.swift new file mode 100644 index 00000000..ce78676f --- /dev/null +++ b/Authenticator/UI/Helpers/UIFont+Extensions.swift @@ -0,0 +1,25 @@ +/* + * Copyright (C) Yubico. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +extension UIFont { + /// Returns a new font in the same family with the given symbolic traits, + /// or `nil` if none found in the system. + func withSymbolicTraits(_ traits: UIFontDescriptor.SymbolicTraits) -> UIFont? { + guard let descriptorWithTraits = fontDescriptor.withSymbolicTraits(traits) + else { return nil } + return UIFont(descriptor: descriptorWithTraits, size: 0) + } +} diff --git a/Authenticator/UI/ListStatusView.swift b/Authenticator/UI/ListStatusView.swift index 66f2bdd8..d5c99394 100644 --- a/Authenticator/UI/ListStatusView.swift +++ b/Authenticator/UI/ListStatusView.swift @@ -30,7 +30,7 @@ struct ListStatusView: View { Spacer() image .font(.system(size: 100.0)) - .foregroundColor(.secondary) + .foregroundColor(Color(.symbol)) .accessibilityHidden(true) Text(message) .font(.title3) @@ -46,7 +46,11 @@ struct ListStatusView: View { .frame(height: height - 100) .listRowSeparator(.hidden) .sheet(isPresented: $showWhatsNew) { - VersionHistoryView(title: String(localized: "What's new in\nYubico Authenticator", comment: "Version history title")) + NavigationView { + VersionHistoryView(presentedFromMainView: true) + .navigationTitle(String(localized: "What's new", comment: "About navigation title")) + + } } } } @@ -57,7 +61,7 @@ struct WhatsNewView: View { var see = AttributedString(localized: "See ", comment: "Substring in \"See what's new in this version\"") see.foregroundColor = .secondaryLabel var whatsNew = AttributedString(localized: "what's new", comment: "Substring in \"See what's new in this version\"") - whatsNew.foregroundColor = Color(.yubiBlue) + whatsNew.foregroundColor = .label var inThisVersion = AttributedString(localized: " in this version", comment: "Substring in \"See what's new in this version\"") inThisVersion.foregroundColor = .secondaryLabel return see + whatsNew + inThisVersion diff --git a/Authenticator/UI/MainView.swift b/Authenticator/UI/MainView.swift index dbfcf534..c36d5f2e 100644 --- a/Authenticator/UI/MainView.swift +++ b/Authenticator/UI/MainView.swift @@ -158,7 +158,7 @@ struct MainView: View { } } .fullScreenCover(isPresented: $showAbout) { - AboutView(showHelp: $showAbout) + AboutView() .onAppear { model.stop() }.onDisappear { diff --git a/Authenticator/UI/Tutorial/Base.lproj/Tutorial.storyboard b/Authenticator/UI/Tutorial/Base.lproj/Tutorial.storyboard deleted file mode 100644 index 6c8bbcc7..00000000 --- a/Authenticator/UI/Tutorial/Base.lproj/Tutorial.storyboard +++ /dev/null @@ -1,433 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Authenticator/UI/Tutorial/TutorialPagesViewControllers.swift b/Authenticator/UI/Tutorial/TutorialPagesViewControllers.swift deleted file mode 100644 index 48c03fbc..00000000 --- a/Authenticator/UI/Tutorial/TutorialPagesViewControllers.swift +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2022 Yubico. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * 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 - -class TutorialOpenUrlViewController: UIViewController { - @IBAction func openUrl(_ sender: Any) { - guard - let button = sender as? UrlButton, - let urlString = button.value(forKeyPath: "url") as? String, - let url = URL(string: urlString) - else { return } - UIApplication.shared.open(url) - } -} - -class UrlButton: UIButton { - @IBInspectable var url : String? -} - -class TutorialWelcomeViewController: TutorialOpenUrlViewController { - static let identifier = "FreWelcomeViewController" -} - -class Tutorial5CiViewController: UIViewController { - static let identifier = "Fre5CiViewController" -} - -class TutorialNFCViewController: UIViewController { - static let identifier = "FreNfcViewController" -} - -class TutorialQRViewController: UIViewController { - static let identifier = "FreQRViewController" -} diff --git a/Authenticator/UI/Tutorial/TutorialViewController.swift b/Authenticator/UI/Tutorial/TutorialViewController.swift deleted file mode 100644 index 7a1df248..00000000 --- a/Authenticator/UI/Tutorial/TutorialViewController.swift +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) 2022 Yubico. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * 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 - -/* - This class is presenting UIPageController with First User Experience information about app and features on first install. It's using 3 ViewControllers that you can scroll through with options of skipping or swiping down or using NextBarButton to go to the next page. It's located in Fre.storyboard and presented modally from MainViewController using segue. - */ - -class TutorialViewController: UIPageViewController { - - @IBOutlet weak var nextBarButton: UIBarButtonItem! - @IBOutlet weak var skipBarButton: UIBarButtonItem! - - @IBAction func next(_ sender: Any) { - if let currentViewController = viewControllers?[0], let nextViewController = pageViewController(self, viewControllerAfter: currentViewController) { - setNavigationBar(nextViewController: nextViewController) - setViewControllers([nextViewController], direction: .forward, animated: true, completion: nil) - } - } - - @IBAction func skip(_ sender: Any) { - self.dismiss(animated: true, completion: nil) - } - - // Will use this property to manage FRE pages in the future releases. - var userFreVersion = 0 - - private(set) lazy var orderedViewControllers: [UIViewController] = { - var viewControllers: [UIViewController?] = [] - - if userFreVersion < 1 { - viewControllers.append(self.createViewController(withIdentifier: TutorialWelcomeViewController.identifier)) - viewControllers.append(self.createViewController(withIdentifier: TutorialQRViewController.identifier)) - viewControllers.append(self.createViewController(withIdentifier: Tutorial5CiViewController.identifier)) - viewControllers.append(self.createViewController(withIdentifier: TutorialNFCViewController.identifier)) - } - - return viewControllers.compactMap { $0 } - }() - - // Invoking manually since UIPageViewController doesn't let to add pageControl - // to itself via storyboard because it's already there but is not visible under - // UIPageViewController elements hierarchy in storyboard. - private var pageControl: UIPageControl { - return view.subviews.first(where: { $0 is UIPageControl}) as! UIPageControl - } - - override func viewDidLoad() { - super.viewDidLoad() - delegate = self - dataSource = self - // When view.background color is not set, part of the mainViewController is - // visible when present modally UIPageViewController, by default - // view.background is transperent. - self.view.backgroundColor = .background - - setViewControllers([orderedViewControllers[0]], direction: .forward, animated: true, completion: nil) - setNavigationBar(nextViewController: orderedViewControllers[0]) - } - - override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - // when indicator colors are not set, pageControl is not visible in light mode - pageControl.currentPageIndicatorTintColor = .yubiBlue - pageControl.pageIndicatorTintColor = .secondaryText - } - - // When it's the last page changing 'Skip' to 'Close' and disabling 'Next'. - private func setNavigationBar(nextViewController: UIViewController) { - if nextViewController == orderedViewControllers.last { - self.nextBarButton.isEnabled = false - self.skipBarButton.title = "Close" - } else { - self.nextBarButton.isEnabled = true - } - } - - private func createViewController(withIdentifier id: String) -> UIViewController { - let stboard = UIStoryboard(name: "Tutorial", bundle: nil) - return stboard.instantiateViewController(withIdentifier: id) - } -} - -// -// MARK: - UIPageViewControllerDelegate -// - -extension TutorialViewController: UIPageViewControllerDelegate { - - func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { - if finished, let currentViewController = pageViewController.viewControllers?[0] { - setNavigationBar(nextViewController: currentViewController) - } - } -} - -// -// MARK: - UIPageViewControllerDataSource -// - -extension TutorialViewController: UIPageViewControllerDataSource { - - func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { - guard let viewControllerIndex = orderedViewControllers.firstIndex(of: viewController) else { - return nil - } - - let previousIndex = viewControllerIndex - 1 - guard previousIndex >= 0 else { - return nil - } - - guard orderedViewControllers.count > previousIndex else { - return nil - } - - return orderedViewControllers[previousIndex] - } - - func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { - guard let viewControllerIndex = orderedViewControllers.firstIndex(of: viewController) else { - return nil - } - - let nextIndex = viewControllerIndex + 1 - - guard orderedViewControllers.count != nextIndex else { - return nil - } - - guard orderedViewControllers.count > nextIndex else { - return nil - } - - return orderedViewControllers[nextIndex] - } - - func presentationCount(for pageViewController: UIPageViewController) -> Int { - return orderedViewControllers.count - } - - func presentationIndex(for pageViewController: UIPageViewController) -> Int { - if let viewController = viewControllers?.first { - return orderedViewControllers.firstIndex(of: viewController) ?? 0 - } - return 0 - } -} diff --git a/Authenticator/UI/Tutorial/mul.lproj/Tutorial.xcstrings b/Authenticator/UI/Tutorial/mul.lproj/Tutorial.xcstrings deleted file mode 100644 index 55e5a2b3..00000000 --- a/Authenticator/UI/Tutorial/mul.lproj/Tutorial.xcstrings +++ /dev/null @@ -1,390 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "0Ew-5d-tth.text" : { - "comment" : "Class = \"UILabel\"; text = \"YubiKey 5 Series NFC authentication\"; ObjectID = \"0Ew-5d-tth\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "YubiKey 5 Series NFC authentication" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Authentification NFC YubiKey 5 Series" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "YubiKey 5シリーズのNFC認証" - } - } - } - }, - "4hs-uc-a5r.text" : { - "comment" : "Class = \"UITextView\"; text = \"If you have a YubiKey with NFC, pull down the main view to activate NFC.\"; ObjectID = \"4hs-uc-a5r\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "If you have a YubiKey with NFC, pull down the main view to activate NFC." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Si vous possédez une YubiKey avec NFC, faites glisser la vue principale vers le bas pour activer le NFC." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "NFC対応のYubiKeyをお持ちの場合は、メインビューをプルダウンしてNFCを有効にします。" - } - } - } - }, - "agV-vn-fpt.text" : { - "comment" : "Class = \"UITextView\"; text = \"You will need a YubiKey 5Ci or a compatible YubiKey with NFC to get started.\"; ObjectID = \"agV-vn-fpt\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "You will need a YubiKey 5Ci or a compatible YubiKey with NFC to get started." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Vous aurez besoin d'une YubiKey 5Ci ou d'une YubiKey compatible avec NFC pour commencer." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "開始するには、YubiKey 5CiまたはNFC対応のYubiKeyが必要です。" - } - } - } - }, - "bkN-Lk-jMY.text" : { - "comment" : "Class = \"UITextView\"; text = \"Touch the center of the key to the edge of the phone.\"; ObjectID = \"bkN-Lk-jMY\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Touch the center of the key to the edge of the phone." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appuyez le centre de la clé contre le bord du téléphone." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "キーの中央をタッチして、スマートフォンの端に移動します。" - } - } - } - }, - "Bxy-Ot-GLA.text" : { - "comment" : "Class = \"UITextView\"; text = \"Hold the key horizontally and tilt the iPhone towards the key.\"; ObjectID = \"Bxy-Ot-GLA\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Hold the key horizontally and tilt the iPhone towards the key." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Tenez la clé horizontalement et inclinez l'iPhone vers la clé." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "キーを水平に持ち、iPhoneをキーに向かって傾けます。" - } - } - } - }, - "bYg-TD-NqH.text" : { - "comment" : "Class = \"UITextView\"; text = \"Get a shared secret from any service you wish to secure, store it on the YubiKey and use it to generate your security codes.\"; ObjectID = \"bYg-TD-NqH\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Get a shared secret from any service you wish to secure, store it on the YubiKey and use it to generate your security codes." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Obtenez un secret partagé du service que vous voulez sécuriser, stockez-le sur la YubiKey et générez vos codes de sécurité." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "保護するサービスの共有秘密鍵を取得し、YubiKeyに保存して、YubiKeyを使用してセキュリティコードを生成します。" - } - } - } - }, - "cSo-Sg-vD2.text" : { - "comment" : "Class = \"UITextView\"; text = \"QR codes are available from the services you wish to secure.\"; ObjectID = \"cSo-Sg-vD2\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "QR codes are available from the services you wish to secure." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Les codes QR sont disponibles auprès des services que vous souhaitez sécuriser." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "QRコードは、保護するサービスから入手できます。" - } - } - } - }, - "IVf-FH-Iqr.title" : { - "comment" : "Class = \"UIBarButtonItem\"; title = \"Skip\"; ObjectID = \"IVf-FH-Iqr\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Skip" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Passer" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "スキップ" - } - } - } - }, - "jBh-MF-9Fk.text" : { - "comment" : "Class = \"UITextView\"; text = \"Simply scan the QR code when you add your YubiKey and generate your own security codes.\"; ObjectID = \"jBh-MF-9Fk\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Simply scan the QR code when you add your YubiKey and generate your own security codes." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Il vous suffit de scanner le code QR lorsque vous ajoutez votre YubiKey pour générer vos propres codes de sécurité." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "YubiKeyを追加して独自のセキュリティコードを生成する場合は、QRコードをスキャンしてください。" - } - } - } - }, - "KWb-g8-FRF.text" : { - "comment" : "Class = \"UITextView\"; text = \"If you have a YubiKey 5Ci, plug it in.\"; ObjectID = \"KWb-g8-FRF\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "If you have a YubiKey 5Ci, plug it in." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Si vous avez une YubiKey 5Ci, insérez-la." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "YubiKey 5Ciをお持ちの場合は接続します。" - } - } - } - }, - "mdG-o8-OXh.text" : { - "comment" : "Class = \"UILabel\"; text = \"YubiKey 5Ci authentication\"; ObjectID = \"mdG-o8-OXh\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "YubiKey 5Ci authentication" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Authentification YubiKey 5Ci" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "YubiKey 5Ci認証" - } - } - } - }, - "N2W-CE-fPm.title" : { - "comment" : "Class = \"UIBarButtonItem\"; title = \"Next\"; ObjectID = \"N2W-CE-fPm\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Next" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Suivant" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "次へ" - } - } - } - }, - "Paz-Es-tja.text" : { - "comment" : "Class = \"UITextView\"; text = \"Touch the contacts on the sides when prompted.\"; ObjectID = \"Paz-Es-tja\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Touch the contacts on the sides when prompted." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Appuyez sur les contacts sur les côtés lorsque vous y êtes invité." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "プロンプトが表示されたら、横にあるお問い合わせをタッチします。" - } - } - } - }, - "RUl-K8-lGO.text" : { - "comment" : "Class = \"UILabel\"; text = \"Where to get QR codes\"; ObjectID = \"RUl-K8-lGO\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Where to get QR codes" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Où obtenir les codes QR" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "QRコードの入手先" - } - } - } - }, - "ub0-A4-vpe.text" : { - "comment" : "Class = \"UILabel\"; text = \"How it works\"; ObjectID = \"ub0-A4-vpe\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "How it works" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Comment ça marche" - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "動作方法" - } - } - } - }, - "XdE-m1-y3M.normalTitle" : { - "comment" : "Class = \"UIButton\"; normalTitle = \"Read more...\"; ObjectID = \"XdE-m1-y3M\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Read more..." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "En savoir plus..." - } - }, - "ja" : { - "stringUnit" : { - "state" : "translated", - "value" : "詳細を読む..." - } - } - } - } - }, - "version" : "1.0" -} \ No newline at end of file diff --git a/Authenticator/UI/YubiKeyConfiguration/ConfigurationView.swift b/Authenticator/UI/YubiKeyConfiguration/ConfigurationView.swift index 6863e3fb..53188740 100644 --- a/Authenticator/UI/YubiKeyConfiguration/ConfigurationView.swift +++ b/Authenticator/UI/YubiKeyConfiguration/ConfigurationView.swift @@ -38,7 +38,7 @@ struct ConfigurationView: View { .resizable() .aspectRatio(contentMode: .fit) .frame(width: 100, height: 100) - .foregroundStyle(.secondary) + .foregroundColor(Color(.symbol)) .padding(15) .accessibilityHidden(true) Text(insertYubiKeyMessage) @@ -47,7 +47,7 @@ struct ConfigurationView: View { .frame(maxWidth: .infinity) .padding(.top, 10) .padding(.horizontal, 20) - .listRowBackground(Color("SheetBackgroundColor")) + .listRowBackground(Color.black.opacity(0)) } if let deviceInfo = model.deviceInfo { @@ -89,7 +89,6 @@ struct ConfigurationView: View { OTPConfigurationView() .navigationBarTitleDisplayMode(.inline) .navigationTitle("Toggle One-Time Password") - .background(Color("SheetBackgroundColor")) .onDisappear { model.start() } @@ -102,7 +101,6 @@ struct ConfigurationView: View { NFCSettingsView() .navigationBarTitleDisplayMode(.inline) .navigationTitle("NFC settings") - .background(Color("SheetBackgroundColor")) .onDisappear { model.start() } @@ -125,7 +123,7 @@ struct ConfigurationView: View { NavigationLink { OATHSavedPasswordsView() } label: { - ListIconView(image: Image(systemName: "xmark.circle"), color: Color(.systemRed), padding: 5) + ListIconView(image: Image(systemName: "xmark.circle"), color: Color(.systemPink), padding: 5) Text("Clear saved passwords") } NavigationLink { diff --git a/Authenticator/UI/YubiKeyConfiguration/SmartCardConfigurationController.swift b/Authenticator/UI/YubiKeyConfiguration/SmartCardConfigurationController.swift index c24f3f13..9180a8a1 100644 --- a/Authenticator/UI/YubiKeyConfiguration/SmartCardConfigurationController.swift +++ b/Authenticator/UI/YubiKeyConfiguration/SmartCardConfigurationController.swift @@ -29,7 +29,7 @@ struct SmartCardConfigurationView: View { SmartCardConfigurationWrapper() .navigationBarTitleDisplayMode(.inline) .navigationTitle("Smart card extension") - .background(Color("SheetBackgroundColor")) + .background(Color(.tableBackground)) .toolbar { ToolbarItem(placement: .topBarTrailing) { Button { diff --git a/Authenticator/UI/mul.lproj/Main.xcstrings b/Authenticator/UI/mul.lproj/Main.xcstrings index 3323a3d8..c1d37035 100644 --- a/Authenticator/UI/mul.lproj/Main.xcstrings +++ b/Authenticator/UI/mul.lproj/Main.xcstrings @@ -22,6 +22,12 @@ "state" : "translated", "value" : "ワンタイムパスワード" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jednorazové heslo" + } } } }, @@ -46,6 +52,12 @@ "state" : "translated", "value" : "戻るボタンをタップして続行します" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pokračujte ťuknutím na tlačidlo späť" + } } } }, @@ -64,6 +76,12 @@ "state" : "translated", "value" : "パスワードとリセット" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Heslá a obnovenie" + } } } }, @@ -88,6 +106,12 @@ "state" : "translated", "value" : "FIDO" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "FIDO" + } } } }, @@ -106,12 +130,18 @@ "state" : "translated", "value" : "パスワード保護" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "OCHRANA HESLOM" + } } } }, "6TW-2t-mYb.text" : { "comment" : "Class = \"UILabel\"; text = \"1.0\"; ObjectID = \"6TW-2t-mYb\";", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -130,6 +160,12 @@ "state" : "translated", "value" : "1.0" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "1.0" + } } } }, @@ -154,12 +190,18 @@ "state" : "translated", "value" : "YubiKey設定" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastavenie YubiKey" + } } } }, "9lG-2A-fbz.text" : { "comment" : "Class = \"UILabel\"; text = \"Privacy policy\"; ObjectID = \"9lG-2A-fbz\";", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -178,6 +220,12 @@ "state" : "translated", "value" : "プライバシーポリシー" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zásady ochrany osobných údajov" + } } } }, @@ -196,6 +244,12 @@ "state" : "translated", "value" : "有効" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Povolené" + } } } }, @@ -214,6 +268,12 @@ "state" : "translated", "value" : "パスワードとリセット" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Heslá a obnovenie" + } } } }, @@ -238,6 +298,12 @@ "state" : "translated", "value" : "Yubico OTP有効" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yubico OTP povolené" + } } } }, @@ -256,6 +322,12 @@ "state" : "translated", "value" : "セキュリティを強化し、不正アクセスを防止するために、YubiKeyをパスワードで保護できます。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Na dodatočné zabezpečenie a zabránenie neoprávnenému prístupu možno YubiKey chrániť heslom." + } } } }, @@ -280,6 +352,12 @@ "state" : "translated", "value" : "有効" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Povolené" + } } } }, @@ -298,6 +376,12 @@ "state" : "translated", "value" : "パスワード" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Heslo" + } } } }, @@ -322,6 +406,12 @@ "state" : "translated", "value" : "FIDOアプリケーションのリセット" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obnoviť aplikáciu FIDO" + } } } }, @@ -346,6 +436,12 @@ "state" : "translated", "value" : "ファームウェア" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Firmvér" + } } } }, @@ -370,6 +466,12 @@ "state" : "translated", "value" : "YubiKeyを取り外して再挿入してください" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odstráňte a znovu vložte váš YubiKey" + } } } }, @@ -388,6 +490,12 @@ "state" : "translated", "value" : "パスワードを確認" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Potvrdiť heslo" + } } } }, @@ -412,6 +520,12 @@ "state" : "translated", "value" : "ワンタイムパスワード" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jednorazové heslo" + } } } }, @@ -430,6 +544,12 @@ "state" : "translated", "value" : "YubiKey設定" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastavenie YubiKey" + } } } }, @@ -454,6 +574,12 @@ "state" : "translated", "value" : "OTPタグ読み取りでNFCをアクティブにする" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivácia funkcie NFC pri OTP prečítaná" + } } } }, @@ -478,6 +604,12 @@ "state" : "translated", "value" : "設定" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Všeobecné" + } } } }, @@ -496,6 +628,12 @@ "state" : "translated", "value" : "パスワード" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Heslo" + } } } }, @@ -520,6 +658,12 @@ "state" : "translated", "value" : "Yubico OTPを無効にすると、YubiKeyがキーボードとして表示されなくなります。Yubico OTPを使用しない場合は、これが推奨される解決策です。Yubico OTPは、設定ページから再度有効にできます。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zakázanie funkcie Yubico OTP zabráni tomu, aby sa YubiKey zobrazoval ako klávesnica. Ak nepoužívate Yubico OTP, toto je odporúčané riešenie. Túto funkciu môžete znovu povoliť na stránke nastavení." + } } } }, @@ -544,6 +688,12 @@ "state" : "translated", "value" : "NFC設定" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastavenia NFC" + } } } }, @@ -568,6 +718,12 @@ "state" : "translated", "value" : "閉じる" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zavrieť" + } } } }, @@ -592,6 +748,12 @@ "state" : "translated", "value" : "OATHアプリケーションのリセット" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obnoviť aplikáciu OATH" + } } } }, @@ -610,6 +772,12 @@ "state" : "translated", "value" : "パスワードを削除" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odstrániť heslo" + } } } }, @@ -634,12 +802,18 @@ "state" : "translated", "value" : "設定" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastavenie" + } } } }, "Ecy-Pw-sM0.text" : { "comment" : "Class = \"UILabel\"; text = \"Copyright © 2021 Yubico.\\nAll rights reserved.\"; ObjectID = \"Ecy-Pw-sM0\";", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -658,6 +832,12 @@ "state" : "translated", "value" : "Copyright © 2021 Yubico.\n無断複写・転載を禁じます。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Copyright © 2021 Yubico.\nVšetky práva vyhradené." + } } } }, @@ -682,6 +862,12 @@ "state" : "translated", "value" : "アプリケーションの起動時にNFCを開始" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivovať NFC pri spustení aplikácie" + } } } }, @@ -700,6 +886,12 @@ "state" : "translated", "value" : "パスワードを設定" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastaviť heslo" + } } } }, @@ -724,6 +916,12 @@ "state" : "translated", "value" : "スマートカード拡張機能" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rozšírenie čipovej karty" + } } } }, @@ -742,6 +940,12 @@ "state" : "translated", "value" : "保存されたパスワード" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "ULOŽENÉ HESLÁ" + } } } }, @@ -766,6 +970,12 @@ "state" : "translated", "value" : "タッチ要件をスキップ" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vynechať požiadavku na dotyk" + } } } }, @@ -784,6 +994,12 @@ "state" : "translated", "value" : "YubiKeyをリセット" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "OBNOVIŤ YUBIKEY" + } } } }, @@ -808,12 +1024,18 @@ "state" : "translated", "value" : "PINを変更" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spravovať PIN" + } } } }, "ghF-dC-3d6.text" : { "comment" : "Class = \"UILabel\"; text = \"Version history\"; ObjectID = \"ghF-dC-3d6\";", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -832,6 +1054,12 @@ "state" : "translated", "value" : "バージョン履歴" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "História verzie" + } } } }, @@ -856,6 +1084,12 @@ "state" : "translated", "value" : "アプリケーションの起動時にNFCを開始すると、アプリがアクティブになると同時にYubiKeyが自動で読み込まれます。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spustenie NFC pri spustení aplikácie automaticky prečíta váš kľúč YubiKey hneď, ako sa aplikácia stane aktívnou." + } } } }, @@ -874,6 +1108,12 @@ "state" : "translated", "value" : "iPhoneに保存されているパスワードを消去します。これにより、パスワードで保護されたYubiKeyの次回使用時にパスワードの入力を求められます。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vymazanie hesiel uložených v iPhone. Pri ďalšom použití heslom chráneného kľúča YubiKey sa zobrazí výzva na zadanie hesla." + } } } }, @@ -898,12 +1138,18 @@ "state" : "translated", "value" : "アイテム" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Položka" + } } } }, "Hbq-O7-HqW.title" : { "comment" : "Class = \"UINavigationItem\"; title = \"About\"; ObjectID = \"Hbq-O7-HqW\";", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -922,6 +1168,12 @@ "state" : "translated", "value" : "概要" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "O aplikácii" + } } } }, @@ -940,6 +1192,12 @@ "state" : "translated", "value" : "セキュリティを強化し、不正アクセスを防止するために、YubiKeyをパスワードで保護できます" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Na dodatočné zabezpečenie a na zabránenie neoprávnenému prístupu možno YubiKey chrániť heslom." + } } } }, @@ -964,6 +1222,12 @@ "state" : "translated", "value" : "OTPをクリップボードにコピー" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skopírovať OTP do schránky" + } } } }, @@ -988,6 +1252,12 @@ "state" : "translated", "value" : "Yubico OTPが無効になっています" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yubico OTP bolo vypnuté" + } } } }, @@ -1006,6 +1276,12 @@ "state" : "translated", "value" : "スマートカード拡張機能" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rozšírenie čipovej karty" + } } } }, @@ -1030,6 +1306,12 @@ "state" : "translated", "value" : "ワンタイムパスワードを切り替える" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prepnúť jednorazové heslo" + } } } }, @@ -1054,12 +1336,18 @@ "state" : "translated", "value" : "このYubiKeyはYubico OTPが有効になっているため、iPhoneへの外付けキーボードとして表示されます。これが原因で、標準のオンスクリーンキーボードで問題が発生します。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tento kľúč YubiKey má aktivovanú funkciu Yubico OTP, vďaka ktorej sa javí ako externá klávesnica pre iPhone. Bohužiaľ to spôsobuje problém s normálnou klávesnicou na obrazovke." + } } } }, "jNG-Du-Ghz.title" : { "comment" : "Class = \"UIBarButtonItem\"; title = \"Close\"; ObjectID = \"jNG-Du-Ghz\";", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -1078,6 +1366,12 @@ "state" : "translated", "value" : "閉じる" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zavrieť" + } } } }, @@ -1102,6 +1396,12 @@ "state" : "translated", "value" : "スマートカード(PIV)PIN" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "PIN (PIV) čipovej karty" + } } } }, @@ -1126,6 +1426,12 @@ "state" : "translated", "value" : "YubiKeyが挿入されている間は、オンスクリーンキーボードが表示されません。キーボードを表示するにはYubiKeyを取り外し、その後再挿入する必要があります。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kým je YubiKey vložený, klávesnica na obrazovke sa nezobrazí. Ak chcete zobraziť klávesnicu, musíte vybrať YubiKey a potom ho znova vložiť." + } } } }, @@ -1150,6 +1456,12 @@ "state" : "translated", "value" : "YubiKeyのOTPタグを読み取ってアプリケーションを開いた際にNFCを開始し、OATHアカウントを読み取ります。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spustiť NFC a čítať účty OATH po otvorení aplikácie načítaním tagu OTP na kľúči YubiKey." + } } } }, @@ -1168,6 +1480,12 @@ "state" : "translated", "value" : "保存したパスワードを消去" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vymazať uložené heslá" + } } } }, @@ -1192,6 +1510,12 @@ "state" : "translated", "value" : "使用制限ありで続行" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pokračovať s obmedzenou použiteľnosťou" + } } } }, @@ -1216,6 +1540,12 @@ "state" : "translated", "value" : "ボタン" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tlačidlo" + } } } }, @@ -1240,6 +1570,12 @@ "state" : "translated", "value" : "または" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "alebo" + } } } }, @@ -1264,6 +1600,12 @@ "state" : "translated", "value" : "パスワードを管理" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spravovať heslo" + } } } }, @@ -1288,6 +1630,12 @@ "state" : "translated", "value" : "保存したパスワードを消去" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vymazať uložené heslá" + } } } }, @@ -1312,6 +1660,12 @@ "state" : "translated", "value" : "デバイスタイプ" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Typ zariadenia" + } } } }, @@ -1336,6 +1690,12 @@ "state" : "translated", "value" : "シリアル番号" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sériové číslo" + } } } }, @@ -1360,12 +1720,18 @@ "state" : "translated", "value" : "該当なし" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nedostupné" + } } } }, "NnL-eZ-nHd.text" : { "comment" : "Class = \"UILabel\"; text = \"Help with YubiKey\"; ObjectID = \"NnL-eZ-nHd\";", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -1384,6 +1750,12 @@ "state" : "translated", "value" : "YubiKeyのヘルプ" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pomoc s YubiKey" + } } } }, @@ -1408,6 +1780,12 @@ "state" : "translated", "value" : "証明書にアクセスするには、YubiKeyを挿入し、そのPINを入力してください。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vložte YubiKey a zadajte jeho PIN kód, aby ste získali prístup k certifikátu." + } } } }, @@ -1432,6 +1810,12 @@ "state" : "translated", "value" : "OATH" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "OATH" + } } } }, @@ -1456,6 +1840,12 @@ "state" : "translated", "value" : "YubiKeyのロックを解除" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Odomknút YubiKey" + } } } }, @@ -1474,6 +1864,12 @@ "state" : "translated", "value" : "パスワードを設定" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastaviť heslo" + } } } }, @@ -1498,6 +1894,12 @@ "state" : "translated", "value" : "YubiKeyがNFCタグ機能を使用してスキャンされた場合に、OTPをクリップボードに自動でコピーします。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automaticky skopírovať OTP do schránky po naskenovaní kľúča YubiKey pomocou funkcie NFC." + } } } }, @@ -1522,6 +1924,12 @@ "state" : "translated", "value" : "NFC設定" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastavenia NFC" + } } } }, @@ -1546,12 +1954,18 @@ "state" : "translated", "value" : "該当なし" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nedostupné" + } } } }, "QHB-fS-VBc.text" : { "comment" : "Class = \"UILabel\"; text = \"Terms of use\"; ObjectID = \"QHB-fS-VBc\";", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -1570,12 +1984,18 @@ "state" : "translated", "value" : "利用規約" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podmienky používania" + } } } }, "raA-qu-ETm.headerTitle" : { "comment" : "Class = \"UITableViewSection\"; headerTitle = \"Application\"; ObjectID = \"raA-qu-ETm\";", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -1594,6 +2014,12 @@ "state" : "translated", "value" : "アプリケーション" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aplikácia" + } } } }, @@ -1618,6 +2044,12 @@ "state" : "translated", "value" : "YubiKeyを挿入してください。またはプルダウンしてNFCを有効にしてください。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vložte kľúč YubiKey alebo potiahnite nadol, aby ste aktivovali NFC" + } } } }, @@ -1642,6 +2074,12 @@ "state" : "translated", "value" : "構成" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nastavenie" + } } } }, @@ -1666,12 +2104,18 @@ "state" : "translated", "value" : "巻き戻しボタン" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "UnwindButton" + } } } }, "tMr-aW-Doe.text" : { "comment" : "Class = \"UILabel\"; text = \"Contact support\"; ObjectID = \"tMr-aW-Doe\";", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -1690,6 +2134,12 @@ "state" : "translated", "value" : "サポートへのお問い合わせ" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontaktovať podporu" + } } } }, @@ -1714,6 +2164,12 @@ "state" : "translated", "value" : "ワンタイムパスワードを切り替える" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prepnúť jednorazové heslo" + } } } }, @@ -1738,6 +2194,12 @@ "state" : "translated", "value" : "タッチが必要なアカウントでは、コードを計算するために追加のNFCタップが必要です。これをスキップすることで、必要なNFCタップの数が最小限に抑えられます。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Účty, ktoré vyžadujú dotykové ovládanie, budú na výpočet kódu potrebovať ďalšie ťuknutie NFC. Jeho vynechanie minimalizuje počet potrebných dotykov NFC." + } } } }, @@ -1762,6 +2224,12 @@ "state" : "translated", "value" : "該当なし" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nedostupné" + } } } }, @@ -1780,12 +2248,18 @@ "state" : "translated", "value" : "YubiKeyをリセット" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obnoviť YubiKey" + } } } }, "VHQ-4i-YEj.text" : { "comment" : "Class = \"UILabel\"; text = \"Yubico Authenticator\"; ObjectID = \"VHQ-4i-YEj\";", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -1804,6 +2278,12 @@ "state" : "translated", "value" : "Yubico Authenticator" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Yubico Authenticator" + } } } }, @@ -1828,12 +2308,18 @@ "state" : "translated", "value" : "NFC YubiKeyのスキャン時にOTPをコピーするには、Safariを開く操作のオン/オフを切り替えてください。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zapnutie/vypnutie otvárania Safari na kopírovanie OTP pri skenovaní NFC YubiKey." + } } } }, "vn9-zq-1Ri.headerTitle" : { "comment" : "Class = \"UITableViewSection\"; headerTitle = \"Support\"; ObjectID = \"vn9-zq-1Ri\";", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -1852,6 +2338,12 @@ "state" : "translated", "value" : "サポート" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Podpora" + } } } }, @@ -1876,6 +2368,12 @@ "state" : "translated", "value" : "証明書にアクセスするには、PINを入力してから、iPhoneに対してNFC対応のYubiKeyをタップしてください。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zadajte PIN a potom priložte YubiKey s funkciou NFC na iPhone, aby ste získali prístup k certifikátu." + } } } }, @@ -1894,12 +2392,18 @@ "state" : "translated", "value" : "パスワード" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Heslo" + } } } }, "wvt-LS-lIS.text" : { "comment" : "Class = \"UILabel\"; text = \"Licensing\"; ObjectID = \"wvt-LS-lIS\";", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -1918,6 +2422,12 @@ "state" : "translated", "value" : "ライセンス" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Licencie" + } } } }, @@ -1942,12 +2452,18 @@ "state" : "translated", "value" : "PIV" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "PIV" + } } } }, "y0i-iX-KLv.text" : { "comment" : "Class = \"UILabel\"; text = \"How does it work\"; ObjectID = \"y0i-iX-KLv\";", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "en" : { "stringUnit" : { @@ -1966,6 +2482,12 @@ "state" : "translated", "value" : "動作の仕組み" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ako to funguje" + } } } }, @@ -1990,6 +2512,12 @@ "state" : "translated", "value" : "情報" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "INFORMÁCIE" + } } } }, @@ -2014,6 +2542,12 @@ "state" : "translated", "value" : "Yubico OTPを無効にする(推奨)" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zakázať Yubico OTP (odporúčané)" + } } } }, @@ -2038,6 +2572,12 @@ "state" : "translated", "value" : "ボタン" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tlačidlo" + } } } }, @@ -2056,6 +2596,12 @@ "state" : "translated", "value" : "YubiKeyに保存されているすべてのアカウントをリセットします。この操作を行う前に、アカウントが一切使用されていないことを確認してください。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Obnoviť všetky účty uložené na YubiKey, pred tým sa však uistite, že sa nikde nepoužívajú." + } } } }, @@ -2080,6 +2626,12 @@ "state" : "translated", "value" : "スマートカード拡張" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rozšírenie čipovej karty" + } } } } diff --git a/Authenticator/VersionHistory.plist b/Authenticator/VersionHistory.plist index 3500f445..313b9a3c 100644 --- a/Authenticator/VersionHistory.plist +++ b/Authenticator/VersionHistory.plist @@ -2,6 +2,18 @@ + + version + 1.9 + date + 2024-11-30T09:41:00Z + shouldPromptUser + + changes + + About view and its subviews rewritten in SwiftUI. + + version 1.8.1 diff --git a/TokenExtension/InfoPlist.xcstrings b/TokenExtension/InfoPlist.xcstrings index 069a2c45..58faabf6 100644 --- a/TokenExtension/InfoPlist.xcstrings +++ b/TokenExtension/InfoPlist.xcstrings @@ -22,6 +22,12 @@ "state" : "translated", "value" : "TokenExtension" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "TokenExtension" + } } } }, @@ -46,6 +52,12 @@ "state" : "translated", "value" : "TokenExtension" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "TokenExtension" + } } } } diff --git a/TokenExtension/Localizable.xcstrings b/TokenExtension/Localizable.xcstrings index 2c6a5bad..a2d2a18e 100644 --- a/TokenExtension/Localizable.xcstrings +++ b/TokenExtension/Localizable.xcstrings @@ -14,6 +14,12 @@ "state" : "translated", "value" : "Yubico Authenticatorを起動" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spustiť Yubico Authenticator" + } } } }, @@ -30,6 +36,12 @@ "state" : "translated", "value" : "ここをタップし、YubiKeyを使用してリクエストを完了します。" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ťuknite sem a dokončite žiadosť pomocou svojho YubiKey." + } } } }, @@ -46,6 +58,12 @@ "state" : "translated", "value" : "YubiKeyが必要です" } + }, + "sk" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vyžaduje sa YubiKey" + } } } }