diff --git a/Authenticator.xcodeproj/project.pbxproj b/Authenticator.xcodeproj/project.pbxproj index fb588860..e4e2943c 100644 --- a/Authenticator.xcodeproj/project.pbxproj +++ b/Authenticator.xcodeproj/project.pbxproj @@ -15,7 +15,6 @@ 513D4DF52660EBA40022C53D /* ConfigurationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 513D4DF42660EBA40022C53D /* ConfigurationController.swift */; }; 513D4DF7266634280022C53D /* ShowTime.swift in Sources */ = {isa = PBXBuildFile; fileRef = 513D4DF6266634280022C53D /* ShowTime.swift */; }; 513D4DF9266A21250022C53D /* DelegateStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 513D4DF8266A21250022C53D /* DelegateStack.swift */; }; - 513F34BE24633A7900FCE030 /* EditCredential.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 513F34BD24633A7900FCE030 /* EditCredential.storyboard */; }; 513F34C02463F0C900FCE030 /* EditFieldController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 513F34BF2463F0C900FCE030 /* EditFieldController.swift */; }; 513F34C22463F44300FCE030 /* EditCredentialController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 513F34C12463F44300FCE030 /* EditCredentialController.swift */; }; 513F34C82464658F00FCE030 /* SettingsRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 513F34C72464658F00FCE030 /* SettingsRowView.swift */; }; @@ -69,8 +68,6 @@ 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 */; }; - A544949023CE546B003E1E07 /* Tutorial.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A544948D23CE546B003E1E07 /* Tutorial.storyboard */; }; - A557BEE023AD97100097545D /* AddCredential.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A557BEDF23AD97100097545D /* AddCredential.storyboard */; }; 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 */; }; @@ -94,6 +91,11 @@ 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 */; }; + 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 */; }; B4B1711827DF8C48002A62DE /* ScanAccountView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4B1711727DF8C48002A62DE /* ScanAccountView.swift */; }; B4C93E60299D156C00C2A8B8 /* ErrorAlertView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4C93E5F299D156C00C2A8B8 /* ErrorAlertView.swift */; }; B4C93E63299FB51A00C2A8B8 /* Account.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4C93E62299FB51A00C2A8B8 /* Account.swift */; }; @@ -149,7 +151,6 @@ 513D4DF42660EBA40022C53D /* ConfigurationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigurationController.swift; sourceTree = ""; }; 513D4DF6266634280022C53D /* ShowTime.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowTime.swift; sourceTree = ""; }; 513D4DF8266A21250022C53D /* DelegateStack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DelegateStack.swift; sourceTree = ""; }; - 513F34BD24633A7900FCE030 /* EditCredential.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = EditCredential.storyboard; sourceTree = ""; }; 513F34BF2463F0C900FCE030 /* EditFieldController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditFieldController.swift; sourceTree = ""; }; 513F34C12463F44300FCE030 /* EditCredentialController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditCredentialController.swift; sourceTree = ""; }; 513F34C72464658F00FCE030 /* SettingsRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsRowView.swift; sourceTree = ""; }; @@ -213,8 +214,6 @@ 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 = ""; }; - A544948D23CE546B003E1E07 /* Tutorial.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Tutorial.storyboard; sourceTree = ""; }; - A557BEDF23AD97100097545D /* AddCredential.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = AddCredential.storyboard; 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 = ""; }; @@ -237,6 +236,18 @@ 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 = ""; }; + B4901AE12BD696BE0092E7A2 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Main.strings; sourceTree = ""; }; + B4901AE22BD696BE0092E7A2 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/LaunchScreen.strings; sourceTree = ""; }; + B4901AE32BD697620092E7A2 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = Localizable.xcstrings; path = Authenticator/Localizable.xcstrings; sourceTree = SOURCE_ROOT; }; + B4901AE52BD69A2B0092E7A2 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Main.strings; sourceTree = ""; }; + B4901AE62BD69A2B0092E7A2 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/LaunchScreen.strings; sourceTree = ""; }; + 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 = ""; }; + B4901AF22BD7DD350092E7A2 /* mul */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = mul; path = mul.lproj/EditCredential.xcstrings; sourceTree = ""; }; + B4901AF32BD7DF960092E7A2 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; B4B1711727DF8C48002A62DE /* ScanAccountView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanAccountView.swift; sourceTree = ""; }; B4C93E5F299D156C00C2A8B8 /* ErrorAlertView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorAlertView.swift; sourceTree = ""; }; B4C93E62299FB51A00C2A8B8 /* Account.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Account.swift; sourceTree = ""; }; @@ -321,7 +332,7 @@ 513F34C12463F44300FCE030 /* EditCredentialController.swift */, 513F34C72464658F00FCE030 /* SettingsRowView.swift */, 513F34BF2463F0C900FCE030 /* EditFieldController.swift */, - 513F34BD24633A7900FCE030 /* EditCredential.storyboard */, + B4901AF02BD7DD350092E7A2 /* EditCredential.storyboard */, ); path = EditCredential; sourceTree = ""; @@ -346,6 +357,7 @@ 515542782656707000B19C59 /* TokenSession.swift */, 5155427A2656707000B19C59 /* Info.plist */, 5156D05A265D0538007A94F8 /* TKTokenAlgorithm+Extensions.swift */, + B4901AF32BD7DF960092E7A2 /* Localizable.xcstrings */, ); path = TokenExtension; sourceTree = ""; @@ -431,6 +443,7 @@ 818BE8DB22F3486500061026 /* Model */, 818BE8DA22F3485600061026 /* UI */, 818866F622E7A877006BC0A8 /* Authenticator.entitlements */, + B4901AE32BD697620092E7A2 /* Localizable.xcstrings */, 818866F122E18804006BC0A8 /* Authenticator-Bridging-Header.h */, B4719B18298AA757006CDAEA /* AuthenticatorApp.swift */, 818866BF22DFD72C006BC0A8 /* Assets.xcassets */, @@ -513,7 +526,7 @@ 513D4DF12660D6570022C53D /* AddCredentialController.swift */, B4B1711727DF8C48002A62DE /* ScanAccountView.swift */, 81FA3C33231AF2D8009C22AB /* AdvancedSettingsViewController.swift */, - A557BEDF23AD97100097545D /* AddCredential.storyboard */, + B4901AEC2BD7DD160092E7A2 /* AddCredential.storyboard */, ); path = AddCredential; sourceTree = ""; @@ -535,7 +548,7 @@ children = ( A544948B23CE546B003E1E07 /* TutorialViewController.swift */, A544948C23CE546B003E1E07 /* TutorialPagesViewControllers.swift */, - A544948D23CE546B003E1E07 /* Tutorial.storyboard */, + B4901AE82BD7DCC70092E7A2 /* Tutorial.storyboard */, ); path = Tutorial; sourceTree = ""; @@ -642,6 +655,8 @@ knownRegions = ( en, Base, + fr, + ja, ); mainGroup = 818866AA22DFD729006BC0A8; packageReferences = ( @@ -663,6 +678,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + B4901AF42BD7DF960092E7A2 /* Localizable.xcstrings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -672,10 +688,11 @@ files = ( 818866C322DFD72C006BC0A8 /* LaunchScreen.storyboard in Resources */, 51AFD4D827196AB6008F2630 /* VersionHistory.plist in Resources */, - 513F34BE24633A7900FCE030 /* EditCredential.storyboard in Resources */, - A557BEE023AD97100097545D /* AddCredential.storyboard in Resources */, + B4901AF12BD7DD350092E7A2 /* EditCredential.storyboard in Resources */, + B4901AED2BD7DD160092E7A2 /* AddCredential.storyboard in Resources */, 818866C022DFD72C006BC0A8 /* Assets.xcassets in Resources */, - A544949023CE546B003E1E07 /* Tutorial.storyboard in Resources */, + B4901AE92BD7DCC70092E7A2 /* Tutorial.storyboard in Resources */, + B4901AE42BD697620092E7A2 /* Localizable.xcstrings in Resources */, 818866BE22DFD729006BC0A8 /* Main.storyboard in Resources */, B40327762847AE0A00DF4DB0 /* Licensing.md in Resources */, ); @@ -820,6 +837,8 @@ isa = PBXVariantGroup; children = ( 818866BD22DFD729006BC0A8 /* Base */, + B4901AE12BD696BE0092E7A2 /* fr */, + B4901AE52BD69A2B0092E7A2 /* ja */, ); name = Main.storyboard; sourceTree = ""; @@ -828,10 +847,39 @@ isa = PBXVariantGroup; children = ( 818866C222DFD72C006BC0A8 /* Base */, + B4901AE22BD696BE0092E7A2 /* fr */, + B4901AE62BD69A2B0092E7A2 /* ja */, ); name = LaunchScreen.storyboard; sourceTree = ""; }; + B4901AE82BD7DCC70092E7A2 /* Tutorial.storyboard */ = { + isa = PBXVariantGroup; + children = ( + B4901AE72BD7DCC70092E7A2 /* Base */, + B4901AEA2BD7DCC70092E7A2 /* mul */, + ); + name = Tutorial.storyboard; + sourceTree = ""; + }; + B4901AEC2BD7DD160092E7A2 /* AddCredential.storyboard */ = { + isa = PBXVariantGroup; + children = ( + B4901AEB2BD7DD160092E7A2 /* Base */, + B4901AEE2BD7DD160092E7A2 /* mul */, + ); + name = AddCredential.storyboard; + sourceTree = ""; + }; + B4901AF02BD7DD350092E7A2 /* EditCredential.storyboard */ = { + isa = PBXVariantGroup; + children = ( + B4901AEF2BD7DD350092E7A2 /* Base */, + B4901AF22BD7DD350092E7A2 /* mul */, + ); + name = EditCredential.storyboard; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ @@ -843,7 +891,7 @@ CURRENT_PROJECT_VERSION = 115; DEVELOPMENT_TEAM = LQA3CS5MM7; INFOPLIST_FILE = TokenExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.5; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -853,6 +901,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.yubico.Authenticator.TokenExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -866,7 +915,7 @@ CURRENT_PROJECT_VERSION = 115; DEVELOPMENT_TEAM = LQA3CS5MM7; INFOPLIST_FILE = TokenExtension/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.5; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -876,6 +925,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.yubico.Authenticator.TokenExtension; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; + SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; @@ -885,6 +935,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -947,6 +998,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -1021,6 +1073,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.yubico.Authenticator; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = NO; + SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OBJC_BRIDGING_HEADER = "Authenticator/Authenticator-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -1049,6 +1102,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.yubico.Authenticator; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTS_MACCATALYST = NO; + SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_OBJC_BRIDGING_HEADER = "Authenticator/Authenticator-Bridging-Header.h"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; diff --git a/Authenticator/Localizable.xcstrings b/Authenticator/Localizable.xcstrings new file mode 100644 index 00000000..cf19397f --- /dev/null +++ b/Authenticator/Localizable.xcstrings @@ -0,0 +1,390 @@ +{ + "sourceLanguage" : "en", + "strings" : { + " in this version" : { + "comment" : "Substring in \"See what's new in this version\"" + }, + "*** *** " : { + + }, + "888 888" : { + + }, + "About" : { + "comment" : "About view navigation title" + }, + "Account name can not be empty" : { + "comment" : "Rename credential alert" + }, + "Account not set" : { + "comment" : "Rename credential alert" + }, + "Accounts" : { + "comment" : "Navigation title in main view." + }, + "Activate NFC" : { + "comment" : "Password save type activate NFC" + }, + "Add account" : { + "comment" : "Scan QR code add account label" + }, + "Add Credential" : { + "comment" : "Add account navigation title" + }, + "Algorithm" : { + "comment" : "Add account select algorithm" + }, + "and can be used by other applications" : { + "comment" : "PIV extension substring in 'These certificates have been added to this [iPad/iPhone] and can be used by other applications'" + }, + "Calculate" : { + "comment" : "Menu" + }, + "Cancel" : { + "comment" : "Password alert" + }, + "Certificates on this YubiKey can be used to authenticate and sign requests from other applications if added to this" : { + "comment" : "PIV extension no certs on yubikey message" + }, + "Certificates on YubiKey" : { + "comment" : "PIV extension table cell header" + }, + "Clear" : { + "comment" : "Clear password alert button" + }, + "Clear passwords saved on" : { + "comment" : "Substring from 'Clear passwords saved on [iPad/iPhone]. This will prompt for a passowrd next time a password protected YubiKey is used.'." + }, + "Clear passwords saved on iPhone. This will prompt for a password next time a password protected YubiKey is used." : { + "comment" : "Clear password alert message" + }, + "Clear passwords?" : { + "comment" : "Clear password alert title" + }, + "Close" : { + "comment" : "View close button" + }, + "Code expired" : { + "comment" : "Accessibility label" + }, + "Code not calculated" : { + "comment" : "Accessibility label" + }, + "Configuration" : { + "comment" : "Configuration navigation title" + }, + "Continue with limited usability" : { + + }, + "Copied to clipboard" : { + "comment" : "Toast copied to clipboard message" + }, + "Copy" : { + "comment" : "Menu" + }, + "Data to String conversion error" : { + + }, + "Delete" : { + "comment" : "Menu" + }, + "Delete account?" : { + + }, + "Digits" : { + "comment" : "Add account select number of digits" + }, + "Disable Yubico OTP (recommended)" : { + + }, + "Disabling Yubico OTP will prevent the YubiKey from appearing as a keyboard. If you don’t use Yubico OTP this is the recommended solution. This can be re-enabled from the settings page." : { + + }, + "Dismiss details view" : { + "comment" : "Accessibility hint" + }, + "Enabled" : { + "comment" : "PIV extension enabled message" + }, + "Enter manually" : { + "comment" : "Scan QR code add manually button" + }, + "Enter password" : { + "comment" : "Password alert" + }, + "Enter the PIN to access the certificate." : { + "comment" : "PIV extension enter PIN message" + }, + "Error" : { + + }, + "Error reading YubiKey" : { + "comment" : "PIV extension error title" + }, + "Error writing configuration" : { + "comment" : "OTP settings error alert title" + }, + "Failed storing certificate" : { + "comment" : "PIV extension storing error alert title" + }, + "Failed to cast object to Data error" : { + + }, + "Failed to clear passwords" : { + "comment" : "Clear passwords failure alert title" + }, + "Failed to reset YubiKey" : { + "comment" : "Reset YubiKey failure alert title" + }, + "Incorrect password. Re-enter password." : { + "comment" : "Password entry error alert message" + }, + "Insert YubiKey" : { + + }, + "Insert YubiKey or pull down to activate NFC" : { + + }, + "Invalid URI format" : { + "comment" : "Invalid Uri, wrong parameters" + }, + "Item not found in secure storage" : { + + }, + "Licensing" : { + "comment" : "Licensing view navigation title" + }, + "Menu" : { + + }, + "Never for this YubiKey" : { + "comment" : "Password entry never save for this yubikey button\nSave password alert." + }, + "No account information found!" : { + "comment" : "Scan QR code no account error message" + }, + "No accounts on YubiKey" : { + + }, + "No camera permissions" : { + "comment" : "Scan QR code camera error title" + }, + "No certificates on YubiKey" : { + "comment" : "PIV extension no certificates message" + }, + "No matching accounts on YubiKey" : { + + }, + "No name" : { + "comment" : "PIV extension certificate with no name" + }, + "No public key certificates in keychain" : { + "comment" : "PIV extension no certs in keychain" + }, + "No QR code?" : { + "comment" : "Scan QR code no QR code message" + }, + "Not Enabled" : { + "comment" : "PIV extension not enabled message" + }, + "Not now" : { + "comment" : "Password entry don't save now for this yubikey button\nSave passsword alert" + }, + "Not valid credential information" : { + "comment" : "Add account error message" + }, + "Notifications disabled" : { + "comment" : "PIV extension notifications alert title" + }, + "Ok" : { + "comment" : "Password alert" + }, + "OK" : { + "comment" : "OK button in error alert." + }, + "Open iOS Settings app" : { + "comment" : "Scan QR code settings button" + }, + "or pull down to activate NFC" : { + + }, + "or scan a NFC YubiKey" : { + + }, + "Other" : { + + }, + "Other applications can use client certificates on your YubiKey for authentication and signing purposes." : { + "comment" : "PIV extension info alert message" + }, + "Password" : { + "comment" : "Password alert" + }, + "Password can not be an empty string" : { + "comment" : "Configuration set password empty password error alert message" + }, + "Period" : { + "comment" : "Add account select period" + }, + "Pin" : { + "comment" : "Menu" + }, + "Pinned" : { + + }, + "Plug-in your YubiKey for that operation" : { + "comment" : "No service found" + }, + "Point your camera at a QR code to scan it" : { + "comment" : "Scan QR code message" + }, + "Public key certificates on" : { + "comment" : "PIV extension no certs on device message" + }, + "Read more..." : { + "comment" : "PIV extension read more alert title" + }, + "Remove and re-insert your YubiKey" : { + + }, + "Remove and reinsert your YubiKey" : { + "comment" : "PIV extension error reinsert key" + }, + "Remove password" : { + "comment" : "Remove password alert title" + }, + "Remove password for this YubiKey?" : { + "comment" : "Remove password alert message" + }, + "Rename" : { + "comment" : "Menu" + }, + "Reset" : { + "comment" : "Reset YubiKey alert button" + }, + "Reset complete" : { + "comment" : "Reset YubiKey complete alert title" + }, + "Reset YubiKey?" : { + "comment" : "Reset YubiKey alert title" + }, + "Save and protect with" : { + "comment" : "Password entry save substring in 'Save and protect with [save type]'" + }, + "Save and protect with %@" : { + + }, + "Save password" : { + "comment" : "Save password alert." + }, + "Save Password" : { + "comment" : "Password entry save password button" + }, + "Save password?" : { + "comment" : "Save password alert" + }, + "Scan NFC YubiKey" : { + + }, + "Search" : { + + }, + "See " : { + "comment" : "Substring in \"See what's new in this version\"" + }, + "Settings" : { + "comment" : "PIV extension settings alert title" + }, + "Smart card extension" : { + "comment" : "PIV extension info alert title" + }, + "Smart card extension is only available on iOS 14.5 and forward." : { + "comment" : "PIV extension version error" + }, + "Something went wrong and key doesn't respond" : { + "comment" : "No response" + }, + "Stored passwords have been cleared from this phone." : { + "comment" : "Clear passwords confirmation alert message" + }, + "String to Data conversion error" : { + + }, + "Success" : { + "comment" : "Clear passwords confirmation alert title" + }, + "The key doesn't respond" : { + "comment" : "Timeout issue" + }, + "The passwords do not match" : { + "comment" : "Configuration set password not matching error alert message" + }, + "The smart card extension requires notifications to be enabled for Yubico Authenticator. Enable it in the iOS Settings." : { + "comment" : "PIV extensions notifications alert message" + }, + "These certificates have been added to this" : { + "comment" : "PIV extension substring in 'These certificates have been added to this [iPad/iPhone] and can be used by other applications'" + }, + "This QR code is not supported" : { + "comment" : "Invalid Uri format, not OATH URL" + }, + "This version of iOS does not support operations with the YubiKey for Lightning nor over NFC" : { + "comment" : "Not supported" + }, + "This will delete all accounts and restore factory defaults of your YubiKey." : { + "comment" : "Reset YubiKey alert message" + }, + "This will permanently delete the account from the YubiKey, and your ability to generate codes for it!" : { + + }, + "This will prompt for a password next time a password protected YubiKey is used" : { + "comment" : "Substring from 'Clear passwords saved on [iPad/iPhone]. This will prompt for a passowrd next time a password protected YubiKey is used.'." + }, + "This YubiKey has Yubico OTP enabled which makes it appear as an external keyboard to the iPhone. Unfortunately this causes problem with the normal on-screen keyboard." : { + + }, + "To prevent unauthorized access this YubiKey is protected with a password." : { + "comment" : "Password entry alert message" + }, + "To scan a QR code you need to enable camera permissions for the Authenticator app." : { + "comment" : "Scan QR code camera error message" + }, + "Type" : { + "comment" : "Add account select type" + }, + "Unhandled Error" : { + + }, + "Unlock YubiKey" : { + "comment" : "Password entry unlock message" + }, + "Unpin" : { + "comment" : "Menu" + }, + "what's new" : { + "comment" : "Substring in \"See what's new in this version\"" + }, + "What's new in\nYubico Authenticator" : { + "comment" : "Version history title" + }, + "While the YubiKey is inserted the on-screen keyboard will not appear. To show the keyboard you will have to remove the YubiKey and then re-insert it." : { + + }, + "Would you like to save this password for YubiKey for next usage in this application?" : { + "comment" : "Password entry save password title" + }, + "You can remove saved password in Settings." : { + "comment" : "Password entry save password message" + }, + "Yubico OTP" : { + + }, + "Yubico OTP enabled" : { + + }, + "Yubico OTP has been disabled" : { + + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/Authenticator/UI/Authentication/AddCredential/AddAccountWrapper.swift b/Authenticator/UI/Authentication/AddCredential/AddAccountWrapper.swift index d58e0dcc..612809d6 100644 --- a/Authenticator/UI/Authentication/AddCredential/AddAccountWrapper.swift +++ b/Authenticator/UI/Authentication/AddCredential/AddAccountWrapper.swift @@ -35,8 +35,8 @@ struct AddAccountView: View { var body: some View { AddCredentialWrapper(accountSubject: accountSubject, oathURL: oathURL) - .navigationTitle("Add Credential") - .navigationBarItems(trailing: Button("Close") { + .navigationTitle(String(localized: "Add Credential", comment: "Add account navigation title")) + .navigationBarItems(trailing: Button(String(localized: "Close", comment: "View close button")) { showAddAccount.toggle() }) .ignoresSafeArea(.all, edges: .bottom) diff --git a/Authenticator/UI/Authentication/AddCredential/AddCredentialController.swift b/Authenticator/UI/Authentication/AddCredential/AddCredentialController.swift index c199f00c..b22a9a58 100644 --- a/Authenticator/UI/Authentication/AddCredential/AddCredentialController.swift +++ b/Authenticator/UI/Authentication/AddCredential/AddCredentialController.swift @@ -152,7 +152,7 @@ class AddCredentialController: UITableViewController { skip: []) } } catch { - showAlertDialog(title: "Not valid credential information", message: error.localizedDescription) + showAlertDialog(title: String(localized: "Not valid credential information", comment: "Add account error message"), message: error.localizedDescription) return } self.requiresTouch = requiresTouchSwitch.isOn @@ -217,28 +217,28 @@ class AddCredentialController: UITableViewController { guard indexPath.section == 1 else { return } switch indexPath.row { case 0: - let table = AdvancedSettingsViewController(title: "Type", + let table = AdvancedSettingsViewController(title: String(localized: "Type", comment: "Add account select type"), rows: advancedSettings[0], selected: typeIndex) { [weak self] result in self?.typeIndex = result } self.navigationController?.pushViewController(table, animated: true) case 1: - let table = AdvancedSettingsViewController(title: "Algorithm", + let table = AdvancedSettingsViewController(title: String(localized: "Algorithm", comment: "Add account select algorithm"), rows: advancedSettings[1], selected: algorithmIndex) { [weak self] result in self?.algorithmIndex = result } self.navigationController?.pushViewController(table, animated: true) case 2: - let table = AdvancedSettingsViewController(title: "Digits", + let table = AdvancedSettingsViewController(title: String(localized: "Digits", comment: "Add account select number of digits"), rows: advancedSettings[2], selected: digitsIndex) { [weak self] result in self?.digitsIndex = result } self.navigationController?.pushViewController(table, animated: true) case 3: - let table = AdvancedSettingsViewController(title: "Period", + let table = AdvancedSettingsViewController(title: String(localized: "Period", comment: "Add account select period"), rows: advancedSettings[3], selected: periodIndex) { [weak self] result in self?.periodIndex = result diff --git a/Authenticator/UI/Authentication/AddCredential/AddCredential.storyboard b/Authenticator/UI/Authentication/AddCredential/Base.lproj/AddCredential.storyboard similarity index 100% rename from Authenticator/UI/Authentication/AddCredential/AddCredential.storyboard rename to Authenticator/UI/Authentication/AddCredential/Base.lproj/AddCredential.storyboard diff --git a/Authenticator/UI/Authentication/AddCredential/ScanAccountView.swift b/Authenticator/UI/Authentication/AddCredential/ScanAccountView.swift index 8150555e..636f5e70 100644 --- a/Authenticator/UI/Authentication/AddCredential/ScanAccountView.swift +++ b/Authenticator/UI/Authentication/AddCredential/ScanAccountView.swift @@ -25,7 +25,7 @@ class ScanAccountView: UIView, AVCaptureMetadataOutputObjectsDelegate { case cancel, manuelEntry, account(YKFOATHCredentialTemplate) } - private static let scanMessage = "Point your camera at a QR code to scan it" + private static let scanMessage = String(localized: "Point your camera at a QR code to scan it", comment: "Scan QR code message") private let completionHandler: (ScanResult) -> () private let captureSession = AVCaptureSession() @@ -41,7 +41,7 @@ class ScanAccountView: UIView, AVCaptureMetadataOutputObjectsDelegate { private let closeButton: UIButton = { let button = UIButton() button.translatesAutoresizingMaskIntoConstraints = false - button.setTitle("Close", for: .normal) + button.setTitle(String(localized: "Close", comment: "View close button"), for: .normal) button.setTitleColor(.white, for: .normal) button.titleLabel?.font = .preferredFont(forTextStyle: .body) return button @@ -50,7 +50,7 @@ class ScanAccountView: UIView, AVCaptureMetadataOutputObjectsDelegate { private let addManuallyButton: UIButton = { let button = UIButton(type: .roundedRect) button.translatesAutoresizingMaskIntoConstraints = false - button.setTitle("Enter manually", for: .normal) + button.setTitle(String(localized: "Enter manually", comment: "Scan QR code add manually button"), for: .normal) button.setContentHuggingPriority(.required, for: .horizontal) button.setTitleColor(.white, for: .normal) button.titleLabel?.font = .preferredFont(forTextStyle: .body) @@ -65,7 +65,7 @@ class ScanAccountView: UIView, AVCaptureMetadataOutputObjectsDelegate { private let openSettingsButton: UIButton = { let button = UIButton(type: .roundedRect) button.translatesAutoresizingMaskIntoConstraints = false - button.setTitle("Open iOS Settings app", for: .normal) + button.setTitle(String(localized: "Open iOS Settings app", comment: "Scan QR code settings button"), for: .normal) button.setTitleColor(.white, for: .normal) button.titleLabel?.font = .preferredFont(forTextStyle: .body) button.layer.cornerRadius = 20 @@ -79,7 +79,7 @@ class ScanAccountView: UIView, AVCaptureMetadataOutputObjectsDelegate { private let addAccountLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false - label.text = "Add account" + label.text = String(localized: "Add account", comment: "Scan QR code add account label") label.textColor = .white label.font = .preferredFont(forTextStyle: .body).withSymbolicTraits(.traitBold) return label @@ -88,7 +88,7 @@ class ScanAccountView: UIView, AVCaptureMetadataOutputObjectsDelegate { private let noQRCodeLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false - label.text = "No QR code?" + label.text = String(localized: "No QR code?", comment: "Scan QR code no QR code message") label.textColor = .white label.font = .preferredFont(forTextStyle: .footnote).withSymbolicTraits(.traitBold) return label @@ -131,14 +131,14 @@ class ScanAccountView: UIView, AVCaptureMetadataOutputObjectsDelegate { title.numberOfLines = 0 title.font = .preferredFont(forTextStyle: .title2) title.textAlignment = .center - title.text = "No camera permissions" + title.text = String(localized: "No camera permissions", comment: "Scan QR code camera error title") title.textColor = .white view.addArrangedSubview(title) let text = UILabel() text.font = .preferredFont(forTextStyle: .body) text.translatesAutoresizingMaskIntoConstraints = false text.numberOfLines = 0 - text.text = "To scan a QR code you need to enable camera permissions for the Authenticator app." + text.text = String(localized: "To scan a QR code you need to enable camera permissions for the Authenticator app.", comment: "Scan QR code camera error message") text.textColor = .lightGray text.textAlignment = .center view.addArrangedSubview(text) @@ -289,7 +289,7 @@ class ScanAccountView: UIView, AVCaptureMetadataOutputObjectsDelegate { let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject, let stringValue = readableObject.stringValue else { return } guard let url = URL(string: stringValue.trimmingCharacters(in: .whitespacesAndNewlines)) else { - showError("No account information found!") + showError(String(localized: "No account information found!", comment: "Scan QR code no account error message")) return } diff --git a/Authenticator/UI/Authentication/AddCredential/mul.lproj/AddCredential.xcstrings b/Authenticator/UI/Authentication/AddCredential/mul.lproj/AddCredential.xcstrings new file mode 100644 index 00000000..b0d9226a --- /dev/null +++ b/Authenticator/UI/Authentication/AddCredential/mul.lproj/AddCredential.xcstrings @@ -0,0 +1,234 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "5qG-r3-8YC.text" : { + "comment" : "Class = \"UILabel\"; text = \"Digits\"; ObjectID = \"5qG-r3-8YC\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Digits" + } + } + } + }, + "7ff-AA-O0N.text" : { + "comment" : "Class = \"UILabel\"; text = \"Type\"; ObjectID = \"7ff-AA-O0N\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Type" + } + } + } + }, + "9r9-ju-7hn.text" : { + "comment" : "Class = \"UILabel\"; text = \"Issuer\"; ObjectID = \"9r9-ju-7hn\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Issuer" + } + } + } + }, + "23x-vE-GEf.text" : { + "comment" : "Class = \"UILabel\"; text = \"6\"; ObjectID = \"23x-vE-GEf\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "6" + } + } + } + }, + "b4T-vk-sxg.title" : { + "comment" : "Class = \"UINavigationItem\"; title = \"Add account\"; ObjectID = \"b4T-vk-sxg\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Add account" + } + } + } + }, + "Fgb-Ow-lzL.text" : { + "comment" : "Class = \"UILabel\"; text = \"Period\"; ObjectID = \"Fgb-Ow-lzL\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Period" + } + } + } + }, + "gdf-yw-zNg.text" : { + "comment" : "Class = \"UILabel\"; text = \"Require touch\"; ObjectID = \"gdf-yw-zNg\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Require touch" + } + } + } + }, + "iKi-yO-dD3.text" : { + "comment" : "Class = \"UILabel\"; text = \"30\"; ObjectID = \"iKi-yO-dD3\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "30" + } + } + } + }, + "jjH-co-W9w.footerTitle" : { + "comment" : "Class = \"UITableViewSection\"; footerTitle = \"Normally these settings should not be changed, doing so may result in the code not working as expected\"; ObjectID = \"jjH-co-W9w\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Normally these settings should not be changed, doing so may result in the code not working as expected" + } + } + } + }, + "jjH-co-W9w.headerTitle" : { + "comment" : "Class = \"UITableViewSection\"; headerTitle = \"Advanced settings\"; ObjectID = \"jjH-co-W9w\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Advanced settings" + } + } + } + }, + "Kyw-Tw-o0u.text" : { + "comment" : "Class = \"UILabel\"; text = \"TOTP\"; ObjectID = \"Kyw-Tw-o0u\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "TOTP" + } + } + } + }, + "Nc5-A6-Y2F.placeholder" : { + "comment" : "Class = \"UITextField\"; placeholder = \"Secret\"; ObjectID = \"Nc5-A6-Y2F\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Secret" + } + } + } + }, + "nc9-CL-5p4.placeholder" : { + "comment" : "Class = \"UITextField\"; placeholder = \"john@doe.com\"; ObjectID = \"nc9-CL-5p4\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "john@doe.com" + } + } + } + }, + "NVO-62-Xcp.text" : { + "comment" : "Class = \"UILabel\"; text = \"SHA1\"; ObjectID = \"NVO-62-Xcp\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "SHA1" + } + } + } + }, + "nyL-Vx-yTS.text" : { + "comment" : "Class = \"UILabel\"; text = \"Secret\"; ObjectID = \"nyL-Vx-yTS\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Secret" + } + } + } + }, + "OHS-sd-F7b.text" : { + "comment" : "Class = \"UILabel\"; text = \"Account name\"; ObjectID = \"OHS-sd-F7b\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Account name" + } + } + } + }, + "t2b-3i-5P0.placeholder" : { + "comment" : "Class = \"UITextField\"; placeholder = \"Optional\"; ObjectID = \"t2b-3i-5P0\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Optional" + } + } + } + }, + "t06-Ma-iHo.headerTitle" : { + "comment" : "Class = \"UITableViewSection\"; headerTitle = \"Account details\"; ObjectID = \"t06-Ma-iHo\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Account details" + } + } + } + }, + "xjs-s4-9fy.text" : { + "comment" : "Class = \"UILabel\"; text = \"Algorithm\"; ObjectID = \"xjs-s4-9fy\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Algorithm" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/Authenticator/UI/Authentication/EditCredential/EditCredential.storyboard b/Authenticator/UI/Authentication/EditCredential/Base.lproj/EditCredential.storyboard similarity index 100% rename from Authenticator/UI/Authentication/EditCredential/EditCredential.storyboard rename to Authenticator/UI/Authentication/EditCredential/Base.lproj/EditCredential.storyboard diff --git a/Authenticator/UI/Authentication/EditCredential/EditAccountWrapper.swift b/Authenticator/UI/Authentication/EditCredential/EditAccountWrapper.swift index 33841382..408d404a 100644 --- a/Authenticator/UI/Authentication/EditCredential/EditAccountWrapper.swift +++ b/Authenticator/UI/Authentication/EditCredential/EditAccountWrapper.swift @@ -37,10 +37,6 @@ struct EditView: View { var body: some View { EditAccountWrapper(account: account, viewModel: viewModel) - .navigationTitle("Add Credential") - .navigationBarItems(trailing: Button("WAAAT") { - showEditing.toggle() - }) .ignoresSafeArea(.all, edges: .bottom) } } diff --git a/Authenticator/UI/Authentication/EditCredential/EditCredentialController.swift b/Authenticator/UI/Authentication/EditCredential/EditCredentialController.swift index 95085916..2b655d14 100644 --- a/Authenticator/UI/Authentication/EditCredential/EditCredentialController.swift +++ b/Authenticator/UI/Authentication/EditCredential/EditCredentialController.swift @@ -37,7 +37,7 @@ class EditCredentialController: UITableViewController { @IBAction func save(_ sender: Any) { guard let account, let issuer = issuerRow.value, let accountName = accountRow.value, accountName.count > 0 else { - showAlertDialog(title: "Account not set", message: "Account name can not be empty") + showAlertDialog(title: String(localized: "Account not set", comment: "Rename credential alert"), message: String(localized: "Account name can not be empty", comment: "Rename credential alert")) return } viewModel?.renameAccount(account, issuer: issuer, accountName: accountName) { diff --git a/Authenticator/UI/Authentication/EditCredential/mul.lproj/EditCredential.xcstrings b/Authenticator/UI/Authentication/EditCredential/mul.lproj/EditCredential.xcstrings new file mode 100644 index 00000000..aa33f1b2 --- /dev/null +++ b/Authenticator/UI/Authentication/EditCredential/mul.lproj/EditCredential.xcstrings @@ -0,0 +1,54 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "1gZ-3p-mE7.text" : { + "comment" : "Class = \"UITextField\"; text = \"jens.utbult@yubico.com\"; ObjectID = \"1gZ-3p-mE7\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "jens.utbult@yubico.com" + } + } + } + }, + "3UQ-h0-0mc.title" : { + "comment" : "Class = \"UINavigationItem\"; title = \"Rename\"; ObjectID = \"3UQ-h0-0mc\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Rename" + } + } + } + }, + "D9E-Hm-eAX.title" : { + "comment" : "Class = \"UIBarButtonItem\"; title = \"Cancel\"; ObjectID = \"D9E-Hm-eAX\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Cancel" + } + } + } + }, + "G5H-9k-oaS.title" : { + "comment" : "Class = \"UIBarButtonItem\"; title = \"Save\"; ObjectID = \"G5H-9k-oaS\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Save" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/Authenticator/UI/Help/AboutWrapper.swift b/Authenticator/UI/Help/AboutWrapper.swift index d3e6b6b8..b3d30d45 100644 --- a/Authenticator/UI/Help/AboutWrapper.swift +++ b/Authenticator/UI/Help/AboutWrapper.swift @@ -32,8 +32,8 @@ struct AboutView: View { var body: some View { NavigationView { HelpWrapper() - .navigationTitle("About") - .navigationBarItems(trailing: Button("Close") { + .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) diff --git a/Authenticator/UI/Help/LicensingViewController.swift b/Authenticator/UI/Help/LicensingViewController.swift index 2e37200f..b6cda45d 100644 --- a/Authenticator/UI/Help/LicensingViewController.swift +++ b/Authenticator/UI/Help/LicensingViewController.swift @@ -22,7 +22,7 @@ class LicensingViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - self.title = "Licensing" + 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) diff --git a/Authenticator/UI/Help/VersionHistoryViewController.swift b/Authenticator/UI/Help/VersionHistoryViewController.swift index 1f86df4b..c6870119 100644 --- a/Authenticator/UI/Help/VersionHistoryViewController.swift +++ b/Authenticator/UI/Help/VersionHistoryViewController.swift @@ -25,13 +25,13 @@ class VersionHistoryViewController: UIViewController { private var titleLabel = UILabel() var closeBlock: (() -> ())? - var closeButtonText: String = "Close" { + var closeButtonText: String = String(localized: "Close", comment: "View close button") { didSet { closeButton.setTitle(closeButtonText, for: .normal) } } - var titleText: String = "Version history" { + var titleText: String = String(localized: "Version history", comment: "Version history navigation title") { didSet { titleLabel.text = titleText } diff --git a/Authenticator/UI/Helpers/ToastPresenter.swift b/Authenticator/UI/Helpers/ToastPresenter.swift index 4d656e24..7ebb62c0 100644 --- a/Authenticator/UI/Helpers/ToastPresenter.swift +++ b/Authenticator/UI/Helpers/ToastPresenter.swift @@ -56,7 +56,7 @@ extension ToastPresenter { func copyToClipboard(_ value: String) { UIPasteboard.general.string = value - toast(message: "Copied to clipboard") + toast(message: String(localized: "Copied to clipboard", comment: "Toast copied to clipboard message")) let generator = UINotificationFeedbackGenerator() generator.notificationOccurred(.success) } diff --git a/Authenticator/UI/Helpers/ToastView.swift b/Authenticator/UI/Helpers/ToastView.swift index e399dfe5..7ed278db 100644 --- a/Authenticator/UI/Helpers/ToastView.swift +++ b/Authenticator/UI/Helpers/ToastView.swift @@ -36,16 +36,6 @@ struct ToastView: View { } } -struct ToastView_Previews: PreviewProvider { - static var previews: some View { - ZStack { - Color(.systemBackground).ignoresSafeArea() - Text("Some content...") - .overlay(ToastView(message: "Very toasty! Something has happened!"), alignment: .top) - } - } -} - struct ToastModifier: ViewModifier { @Binding var isPresenting: Bool diff --git a/Authenticator/UI/Helpers/UIAlertController+Extensions.swift b/Authenticator/UI/Helpers/UIAlertController+Extensions.swift index 8cb099a1..92d06d79 100644 --- a/Authenticator/UI/Helpers/UIAlertController+Extensions.swift +++ b/Authenticator/UI/Helpers/UIAlertController+Extensions.swift @@ -38,22 +38,22 @@ extension UIAlertController { let message: String switch type { case .password: - message = "To prevent unauthorized access this YubiKey is protected with a password." + message = String(localized: "To prevent unauthorized access this YubiKey is protected with a password.", comment: "Password entry alert message") case .retryPassword: - message = "Incorrect password. Re-enter password." + message = String(localized: "Incorrect password. Re-enter password.", comment: "Password entry error alert message") } - self.init(title: "Unlock YubiKey", message: message, preferredStyle: .alert) + self.init(title: String(localized: "Unlock YubiKey", comment: "Password entry unlock message"), message: message, preferredStyle: .alert) weak var inputTextField: UITextField? self.addTextField { textField in textField.isSecureTextEntry = true inputTextField = textField } - let ok = UIAlertAction(title: "OK", style: .default) { _ in + let ok = UIAlertAction(title: String(localized: "OK"), style: .default) { _ in completion(inputTextField?.text) } - let cancel = UIAlertAction(title: "Cancel", style: .cancel) { _ in + let cancel = UIAlertAction(title: String(localized: "Cancel"), style: .cancel) { _ in completion(nil) } self.addAction(ok) @@ -63,14 +63,14 @@ extension UIAlertController { convenience init(completion: @escaping (PasswordSaveType) -> Void) { let authenticationType = PasswordPreferences.evaluatedAuthenticationType() - self.init(title: "Would you like to save this password for YubiKey for next usage in this application?", - message: "You can remove saved password in Settings.", + self.init(title: String(localized: "Would you like to save this password for YubiKey for next usage in this application?", comment: "Password entry save password title"), + message: String(localized: "You can remove saved password in Settings.", comment: "Password entry save password message"), preferredStyle: UIDevice.current.userInterfaceIdiom == .pad ? .alert : .actionSheet) - let save = UIAlertAction(title: "Save Password", style: .default) { _ in completion(.save) } - let biometric = UIAlertAction(title: "Save and protect with \(authenticationType.title)", style: .default) { _ in completion(.lock) } - let never = UIAlertAction(title: "Never for this YubiKey", style: .default) { _ in completion(.never) } - let notNow = UIAlertAction(title: "Not now", style: .cancel) { _ in + let save = UIAlertAction(title: String(localized: "Save Password", comment: "Password entry save password button"), style: .default) { _ in completion(.save) } + let biometric = UIAlertAction(title: "\(String(localized: "Save and protect with", comment: "Password entry save substring in 'Save and protect with [save type]'")) \(authenticationType.title)", style: .default) { _ in completion(.lock) } + let never = UIAlertAction(title: String(localized: "Never for this YubiKey", comment: "Password entry never save for this yubikey button"), style: .default) { _ in completion(.never) } + let notNow = UIAlertAction(title: String(localized: "Not now", comment: "Password entry don't save now for this yubikey button"), style: .cancel) { _ in completion(.none) self.dismiss(animated: true, completion: nil) } diff --git a/Authenticator/UI/Helpers/UIViewControllerAdditions.swift b/Authenticator/UI/Helpers/UIViewControllerAdditions.swift index 215c712a..70ca1982 100644 --- a/Authenticator/UI/Helpers/UIViewControllerAdditions.swift +++ b/Authenticator/UI/Helpers/UIViewControllerAdditions.swift @@ -25,12 +25,12 @@ extension UIViewController { func showAlertDialog(title: String, message: String? = nil, nfcHandler: (() -> Void)? = nil, okHandler: (() -> Void)? = nil) { DispatchQueue.main.async { let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) - let cancel = UIAlertAction(title: "OK", style: .cancel) { (action) -> Void in + let cancel = UIAlertAction(title: String(localized: "OK"), style: .cancel) { (action) -> Void in okHandler?() } if YubiKitDeviceCapabilities.supportsISO7816NFCTags && nfcHandler != nil { - let activate = UIAlertAction(title: "Activate NFC", style: .default) { (action) -> Void in + let activate = UIAlertAction(title: String(localized: "Activate NFC", comment: "Password save type activate NFC"), style: .default) { (action) -> Void in nfcHandler?() } alertController.addAction(activate) @@ -49,7 +49,7 @@ extension UIViewController { let reset = UIAlertAction(title: okButtonTitle, style: style, handler: { (action) -> Void in okHandler?() }) - let cancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil) + let cancel = UIAlertAction(title: String(localized: "Cancel"), style: .cancel, handler: nil) alertController.addAction(reset) alertController.addAction(cancel) diff --git a/Authenticator/UI/MainView.swift b/Authenticator/UI/MainView.swift index 2e708a3a..46a2e957 100644 --- a/Authenticator/UI/MainView.swift +++ b/Authenticator/UI/MainView.swift @@ -170,13 +170,13 @@ struct MainView: View { Text(model.passwordEntryMessage) } .alertOrConfirmationDialog(String(localized: "Save password?", comment: "Save password alert"), isPresented: $model.presentPasswordSaveType) { - Button("Save password", comment: "Save password alert.") { model.passwordSaveType.send(.some(.save)) } + Button(String(localized: "Save password", comment: "Save password alert.")) { model.passwordSaveType.send(.some(.save)) } let authenticationType = PasswordPreferences.evaluatedAuthenticationType() if authenticationType != .none { - Button("Save and protect with \(authenticationType.title)") { model.passwordSaveType.send(.some(.lock)) } + Button(String(localized: "Save and protect with \(authenticationType.title)")) { model.passwordSaveType.send(.some(.lock)) } } - Button("Never for this YubiKey", comment: "Save password alert.") { model.passwordSaveType.send(.some(.never)) } - Button("Not now", comment: "Save passsword alert" , role: .cancel) { model.passwordSaveType.send(nil) } + Button(String(localized: "Never for this YubiKey", comment: "Save password alert.")) { model.passwordSaveType.send(.some(.never)) } + Button(String(localized: "Not now", comment: "Save passsword alert"), role: .cancel) { model.passwordSaveType.send(nil) } } .errorAlert(error: $model.sessionError) .errorAlert(error: $model.connectionError) { model.start() } diff --git a/Authenticator/UI/TokenSession/TokenRequestViewController.swift b/Authenticator/UI/TokenSession/TokenRequestViewController.swift index 3f47c548..bc1d8e60 100644 --- a/Authenticator/UI/TokenSession/TokenRequestViewController.swift +++ b/Authenticator/UI/TokenSession/TokenRequestViewController.swift @@ -94,7 +94,7 @@ class TokenRequestViewController: UIViewController, UITextFieldDelegate { UIView.animate(withDuration: 0.2) { self?.accessoryLabel.alpha = 1 if connected { - self?.accessoryLabel.text = "Enter the PIN to access the certificate." + self?.accessoryLabel.text = String(localized: "Enter the PIN to access the certificate.", comment: "PIV extension enter PIN message") } else { self?.accessoryLabel.text = self?.defaultAccessoryTest if YubiKitDeviceCapabilities.supportsISO7816NFCTags { diff --git a/Authenticator/UI/TokenSession/TokenRequestYubiOTPViewController.swift b/Authenticator/UI/TokenSession/TokenRequestYubiOTPViewController.swift index f243fbd9..e032a9c7 100644 --- a/Authenticator/UI/TokenSession/TokenRequestYubiOTPViewController.swift +++ b/Authenticator/UI/TokenSession/TokenRequestYubiOTPViewController.swift @@ -52,7 +52,7 @@ class TokenRequestYubiOTPViewController: UIViewController { private func presentError(_ error: Error?) { guard let error else { return } - let alert = UIAlertController(title: "Error reading YubiKey", message: "\(error.localizedDescription)\n\nRemove and reinsert your YubiKey.") { self.dismiss(animated: true) } + let alert = UIAlertController(title: String(localized: "Error reading YubiKey", comment: "PIV extension error title"), message: "\(error.localizedDescription)\n\n\(String(localized: "Remove and reinsert your YubiKey", comment: "PIV extension error reinsert key")).") { self.dismiss(animated: true) } self.present(alert, animated: true, completion: nil) } } diff --git a/Authenticator/UI/Tutorial/Tutorial.storyboard b/Authenticator/UI/Tutorial/Base.lproj/Tutorial.storyboard similarity index 100% rename from Authenticator/UI/Tutorial/Tutorial.storyboard rename to Authenticator/UI/Tutorial/Base.lproj/Tutorial.storyboard diff --git a/Authenticator/UI/Tutorial/mul.lproj/Tutorial.xcstrings b/Authenticator/UI/Tutorial/mul.lproj/Tutorial.xcstrings new file mode 100644 index 00000000..ffa62997 --- /dev/null +++ b/Authenticator/UI/Tutorial/mul.lproj/Tutorial.xcstrings @@ -0,0 +1,198 @@ +{ + "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" + } + } + } + }, + "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." + } + } + } + }, + "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." + } + } + } + }, + "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." + } + } + } + }, + "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." + } + } + } + }, + "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." + } + } + } + }, + "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." + } + } + } + }, + "IVf-FH-Iqr.title" : { + "comment" : "Class = \"UIBarButtonItem\"; title = \"Skip\"; ObjectID = \"IVf-FH-Iqr\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Skip" + } + } + } + }, + "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." + } + } + } + }, + "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." + } + } + } + }, + "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" + } + } + } + }, + "N2W-CE-fPm.title" : { + "comment" : "Class = \"UIBarButtonItem\"; title = \"Next\"; ObjectID = \"N2W-CE-fPm\";", + "extractionState" : "extracted_with_value", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "Next" + } + } + } + }, + "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." + } + } + } + }, + "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" + } + } + } + }, + "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" + } + } + } + }, + "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..." + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/Authenticator/UI/YubiKeyConfiguration/ConfigurationController.swift b/Authenticator/UI/YubiKeyConfiguration/ConfigurationController.swift index 29d4413e..dc984acd 100644 --- a/Authenticator/UI/YubiKeyConfiguration/ConfigurationController.swift +++ b/Authenticator/UI/YubiKeyConfiguration/ConfigurationController.swift @@ -35,7 +35,7 @@ class ConfigurationController: UITableViewController { if #available(iOS 14.5, *) { } else { switch (indexPath.section, indexPath.row) { case (3, 0): - let alert = UIAlertController(title: "Smart card extension is only available on iOS 14.5 and forward.", message: nil, completion: {}) + let alert = UIAlertController(title: String(localized: "Smart card extension is only available on iOS 14.5 and forward.", comment: "PIV extension version error"), message: nil, completion: {}) self.present(alert, animated: true, completion: nil) default: break } @@ -68,7 +68,7 @@ class ConfigurationController: UITableViewController { self.refreshControl = refreshControl } - insertYubiKeyLabel.text = YubiKitDeviceCapabilities.supportsISO7816NFCTags ? "Insert YubiKey or pull down to activate NFC" : "Insert YubiKey" + insertYubiKeyLabel.text = YubiKitDeviceCapabilities.supportsISO7816NFCTags ? String(localized: "Insert YubiKey or pull down to activate NFC") : String(localized: "Insert YubiKey") infoViewModel.deviceInfo { [weak self] result in DispatchQueue.main.async { @@ -85,7 +85,7 @@ class ConfigurationController: UITableViewController { self?.firmwareVersionLabel.text = info.version.description case .failure(let error): self?.reset() - let alert = UIAlertController(title: "Error reading YubiKey", message: error.localizedDescription) { } + let alert = UIAlertController(title: String(localized: "Error reading YubiKey"), message: error.localizedDescription) { } self?.present(alert, animated: true, completion: nil) } } diff --git a/Authenticator/UI/YubiKeyConfiguration/ConfigurationWrapper.swift b/Authenticator/UI/YubiKeyConfiguration/ConfigurationWrapper.swift index 8b8811cb..4589bfc0 100644 --- a/Authenticator/UI/YubiKeyConfiguration/ConfigurationWrapper.swift +++ b/Authenticator/UI/YubiKeyConfiguration/ConfigurationWrapper.swift @@ -24,8 +24,8 @@ struct ConfigurationView: View { var body: some View { NavigationView { ConfigurationWrapper() - .navigationTitle("Configuration") - .navigationBarItems(trailing: Button("Close") { + .navigationTitle(String(localized: "Configuration", comment: "Configuration navigation title")) + .navigationBarItems(trailing: Button(String(localized: "Close", comment: "View close button")) { showConfiguration.toggle() }) .ignoresSafeArea(.all, edges: .bottom) diff --git a/Authenticator/UI/YubiKeyConfiguration/OATHConfigurationController.swift b/Authenticator/UI/YubiKeyConfiguration/OATHConfigurationController.swift index 64733f11..41501b6a 100644 --- a/Authenticator/UI/YubiKeyConfiguration/OATHConfigurationController.swift +++ b/Authenticator/UI/YubiKeyConfiguration/OATHConfigurationController.swift @@ -54,7 +54,7 @@ class OATHConfigurationController: UITableViewController { override func viewDidLoad() { super.viewDidLoad() - clearPasswordsOnDeviceLabel.text = "Clear passwords saved on \(UIDevice.current.userInterfaceIdiom == .pad ? "iPad" : "iPhone"). This will prompt for a password next time a password protected YubiKey is used." + clearPasswordsOnDeviceLabel.text = "\(String(localized: "Clear passwords saved on", comment: "Substring from 'Clear passwords saved on [iPad/iPhone]. This will prompt for a passowrd next time a password protected YubiKey is used.'.")) \(UIDevice.current.userInterfaceIdiom == .pad ? "iPad" : "iPhone"). \(String(localized: "This will prompt for a password next time a password protected YubiKey is used", comment: "Substring from 'Clear passwords saved on [iPad/iPhone]. This will prompt for a passowrd next time a password protected YubiKey is used.'."))." } func pause() { @@ -83,15 +83,21 @@ class OATHConfigurationController: UITableViewController { override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { switch (indexPath.section, indexPath.row) { case (0, 2): - self.showWarning(title: "Remove password", message: "Remove password for this YubiKey?", okButtonTitle: "Remove password") { [weak self] () -> Void in + self.showWarning(title: String(localized: "Remove password", comment: "Remove password alert title"), + message: String(localized: "Remove password for this YubiKey?", comment: "Remove password alert message"), + okButtonTitle: String(localized: "Remove password", comment: "Remove password alert button")) { [weak self] () -> Void in self?.removeYubiKeyPassword(currentPassword: nil) } case (1, 1): - self.showWarning(title: "Clear passwords?", message: "Clear passwords saved on iPhone. This will prompt for a password next time a password protected YubiKey is used.", okButtonTitle: "Clear") { [weak self] () -> Void in + self.showWarning(title: String(localized: "Clear passwords?", comment: "Clear password alert title"), + message: String(localized: "Clear passwords saved on iPhone. This will prompt for a password next time a password protected YubiKey is used.", comment: "Clear password alert message"), + okButtonTitle: String(localized: "Clear", comment: "Clear password alert button")) { [weak self] () -> Void in self?.removeStoredPasswords() } case (2, 1): - self.showWarning(title: "Reset YubiKey?", message: "This will delete all accounts and restore factory defaults of your YubiKey.", okButtonTitle: "Reset") { [weak self] () -> Void in + self.showWarning(title: String(localized: "Reset YubiKey?", comment: "Reset YubiKey alert title"), + message: String(localized: "This will delete all accounts and restore factory defaults of your YubiKey.", comment: "Reset YubiKey alert message"), + okButtonTitle: String(localized: "Reset", comment: "Reset YubiKey alert button")) { [weak self] () -> Void in self?.resetOATH() } default: @@ -153,11 +159,15 @@ class OATHConfigurationController: UITableViewController { passwordPreferences.resetPasswordPreferenceForAll() do { try secureStore.removeAllValues() - self.showAlertDialog(title: "Success", message: "Stored passwords have been cleared from this phone.", okHandler: { [weak self] () -> Void in + self.showAlertDialog(title: String(localized: "Success", comment: "Clear passwords confirmation alert title"), + message: String(localized: "Stored passwords have been cleared from this phone.", comment: "Clear passwords confirmation alert message"), + okHandler: { [weak self] () -> Void in self?.dismiss(animated: true, completion: nil) }) } catch { - self.showAlertDialog(title: "Failed to clear passwords", message: error.localizedDescription, okHandler: { [weak self] () -> Void in + self.showAlertDialog(title: String(localized: "Failed to clear passwords", comment: "Clear passwords failure alert title"), + message: error.localizedDescription, + okHandler: { [weak self] () -> Void in self?.dismiss(animated: true, completion: nil) }) } @@ -173,11 +183,11 @@ class OATHConfigurationController: UITableViewController { switch result { case .success(let message): if let message = message { - self.showAlertDialog(title: "Reset complete", message: message) + self.showAlertDialog(title: String(localized: "Reset complete", comment: "Reset YubiKey complete alert title"), message: message) } case .failure(let error): if let message = error { - self.showAlertDialog(title: "Failed to reset YubiKey", message: message) + self.showAlertDialog(title: String(localized: "Failed to reset YubiKey", comment: "Reset YubiKey failure alert title"), message: message) } } } diff --git a/Authenticator/UI/YubiKeyConfiguration/OTPConfigurationController.swift b/Authenticator/UI/YubiKeyConfiguration/OTPConfigurationController.swift index 4cafd98b..e002afc5 100644 --- a/Authenticator/UI/YubiKeyConfiguration/OTPConfigurationController.swift +++ b/Authenticator/UI/YubiKeyConfiguration/OTPConfigurationController.swift @@ -37,8 +37,8 @@ class OTPConfigurationController: UITableViewController { viewModel.setOTPEnabled(enabled: sender.isOn) { error in DispatchQueue.main.async { guard error == nil else { - let alert = UIAlertController(title: "Error writing configuration", message: error?.localizedDescription, preferredStyle: .alert) - let action = UIAlertAction(title: "Ok", style: .default) { _ in + let alert = UIAlertController(title: String(localized: "Error writing configuration", comment: "OTP settings error alert title"), message: error?.localizedDescription, preferredStyle: .alert) + let action = UIAlertAction(title: String(localized: "Ok"), style: .default) { _ in self.dismiss() } alert.addAction(action) diff --git a/Authenticator/UI/YubiKeyConfiguration/SetPasswordViewController.swift b/Authenticator/UI/YubiKeyConfiguration/SetPasswordViewController.swift index dd4cbe9a..fd3d38dc 100644 --- a/Authenticator/UI/YubiKeyConfiguration/SetPasswordViewController.swift +++ b/Authenticator/UI/YubiKeyConfiguration/SetPasswordViewController.swift @@ -46,9 +46,9 @@ class SetPasswordViewController: UITableViewController { @IBAction func savePassword(_ sender: Any) { if !password.hasText && !confirmPassword.hasText { - self.showAlertDialog(title: "Error", message: "Password can not be an empty string") + self.showAlertDialog(title: String(localized: "Error"), message: String(localized: "Password can not be an empty string", comment: "Configuration set password empty password error alert message")) } else if password.text != confirmPassword.text { - self.showAlertDialog(title: "Error", message: "The passwords do not match") + self.showAlertDialog(title: String(localized: "Error"), message: String(localized: "The passwords do not match", comment: "Configuration set password not matching error alert message")) } else { self.changePassword(password: password.text ?? "", oldPassword: nil) } diff --git a/Authenticator/UI/YubiKeyConfiguration/SmartCardConfigurationController.swift b/Authenticator/UI/YubiKeyConfiguration/SmartCardConfigurationController.swift index 634dbf80..a82c532b 100644 --- a/Authenticator/UI/YubiKeyConfiguration/SmartCardConfigurationController.swift +++ b/Authenticator/UI/YubiKeyConfiguration/SmartCardConfigurationController.swift @@ -31,10 +31,12 @@ class SmartCardConfigurationController: UITableViewController { @IBAction func showHelp(sender: Any) { - let alert = UIAlertController(title: "Smart card extension", message: "Other applications can use client certificates on your YubiKey for authentication and signing purposes.", preferredStyle: .alert) - let closeAction = UIAlertAction(title: "Close", style: .cancel) + let alert = UIAlertController(title: String(localized: "Smart card extension", comment: "PIV extension info alert title"), + message: String(localized: "Other applications can use client certificates on your YubiKey for authentication and signing purposes.", comment: "PIV extension info alert message"), + preferredStyle: .alert) + let closeAction = UIAlertAction(title: String(localized: "Close"), style: .cancel) alert.addAction(closeAction) - let readMoreAction = UIAlertAction(title: "Read more...", style: .default) {_ in + let readMoreAction = UIAlertAction(title: String(localized: "Read more...", comment: "PIV extension read more alert title"), style: .default) {_ in if let url = URL(string: "https://www.yubico.com/blog/yubico-pioneers-the-simplification-of-smartcard-support-on-mobile-for-ios/") { UIApplication.shared.open(url) } @@ -75,14 +77,16 @@ class SmartCardConfigurationController: UITableViewController { center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in if !granted { DispatchQueue.main.async { - let alertController = UIAlertController (title: "Notifications disabled", message: "The smart card extension requires notifications to be enabled for Yubico Authenticator. Enable it in the iOS Settings.", preferredStyle: .alert) + let alertController = UIAlertController (title: String(localized: "Notifications disabled", comment: "PIV extension notifications alert title"), + message: String(localized: "The smart card extension requires notifications to be enabled for Yubico Authenticator. Enable it in the iOS Settings.", comment: "PIV extensions notifications alert message"), + preferredStyle: .alert) - let cancelAction = UIAlertAction(title: "Cancel", style: .default) {_ in + let cancelAction = UIAlertAction(title: String(localized: "Cancel"), style: .default) {_ in self.dismiss(animated: true) } alertController.addAction(cancelAction) - let settingsAction = UIAlertAction(title: "Settings", style: .default) { (_) -> Void in + let settingsAction = UIAlertAction(title: String(localized: "Settings", comment: "PIV extension settings alert title"), style: .default) { (_) -> Void in guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else { return } @@ -139,7 +143,7 @@ class SmartCardConfigurationController: UITableViewController { func storeTokenCertificate(certificate: SecCertificate) { let error = viewModel.storeTokenCertificate(certificate: certificate) if let error = error { - let alert = UIAlertController(title: "Failed storing certificate", message: "Error: \(error)", completion:{}) + let alert = UIAlertController(title: String(localized: "Failed storing certificate", comment: "PIV extension storing error alert title"), message: "Error: \(error)", completion:{}) self.present(alert, animated: true, completion: nil) } } @@ -162,18 +166,18 @@ class SmartCardConfigurationController: UITableViewController { guard let certificates = certificates else { let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as! MessageCell - cell.message = "Insert YubiKey or pull down to activate NFC" + cell.message = String(localized: "Insert YubiKey or pull down to activate NFC") return cell } if certificates.count == 0 { let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as! MessageCell - cell.message = "No certificates on YubiKey" + cell.message = String(localized: "No certificates on YubiKey", comment: "PIV extension no certificates message") return cell } else { let cell = tableView.dequeueReusableCell(withIdentifier: "CertificateCell", for: indexPath) as! CertificateCell let certificate = certificates[indexPath.row - 1] - cell.name = "\(certificate.certificate.commonName ?? "No name") (slot \(String(format: "%02X", certificate.slot.rawValue)))" + cell.name = "\(certificate.certificate.commonName ?? String(localized: "No name", comment: "PIV extension certificate with no name")) (slot \(String(format: "%02X", certificate.slot.rawValue)))" if !tokens.contains(certificate.certificate) { cell.action = { [weak self] in self?.storeTokenCertificate(certificate: certificate.certificate) @@ -193,7 +197,7 @@ class SmartCardConfigurationController: UITableViewController { if tokens.count == 0 { let cell = tableView.dequeueReusableCell(withIdentifier: "MessageCell", for: indexPath) as! MessageCell - cell.message = "No public key certificates in keychain" + cell.message = String(localized: "No public key certificates in keychain", comment: "PIV extension no certs in keychain") return cell } else { let cell = tableView.dequeueReusableCell(withIdentifier: "CertificateCell", for: indexPath) as! CertificateCell @@ -228,12 +232,12 @@ private class HeaderCell: UITableViewCell { switch newValue { case .onYubiKey: icon.image = UIImage(named: "yubikey")?.withConfiguration(configuration) - title.text = "Certificates on YubiKey".uppercased() - text.text = "Certificates on this YubiKey can be used to authenticate and sign requests from other applications if added to this \(device)." + title.text = String(localized: "Certificates on YubiKey", comment: "PIV extension table cell header").uppercased() + text.text = "\(String(localized: "Certificates on this YubiKey can be used to authenticate and sign requests from other applications if added to this", comment: "PIV extension no certs on yubikey message")) \(device)." case .onDevice: icon.image = UIImage(systemName: "iphone", withConfiguration: configuration) - title.text = "Public key certificates on \(device)".uppercased() - text.text = "These certificates have been added to this \(device) and can be used by other applications." + title.text = "\(String(localized: "Public key certificates on", comment: "PIV extension no certs on device message")) \(device)".uppercased() + text.text = "\(String(localized: "These certificates have been added to this", comment: "PIV extension substring in 'These certificates have been added to this [iPad/iPhone] and can be used by other applications'")) \(device) \(String(localized: "and can be used by other applications", comment: "PIV extension substring in 'These certificates have been added to this [iPad/iPhone] and can be used by other applications'"))." } } } @@ -457,11 +461,11 @@ class TableHeaderView: UIView { case .notEnabled: imageView.image = UIImage(systemName: "minus.circle.fill", withConfiguration: configuration) imageView.tintColor = .secondaryLabel - label.text = "Not Enabled".uppercased() + label.text = String(localized: "Not Enabled", comment: "PIV extension not enabled message").uppercased() case .enabled: imageView.image = UIImage(systemName: "checkmark.circle.fill", withConfiguration: configuration) imageView.tintColor = .systemGreen - label.text = "Enabled".uppercased() + label.text = String(localized: "Enabled", comment: "PIV extension enabled message").uppercased() } } } diff --git a/Authenticator/UI/fr.lproj/LaunchScreen.strings b/Authenticator/UI/fr.lproj/LaunchScreen.strings new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Authenticator/UI/fr.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/Authenticator/UI/fr.lproj/Main.strings b/Authenticator/UI/fr.lproj/Main.strings new file mode 100644 index 00000000..81716cf9 --- /dev/null +++ b/Authenticator/UI/fr.lproj/Main.strings @@ -0,0 +1,243 @@ + +/* Class = "UILabel"; text = "Passwords and reset"; ObjectID = "03k-jY-TEC"; */ +"03k-jY-TEC.text" = "Passwords and reset"; + +/* Class = "UITableViewController"; title = "YubiKey configuration"; ObjectID = "09D-Aw-j1I"; */ +"09D-Aw-j1I.title" = "YubiKey configuration"; + +/* Class = "UILabel"; text = "One-Time Password"; ObjectID = "1mC-4P-2g3"; */ +"1mC-4P-2g3.text" = "One-Time Password"; + +/* Class = "UILabel"; text = "Yubico OTP enabled"; ObjectID = "26R-OJ-dML"; */ +"26R-OJ-dML.text" = "Yubico OTP enabled"; + +/* Class = "UILabel"; text = "Tap the back button to continue"; ObjectID = "2pK-HU-1WC"; */ +"2pK-HU-1WC.text" = "Tap the back button to continue"; + +/* Class = "UILabel"; text = "For additional security and to prevent unauthorized access the YubiKey can be password protected."; ObjectID = "46N-qq-yo2"; */ +"46N-qq-yo2.text" = "For additional security and to prevent unauthorized access the YubiKey can be password protected."; + +/* Class = "UILabel"; text = "PASSWORD PROTECTION"; ObjectID = "5iZ-OS-CfM"; */ +"5iZ-OS-CfM.text" = "PASSWORD PROTECTION"; + +/* Class = "UILabel"; text = "1.0"; ObjectID = "6TW-2t-mYb"; */ +"6TW-2t-mYb.text" = "1.0"; + +/* Class = "UITextField"; placeholder = "Password"; ObjectID = "857-GD-96Q"; */ +"857-GD-96Q.placeholder" = "Password"; + +/* Class = "UINavigationItem"; title = "Passwords and reset"; ObjectID = "9NQ-7X-HqZ"; */ +"9NQ-7X-HqZ.title" = "Passwords and reset"; + +/* Class = "UILabel"; text = "Privacy policy"; ObjectID = "9lG-2A-fbz"; */ +"9lG-2A-fbz.text" = "Privacy policy"; + +/* Class = "UILabel"; text = "Enabled"; ObjectID = "9lL-ZS-odE"; */ +"9lL-ZS-odE.text" = "Enabled"; + +/* Class = "UILabel"; text = "Remove and re-insert your YubiKey"; ObjectID = "AGQ-n1-pV3"; */ +"AGQ-n1-pV3.text" = "Remove and re-insert your YubiKey"; + +/* Class = "UITableViewController"; title = "YubiKey configuration"; ObjectID = "Bxb-bg-K32"; */ +"Bxb-bg-K32.title" = "YubiKey configuration"; + +/* Class = "UILabel"; text = "Activate NFC on OTP tag read"; ObjectID = "Byl-RD-bpD"; */ +"Byl-RD-bpD.text" = "Activate NFC on OTP tag read"; + +/* Class = "UITableViewSection"; headerTitle = "Configuration"; ObjectID = "C5n-jq-Mk9"; */ +"C5n-jq-Mk9.headerTitle" = "Configuration"; + +/* Class = "UILabel"; text = "Password"; ObjectID = "Ced-DN-oqW"; */ +"Ced-DN-oqW.text" = "Password"; + +/* Class = "UILabel"; text = "NFC settings"; ObjectID = "D3g-ds-RCu"; */ +"D3g-ds-RCu.text" = "NFC settings"; + +/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "D6R-wW-EtA"; */ +"D6R-wW-EtA.title" = "Close"; + +/* Class = "UILabel"; text = "Copyright © 2021 Yubico.\nAll rights reserved."; ObjectID = "Ecy-Pw-sM0"; */ +"Ecy-Pw-sM0.text" = "Copyright © 2021 Yubico.\nAll rights reserved."; + +/* Class = "UILabel"; text = "Initiate NFC at application start"; ObjectID = "Efl-xJ-qER"; */ +"Efl-xJ-qER.text" = "Initiate NFC at application start"; + +/* Class = "UILabel"; text = "SAVED PASSWORDS"; ObjectID = "FMw-TB-KRk"; */ +"FMw-TB-KRk.text" = "SAVED PASSWORDS"; + +/* Class = "UINavigationItem"; title = "About"; ObjectID = "Hbq-O7-HqW"; */ +"Hbq-O7-HqW.title" = "About"; + +/* Class = "UILabel"; text = "Yubico OTP has been disabled"; ObjectID = "Icc-EW-Cgh"; */ +"Icc-EW-Cgh.text" = "Yubico OTP has been disabled"; + +/* Class = "UINavigationItem"; title = "Toggle One-Time Password"; ObjectID = "Inc-aD-fdW"; */ +"Inc-aD-fdW.title" = "Toggle One-Time Password"; + +/* Class = "UILabel"; text = "This YubiKey has Yubico OTP enabled which makes it appear as an external keyboard to the iPhone. Unfortunately this causes problem with the normal on-screen keyboard."; ObjectID = "JN3-vC-kaK"; */ +"JN3-vC-kaK.text" = "This YubiKey has Yubico OTP enabled which makes it appear as an external keyboard to the iPhone. Unfortunately this causes problem with the normal on-screen keyboard."; + +/* Class = "UITextField"; placeholder = "Smart card (PIV) PIN"; ObjectID = "JON-gB-7WG"; */ +"JON-gB-7WG.placeholder" = "Smart card (PIV) PIN"; + +/* Class = "UILabel"; text = "While the YubiKey is inserted the on-screen keyboard will not appear. To show the keyboard you will have to remove the YubiKey and then re-insert it."; ObjectID = "JQM-z3-Kvc"; */ +"JQM-z3-Kvc.text" = "While the YubiKey is inserted the on-screen keyboard will not appear. To show the keyboard you will have to remove the YubiKey and then re-insert it."; + +/* Class = "UITableViewSection"; footerTitle = "Start NFC and read OATH accounts when the application has been opened by reading the OTP tag on a YubiKey."; ObjectID = "JSq-rh-zB3"; */ +"JSq-rh-zB3.footerTitle" = "Start NFC and read OATH accounts when the application has been opened by reading the OTP tag on a YubiKey."; + +/* Class = "UILabel"; text = "or"; ObjectID = "L2j-ZW-Jbf"; */ +"L2j-ZW-Jbf.text" = "or"; + +/* Class = "UILabel"; text = "Serial number"; ObjectID = "Lzm-p7-Lmb"; */ +"Lzm-p7-Lmb.text" = "Serial number"; + +/* Class = "UILabel"; text = "N/A"; ObjectID = "MBv-4M-eos"; */ +"MBv-4M-eos.text" = "N/A"; + +/* Class = "UILabel"; text = "Help with YubiKey"; ObjectID = "NnL-eZ-nHd"; */ +"NnL-eZ-nHd.text" = "Help with YubiKey"; + +/* Class = "UILabel"; text = "Unlock YubiKey"; ObjectID = "O2N-dk-eMF"; */ +"O2N-dk-eMF.text" = "Unlock YubiKey"; + +/* Class = "UILabel"; text = "Set password"; ObjectID = "Oba-Qw-cTB"; */ +"Oba-Qw-cTB.text" = "Set password"; + +/* Class = "UINavigationItem"; title = "NFC settings"; ObjectID = "PCq-PC-KyX"; */ +"PCq-PC-KyX.title" = "NFC settings"; + +/* Class = "UILabel"; text = "N/A"; ObjectID = "QGj-16-s0W"; */ +"QGj-16-s0W.text" = "N/A"; + +/* Class = "UILabel"; text = "Terms of use"; ObjectID = "QHB-fS-VBc"; */ +"QHB-fS-VBc.text" = "Terms of use"; + +/* Class = "UILabel"; text = "Insert YubiKey or pull down to activate NFC"; ObjectID = "Re8-TR-xIr"; */ +"Re8-TR-xIr.text" = "Insert YubiKey or pull down to activate NFC"; + +/* Class = "UIButton"; normalTitle = "UnwindButton"; ObjectID = "Szl-yL-4ir"; */ +"Szl-yL-4ir.normalTitle" = "UnwindButton"; + +/* Class = "UITableViewSection"; footerTitle = "Accounts that require touch will need an extra NFC tap to calculate its code. Bypassing it minimizes the number of NFC taps needed."; ObjectID = "Uvq-Ba-xiH"; */ +"Uvq-Ba-xiH.footerTitle" = "Accounts that require touch will need an extra NFC tap to calculate its code. Bypassing it minimizes the number of NFC taps needed."; + +/* Class = "UILabel"; text = "N/A"; ObjectID = "VAw-dv-zeA"; */ +"VAw-dv-zeA.text" = "N/A"; + +/* Class = "UILabel"; text = "Yubico Authenticator"; ObjectID = "VHQ-4i-YEj"; */ +"VHQ-4i-YEj.text" = "Yubico Authenticator"; + +/* Class = "UILabel"; text = "Reset YubiKey"; ObjectID = "Vb7-1M-PWz"; */ +"Vb7-1M-PWz.text" = "Reset YubiKey"; + +/* Class = "UILabel"; text = "Enter the PIN, then tap a NFC enabled YubiKey against the iPhone to access the certificate."; ObjectID = "WGy-0e-K7w"; */ +"WGy-0e-K7w.text" = "Enter the PIN, then tap a NFC enabled YubiKey against the iPhone to access the certificate."; + +/* Class = "UIButton"; configuration.title = "Disable Yubico OTP (recommended)"; ObjectID = "Yo4-ef-tkZ"; */ +"Yo4-ef-tkZ.configuration.title" = "Disable Yubico OTP (recommended)"; + +/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "Yo4-ef-tkZ"; */ +"Yo4-ef-tkZ.normalTitle" = "Button"; + +/* Class = "UILabel"; text = "Firmware"; ObjectID = "aFH-4H-WRy"; */ +"aFH-4H-WRy.text" = "Firmware"; + +/* Class = "UILabel"; text = "Confirm password"; ObjectID = "al9-tv-dIv"; */ +"al9-tv-dIv.text" = "Confirm password"; + +/* Class = "UILabel"; text = "ONE-TIME PASSWORD"; ObjectID = "b6z-Ri-5bh"; */ +"b6z-Ri-5bh.text" = "ONE-TIME PASSWORD"; + +/* Class = "UILabel"; text = "Disabling Yubico OTP will prevent the YubiKey from appearing as a keyboard. If you don’t use Yubico OTP this is the recommended solution. This can be re-enabled from the settings page."; ObjectID = "cou-Cr-QYP"; */ +"cou-Cr-QYP.text" = "Disabling Yubico OTP will prevent the YubiKey from appearing as a keyboard. If you don’t use Yubico OTP this is the recommended solution. This can be re-enabled from the settings page."; + +/* Class = "UILabel"; text = "Remove password"; ObjectID = "dAR-My-Mmm"; */ +"dAR-My-Mmm.text" = "Remove password"; + +/* Class = "UINavigationItem"; title = "Configuration"; ObjectID = "e3s-bq-xAt"; */ +"e3s-bq-xAt.title" = "Configuration"; + +/* Class = "UINavigationItem"; title = "Set password"; ObjectID = "eiF-JR-TAC"; */ +"eiF-JR-TAC.title" = "Set password"; + +/* Class = "UINavigationItem"; title = "Smart card extension"; ObjectID = "fl4-8d-lD9"; */ +"fl4-8d-lD9.title" = "Smart card extension"; + +/* Class = "UILabel"; text = "Bypass touch requirement"; ObjectID = "frN-Of-d1s"; */ +"frN-Of-d1s.text" = "Bypass touch requirement"; + +/* Class = "UILabel"; text = "RESET YUBIKEY"; ObjectID = "gAN-p5-fcQ"; */ +"gAN-p5-fcQ.text" = "RESET YUBIKEY"; + +/* Class = "UITableViewSection"; footerTitle = "Initiate NFC at application start will automatically read your YubiKey as soon as the app becomes active."; ObjectID = "gQR-ie-6Y0"; */ +"gQR-ie-6Y0.footerTitle" = "Initiate NFC at application start will automatically read your YubiKey as soon as the app becomes active."; + +/* Class = "UILabel"; text = "Clear passwords saved on iPhone. This will prompt for a password next time a password protected YubiKey is used."; ObjectID = "gYP-vW-fFN"; */ +"gYP-vW-fFN.text" = "Clear passwords saved on iPhone. This will prompt for a password next time a password protected YubiKey is used."; + +/* Class = "UILabel"; text = "Version history"; ObjectID = "ghF-dC-3d6"; */ +"ghF-dC-3d6.text" = "Version history"; + +/* Class = "UIBarButtonItem"; title = "Item"; ObjectID = "hBA-XE-Ib1"; */ +"hBA-XE-Ib1.title" = "Item"; + +/* Class = "UITableViewSection"; footerTitle = "For additional security and to prevent unauthorized access the YubiKey can be protected with a password"; ObjectID = "hOr-gJ-fIa"; */ +"hOr-gJ-fIa.footerTitle" = "For additional security and to prevent unauthorized access the YubiKey can be protected with a password"; + +/* Class = "UILabel"; text = "Copy OTP to clipboard"; ObjectID = "hsz-tV-DPW"; */ +"hsz-tV-DPW.text" = "Copy OTP to clipboard"; + +/* Class = "UILabel"; text = "Smart card extension"; ObjectID = "iH3-4d-Rv5"; */ +"iH3-4d-Rv5.text" = "Smart card extension"; + +/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "jNG-Du-Ghz"; */ +"jNG-Du-Ghz.title" = "Close"; + +/* Class = "UILabel"; text = "Clear saved passwords"; ObjectID = "jx7-Be-qMk"; */ +"jx7-Be-qMk.text" = "Clear saved passwords"; + +/* Class = "UIButton"; configuration.title = "Continue with limited usability"; ObjectID = "kAX-Sn-d4r"; */ +"kAX-Sn-d4r.configuration.title" = "Continue with limited usability"; + +/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "kAX-Sn-d4r"; */ +"kAX-Sn-d4r.normalTitle" = "Button"; + +/* Class = "UILabel"; text = "Device type"; ObjectID = "llv-60-0FB"; */ +"llv-60-0FB.text" = "Device type"; + +/* Class = "UILabel"; text = "Insert a YubiKey and enter its PIN to access the certificate."; ObjectID = "noy-hK-f0E"; */ +"noy-hK-f0E.text" = "Insert a YubiKey and enter its PIN to access the certificate."; + +/* Class = "UITableViewSection"; footerTitle = "Copy OTP automatically to clipboard when a YubiKey has been scanned using the NFC tag functionality."; ObjectID = "oy6-QK-Bgw"; */ +"oy6-QK-Bgw.footerTitle" = "Copy OTP automatically to clipboard when a YubiKey has been scanned using the NFC tag functionality."; + +/* Class = "UITableViewSection"; headerTitle = "Application"; ObjectID = "raA-qu-ETm"; */ +"raA-qu-ETm.headerTitle" = "Application"; + +/* Class = "UILabel"; text = "Contact support"; ObjectID = "tMr-aW-Doe"; */ +"tMr-aW-Doe.text" = "Contact support"; + +/* Class = "UILabel"; text = "Toggle One-Time Password"; ObjectID = "uP5-O2-d0d"; */ +"uP5-O2-d0d.text" = "Toggle One-Time Password"; + +/* Class = "UILabel"; text = "Turn on/off opening Safari to copy your OTP when scanning the NFC YubiKey."; ObjectID = "vjs-4B-RzZ"; */ +"vjs-4B-RzZ.text" = "Turn on/off opening Safari to copy your OTP when scanning the NFC YubiKey."; + +/* Class = "UITableViewSection"; headerTitle = "Support"; ObjectID = "vn9-zq-1Ri"; */ +"vn9-zq-1Ri.headerTitle" = "Support"; + +/* Class = "UITextField"; placeholder = "Password"; ObjectID = "wH4-5g-AV5"; */ +"wH4-5g-AV5.placeholder" = "Password"; + +/* Class = "UILabel"; text = "Licensing"; ObjectID = "wvt-LS-lIS"; */ +"wvt-LS-lIS.text" = "Licensing"; + +/* Class = "UILabel"; text = "How does it work"; ObjectID = "y0i-iX-KLv"; */ +"y0i-iX-KLv.text" = "How does it work"; + +/* Class = "UITableViewSection"; headerTitle = "INFORMATION"; ObjectID = "yed-kd-amP"; */ +"yed-kd-amP.headerTitle" = "INFORMATION"; + +/* Class = "UILabel"; text = "Reset all accounts stored on YubiKey, make sure they are not in use anywhere before doing this."; ObjectID = "zcT-oY-vKq"; */ +"zcT-oY-vKq.text" = "Reset all accounts stored on YubiKey, make sure they are not in use anywhere before doing this."; diff --git a/Authenticator/UI/ja.lproj/LaunchScreen.strings b/Authenticator/UI/ja.lproj/LaunchScreen.strings new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/Authenticator/UI/ja.lproj/LaunchScreen.strings @@ -0,0 +1 @@ + diff --git a/Authenticator/UI/ja.lproj/Main.strings b/Authenticator/UI/ja.lproj/Main.strings new file mode 100644 index 00000000..81716cf9 --- /dev/null +++ b/Authenticator/UI/ja.lproj/Main.strings @@ -0,0 +1,243 @@ + +/* Class = "UILabel"; text = "Passwords and reset"; ObjectID = "03k-jY-TEC"; */ +"03k-jY-TEC.text" = "Passwords and reset"; + +/* Class = "UITableViewController"; title = "YubiKey configuration"; ObjectID = "09D-Aw-j1I"; */ +"09D-Aw-j1I.title" = "YubiKey configuration"; + +/* Class = "UILabel"; text = "One-Time Password"; ObjectID = "1mC-4P-2g3"; */ +"1mC-4P-2g3.text" = "One-Time Password"; + +/* Class = "UILabel"; text = "Yubico OTP enabled"; ObjectID = "26R-OJ-dML"; */ +"26R-OJ-dML.text" = "Yubico OTP enabled"; + +/* Class = "UILabel"; text = "Tap the back button to continue"; ObjectID = "2pK-HU-1WC"; */ +"2pK-HU-1WC.text" = "Tap the back button to continue"; + +/* Class = "UILabel"; text = "For additional security and to prevent unauthorized access the YubiKey can be password protected."; ObjectID = "46N-qq-yo2"; */ +"46N-qq-yo2.text" = "For additional security and to prevent unauthorized access the YubiKey can be password protected."; + +/* Class = "UILabel"; text = "PASSWORD PROTECTION"; ObjectID = "5iZ-OS-CfM"; */ +"5iZ-OS-CfM.text" = "PASSWORD PROTECTION"; + +/* Class = "UILabel"; text = "1.0"; ObjectID = "6TW-2t-mYb"; */ +"6TW-2t-mYb.text" = "1.0"; + +/* Class = "UITextField"; placeholder = "Password"; ObjectID = "857-GD-96Q"; */ +"857-GD-96Q.placeholder" = "Password"; + +/* Class = "UINavigationItem"; title = "Passwords and reset"; ObjectID = "9NQ-7X-HqZ"; */ +"9NQ-7X-HqZ.title" = "Passwords and reset"; + +/* Class = "UILabel"; text = "Privacy policy"; ObjectID = "9lG-2A-fbz"; */ +"9lG-2A-fbz.text" = "Privacy policy"; + +/* Class = "UILabel"; text = "Enabled"; ObjectID = "9lL-ZS-odE"; */ +"9lL-ZS-odE.text" = "Enabled"; + +/* Class = "UILabel"; text = "Remove and re-insert your YubiKey"; ObjectID = "AGQ-n1-pV3"; */ +"AGQ-n1-pV3.text" = "Remove and re-insert your YubiKey"; + +/* Class = "UITableViewController"; title = "YubiKey configuration"; ObjectID = "Bxb-bg-K32"; */ +"Bxb-bg-K32.title" = "YubiKey configuration"; + +/* Class = "UILabel"; text = "Activate NFC on OTP tag read"; ObjectID = "Byl-RD-bpD"; */ +"Byl-RD-bpD.text" = "Activate NFC on OTP tag read"; + +/* Class = "UITableViewSection"; headerTitle = "Configuration"; ObjectID = "C5n-jq-Mk9"; */ +"C5n-jq-Mk9.headerTitle" = "Configuration"; + +/* Class = "UILabel"; text = "Password"; ObjectID = "Ced-DN-oqW"; */ +"Ced-DN-oqW.text" = "Password"; + +/* Class = "UILabel"; text = "NFC settings"; ObjectID = "D3g-ds-RCu"; */ +"D3g-ds-RCu.text" = "NFC settings"; + +/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "D6R-wW-EtA"; */ +"D6R-wW-EtA.title" = "Close"; + +/* Class = "UILabel"; text = "Copyright © 2021 Yubico.\nAll rights reserved."; ObjectID = "Ecy-Pw-sM0"; */ +"Ecy-Pw-sM0.text" = "Copyright © 2021 Yubico.\nAll rights reserved."; + +/* Class = "UILabel"; text = "Initiate NFC at application start"; ObjectID = "Efl-xJ-qER"; */ +"Efl-xJ-qER.text" = "Initiate NFC at application start"; + +/* Class = "UILabel"; text = "SAVED PASSWORDS"; ObjectID = "FMw-TB-KRk"; */ +"FMw-TB-KRk.text" = "SAVED PASSWORDS"; + +/* Class = "UINavigationItem"; title = "About"; ObjectID = "Hbq-O7-HqW"; */ +"Hbq-O7-HqW.title" = "About"; + +/* Class = "UILabel"; text = "Yubico OTP has been disabled"; ObjectID = "Icc-EW-Cgh"; */ +"Icc-EW-Cgh.text" = "Yubico OTP has been disabled"; + +/* Class = "UINavigationItem"; title = "Toggle One-Time Password"; ObjectID = "Inc-aD-fdW"; */ +"Inc-aD-fdW.title" = "Toggle One-Time Password"; + +/* Class = "UILabel"; text = "This YubiKey has Yubico OTP enabled which makes it appear as an external keyboard to the iPhone. Unfortunately this causes problem with the normal on-screen keyboard."; ObjectID = "JN3-vC-kaK"; */ +"JN3-vC-kaK.text" = "This YubiKey has Yubico OTP enabled which makes it appear as an external keyboard to the iPhone. Unfortunately this causes problem with the normal on-screen keyboard."; + +/* Class = "UITextField"; placeholder = "Smart card (PIV) PIN"; ObjectID = "JON-gB-7WG"; */ +"JON-gB-7WG.placeholder" = "Smart card (PIV) PIN"; + +/* Class = "UILabel"; text = "While the YubiKey is inserted the on-screen keyboard will not appear. To show the keyboard you will have to remove the YubiKey and then re-insert it."; ObjectID = "JQM-z3-Kvc"; */ +"JQM-z3-Kvc.text" = "While the YubiKey is inserted the on-screen keyboard will not appear. To show the keyboard you will have to remove the YubiKey and then re-insert it."; + +/* Class = "UITableViewSection"; footerTitle = "Start NFC and read OATH accounts when the application has been opened by reading the OTP tag on a YubiKey."; ObjectID = "JSq-rh-zB3"; */ +"JSq-rh-zB3.footerTitle" = "Start NFC and read OATH accounts when the application has been opened by reading the OTP tag on a YubiKey."; + +/* Class = "UILabel"; text = "or"; ObjectID = "L2j-ZW-Jbf"; */ +"L2j-ZW-Jbf.text" = "or"; + +/* Class = "UILabel"; text = "Serial number"; ObjectID = "Lzm-p7-Lmb"; */ +"Lzm-p7-Lmb.text" = "Serial number"; + +/* Class = "UILabel"; text = "N/A"; ObjectID = "MBv-4M-eos"; */ +"MBv-4M-eos.text" = "N/A"; + +/* Class = "UILabel"; text = "Help with YubiKey"; ObjectID = "NnL-eZ-nHd"; */ +"NnL-eZ-nHd.text" = "Help with YubiKey"; + +/* Class = "UILabel"; text = "Unlock YubiKey"; ObjectID = "O2N-dk-eMF"; */ +"O2N-dk-eMF.text" = "Unlock YubiKey"; + +/* Class = "UILabel"; text = "Set password"; ObjectID = "Oba-Qw-cTB"; */ +"Oba-Qw-cTB.text" = "Set password"; + +/* Class = "UINavigationItem"; title = "NFC settings"; ObjectID = "PCq-PC-KyX"; */ +"PCq-PC-KyX.title" = "NFC settings"; + +/* Class = "UILabel"; text = "N/A"; ObjectID = "QGj-16-s0W"; */ +"QGj-16-s0W.text" = "N/A"; + +/* Class = "UILabel"; text = "Terms of use"; ObjectID = "QHB-fS-VBc"; */ +"QHB-fS-VBc.text" = "Terms of use"; + +/* Class = "UILabel"; text = "Insert YubiKey or pull down to activate NFC"; ObjectID = "Re8-TR-xIr"; */ +"Re8-TR-xIr.text" = "Insert YubiKey or pull down to activate NFC"; + +/* Class = "UIButton"; normalTitle = "UnwindButton"; ObjectID = "Szl-yL-4ir"; */ +"Szl-yL-4ir.normalTitle" = "UnwindButton"; + +/* Class = "UITableViewSection"; footerTitle = "Accounts that require touch will need an extra NFC tap to calculate its code. Bypassing it minimizes the number of NFC taps needed."; ObjectID = "Uvq-Ba-xiH"; */ +"Uvq-Ba-xiH.footerTitle" = "Accounts that require touch will need an extra NFC tap to calculate its code. Bypassing it minimizes the number of NFC taps needed."; + +/* Class = "UILabel"; text = "N/A"; ObjectID = "VAw-dv-zeA"; */ +"VAw-dv-zeA.text" = "N/A"; + +/* Class = "UILabel"; text = "Yubico Authenticator"; ObjectID = "VHQ-4i-YEj"; */ +"VHQ-4i-YEj.text" = "Yubico Authenticator"; + +/* Class = "UILabel"; text = "Reset YubiKey"; ObjectID = "Vb7-1M-PWz"; */ +"Vb7-1M-PWz.text" = "Reset YubiKey"; + +/* Class = "UILabel"; text = "Enter the PIN, then tap a NFC enabled YubiKey against the iPhone to access the certificate."; ObjectID = "WGy-0e-K7w"; */ +"WGy-0e-K7w.text" = "Enter the PIN, then tap a NFC enabled YubiKey against the iPhone to access the certificate."; + +/* Class = "UIButton"; configuration.title = "Disable Yubico OTP (recommended)"; ObjectID = "Yo4-ef-tkZ"; */ +"Yo4-ef-tkZ.configuration.title" = "Disable Yubico OTP (recommended)"; + +/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "Yo4-ef-tkZ"; */ +"Yo4-ef-tkZ.normalTitle" = "Button"; + +/* Class = "UILabel"; text = "Firmware"; ObjectID = "aFH-4H-WRy"; */ +"aFH-4H-WRy.text" = "Firmware"; + +/* Class = "UILabel"; text = "Confirm password"; ObjectID = "al9-tv-dIv"; */ +"al9-tv-dIv.text" = "Confirm password"; + +/* Class = "UILabel"; text = "ONE-TIME PASSWORD"; ObjectID = "b6z-Ri-5bh"; */ +"b6z-Ri-5bh.text" = "ONE-TIME PASSWORD"; + +/* Class = "UILabel"; text = "Disabling Yubico OTP will prevent the YubiKey from appearing as a keyboard. If you don’t use Yubico OTP this is the recommended solution. This can be re-enabled from the settings page."; ObjectID = "cou-Cr-QYP"; */ +"cou-Cr-QYP.text" = "Disabling Yubico OTP will prevent the YubiKey from appearing as a keyboard. If you don’t use Yubico OTP this is the recommended solution. This can be re-enabled from the settings page."; + +/* Class = "UILabel"; text = "Remove password"; ObjectID = "dAR-My-Mmm"; */ +"dAR-My-Mmm.text" = "Remove password"; + +/* Class = "UINavigationItem"; title = "Configuration"; ObjectID = "e3s-bq-xAt"; */ +"e3s-bq-xAt.title" = "Configuration"; + +/* Class = "UINavigationItem"; title = "Set password"; ObjectID = "eiF-JR-TAC"; */ +"eiF-JR-TAC.title" = "Set password"; + +/* Class = "UINavigationItem"; title = "Smart card extension"; ObjectID = "fl4-8d-lD9"; */ +"fl4-8d-lD9.title" = "Smart card extension"; + +/* Class = "UILabel"; text = "Bypass touch requirement"; ObjectID = "frN-Of-d1s"; */ +"frN-Of-d1s.text" = "Bypass touch requirement"; + +/* Class = "UILabel"; text = "RESET YUBIKEY"; ObjectID = "gAN-p5-fcQ"; */ +"gAN-p5-fcQ.text" = "RESET YUBIKEY"; + +/* Class = "UITableViewSection"; footerTitle = "Initiate NFC at application start will automatically read your YubiKey as soon as the app becomes active."; ObjectID = "gQR-ie-6Y0"; */ +"gQR-ie-6Y0.footerTitle" = "Initiate NFC at application start will automatically read your YubiKey as soon as the app becomes active."; + +/* Class = "UILabel"; text = "Clear passwords saved on iPhone. This will prompt for a password next time a password protected YubiKey is used."; ObjectID = "gYP-vW-fFN"; */ +"gYP-vW-fFN.text" = "Clear passwords saved on iPhone. This will prompt for a password next time a password protected YubiKey is used."; + +/* Class = "UILabel"; text = "Version history"; ObjectID = "ghF-dC-3d6"; */ +"ghF-dC-3d6.text" = "Version history"; + +/* Class = "UIBarButtonItem"; title = "Item"; ObjectID = "hBA-XE-Ib1"; */ +"hBA-XE-Ib1.title" = "Item"; + +/* Class = "UITableViewSection"; footerTitle = "For additional security and to prevent unauthorized access the YubiKey can be protected with a password"; ObjectID = "hOr-gJ-fIa"; */ +"hOr-gJ-fIa.footerTitle" = "For additional security and to prevent unauthorized access the YubiKey can be protected with a password"; + +/* Class = "UILabel"; text = "Copy OTP to clipboard"; ObjectID = "hsz-tV-DPW"; */ +"hsz-tV-DPW.text" = "Copy OTP to clipboard"; + +/* Class = "UILabel"; text = "Smart card extension"; ObjectID = "iH3-4d-Rv5"; */ +"iH3-4d-Rv5.text" = "Smart card extension"; + +/* Class = "UIBarButtonItem"; title = "Close"; ObjectID = "jNG-Du-Ghz"; */ +"jNG-Du-Ghz.title" = "Close"; + +/* Class = "UILabel"; text = "Clear saved passwords"; ObjectID = "jx7-Be-qMk"; */ +"jx7-Be-qMk.text" = "Clear saved passwords"; + +/* Class = "UIButton"; configuration.title = "Continue with limited usability"; ObjectID = "kAX-Sn-d4r"; */ +"kAX-Sn-d4r.configuration.title" = "Continue with limited usability"; + +/* Class = "UIButton"; normalTitle = "Button"; ObjectID = "kAX-Sn-d4r"; */ +"kAX-Sn-d4r.normalTitle" = "Button"; + +/* Class = "UILabel"; text = "Device type"; ObjectID = "llv-60-0FB"; */ +"llv-60-0FB.text" = "Device type"; + +/* Class = "UILabel"; text = "Insert a YubiKey and enter its PIN to access the certificate."; ObjectID = "noy-hK-f0E"; */ +"noy-hK-f0E.text" = "Insert a YubiKey and enter its PIN to access the certificate."; + +/* Class = "UITableViewSection"; footerTitle = "Copy OTP automatically to clipboard when a YubiKey has been scanned using the NFC tag functionality."; ObjectID = "oy6-QK-Bgw"; */ +"oy6-QK-Bgw.footerTitle" = "Copy OTP automatically to clipboard when a YubiKey has been scanned using the NFC tag functionality."; + +/* Class = "UITableViewSection"; headerTitle = "Application"; ObjectID = "raA-qu-ETm"; */ +"raA-qu-ETm.headerTitle" = "Application"; + +/* Class = "UILabel"; text = "Contact support"; ObjectID = "tMr-aW-Doe"; */ +"tMr-aW-Doe.text" = "Contact support"; + +/* Class = "UILabel"; text = "Toggle One-Time Password"; ObjectID = "uP5-O2-d0d"; */ +"uP5-O2-d0d.text" = "Toggle One-Time Password"; + +/* Class = "UILabel"; text = "Turn on/off opening Safari to copy your OTP when scanning the NFC YubiKey."; ObjectID = "vjs-4B-RzZ"; */ +"vjs-4B-RzZ.text" = "Turn on/off opening Safari to copy your OTP when scanning the NFC YubiKey."; + +/* Class = "UITableViewSection"; headerTitle = "Support"; ObjectID = "vn9-zq-1Ri"; */ +"vn9-zq-1Ri.headerTitle" = "Support"; + +/* Class = "UITextField"; placeholder = "Password"; ObjectID = "wH4-5g-AV5"; */ +"wH4-5g-AV5.placeholder" = "Password"; + +/* Class = "UILabel"; text = "Licensing"; ObjectID = "wvt-LS-lIS"; */ +"wvt-LS-lIS.text" = "Licensing"; + +/* Class = "UILabel"; text = "How does it work"; ObjectID = "y0i-iX-KLv"; */ +"y0i-iX-KLv.text" = "How does it work"; + +/* Class = "UITableViewSection"; headerTitle = "INFORMATION"; ObjectID = "yed-kd-amP"; */ +"yed-kd-amP.headerTitle" = "INFORMATION"; + +/* Class = "UILabel"; text = "Reset all accounts stored on YubiKey, make sure they are not in use anywhere before doing this."; ObjectID = "zcT-oY-vKq"; */ +"zcT-oY-vKq.text" = "Reset all accounts stored on YubiKey, make sure they are not in use anywhere before doing this."; diff --git a/Localizations/en.xcloc/Localized Contents/en.xliff b/Localizations/en.xcloc/Localized Contents/en.xliff new file mode 100644 index 00000000..df4c0ace --- /dev/null +++ b/Localizations/en.xcloc/Localized Contents/en.xliff @@ -0,0 +1,623 @@ + + + +
+ +
+ + + Authenticator + Authenticator + Bundle name + + + The application needs access to NFC reading to communicate with your Yubikey. + The application needs access to NFC reading to communicate with your Yubikey. + Privacy - NFC Scan Usage Description + + + The application needs access to Camera to scan QR codes. + The application needs access to Camera to scan QR codes. + Privacy - Camera Usage Description + + + The application needs access to Face ID to unlock your password vault. + The application needs access to Face ID to unlock your password vault. + Privacy - Face ID Usage Description + + +
+ +
+ +
+ + + *** *** + *** *** + No comment provided by engineer. + + + 888 888 + 888 888 + No comment provided by engineer. + + + ? + ? + No comment provided by engineer. + + + Accounts + Accounts + No comment provided by engineer. + + + Cancel + Cancel + No comment provided by engineer. + + + Continue with limited usability + Continue with limited usability + No comment provided by engineer. + + + Data to String conversion error + Data to String conversion error + No comment provided by engineer. + + + Delete + Delete + No comment provided by engineer. + + + Delete account? + Delete account? + No comment provided by engineer. + + + Disable Yubico OTP (recommended) + Disable Yubico OTP (recommended) + No comment provided by engineer. + + + Disabling Yubico OTP will prevent the YubiKey from appearing as a keyboard. If you don’t use Yubico OTP this is the recommended solution. This can be re-enabled from the settings page. + Disabling Yubico OTP will prevent the YubiKey from appearing as a keyboard. If you don’t use Yubico OTP this is the recommended solution. This can be re-enabled from the settings page. + No comment provided by engineer. + + + Failed to cast object to Data error + Failed to cast object to Data error + No comment provided by engineer. + + + Invalid URI format + Invalid URI format + Invalid Uri, wrong parameters + + + Item not found in secure storage + Item not found in secure storage + No comment provided by engineer. + + + Other + Other + No comment provided by engineer. + + + Pinned + Pinned + No comment provided by engineer. + + + Plug-in your YubiKey for that operation + Plug-in your YubiKey for that operation + No service found + + + Remove and re-insert your YubiKey + Remove and re-insert your YubiKey + No comment provided by engineer. + + + Some content... + Some content... + No comment provided by engineer. + + + Something went wrong and key doesn't respond + Something went wrong and key doesn't respond + No response + + + String to Data conversion error + String to Data conversion error + No comment provided by engineer. + + + The key doesn't respond + The key doesn't respond + Timeout issue + + + This QR code is not supported + This QR code is not supported + Invalid Uri format, not OATH URL + + + This YubiKey has Yubico OTP enabled which makes it appear as an external keyboard to the iPhone. Unfortunately this causes problem with the normal on-screen keyboard. + This YubiKey has Yubico OTP enabled which makes it appear as an external keyboard to the iPhone. Unfortunately this causes problem with the normal on-screen keyboard. + No comment provided by engineer. + + + This version of iOS does not support operations with the YubiKey for Lightning nor over NFC + This version of iOS does not support operations with the YubiKey for Lightning nor over NFC + Not supported + + + This will permanently delete the account from the YubiKey, and your ability to generate codes for it! + This will permanently delete the account from the YubiKey, and your ability to generate codes for it! + No comment provided by engineer. + + + Unhandled Error + Unhandled Error + No comment provided by engineer. + + + While the YubiKey is inserted the on-screen keyboard will not appear. To show the keyboard you will have to remove the YubiKey and then re-insert it. + While the YubiKey is inserted the on-screen keyboard will not appear. To show the keyboard you will have to remove the YubiKey and then re-insert it. + No comment provided by engineer. + + + Yubico OTP + Yubico OTP + No comment provided by engineer. + + + Yubico OTP enabled + Yubico OTP enabled + No comment provided by engineer. + + + Yubico OTP has been disabled + Yubico OTP has been disabled + No comment provided by engineer. + + +
+ +
+ +
+ + + One-Time Password + One-Time Password + Class = "UILabel"; text = "One-Time Password"; ObjectID = "1mC-4P-2g3"; + + + Tap the back button to continue + Tap the back button to continue + Class = "UILabel"; text = "Tap the back button to continue"; ObjectID = "2pK-HU-1WC"; + + + Passwords and reset + Passwords and reset + Class = "UILabel"; text = "Passwords and reset"; ObjectID = "03k-jY-TEC"; + + + PASSWORD PROTECTION + PASSWORD PROTECTION + Class = "UILabel"; text = "PASSWORD PROTECTION"; ObjectID = "5iZ-OS-CfM"; + + + 1.0 + 1.0 + Class = "UILabel"; text = "1.0"; ObjectID = "6TW-2t-mYb"; + + + YubiKey configuration + YubiKey configuration + Class = "UITableViewController"; title = "YubiKey configuration"; ObjectID = "09D-Aw-j1I"; + + + Passwords and reset + Passwords and reset + Class = "UINavigationItem"; title = "Passwords and reset"; ObjectID = "9NQ-7X-HqZ"; + + + Privacy policy + Privacy policy + Class = "UILabel"; text = "Privacy policy"; ObjectID = "9lG-2A-fbz"; + + + Enabled + Enabled + Class = "UILabel"; text = "Enabled"; ObjectID = "9lL-ZS-odE"; + + + Yubico OTP enabled + Yubico OTP enabled + Class = "UILabel"; text = "Yubico OTP enabled"; ObjectID = "26R-OJ-dML"; + + + For additional security and to prevent unauthorized access the YubiKey can be password protected. + For additional security and to prevent unauthorized access the YubiKey can be password protected. + Class = "UILabel"; text = "For additional security and to prevent unauthorized access the YubiKey can be password protected."; ObjectID = "46N-qq-yo2"; + + + Password + Password + Class = "UITextField"; placeholder = "Password"; ObjectID = "857-GD-96Q"; + + + Remove and re-insert your YubiKey + Remove and re-insert your YubiKey + Class = "UILabel"; text = "Remove and re-insert your YubiKey"; ObjectID = "AGQ-n1-pV3"; + + + YubiKey configuration + YubiKey configuration + Class = "UITableViewController"; title = "YubiKey configuration"; ObjectID = "Bxb-bg-K32"; + + + Activate NFC on OTP tag read + Activate NFC on OTP tag read + Class = "UILabel"; text = "Activate NFC on OTP tag read"; ObjectID = "Byl-RD-bpD"; + + + Configuration + Configuration + Class = "UITableViewSection"; headerTitle = "Configuration"; ObjectID = "C5n-jq-Mk9"; + + + Password + Password + Class = "UILabel"; text = "Password"; ObjectID = "Ced-DN-oqW"; + + + NFC settings + NFC settings + Class = "UILabel"; text = "NFC settings"; ObjectID = "D3g-ds-RCu"; + + + Close + Close + Class = "UIBarButtonItem"; title = "Close"; ObjectID = "D6R-wW-EtA"; + + + Copyright © 2021 Yubico. +All rights reserved. + Copyright © 2021 Yubico. +All rights reserved. + Class = "UILabel"; text = "Copyright © 2021 Yubico.\nAll rights reserved."; ObjectID = "Ecy-Pw-sM0"; + + + Initiate NFC at application start + Initiate NFC at application start + Class = "UILabel"; text = "Initiate NFC at application start"; ObjectID = "Efl-xJ-qER"; + + + SAVED PASSWORDS + SAVED PASSWORDS + Class = "UILabel"; text = "SAVED PASSWORDS"; ObjectID = "FMw-TB-KRk"; + + + About + About + Class = "UINavigationItem"; title = "About"; ObjectID = "Hbq-O7-HqW"; + + + Yubico OTP has been disabled + Yubico OTP has been disabled + Class = "UILabel"; text = "Yubico OTP has been disabled"; ObjectID = "Icc-EW-Cgh"; + + + Toggle One-Time Password + Toggle One-Time Password + Class = "UINavigationItem"; title = "Toggle One-Time Password"; ObjectID = "Inc-aD-fdW"; + + + This YubiKey has Yubico OTP enabled which makes it appear as an external keyboard to the iPhone. Unfortunately this causes problem with the normal on-screen keyboard. + This YubiKey has Yubico OTP enabled which makes it appear as an external keyboard to the iPhone. Unfortunately this causes problem with the normal on-screen keyboard. + Class = "UILabel"; text = "This YubiKey has Yubico OTP enabled which makes it appear as an external keyboard to the iPhone. Unfortunately this causes problem with the normal on-screen keyboard."; ObjectID = "JN3-vC-kaK"; + + + Smart card (PIV) PIN + Smart card (PIV) PIN + Class = "UITextField"; placeholder = "Smart card (PIV) PIN"; ObjectID = "JON-gB-7WG"; + + + While the YubiKey is inserted the on-screen keyboard will not appear. To show the keyboard you will have to remove the YubiKey and then re-insert it. + While the YubiKey is inserted the on-screen keyboard will not appear. To show the keyboard you will have to remove the YubiKey and then re-insert it. + Class = "UILabel"; text = "While the YubiKey is inserted the on-screen keyboard will not appear. To show the keyboard you will have to remove the YubiKey and then re-insert it."; ObjectID = "JQM-z3-Kvc"; + + + Start NFC and read OATH accounts when the application has been opened by reading the OTP tag on a YubiKey. + Start NFC and read OATH accounts when the application has been opened by reading the OTP tag on a YubiKey. + Class = "UITableViewSection"; footerTitle = "Start NFC and read OATH accounts when the application has been opened by reading the OTP tag on a YubiKey."; ObjectID = "JSq-rh-zB3"; + + + or + or + Class = "UILabel"; text = "or"; ObjectID = "L2j-ZW-Jbf"; + + + Serial number + Serial number + Class = "UILabel"; text = "Serial number"; ObjectID = "Lzm-p7-Lmb"; + + + N/A + N/A + Class = "UILabel"; text = "N/A"; ObjectID = "MBv-4M-eos"; + + + Help with YubiKey + Help with YubiKey + Class = "UILabel"; text = "Help with YubiKey"; ObjectID = "NnL-eZ-nHd"; + + + Unlock YubiKey + Unlock YubiKey + Class = "UILabel"; text = "Unlock YubiKey"; ObjectID = "O2N-dk-eMF"; + + + Set password + Set password + Class = "UILabel"; text = "Set password"; ObjectID = "Oba-Qw-cTB"; + + + NFC settings + NFC settings + Class = "UINavigationItem"; title = "NFC settings"; ObjectID = "PCq-PC-KyX"; + + + N/A + N/A + Class = "UILabel"; text = "N/A"; ObjectID = "QGj-16-s0W"; + + + Terms of use + Terms of use + Class = "UILabel"; text = "Terms of use"; ObjectID = "QHB-fS-VBc"; + + + Insert YubiKey or pull down to activate NFC + Insert YubiKey or pull down to activate NFC + Class = "UILabel"; text = "Insert YubiKey or pull down to activate NFC"; ObjectID = "Re8-TR-xIr"; + + + UnwindButton + UnwindButton + Class = "UIButton"; normalTitle = "UnwindButton"; ObjectID = "Szl-yL-4ir"; + + + Accounts that require touch will need an extra NFC tap to calculate its code. Bypassing it minimizes the number of NFC taps needed. + Accounts that require touch will need an extra NFC tap to calculate its code. Bypassing it minimizes the number of NFC taps needed. + Class = "UITableViewSection"; footerTitle = "Accounts that require touch will need an extra NFC tap to calculate its code. Bypassing it minimizes the number of NFC taps needed."; ObjectID = "Uvq-Ba-xiH"; + + + N/A + N/A + Class = "UILabel"; text = "N/A"; ObjectID = "VAw-dv-zeA"; + + + Yubico Authenticator + Yubico Authenticator + Class = "UILabel"; text = "Yubico Authenticator"; ObjectID = "VHQ-4i-YEj"; + + + Reset YubiKey + Reset YubiKey + Class = "UILabel"; text = "Reset YubiKey"; ObjectID = "Vb7-1M-PWz"; + + + Enter the PIN, then tap a NFC enabled YubiKey against the iPhone to access the certificate. + Enter the PIN, then tap a NFC enabled YubiKey against the iPhone to access the certificate. + Class = "UILabel"; text = "Enter the PIN, then tap a NFC enabled YubiKey against the iPhone to access the certificate."; ObjectID = "WGy-0e-K7w"; + + + Disable Yubico OTP (recommended) + Disable Yubico OTP (recommended) + Class = "UIButton"; configuration.title = "Disable Yubico OTP (recommended)"; ObjectID = "Yo4-ef-tkZ"; + + + Button + Button + Class = "UIButton"; normalTitle = "Button"; ObjectID = "Yo4-ef-tkZ"; + + + Firmware + Firmware + Class = "UILabel"; text = "Firmware"; ObjectID = "aFH-4H-WRy"; + + + Confirm password + Confirm password + Class = "UILabel"; text = "Confirm password"; ObjectID = "al9-tv-dIv"; + + + ONE-TIME PASSWORD + ONE-TIME PASSWORD + Class = "UILabel"; text = "ONE-TIME PASSWORD"; ObjectID = "b6z-Ri-5bh"; + + + Disabling Yubico OTP will prevent the YubiKey from appearing as a keyboard. If you don’t use Yubico OTP this is the recommended solution. This can be re-enabled from the settings page. + Disabling Yubico OTP will prevent the YubiKey from appearing as a keyboard. If you don’t use Yubico OTP this is the recommended solution. This can be re-enabled from the settings page. + Class = "UILabel"; text = "Disabling Yubico OTP will prevent the YubiKey from appearing as a keyboard. If you don’t use Yubico OTP this is the recommended solution. This can be re-enabled from the settings page."; ObjectID = "cou-Cr-QYP"; + + + Remove password + Remove password + Class = "UILabel"; text = "Remove password"; ObjectID = "dAR-My-Mmm"; + + + Configuration + Configuration + Class = "UINavigationItem"; title = "Configuration"; ObjectID = "e3s-bq-xAt"; + + + Set password + Set password + Class = "UINavigationItem"; title = "Set password"; ObjectID = "eiF-JR-TAC"; + + + Smart card extension + Smart card extension + Class = "UINavigationItem"; title = "Smart card extension"; ObjectID = "fl4-8d-lD9"; + + + Bypass touch requirement + Bypass touch requirement + Class = "UILabel"; text = "Bypass touch requirement"; ObjectID = "frN-Of-d1s"; + + + RESET YUBIKEY + RESET YUBIKEY + Class = "UILabel"; text = "RESET YUBIKEY"; ObjectID = "gAN-p5-fcQ"; + + + Initiate NFC at application start will automatically read your YubiKey as soon as the app becomes active. + Initiate NFC at application start will automatically read your YubiKey as soon as the app becomes active. + Class = "UITableViewSection"; footerTitle = "Initiate NFC at application start will automatically read your YubiKey as soon as the app becomes active."; ObjectID = "gQR-ie-6Y0"; + + + Clear passwords saved on iPhone. This will prompt for a password next time a password protected YubiKey is used. + Clear passwords saved on iPhone. This will prompt for a password next time a password protected YubiKey is used. + Class = "UILabel"; text = "Clear passwords saved on iPhone. This will prompt for a password next time a password protected YubiKey is used."; ObjectID = "gYP-vW-fFN"; + + + Version history + Version history + Class = "UILabel"; text = "Version history"; ObjectID = "ghF-dC-3d6"; + + + Item + Item + Class = "UIBarButtonItem"; title = "Item"; ObjectID = "hBA-XE-Ib1"; + + + For additional security and to prevent unauthorized access the YubiKey can be protected with a password + For additional security and to prevent unauthorized access the YubiKey can be protected with a password + Class = "UITableViewSection"; footerTitle = "For additional security and to prevent unauthorized access the YubiKey can be protected with a password"; ObjectID = "hOr-gJ-fIa"; + + + Copy OTP to clipboard + Copy OTP to clipboard + Class = "UILabel"; text = "Copy OTP to clipboard"; ObjectID = "hsz-tV-DPW"; + + + Smart card extension + Smart card extension + Class = "UILabel"; text = "Smart card extension"; ObjectID = "iH3-4d-Rv5"; + + + Close + Close + Class = "UIBarButtonItem"; title = "Close"; ObjectID = "jNG-Du-Ghz"; + + + Clear saved passwords + Clear saved passwords + Class = "UILabel"; text = "Clear saved passwords"; ObjectID = "jx7-Be-qMk"; + + + Continue with limited usability + Continue with limited usability + Class = "UIButton"; configuration.title = "Continue with limited usability"; ObjectID = "kAX-Sn-d4r"; + + + Button + Button + Class = "UIButton"; normalTitle = "Button"; ObjectID = "kAX-Sn-d4r"; + + + Device type + Device type + Class = "UILabel"; text = "Device type"; ObjectID = "llv-60-0FB"; + + + Insert a YubiKey and enter its PIN to access the certificate. + Insert a YubiKey and enter its PIN to access the certificate. + Class = "UILabel"; text = "Insert a YubiKey and enter its PIN to access the certificate."; ObjectID = "noy-hK-f0E"; + + + Copy OTP automatically to clipboard when a YubiKey has been scanned using the NFC tag functionality. + Copy OTP automatically to clipboard when a YubiKey has been scanned using the NFC tag functionality. + Class = "UITableViewSection"; footerTitle = "Copy OTP automatically to clipboard when a YubiKey has been scanned using the NFC tag functionality."; ObjectID = "oy6-QK-Bgw"; + + + Application + Application + Class = "UITableViewSection"; headerTitle = "Application"; ObjectID = "raA-qu-ETm"; + + + Contact support + Contact support + Class = "UILabel"; text = "Contact support"; ObjectID = "tMr-aW-Doe"; + + + Toggle One-Time Password + Toggle One-Time Password + Class = "UILabel"; text = "Toggle One-Time Password"; ObjectID = "uP5-O2-d0d"; + + + Turn on/off opening Safari to copy your OTP when scanning the NFC YubiKey. + Turn on/off opening Safari to copy your OTP when scanning the NFC YubiKey. + Class = "UILabel"; text = "Turn on/off opening Safari to copy your OTP when scanning the NFC YubiKey."; ObjectID = "vjs-4B-RzZ"; + + + Support + Support + Class = "UITableViewSection"; headerTitle = "Support"; ObjectID = "vn9-zq-1Ri"; + + + Password + Password + Class = "UITextField"; placeholder = "Password"; ObjectID = "wH4-5g-AV5"; + + + Licensing + Licensing + Class = "UILabel"; text = "Licensing"; ObjectID = "wvt-LS-lIS"; + + + How does it work + How does it work + Class = "UILabel"; text = "How does it work"; ObjectID = "y0i-iX-KLv"; + + + INFORMATION + INFORMATION + Class = "UITableViewSection"; headerTitle = "INFORMATION"; ObjectID = "yed-kd-amP"; + + + Reset all accounts stored on YubiKey, make sure they are not in use anywhere before doing this. + Reset all accounts stored on YubiKey, make sure they are not in use anywhere before doing this. + Class = "UILabel"; text = "Reset all accounts stored on YubiKey, make sure they are not in use anywhere before doing this."; ObjectID = "zcT-oY-vKq"; + + +
+ +
+ +
+ + + TokenExtension + TokenExtension + Bundle display name + + + TokenExtension + TokenExtension + Bundle name + + +
+
diff --git a/Localizations/en.xcloc/Source Contents/Authenticator/UI/Base.lproj/LaunchScreen.storyboard b/Localizations/en.xcloc/Source Contents/Authenticator/UI/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..2825ba1a --- /dev/null +++ b/Localizations/en.xcloc/Source Contents/Authenticator/UI/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Localizations/en.xcloc/Source Contents/Authenticator/UI/Base.lproj/Main.storyboard b/Localizations/en.xcloc/Source Contents/Authenticator/UI/Base.lproj/Main.storyboard new file mode 100644 index 00000000..72bd3467 --- /dev/null +++ b/Localizations/en.xcloc/Source Contents/Authenticator/UI/Base.lproj/Main.storyboard @@ -0,0 +1,1673 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Accounts that require touch will need an extra NFC tap to calculate its code. Bypassing it minimizes the number of NFC taps needed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Localizations/en.xcloc/Source Contents/Authenticator/en.lproj/InfoPlist.strings b/Localizations/en.xcloc/Source Contents/Authenticator/en.lproj/InfoPlist.strings new file mode 100644 index 00000000..49238f28 --- /dev/null +++ b/Localizations/en.xcloc/Source Contents/Authenticator/en.lproj/InfoPlist.strings @@ -0,0 +1,8 @@ +/* Bundle name */ +"CFBundleName" = "Authenticator"; +/* Privacy - NFC Scan Usage Description */ +"NFCReaderUsageDescription" = "The application needs access to NFC reading to communicate with your Yubikey."; +/* Privacy - Camera Usage Description */ +"NSCameraUsageDescription" = "The application needs access to Camera to scan QR codes."; +/* Privacy - Face ID Usage Description */ +"NSFaceIDUsageDescription" = "The application needs access to Face ID to unlock your password vault."; diff --git a/Localizations/en.xcloc/Source Contents/Authenticator/en.lproj/Localizable.strings b/Localizations/en.xcloc/Source Contents/Authenticator/en.lproj/Localizable.strings new file mode 100644 index 00000000..bad7b929 Binary files /dev/null and b/Localizations/en.xcloc/Source Contents/Authenticator/en.lproj/Localizable.strings differ diff --git a/Localizations/en.xcloc/Source Contents/TokenExtension/en.lproj/InfoPlist.strings b/Localizations/en.xcloc/Source Contents/TokenExtension/en.lproj/InfoPlist.strings new file mode 100644 index 00000000..7162b4da --- /dev/null +++ b/Localizations/en.xcloc/Source Contents/TokenExtension/en.lproj/InfoPlist.strings @@ -0,0 +1,4 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "TokenExtension"; +/* Bundle name */ +"CFBundleName" = "TokenExtension"; diff --git a/Localizations/en.xcloc/contents.json b/Localizations/en.xcloc/contents.json new file mode 100644 index 00000000..946b5513 --- /dev/null +++ b/Localizations/en.xcloc/contents.json @@ -0,0 +1,12 @@ +{ + "developmentRegion" : "en", + "project" : "Authenticator.xcodeproj", + "targetLocale" : "en", + "toolInfo" : { + "toolBuildNumber" : "15C500b", + "toolID" : "com.apple.dt.xcode", + "toolName" : "Xcode", + "toolVersion" : "15.2" + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/Localizations/en/en.xcloc/Localized Contents/en.xliff b/Localizations/en/en.xcloc/Localized Contents/en.xliff new file mode 100644 index 00000000..df4c0ace --- /dev/null +++ b/Localizations/en/en.xcloc/Localized Contents/en.xliff @@ -0,0 +1,623 @@ + + + +
+ +
+ + + Authenticator + Authenticator + Bundle name + + + The application needs access to NFC reading to communicate with your Yubikey. + The application needs access to NFC reading to communicate with your Yubikey. + Privacy - NFC Scan Usage Description + + + The application needs access to Camera to scan QR codes. + The application needs access to Camera to scan QR codes. + Privacy - Camera Usage Description + + + The application needs access to Face ID to unlock your password vault. + The application needs access to Face ID to unlock your password vault. + Privacy - Face ID Usage Description + + +
+ +
+ +
+ + + *** *** + *** *** + No comment provided by engineer. + + + 888 888 + 888 888 + No comment provided by engineer. + + + ? + ? + No comment provided by engineer. + + + Accounts + Accounts + No comment provided by engineer. + + + Cancel + Cancel + No comment provided by engineer. + + + Continue with limited usability + Continue with limited usability + No comment provided by engineer. + + + Data to String conversion error + Data to String conversion error + No comment provided by engineer. + + + Delete + Delete + No comment provided by engineer. + + + Delete account? + Delete account? + No comment provided by engineer. + + + Disable Yubico OTP (recommended) + Disable Yubico OTP (recommended) + No comment provided by engineer. + + + Disabling Yubico OTP will prevent the YubiKey from appearing as a keyboard. If you don’t use Yubico OTP this is the recommended solution. This can be re-enabled from the settings page. + Disabling Yubico OTP will prevent the YubiKey from appearing as a keyboard. If you don’t use Yubico OTP this is the recommended solution. This can be re-enabled from the settings page. + No comment provided by engineer. + + + Failed to cast object to Data error + Failed to cast object to Data error + No comment provided by engineer. + + + Invalid URI format + Invalid URI format + Invalid Uri, wrong parameters + + + Item not found in secure storage + Item not found in secure storage + No comment provided by engineer. + + + Other + Other + No comment provided by engineer. + + + Pinned + Pinned + No comment provided by engineer. + + + Plug-in your YubiKey for that operation + Plug-in your YubiKey for that operation + No service found + + + Remove and re-insert your YubiKey + Remove and re-insert your YubiKey + No comment provided by engineer. + + + Some content... + Some content... + No comment provided by engineer. + + + Something went wrong and key doesn't respond + Something went wrong and key doesn't respond + No response + + + String to Data conversion error + String to Data conversion error + No comment provided by engineer. + + + The key doesn't respond + The key doesn't respond + Timeout issue + + + This QR code is not supported + This QR code is not supported + Invalid Uri format, not OATH URL + + + This YubiKey has Yubico OTP enabled which makes it appear as an external keyboard to the iPhone. Unfortunately this causes problem with the normal on-screen keyboard. + This YubiKey has Yubico OTP enabled which makes it appear as an external keyboard to the iPhone. Unfortunately this causes problem with the normal on-screen keyboard. + No comment provided by engineer. + + + This version of iOS does not support operations with the YubiKey for Lightning nor over NFC + This version of iOS does not support operations with the YubiKey for Lightning nor over NFC + Not supported + + + This will permanently delete the account from the YubiKey, and your ability to generate codes for it! + This will permanently delete the account from the YubiKey, and your ability to generate codes for it! + No comment provided by engineer. + + + Unhandled Error + Unhandled Error + No comment provided by engineer. + + + While the YubiKey is inserted the on-screen keyboard will not appear. To show the keyboard you will have to remove the YubiKey and then re-insert it. + While the YubiKey is inserted the on-screen keyboard will not appear. To show the keyboard you will have to remove the YubiKey and then re-insert it. + No comment provided by engineer. + + + Yubico OTP + Yubico OTP + No comment provided by engineer. + + + Yubico OTP enabled + Yubico OTP enabled + No comment provided by engineer. + + + Yubico OTP has been disabled + Yubico OTP has been disabled + No comment provided by engineer. + + +
+ +
+ +
+ + + One-Time Password + One-Time Password + Class = "UILabel"; text = "One-Time Password"; ObjectID = "1mC-4P-2g3"; + + + Tap the back button to continue + Tap the back button to continue + Class = "UILabel"; text = "Tap the back button to continue"; ObjectID = "2pK-HU-1WC"; + + + Passwords and reset + Passwords and reset + Class = "UILabel"; text = "Passwords and reset"; ObjectID = "03k-jY-TEC"; + + + PASSWORD PROTECTION + PASSWORD PROTECTION + Class = "UILabel"; text = "PASSWORD PROTECTION"; ObjectID = "5iZ-OS-CfM"; + + + 1.0 + 1.0 + Class = "UILabel"; text = "1.0"; ObjectID = "6TW-2t-mYb"; + + + YubiKey configuration + YubiKey configuration + Class = "UITableViewController"; title = "YubiKey configuration"; ObjectID = "09D-Aw-j1I"; + + + Passwords and reset + Passwords and reset + Class = "UINavigationItem"; title = "Passwords and reset"; ObjectID = "9NQ-7X-HqZ"; + + + Privacy policy + Privacy policy + Class = "UILabel"; text = "Privacy policy"; ObjectID = "9lG-2A-fbz"; + + + Enabled + Enabled + Class = "UILabel"; text = "Enabled"; ObjectID = "9lL-ZS-odE"; + + + Yubico OTP enabled + Yubico OTP enabled + Class = "UILabel"; text = "Yubico OTP enabled"; ObjectID = "26R-OJ-dML"; + + + For additional security and to prevent unauthorized access the YubiKey can be password protected. + For additional security and to prevent unauthorized access the YubiKey can be password protected. + Class = "UILabel"; text = "For additional security and to prevent unauthorized access the YubiKey can be password protected."; ObjectID = "46N-qq-yo2"; + + + Password + Password + Class = "UITextField"; placeholder = "Password"; ObjectID = "857-GD-96Q"; + + + Remove and re-insert your YubiKey + Remove and re-insert your YubiKey + Class = "UILabel"; text = "Remove and re-insert your YubiKey"; ObjectID = "AGQ-n1-pV3"; + + + YubiKey configuration + YubiKey configuration + Class = "UITableViewController"; title = "YubiKey configuration"; ObjectID = "Bxb-bg-K32"; + + + Activate NFC on OTP tag read + Activate NFC on OTP tag read + Class = "UILabel"; text = "Activate NFC on OTP tag read"; ObjectID = "Byl-RD-bpD"; + + + Configuration + Configuration + Class = "UITableViewSection"; headerTitle = "Configuration"; ObjectID = "C5n-jq-Mk9"; + + + Password + Password + Class = "UILabel"; text = "Password"; ObjectID = "Ced-DN-oqW"; + + + NFC settings + NFC settings + Class = "UILabel"; text = "NFC settings"; ObjectID = "D3g-ds-RCu"; + + + Close + Close + Class = "UIBarButtonItem"; title = "Close"; ObjectID = "D6R-wW-EtA"; + + + Copyright © 2021 Yubico. +All rights reserved. + Copyright © 2021 Yubico. +All rights reserved. + Class = "UILabel"; text = "Copyright © 2021 Yubico.\nAll rights reserved."; ObjectID = "Ecy-Pw-sM0"; + + + Initiate NFC at application start + Initiate NFC at application start + Class = "UILabel"; text = "Initiate NFC at application start"; ObjectID = "Efl-xJ-qER"; + + + SAVED PASSWORDS + SAVED PASSWORDS + Class = "UILabel"; text = "SAVED PASSWORDS"; ObjectID = "FMw-TB-KRk"; + + + About + About + Class = "UINavigationItem"; title = "About"; ObjectID = "Hbq-O7-HqW"; + + + Yubico OTP has been disabled + Yubico OTP has been disabled + Class = "UILabel"; text = "Yubico OTP has been disabled"; ObjectID = "Icc-EW-Cgh"; + + + Toggle One-Time Password + Toggle One-Time Password + Class = "UINavigationItem"; title = "Toggle One-Time Password"; ObjectID = "Inc-aD-fdW"; + + + This YubiKey has Yubico OTP enabled which makes it appear as an external keyboard to the iPhone. Unfortunately this causes problem with the normal on-screen keyboard. + This YubiKey has Yubico OTP enabled which makes it appear as an external keyboard to the iPhone. Unfortunately this causes problem with the normal on-screen keyboard. + Class = "UILabel"; text = "This YubiKey has Yubico OTP enabled which makes it appear as an external keyboard to the iPhone. Unfortunately this causes problem with the normal on-screen keyboard."; ObjectID = "JN3-vC-kaK"; + + + Smart card (PIV) PIN + Smart card (PIV) PIN + Class = "UITextField"; placeholder = "Smart card (PIV) PIN"; ObjectID = "JON-gB-7WG"; + + + While the YubiKey is inserted the on-screen keyboard will not appear. To show the keyboard you will have to remove the YubiKey and then re-insert it. + While the YubiKey is inserted the on-screen keyboard will not appear. To show the keyboard you will have to remove the YubiKey and then re-insert it. + Class = "UILabel"; text = "While the YubiKey is inserted the on-screen keyboard will not appear. To show the keyboard you will have to remove the YubiKey and then re-insert it."; ObjectID = "JQM-z3-Kvc"; + + + Start NFC and read OATH accounts when the application has been opened by reading the OTP tag on a YubiKey. + Start NFC and read OATH accounts when the application has been opened by reading the OTP tag on a YubiKey. + Class = "UITableViewSection"; footerTitle = "Start NFC and read OATH accounts when the application has been opened by reading the OTP tag on a YubiKey."; ObjectID = "JSq-rh-zB3"; + + + or + or + Class = "UILabel"; text = "or"; ObjectID = "L2j-ZW-Jbf"; + + + Serial number + Serial number + Class = "UILabel"; text = "Serial number"; ObjectID = "Lzm-p7-Lmb"; + + + N/A + N/A + Class = "UILabel"; text = "N/A"; ObjectID = "MBv-4M-eos"; + + + Help with YubiKey + Help with YubiKey + Class = "UILabel"; text = "Help with YubiKey"; ObjectID = "NnL-eZ-nHd"; + + + Unlock YubiKey + Unlock YubiKey + Class = "UILabel"; text = "Unlock YubiKey"; ObjectID = "O2N-dk-eMF"; + + + Set password + Set password + Class = "UILabel"; text = "Set password"; ObjectID = "Oba-Qw-cTB"; + + + NFC settings + NFC settings + Class = "UINavigationItem"; title = "NFC settings"; ObjectID = "PCq-PC-KyX"; + + + N/A + N/A + Class = "UILabel"; text = "N/A"; ObjectID = "QGj-16-s0W"; + + + Terms of use + Terms of use + Class = "UILabel"; text = "Terms of use"; ObjectID = "QHB-fS-VBc"; + + + Insert YubiKey or pull down to activate NFC + Insert YubiKey or pull down to activate NFC + Class = "UILabel"; text = "Insert YubiKey or pull down to activate NFC"; ObjectID = "Re8-TR-xIr"; + + + UnwindButton + UnwindButton + Class = "UIButton"; normalTitle = "UnwindButton"; ObjectID = "Szl-yL-4ir"; + + + Accounts that require touch will need an extra NFC tap to calculate its code. Bypassing it minimizes the number of NFC taps needed. + Accounts that require touch will need an extra NFC tap to calculate its code. Bypassing it minimizes the number of NFC taps needed. + Class = "UITableViewSection"; footerTitle = "Accounts that require touch will need an extra NFC tap to calculate its code. Bypassing it minimizes the number of NFC taps needed."; ObjectID = "Uvq-Ba-xiH"; + + + N/A + N/A + Class = "UILabel"; text = "N/A"; ObjectID = "VAw-dv-zeA"; + + + Yubico Authenticator + Yubico Authenticator + Class = "UILabel"; text = "Yubico Authenticator"; ObjectID = "VHQ-4i-YEj"; + + + Reset YubiKey + Reset YubiKey + Class = "UILabel"; text = "Reset YubiKey"; ObjectID = "Vb7-1M-PWz"; + + + Enter the PIN, then tap a NFC enabled YubiKey against the iPhone to access the certificate. + Enter the PIN, then tap a NFC enabled YubiKey against the iPhone to access the certificate. + Class = "UILabel"; text = "Enter the PIN, then tap a NFC enabled YubiKey against the iPhone to access the certificate."; ObjectID = "WGy-0e-K7w"; + + + Disable Yubico OTP (recommended) + Disable Yubico OTP (recommended) + Class = "UIButton"; configuration.title = "Disable Yubico OTP (recommended)"; ObjectID = "Yo4-ef-tkZ"; + + + Button + Button + Class = "UIButton"; normalTitle = "Button"; ObjectID = "Yo4-ef-tkZ"; + + + Firmware + Firmware + Class = "UILabel"; text = "Firmware"; ObjectID = "aFH-4H-WRy"; + + + Confirm password + Confirm password + Class = "UILabel"; text = "Confirm password"; ObjectID = "al9-tv-dIv"; + + + ONE-TIME PASSWORD + ONE-TIME PASSWORD + Class = "UILabel"; text = "ONE-TIME PASSWORD"; ObjectID = "b6z-Ri-5bh"; + + + Disabling Yubico OTP will prevent the YubiKey from appearing as a keyboard. If you don’t use Yubico OTP this is the recommended solution. This can be re-enabled from the settings page. + Disabling Yubico OTP will prevent the YubiKey from appearing as a keyboard. If you don’t use Yubico OTP this is the recommended solution. This can be re-enabled from the settings page. + Class = "UILabel"; text = "Disabling Yubico OTP will prevent the YubiKey from appearing as a keyboard. If you don’t use Yubico OTP this is the recommended solution. This can be re-enabled from the settings page."; ObjectID = "cou-Cr-QYP"; + + + Remove password + Remove password + Class = "UILabel"; text = "Remove password"; ObjectID = "dAR-My-Mmm"; + + + Configuration + Configuration + Class = "UINavigationItem"; title = "Configuration"; ObjectID = "e3s-bq-xAt"; + + + Set password + Set password + Class = "UINavigationItem"; title = "Set password"; ObjectID = "eiF-JR-TAC"; + + + Smart card extension + Smart card extension + Class = "UINavigationItem"; title = "Smart card extension"; ObjectID = "fl4-8d-lD9"; + + + Bypass touch requirement + Bypass touch requirement + Class = "UILabel"; text = "Bypass touch requirement"; ObjectID = "frN-Of-d1s"; + + + RESET YUBIKEY + RESET YUBIKEY + Class = "UILabel"; text = "RESET YUBIKEY"; ObjectID = "gAN-p5-fcQ"; + + + Initiate NFC at application start will automatically read your YubiKey as soon as the app becomes active. + Initiate NFC at application start will automatically read your YubiKey as soon as the app becomes active. + Class = "UITableViewSection"; footerTitle = "Initiate NFC at application start will automatically read your YubiKey as soon as the app becomes active."; ObjectID = "gQR-ie-6Y0"; + + + Clear passwords saved on iPhone. This will prompt for a password next time a password protected YubiKey is used. + Clear passwords saved on iPhone. This will prompt for a password next time a password protected YubiKey is used. + Class = "UILabel"; text = "Clear passwords saved on iPhone. This will prompt for a password next time a password protected YubiKey is used."; ObjectID = "gYP-vW-fFN"; + + + Version history + Version history + Class = "UILabel"; text = "Version history"; ObjectID = "ghF-dC-3d6"; + + + Item + Item + Class = "UIBarButtonItem"; title = "Item"; ObjectID = "hBA-XE-Ib1"; + + + For additional security and to prevent unauthorized access the YubiKey can be protected with a password + For additional security and to prevent unauthorized access the YubiKey can be protected with a password + Class = "UITableViewSection"; footerTitle = "For additional security and to prevent unauthorized access the YubiKey can be protected with a password"; ObjectID = "hOr-gJ-fIa"; + + + Copy OTP to clipboard + Copy OTP to clipboard + Class = "UILabel"; text = "Copy OTP to clipboard"; ObjectID = "hsz-tV-DPW"; + + + Smart card extension + Smart card extension + Class = "UILabel"; text = "Smart card extension"; ObjectID = "iH3-4d-Rv5"; + + + Close + Close + Class = "UIBarButtonItem"; title = "Close"; ObjectID = "jNG-Du-Ghz"; + + + Clear saved passwords + Clear saved passwords + Class = "UILabel"; text = "Clear saved passwords"; ObjectID = "jx7-Be-qMk"; + + + Continue with limited usability + Continue with limited usability + Class = "UIButton"; configuration.title = "Continue with limited usability"; ObjectID = "kAX-Sn-d4r"; + + + Button + Button + Class = "UIButton"; normalTitle = "Button"; ObjectID = "kAX-Sn-d4r"; + + + Device type + Device type + Class = "UILabel"; text = "Device type"; ObjectID = "llv-60-0FB"; + + + Insert a YubiKey and enter its PIN to access the certificate. + Insert a YubiKey and enter its PIN to access the certificate. + Class = "UILabel"; text = "Insert a YubiKey and enter its PIN to access the certificate."; ObjectID = "noy-hK-f0E"; + + + Copy OTP automatically to clipboard when a YubiKey has been scanned using the NFC tag functionality. + Copy OTP automatically to clipboard when a YubiKey has been scanned using the NFC tag functionality. + Class = "UITableViewSection"; footerTitle = "Copy OTP automatically to clipboard when a YubiKey has been scanned using the NFC tag functionality."; ObjectID = "oy6-QK-Bgw"; + + + Application + Application + Class = "UITableViewSection"; headerTitle = "Application"; ObjectID = "raA-qu-ETm"; + + + Contact support + Contact support + Class = "UILabel"; text = "Contact support"; ObjectID = "tMr-aW-Doe"; + + + Toggle One-Time Password + Toggle One-Time Password + Class = "UILabel"; text = "Toggle One-Time Password"; ObjectID = "uP5-O2-d0d"; + + + Turn on/off opening Safari to copy your OTP when scanning the NFC YubiKey. + Turn on/off opening Safari to copy your OTP when scanning the NFC YubiKey. + Class = "UILabel"; text = "Turn on/off opening Safari to copy your OTP when scanning the NFC YubiKey."; ObjectID = "vjs-4B-RzZ"; + + + Support + Support + Class = "UITableViewSection"; headerTitle = "Support"; ObjectID = "vn9-zq-1Ri"; + + + Password + Password + Class = "UITextField"; placeholder = "Password"; ObjectID = "wH4-5g-AV5"; + + + Licensing + Licensing + Class = "UILabel"; text = "Licensing"; ObjectID = "wvt-LS-lIS"; + + + How does it work + How does it work + Class = "UILabel"; text = "How does it work"; ObjectID = "y0i-iX-KLv"; + + + INFORMATION + INFORMATION + Class = "UITableViewSection"; headerTitle = "INFORMATION"; ObjectID = "yed-kd-amP"; + + + Reset all accounts stored on YubiKey, make sure they are not in use anywhere before doing this. + Reset all accounts stored on YubiKey, make sure they are not in use anywhere before doing this. + Class = "UILabel"; text = "Reset all accounts stored on YubiKey, make sure they are not in use anywhere before doing this."; ObjectID = "zcT-oY-vKq"; + + +
+ +
+ +
+ + + TokenExtension + TokenExtension + Bundle display name + + + TokenExtension + TokenExtension + Bundle name + + +
+
diff --git a/Localizations/en/en.xcloc/Source Contents/Authenticator/UI/Base.lproj/LaunchScreen.storyboard b/Localizations/en/en.xcloc/Source Contents/Authenticator/UI/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..2825ba1a --- /dev/null +++ b/Localizations/en/en.xcloc/Source Contents/Authenticator/UI/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Localizations/en/en.xcloc/Source Contents/Authenticator/UI/Base.lproj/Main.storyboard b/Localizations/en/en.xcloc/Source Contents/Authenticator/UI/Base.lproj/Main.storyboard new file mode 100644 index 00000000..72bd3467 --- /dev/null +++ b/Localizations/en/en.xcloc/Source Contents/Authenticator/UI/Base.lproj/Main.storyboard @@ -0,0 +1,1673 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Accounts that require touch will need an extra NFC tap to calculate its code. Bypassing it minimizes the number of NFC taps needed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Localizations/en/en.xcloc/Source Contents/Authenticator/en.lproj/InfoPlist.strings b/Localizations/en/en.xcloc/Source Contents/Authenticator/en.lproj/InfoPlist.strings new file mode 100644 index 00000000..49238f28 --- /dev/null +++ b/Localizations/en/en.xcloc/Source Contents/Authenticator/en.lproj/InfoPlist.strings @@ -0,0 +1,8 @@ +/* Bundle name */ +"CFBundleName" = "Authenticator"; +/* Privacy - NFC Scan Usage Description */ +"NFCReaderUsageDescription" = "The application needs access to NFC reading to communicate with your Yubikey."; +/* Privacy - Camera Usage Description */ +"NSCameraUsageDescription" = "The application needs access to Camera to scan QR codes."; +/* Privacy - Face ID Usage Description */ +"NSFaceIDUsageDescription" = "The application needs access to Face ID to unlock your password vault."; diff --git a/Localizations/en/en.xcloc/Source Contents/Authenticator/en.lproj/Localizable.strings b/Localizations/en/en.xcloc/Source Contents/Authenticator/en.lproj/Localizable.strings new file mode 100644 index 00000000..bad7b929 Binary files /dev/null and b/Localizations/en/en.xcloc/Source Contents/Authenticator/en.lproj/Localizable.strings differ diff --git a/Localizations/en/en.xcloc/Source Contents/TokenExtension/en.lproj/InfoPlist.strings b/Localizations/en/en.xcloc/Source Contents/TokenExtension/en.lproj/InfoPlist.strings new file mode 100644 index 00000000..7162b4da --- /dev/null +++ b/Localizations/en/en.xcloc/Source Contents/TokenExtension/en.lproj/InfoPlist.strings @@ -0,0 +1,4 @@ +/* Bundle display name */ +"CFBundleDisplayName" = "TokenExtension"; +/* Bundle name */ +"CFBundleName" = "TokenExtension"; diff --git a/Localizations/en/en.xcloc/contents.json b/Localizations/en/en.xcloc/contents.json new file mode 100644 index 00000000..946b5513 --- /dev/null +++ b/Localizations/en/en.xcloc/contents.json @@ -0,0 +1,12 @@ +{ + "developmentRegion" : "en", + "project" : "Authenticator.xcodeproj", + "targetLocale" : "en", + "toolInfo" : { + "toolBuildNumber" : "15C500b", + "toolID" : "com.apple.dt.xcode", + "toolName" : "Xcode", + "toolVersion" : "15.2" + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/TokenExtension/Localizable.xcstrings b/TokenExtension/Localizable.xcstrings new file mode 100644 index 00000000..bc881272 --- /dev/null +++ b/TokenExtension/Localizable.xcstrings @@ -0,0 +1,15 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "Launch Yubico Authenticator" : { + + }, + "Tap here to complete the request using your YubiKey." : { + + }, + "YubiKey required" : { + + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/TokenExtension/TokenSession.swift b/TokenExtension/TokenSession.swift index 58d346f1..0d967e6e 100644 --- a/TokenExtension/TokenSession.swift +++ b/TokenExtension/TokenSession.swift @@ -151,14 +151,14 @@ class TokenSession: TKTokenSession, TKTokenSessionDelegate { cancelAllNotifications() let categoryID = "SignData" let content = UNMutableNotificationContent() - content.title = "YubiKey required" - content.body = "Tap here to complete the request using your YubiKey." + content.title = String(localized: "YubiKey required") + content.body = String(localized: "Tap here to complete the request using your YubiKey.") content.categoryIdentifier = categoryID content.userInfo = ["data": data, "keyObjectID": keyObjectID, "algorithm": algorithm.rawValue, "keyType": keyType.rawValue]; content.sound = UNNotificationSound.default let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 0.1, repeats: false) - let show = UNNotificationAction(identifier: categoryID, title: "Launch Yubico Authenticator", options: .foreground) + let show = UNNotificationAction(identifier: categoryID, title: String(localized: "Launch Yubico Authenticator"), options: .foreground) let category = UNNotificationCategory(identifier: categoryID, actions: [show], intentIdentifiers: []) let center = UNUserNotificationCenter.current()