From b2f23345e9d8fc6a4160ac7e9ebd61ba11ab21e2 Mon Sep 17 00:00:00 2001 From: Raul Metsma Date: Wed, 31 Jan 2024 23:32:25 +0200 Subject: [PATCH] Show macOS smartcard settings IB-7959 Signed-off-by: Raul Metsma --- EstEIDTokenApp.xcodeproj/project.pbxproj | 39 +-- EstEIDTokenApp/AppDelegate.m | 67 ---- EstEIDTokenApp/Base.lproj/MainMenu.xib | 140 -------- EstEIDTokenApp/EstEidTokenApp.swift | 102 ++++++ EstEIDTokenApp/Localizable.xcstrings | 38 +++ EstEIDTokenApp/main.m | 24 -- EstEIDTokenApp/mul.lproj/MainMenu.xcstrings | 342 ------------------- EstEIDTokenNotify/Base.lproj/Main.storyboard | 2 +- 8 files changed, 155 insertions(+), 599 deletions(-) delete mode 100644 EstEIDTokenApp/AppDelegate.m delete mode 100644 EstEIDTokenApp/Base.lproj/MainMenu.xib create mode 100644 EstEIDTokenApp/EstEidTokenApp.swift create mode 100644 EstEIDTokenApp/Localizable.xcstrings delete mode 100644 EstEIDTokenApp/main.m delete mode 100644 EstEIDTokenApp/mul.lproj/MainMenu.xcstrings diff --git a/EstEIDTokenApp.xcodeproj/project.pbxproj b/EstEIDTokenApp.xcodeproj/project.pbxproj index 16c3799..9925c0e 100644 --- a/EstEIDTokenApp.xcodeproj/project.pbxproj +++ b/EstEIDTokenApp.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 60; + objectVersion = 55; objects = { /* Begin PBXAggregateTarget section */ @@ -22,15 +22,14 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ - 2F38839D1CF46C6E00F114A7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F38839C1CF46C6E00F114A7 /* AppDelegate.m */; }; - 2F3883A01CF46C6E00F114A7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F38839F1CF46C6E00F114A7 /* main.m */; }; + 2F38839D1CF46C6E00F114A7 /* EstEidTokenApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F38839C1CF46C6E00F114A7 /* EstEidTokenApp.swift */; }; 2F3883A21CF46C6E00F114A7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2F3883A11CF46C6E00F114A7 /* Assets.xcassets */; }; - 2F3883A51CF46C6F00F114A7 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2F3883A31CF46C6F00F114A7 /* MainMenu.xib */; }; 2F3883B91CF46C9D00F114A7 /* Token.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F3883B81CF46C9D00F114A7 /* Token.m */; }; 2F3883BF1CF46C9D00F114A7 /* EstEIDToken.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 2F3883B01CF46C9D00F114A7 /* EstEIDToken.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; 2F3883C51CF46D6F00F114A7 /* TokenSession.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F3883C41CF46D6F00F114A7 /* TokenSession.m */; }; 4E77CCA42B5E85AB00518F62 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 4E77CCA32B5E85AB00518F62 /* Localizable.xcstrings */; }; 4E77CCCB2B5EFD8B00518F62 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E77CCAB2B5EFCF400518F62 /* AppDelegate.swift */; }; + 4EEEB3E22B6AEC9B00138C48 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 4EEEB3E12B6AEC9B00138C48 /* Localizable.xcstrings */; }; 4EF3231920AC184000809D13 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4EF3231720AC184000809D13 /* Main.storyboard */; }; 4EF3232620AC1B4000809D13 /* EstEIDTokenNotify.app in Resources */ = {isa = PBXBuildFile; fileRef = 4EF3230D20AC183E00809D13 /* EstEIDTokenNotify.app */; }; 4EF3232820AC304C00809D13 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 4EF3232720AC304C00809D13 /* Assets.xcassets */; }; @@ -76,19 +75,17 @@ /* Begin PBXFileReference section */ 2F3883981CF46C6E00F114A7 /* EstEIDTokenApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = EstEIDTokenApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 2F38839C1CF46C6E00F114A7 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 2F38839F1CF46C6E00F114A7 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 2F38839C1CF46C6E00F114A7 /* EstEidTokenApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EstEidTokenApp.swift; sourceTree = ""; }; 2F3883A11CF46C6E00F114A7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 2F3883A41CF46C6F00F114A7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; 2F3883B01CF46C9D00F114A7 /* EstEIDToken.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = EstEIDToken.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 2F3883B61CF46C9D00F114A7 /* EstEIDToken.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = EstEIDToken.entitlements; sourceTree = ""; }; 2F3883B71CF46C9D00F114A7 /* Token.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Token.h; sourceTree = ""; }; 2F3883B81CF46C9D00F114A7 /* Token.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Token.m; sourceTree = ""; }; 2F3883BC1CF46C9D00F114A7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 2F3883C41CF46D6F00F114A7 /* TokenSession.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TokenSession.m; sourceTree = ""; }; - 4E77CCA12B5E85AB00518F62 /* mul */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; name = mul; path = mul.lproj/MainMenu.xcstrings; sourceTree = ""; }; 4E77CCA32B5E85AB00518F62 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; 4E77CCAB2B5EFCF400518F62 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 4EEEB3E12B6AEC9B00138C48 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; 4EF3230D20AC183E00809D13 /* EstEIDTokenNotify.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = EstEIDTokenNotify.app; sourceTree = BUILT_PRODUCTS_DIR; }; 4EF3231820AC184000809D13 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 4EF3232720AC304C00809D13 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = EstEIDTokenApp/Assets.xcassets; sourceTree = SOURCE_ROOT; }; @@ -142,10 +139,9 @@ 2F38839A1CF46C6E00F114A7 /* EstEIDTokenApp */ = { isa = PBXGroup; children = ( - 2F38839C1CF46C6E00F114A7 /* AppDelegate.m */, + 2F38839C1CF46C6E00F114A7 /* EstEidTokenApp.swift */, 2F3883A11CF46C6E00F114A7 /* Assets.xcassets */, - 2F3883A31CF46C6F00F114A7 /* MainMenu.xib */, - 2F38839F1CF46C6E00F114A7 /* main.m */, + 4EEEB3E12B6AEC9B00138C48 /* Localizable.xcstrings */, ); path = EstEIDTokenApp; sourceTree = ""; @@ -300,7 +296,7 @@ files = ( 2F3883A21CF46C6E00F114A7 /* Assets.xcassets in Resources */, 4EF3232620AC1B4000809D13 /* EstEIDTokenNotify.app in Resources */, - 2F3883A51CF46C6F00F114A7 /* MainMenu.xib in Resources */, + 4EEEB3E22B6AEC9B00138C48 /* Localizable.xcstrings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -346,8 +342,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2F3883A01CF46C6E00F114A7 /* main.m in Sources */, - 2F38839D1CF46C6E00F114A7 /* AppDelegate.m in Sources */, + 2F38839D1CF46C6E00F114A7 /* EstEidTokenApp.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -389,15 +384,6 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ - 2F3883A31CF46C6F00F114A7 /* MainMenu.xib */ = { - isa = PBXVariantGroup; - children = ( - 2F3883A41CF46C6F00F114A7 /* Base */, - 4E77CCA12B5E85AB00518F62 /* mul */, - ); - name = MainMenu.xib; - sourceTree = ""; - }; 4EF3231720AC184000809D13 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( @@ -545,7 +531,6 @@ COMBINE_HIDPI_IMAGES = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; - INFOPLIST_KEY_NSMainNibFile = MainMenu; INSTALL_PATH = "$(LOCAL_APPS_DIR)/Utilities"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -553,6 +538,9 @@ ); PRODUCT_BUNDLE_IDENTIFIER = ee.ria.EstEIDTokenApp; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -563,7 +551,6 @@ COMBINE_HIDPI_IMAGES = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.utilities"; - INFOPLIST_KEY_NSMainNibFile = MainMenu; INSTALL_PATH = "$(LOCAL_APPS_DIR)/Utilities"; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -571,6 +558,8 @@ ); PRODUCT_BUNDLE_IDENTIFIER = ee.ria.EstEIDTokenApp; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/EstEIDTokenApp/AppDelegate.m b/EstEIDTokenApp/AppDelegate.m deleted file mode 100644 index 46192db..0000000 --- a/EstEIDTokenApp/AppDelegate.m +++ /dev/null @@ -1,67 +0,0 @@ -/* - * EstEIDTokenApp - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import - -@interface AppDelegate : NSObject -@property (weak) IBOutlet NSTextField *version; -@property (weak) IBOutlet NSTextView *text; -@property (weak) IBOutlet NSWindow *window; -@end - -@implementation AppDelegate - -- (void)applicationDidFinishLaunching:(NSNotification *)notification -{ - self.version.stringValue = [NSString stringWithFormat:@"Version: %@.%@", NSBundle.mainBundle.infoDictionary[@"CFBundleShortVersionString"], NSBundle.mainBundle.infoDictionary[@"CFBundleVersion"]]; - - NSPipe *pipe = [NSPipe pipe]; - NSFileHandle *file = pipe.fileHandleForReading; - - NSTask *task = [[NSTask alloc] init]; - task.launchPath = @"/usr/sbin/system_profiler"; - task.arguments = @[@"SPSmartCardsDataType"]; - task.standardOutput = pipe; - [task launch]; - - NSData *data = [file readDataToEndOfFile]; - [file closeFile]; - - NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] - attributes:@{NSForegroundColorAttributeName : NSColor.controlTextColor}]; - self.text.textStorage.attributedString = text; - - NSDictionary *find = @{ - (__bridge id)kSecClass: (__bridge id)kSecClassKey, - (__bridge id)kSecReturnAttributes: (__bridge id)kCFBooleanTrue, - (__bridge id)kSecMatchLimit: (__bridge id)kSecMatchLimitAll, - }; - CFArrayRef itemsTemp = nil; - SecItemCopyMatching((__bridge CFDictionaryRef)find, (CFTypeRef *)&itemsTemp); - NSArray *items = CFBridgingRelease(itemsTemp); - NSMutableString *string = text.mutableString; - for (NSDictionary *key in items) { - if ([(NSString*)key[(__bridge id)kSecAttrTokenID] containsString:@"ee.ria.EstEIDTokenApp.EstEIDToken"]) { - [string appendFormat:@"\nKey: %@", key]; - self.text.textStorage.attributedString = text; - } - } -} - -@end diff --git a/EstEIDTokenApp/Base.lproj/MainMenu.xib b/EstEIDTokenApp/Base.lproj/MainMenu.xib deleted file mode 100644 index 0d31bfb..0000000 --- a/EstEIDTokenApp/Base.lproj/MainMenu.xib +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/EstEIDTokenApp/EstEidTokenApp.swift b/EstEIDTokenApp/EstEidTokenApp.swift new file mode 100644 index 0000000..8bc9d49 --- /dev/null +++ b/EstEIDTokenApp/EstEidTokenApp.swift @@ -0,0 +1,102 @@ +/* + * EstEIDTokenApp + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +import Cocoa +import SwiftUI + +final class AppDelegate: NSObject, NSApplicationDelegate { + func applicationWillUpdate(_ notification: Notification) { + if let menu = NSApplication.shared.mainMenu { + let list = ["File", "Edit", "Window", "View", "Help"] + for item in menu.items { + if list.contains(item.title) { + menu.removeItem(item) + } + } + } + } +} + +@main +struct EstEidTokenApp: App { + @NSApplicationDelegateAdaptor(AppDelegate.self) var delegate + + var body: some Scene { + WindowGroup { + ContentView() + .onAppear { + NSWindow.allowsAutomaticWindowTabbing = false + } + } + } +} + +struct ContentView: View { + @State private var version = "1.0.0.0" + @State private var text = "" + + var body: some View { + VStack { + Text("In case of questions please contact our support via id.ee") + Text("Version: \(version)") + TextEditor(text: .constant(text)) + } + .padding() + .onAppear { + version = "\(Bundle.main.infoDictionary?["CFBundleShortVersionString"] ?? 0).\(Bundle.main.infoDictionary?["CFBundleVersion"] ?? 0)" + + let pipe = Pipe() + let task = Process() + task.launchPath = "/usr/sbin/system_profiler" + task.arguments = ["SPSmartCardsDataType"] + task.standardOutput = pipe + try! task.run() + + let data = pipe.fileHandleForReading.readDataToEndOfFile() + text = String(data: data, encoding: .utf8) ?? ""; + task.waitUntilExit() + + let find = [ + kSecClass: kSecClassKey, + kSecReturnAttributes: true, + kSecMatchLimit: kSecMatchLimitAll, + ] as [CFString : Any] + var result: CFTypeRef? + if SecItemCopyMatching(find as CFDictionary, &result) == errSecSuccess, + let items = result as? [Dictionary] { + for item in items { + if let value = item[kSecAttrTokenID] as? String, + value.contains("ee.ria.EstEIDTokenApp.EstEIDToken") { + text.append("\nKey: \(item)") + } + } + } + + if let settings = NSDictionary(contentsOfFile: "/Library/Preferences/com.apple.security.smartcard.plist") { + text.append("\nSettings:\n\(settings)") + } + } + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + ContentView() + } +} diff --git a/EstEIDTokenApp/Localizable.xcstrings b/EstEIDTokenApp/Localizable.xcstrings new file mode 100644 index 0000000..cbb31eb --- /dev/null +++ b/EstEIDTokenApp/Localizable.xcstrings @@ -0,0 +1,38 @@ +{ + "sourceLanguage" : "en", + "strings" : { + "In case of questions please contact our support via id.ee" : { + "localizations" : { + "et" : { + "stringUnit" : { + "state" : "translated", + "value" : "Küsimuste korral pöörduge id.ee" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Если у вас возникнут вопросы, пожалуйста, обратитесь на id.ee" + } + } + } + }, + "Version: %@" : { + "localizations" : { + "et" : { + "stringUnit" : { + "state" : "translated", + "value" : "Versioon: %@" + } + }, + "ru" : { + "stringUnit" : { + "state" : "translated", + "value" : "Версия: %@" + } + } + } + } + }, + "version" : "1.0" +} \ No newline at end of file diff --git a/EstEIDTokenApp/main.m b/EstEIDTokenApp/main.m deleted file mode 100644 index 1cd5e5e..0000000 --- a/EstEIDTokenApp/main.m +++ /dev/null @@ -1,24 +0,0 @@ -/* - * EstEIDTokenApp - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#import - -int main(int argc, const char * argv[]) { - return NSApplicationMain(argc, argv); -} diff --git a/EstEIDTokenApp/mul.lproj/MainMenu.xcstrings b/EstEIDTokenApp/mul.lproj/MainMenu.xcstrings deleted file mode 100644 index 9896f94..0000000 --- a/EstEIDTokenApp/mul.lproj/MainMenu.xcstrings +++ /dev/null @@ -1,342 +0,0 @@ -{ - "sourceLanguage" : "en", - "strings" : { - "1Xt-HY-uBw.title" : { - "comment" : "Class = \"NSMenuItem\"; title = \"EstEIDTokenApp\"; ObjectID = \"1Xt-HY-uBw\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "EstEIDTokenApp" - } - }, - "et" : { - "stringUnit" : { - "state" : "translated", - "value" : "EstEIDTokenApp" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "EstEIDTokenApp" - } - } - } - }, - "4sb-4s-VLi.title" : { - "comment" : "Class = \"NSMenuItem\"; title = \"Quit EstEIDTokenApp\"; ObjectID = \"4sb-4s-VLi\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Quit EstEIDTokenApp" - } - }, - "et" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quit EstEIDTokenApp" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Quit EstEIDTokenApp" - } - } - } - }, - "5kV-Vb-QxS.title" : { - "comment" : "Class = \"NSMenuItem\"; title = \"About EstEIDTokenApp\"; ObjectID = \"5kV-Vb-QxS\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "About EstEIDTokenApp" - } - }, - "et" : { - "stringUnit" : { - "state" : "translated", - "value" : "About EstEIDTokenApp" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "About EstEIDTokenApp" - } - } - } - }, - "9Pp-ko-iP0.title" : { - "comment" : "Class = \"NSTextFieldCell\"; title = \"Version: 1.0.0\"; ObjectID = \"9Pp-ko-iP0\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Version: 1.0.0" - } - }, - "et" : { - "stringUnit" : { - "state" : "translated", - "value" : "Versioon: 1.0.0" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Version: 1.0.0" - } - } - } - }, - "AYu-sK-qS6.title" : { - "comment" : "Class = \"NSMenu\"; title = \"Main Menu\"; ObjectID = \"AYu-sK-qS6\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Main Menu" - } - }, - "et" : { - "stringUnit" : { - "state" : "translated", - "value" : "Main Menu" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Main Menu" - } - } - } - }, - "BOF-NM-1cW.title" : { - "comment" : "Class = \"NSMenuItem\"; title = \"Preferences…\"; ObjectID = \"BOF-NM-1cW\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Preferences…" - } - }, - "et" : { - "stringUnit" : { - "state" : "translated", - "value" : "Preferences…" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Preferences…" - } - } - } - }, - "hz9-B4-Xy5.title" : { - "comment" : "Class = \"NSMenu\"; title = \"Services\"; ObjectID = \"hz9-B4-Xy5\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Services" - } - }, - "et" : { - "stringUnit" : { - "state" : "translated", - "value" : "Services" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Services" - } - } - } - }, - "Kd2-mp-pUS.title" : { - "comment" : "Class = \"NSMenuItem\"; title = \"Show All\"; ObjectID = \"Kd2-mp-pUS\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Show All" - } - }, - "et" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show All" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Show All" - } - } - } - }, - "NMo-om-nkz.title" : { - "comment" : "Class = \"NSMenuItem\"; title = \"Services\"; ObjectID = \"NMo-om-nkz\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Services" - } - }, - "et" : { - "stringUnit" : { - "state" : "translated", - "value" : "Services" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Services" - } - } - } - }, - "Olw-nP-bQN.title" : { - "comment" : "Class = \"NSMenuItem\"; title = \"Hide EstEIDTokenApp\"; ObjectID = \"Olw-nP-bQN\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Hide EstEIDTokenApp" - } - }, - "et" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hide EstEIDTokenApp" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hide EstEIDTokenApp" - } - } - } - }, - "QvC-M9-y7g.title" : { - "comment" : "Class = \"NSWindow\"; title = \"EstEIDToken\"; ObjectID = \"QvC-M9-y7g\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "EstEIDToken" - } - }, - "et" : { - "stringUnit" : { - "state" : "translated", - "value" : "EstEIDToken" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "EstEIDToken" - } - } - } - }, - "uQy-DD-JDr.title" : { - "comment" : "Class = \"NSMenu\"; title = \"EstEIDTokenApp\"; ObjectID = \"uQy-DD-JDr\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "EstEIDTokenApp" - } - }, - "et" : { - "stringUnit" : { - "state" : "translated", - "value" : "EstEIDTokenApp" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "EstEIDTokenApp" - } - } - } - }, - "VD0-B1-6pa.title" : { - "comment" : "Class = \"NSTextFieldCell\"; title = \"In case of questions please contact our support via id.ee\"; ObjectID = \"VD0-B1-6pa\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "In case of questions please contact our support via id.ee" - } - }, - "et" : { - "stringUnit" : { - "state" : "translated", - "value" : "Küsimuste korral pöörduge id.ee" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Если у вас возникнут вопросы, пожалуйста, обратитесь на id.ee" - } - } - } - }, - "Vdr-fp-XzO.title" : { - "comment" : "Class = \"NSMenuItem\"; title = \"Hide Others\"; ObjectID = \"Vdr-fp-XzO\";", - "extractionState" : "extracted_with_value", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "new", - "value" : "Hide Others" - } - }, - "et" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hide Others" - } - }, - "ru" : { - "stringUnit" : { - "state" : "translated", - "value" : "Hide Others" - } - } - } - } - }, - "version" : "1.0" -} \ No newline at end of file diff --git a/EstEIDTokenNotify/Base.lproj/Main.storyboard b/EstEIDTokenNotify/Base.lproj/Main.storyboard index dfdcdc7..8d1bd64 100644 --- a/EstEIDTokenNotify/Base.lproj/Main.storyboard +++ b/EstEIDTokenNotify/Base.lproj/Main.storyboard @@ -61,7 +61,7 @@ - +