Browse Source

Merge branch 'master' of https://github.com/n0shake/Clocker

pull/92/head
Abhishek 4 years ago
parent
commit
6a048405b7
  1. 7
      Clocker/AppDelegate.swift
  2. 23
      Clocker/Clocker.xcodeproj/project.pbxproj
  3. 5
      Clocker/Clocker.xcodeproj/xcshareddata/xcschemes/Clocker.xcscheme
  4. 2
      Clocker/Clocker.xcodeproj/xcuserdata/ban.xcuserdatad/xcschemes/xcschememanagement.plist
  5. 2
      Clocker/Clocker/LocationController.swift
  6. 3
      Clocker/Clocker/ca.lproj/Localizable.strings
  7. 453
      Clocker/Clocker/de.lproj/Localizable.strings
  8. 4
      Clocker/Clocker/en.lproj/Localizable.strings
  9. 47
      Clocker/Clocker/en.lproj/Panel.xib
  10. 3
      Clocker/Clocker/es.lproj/Localizable.strings
  11. 3
      Clocker/Clocker/fr.lproj/Localizable.strings
  12. 3
      Clocker/Clocker/hi.lproj/Localizable.strings
  13. 3
      Clocker/Clocker/it.lproj/Localizable.strings
  14. 2
      Clocker/Clocker/ja.lproj/Localizable.strings
  15. 129
      Clocker/Clocker/ko.lproj/Localizable.strings
  16. 3
      Clocker/Clocker/nl.lproj/Localizable.strings
  17. 162
      Clocker/Clocker/pt-BR.lproj/Localizable.strings
  18. 3
      Clocker/Clocker/ru.lproj/Localizable.strings
  19. 471
      Clocker/Clocker/zh-Hans.lproj/Localizable.strings
  20. 1
      Clocker/ClockerUITests/AboutUsTests.swift
  21. 6
      Clocker/ClockerUITests/FloatingWindowTests.swift
  22. 14
      Clocker/ClockerUITests/OnboardingTests.swift
  23. 4
      Clocker/ClockerUITests/PreferencesTest.swift
  24. 2
      Clocker/Dependencies/Date Additions/TimeChunk.swift
  25. 8
      Clocker/Dependencies/Date Additions/TimePeriod.swift
  26. 2
      Clocker/Dependencies/Date Additions/TimePeriodChain.swift
  27. 14
      Clocker/Events and Reminders/CalendarHandler.swift
  28. 2
      Clocker/Events and Reminders/EventCenter.swift
  29. 2
      Clocker/Media.xcassets/Onboarding/Dark Menubar.imageset/Contents.json
  30. BIN
      Clocker/Media.xcassets/Onboarding/Dark Menubar.imageset/Screen Shot 2020-10-11 at 2.16.37 PM.png
  31. BIN
      Clocker/Media.xcassets/Onboarding/Dark Menubar.imageset/Screen Shot 2020-10-11 at 2.19.26 PM.png
  32. 2
      Clocker/Menu Bar/MenubarHandler.swift
  33. 2
      Clocker/Menu Bar/StatusContainerView.swift
  34. 16
      Clocker/Menu Bar/StatusItemHandler.swift
  35. 2
      Clocker/Onboarding/FinalOnboardingViewController.swift
  36. 78
      Clocker/Onboarding/Onboarding.storyboard
  37. 11
      Clocker/Onboarding/OnboardingParentViewController.swift
  38. 12
      Clocker/Onboarding/OnboardingSearchController.swift
  39. 16
      Clocker/Overall App/AppDefaults.swift
  40. 3
      Clocker/Overall App/DataStore.swift
  41. 12
      Clocker/Overall App/Logger.swift
  42. 2
      Clocker/Overall App/Strings.swift
  43. 31
      Clocker/Overall App/Themer.swift
  44. 8
      Clocker/Overall App/VersionUpdateHandler.swift
  45. 2
      Clocker/Panel/Data Layer/TimezoneData.swift
  46. 35
      Clocker/Panel/Data Layer/TimezoneDataOperations.swift
  47. 4
      Clocker/Panel/Notes Popover/NotesPopover.swift
  48. 4
      Clocker/Panel/PanelController.swift
  49. 33
      Clocker/Panel/ParentPanelController.swift
  50. 31
      Clocker/Panel/UI/HourMarkerViewItem.swift
  51. 4
      Clocker/Panel/UI/HourMarkerViewItem.xib
  52. 2
      Clocker/Panel/UI/PanelTableView.swift
  53. 14
      Clocker/Panel/UI/TimezoneDataSource.swift
  54. 18
      Clocker/Preferences/Appearance/AppearanceViewController.swift
  55. 2
      Clocker/Preferences/Calendar/CalendarViewController.swift
  56. 2
      Clocker/Preferences/General/PreferencesDataSource.swift
  57. 18
      Clocker/Preferences/General/PreferencesViewController.swift
  58. 96
      Clocker/Preferences/Preferences.storyboard

7
Clocker/AppDelegate.swift

@ -164,12 +164,7 @@ open class AppDelegate: NSObject, NSApplicationDelegate {
let defaults = UserDefaults.standard
let currentActivationPolicy = NSRunningApplication.current.activationPolicy
var activationPolicy: NSApplication.ActivationPolicy = defaults.integer(forKey: CLAppDisplayOptions) == 0 ? .accessory : .regular
#if DEBUG
UserDefaults.standard.set(1, forKey: CLAppDisplayOptions)
activationPolicy = .regular
#endif
let activationPolicy: NSApplication.ActivationPolicy = defaults.integer(forKey: CLAppDisplayOptions) == 0 ? .accessory : .regular
if currentActivationPolicy != activationPolicy {
NSApp.setActivationPolicy(activationPolicy)

23
Clocker/Clocker.xcodeproj/project.pbxproj

@ -84,7 +84,6 @@
35C36FA22259ED6D002FA5C6 /* RemindersHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35C36F9F2259ED6D002FA5C6 /* RemindersHandler.swift */; };
35C36FA42259EEC2002FA5C6 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35C36FA32259EEC2002FA5C6 /* AppDelegate.swift */; };
35EB537325310FD200311068 /* TimezoneDataEqualityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3545C52A22612BCC00121E25 /* TimezoneDataEqualityTests.swift */; };
35F14BDE25073E4C0052B240 /* Keys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 35F14BDD25073E4C0052B240 /* Keys.plist */; };
9A0A1C8C20903DBD0012003B /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A9E87651C1FEDC500A7A2DF /* CoreLocation.framework */; };
9A13BAD61CA87F08007C6CBE /* Panel.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9A13BAD81CA87F08007C6CBE /* Panel.xib */; };
9A13BAE01CA882FA007C6CBE /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9A13BAE21CA882FA007C6CBE /* InfoPlist.strings */; };
@ -92,6 +91,7 @@
9A20A04B1C4DEED200FB45AB /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A20A04A1C4DEED200FB45AB /* IOKit.framework */; };
9A24A1881ED902CC0095201E /* EventKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A24A1871ED902CC0095201E /* EventKit.framework */; };
9A3169C11D2CC5AA0079FDF8 /* com.abhishek.ClockerHelper.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9A3169C01D2CC5AA0079FDF8 /* com.abhishek.ClockerHelper.plist */; };
9A348B312545DE18000E846F /* Keys.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9A348B302545DE17000E846F /* Keys.plist */; };
9A4379271BEC223900F4E27F /* Fabric.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A4379231BEC223900F4E27F /* Fabric.framework */; };
9A43792A1BEC230A00F4E27F /* libc++.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 9A4379291BEC230A00F4E27F /* libc++.tbd */; };
9A56DB801C1CFB73004CE6AF /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9A56DB7D1C1CFB73004CE6AF /* MainMenu.xib */; };
@ -228,6 +228,7 @@
352AF497232E07B400D96FA7 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/InfoPlist.strings; sourceTree = "<group>"; };
352AF499232E07B400D96FA7 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Localizable.strings; sourceTree = "<group>"; };
3545C52A22612BCC00121E25 /* TimezoneDataEqualityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimezoneDataEqualityTests.swift; sourceTree = "<group>"; };
3569A44E25441F320087E254 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = "<group>"; };
357391852507277500D30819 /* HourMarkerViewItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HourMarkerViewItem.swift; sourceTree = "<group>"; };
357391862507277500D30819 /* HourMarkerViewItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = HourMarkerViewItem.xib; sourceTree = "<group>"; };
3595FACF227F88BC0044A12A /* UserDefaults + KVOExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UserDefaults + KVOExtensions.swift"; sourceTree = "<group>"; };
@ -305,7 +306,6 @@
35C36F9E2259ED6D002FA5C6 /* EventCenter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EventCenter.swift; sourceTree = "<group>"; };
35C36F9F2259ED6D002FA5C6 /* RemindersHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RemindersHandler.swift; sourceTree = "<group>"; };
35C36FA32259EEC2002FA5C6 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = SOURCE_ROOT; };
35F14BDD25073E4C0052B240 /* Keys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Keys.plist; path = ../Internal/Keys.plist; sourceTree = "<group>"; };
9A13BAD71CA87F08007C6CBE /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/Panel.xib; sourceTree = "<group>"; };
9A13BAE11CA882FA007C6CBE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
9A13BAEB1CA88A76007C6CBE /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
@ -313,6 +313,7 @@
9A20A06F1C4E804D00FB45AB /* ServiceManagement.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ServiceManagement.framework; path = System/Library/Frameworks/ServiceManagement.framework; sourceTree = SDKROOT; };
9A24A1871ED902CC0095201E /* EventKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = EventKit.framework; path = System/Library/Frameworks/EventKit.framework; sourceTree = SDKROOT; };
9A3169C01D2CC5AA0079FDF8 /* com.abhishek.ClockerHelper.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = com.abhishek.ClockerHelper.plist; path = Clocker/com.abhishek.ClockerHelper.plist; sourceTree = "<group>"; };
9A348B302545DE17000E846F /* Keys.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Keys.plist; path = Internal/Keys.plist; sourceTree = "<group>"; };
9A4379231BEC223900F4E27F /* Fabric.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Fabric.framework; sourceTree = "<group>"; };
9A4379291BEC230A00F4E27F /* libc++.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.tbd"; path = "usr/lib/libc++.tbd"; sourceTree = SDKROOT; };
9A43792B1BEC231100F4E27F /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
@ -828,7 +829,7 @@
DD4F7BF913C30F9F00825C6E = {
isa = PBXGroup;
children = (
35F14BDD25073E4C0052B240 /* Keys.plist */,
9A348B302545DE17000E846F /* Keys.plist */,
35C36F9B2259EC97002FA5C6 /* Events and Reminders */,
35C36F382259D80C002FA5C6 /* Overall App */,
35C36F242259D64D002FA5C6 /* Panel */,
@ -1038,6 +1039,7 @@
it,
tr,
ar,
"pt-BR",
);
mainGroup = DD4F7BF913C30F9F00825C6E;
productRefGroup = DD4F7C0513C30F9F00825C6E /* Products */;
@ -1113,7 +1115,7 @@
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
35F14BDE25073E4C0052B240 /* Keys.plist in Resources */,
9A348B312545DE18000E846F /* Keys.plist in Resources */,
9A13BAEA1CA88A76007C6CBE /* Localizable.strings in Resources */,
357391882507277500D30819 /* HourMarkerViewItem.xib in Resources */,
9AB6F15E2259D08300A44663 /* iVersion.bundle in Resources */,
@ -1362,6 +1364,7 @@
9AA522D123416A0E00C9E005 /* es */,
9AA522D523416A6000C9E005 /* nl */,
9AA522D723416E6000C9E005 /* it */,
3569A44E25441F320087E254 /* pt-BR */,
);
name = Localizable.strings;
path = Clocker;
@ -1466,7 +1469,7 @@
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 81;
CURRENT_PROJECT_VERSION = 83;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
FRAMEWORK_SEARCH_PATHS = (
@ -1491,7 +1494,7 @@
INFOPLIST_FILE = "Clocker/Clocker-Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.12;
MARKETING_VERSION = 20.10.01;
MARKETING_VERSION = 20.10.02;
OTHER_LDFLAGS = "";
PRODUCT_BUNDLE_IDENTIFIER = com.abhishek.Clocker;
PRODUCT_NAME = Clocker;
@ -1953,7 +1956,7 @@
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 81;
CURRENT_PROJECT_VERSION = 83;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
@ -1980,7 +1983,7 @@
INFOPLIST_FILE = "Clocker/Clocker-Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.12;
MARKETING_VERSION = 20.10.01;
MARKETING_VERSION = 20.10.02;
ONLY_ACTIVE_ARCH = NO;
OTHER_LDFLAGS = "";
"OTHER_SWIFT_FLAGS[arch=*]" = "-D DEBUG";
@ -2018,7 +2021,7 @@
CODE_SIGN_STYLE = Manual;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 81;
CURRENT_PROJECT_VERSION = 83;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
FRAMEWORK_SEARCH_PATHS = (
@ -2043,7 +2046,7 @@
INFOPLIST_FILE = "Clocker/Clocker-Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.12;
MARKETING_VERSION = 20.10.01;
MARKETING_VERSION = 20.10.02;
OTHER_LDFLAGS = "";
"OTHER_SWIFT_FLAGS[arch=*]" = "-D RELEASE";
PRODUCT_BUNDLE_IDENTIFIER = com.abhishek.Clocker;

5
Clocker/Clocker.xcodeproj/xcshareddata/xcschemes/Clocker.xcscheme

@ -82,11 +82,6 @@
</BuildableReference>
</BuildableProductRunnable>
<EnvironmentVariables>
<EnvironmentVariable
key = "OS_ACTIVITY_MODE"
value = "disable"
isEnabled = "YES">
</EnvironmentVariable>
<EnvironmentVariable
key = "ENABLE_PERF_LOGGING"
value = "NO"

2
Clocker/Clocker.xcodeproj/xcuserdata/ban.xcuserdatad/xcschemes/xcschememanagement.plist

@ -17,7 +17,7 @@
<key>Tests.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>1</integer>
<integer>2</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>

2
Clocker/Clocker/LocationController.swift

@ -111,6 +111,6 @@ extension LocationController: CLLocationManagerDelegate {
}
func locationManager(_: CLLocationManager, didFailWithError error: Error) {
print(error)
Logger.info(error.localizedDescription)
}
}

3
Clocker/Clocker/ca.lproj/Localizable.strings

@ -156,3 +156,6 @@
"New Zealand" = "New Zealand";
"Florida" = "Florida";
"San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

453
Clocker/Clocker/de.lproj/Localizable.strings

@ -1,332 +1,161 @@
/* (No Comment) */
"About Tab" = "Über Clocker";
/*
Localizable.strings
Clocker
"CFBundleDisplayName" = "Clocker";
Created by Abhishek Banthia on 3/27/16.
/* Button to add a location */
"Add Button Title" = "Hinzufügen";
*/
/* (No Comment) */
"CFBundleDisplayName" = "Clocker";
"Thank you for helping make Clocker even better!" = "Danke, dass du dabei geholfen hast, Clocker noch besser zu machen!";
"iRateMessageTitle" = "%@ bewerten";
"iRateAppMessage" = "Wenn dir %@ gefällt, dann bewerte uns doch im App Store. Das dauert kaum eine Minute und hilft uns sehr. Vielen Dank für deine Unterstützung!";
"iRateGameMessage" = "Wenn du Spaß an %@ hast, dann bewerte uns doch im App Store. Das dauert kaum eine Minute und hilft uns sehr. Vielen Dank, für deine Unterstützung!";
"iRateCancelButton" = "Nein, danke";
"iRateRateButton" = "Jetzt bewerten";
"iRateRemindButton" = "Später erinnern";
"iRateUpdateMessage" = "Jetzt aktualisieren?";
"ClockerVersion" = "Version %@";
"CLFeedbackAlertTitle" = "Danke, dass Du hilfst Clocker noch besser zu machen!";
"app-name" = "Clocker";
/* (No Comment) */
"Appearance Tab" = "Darstellungen";
/* Button title for going back to the previous screen */
"Back" = "Zurück";
/* Calendar Permission Title */
"start-at-login" = "Bei der Anmeldung starten";
"setup-steps" = "In nur drei Schritten ist Clocker fertig eingerichtet";
"Permissions-Header" = "Berechtigungen";
"See your next Calendar event here." = "Hier Deinen nächsten Kalendereintrag anzeigen.";
"Click here to start." = "Hier klicken, um zu starten.";
"Reminders Access" = "Erinnerungen-Zugriff";
"Calendar Access" = "Kalender-Zugriff";
/* Title for Calendar access label */
"Calendar Access Title" = "Kalender-Zugriff";
/* Calendar Detail Text */
"Calendar Detail" = "Die nächsten Termine Ihrer persönlichen und geteilten Kalender können in der Menüleiste und im Panel angezeigt werden.";
/* (No Comment) */
"Permissions" = "Berechtigungen";
"Calendar Detail" = "Anstehende Termine aus Deinem persönlichen und geteilten Kalendern können in der Menüleiste und im Fenster angezeigt werden.";
"Reminders Detail" = "Erinnerungen in der Zeitzone Deiner Wahl festlegen. Deine Erinnerungen werden in der Standard-Erinnerungs-App gespeichert.";
"Privacy Text" = "Du kannst das später im Bereich Datenschutz in den Systemeinstellungen ändern.";
"Granted Button Text" = "Gewährt";
"Denied Button Text" = "Verweigert";
"Grant Button Text" = "Gewähren";
// Welcome Onboarding
"It only takes 3 steps to setup Clocker." = "In nur drei Schritten ist Clocker fertig eingerichtet.";
"Get Started" = "Erste Schritte";
// Tab Item Titles
"Preferences Tab" = "Einstellungen";
"Appearance Tab" = "Darstellung";
"Calendar Tab" = "Kalender";
/* (No Comment) */
"characters" = "characters";
/* (No Comment) */
"CLFeedbackAlertTitle" = "Vielen Dank, dass Sie Clocker noch besser machen!";
/* Button Title for no Calendar access */
"Click here to start." = "Klicken Sie hier, um zu starten.";
/* (No Comment) */
"Clocker is more useful when it can display events from your calendars." = "Clocker ist nützlicher, wenn es Ereignisse von Ihren Kalender anzeigen kann.";
/* (No Comment) */
"Clocker is more useful when it can display events from your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy." = "Clocker ist nützlicher, wenn es Ereignisse von Ihren Kalender anzeigen kann. Sie können diese Einstellung in Systemeinstellungen › Sicherheit und Privatsphäre › Privatsphäre ändern.";
/* (No Comment) */
"ClockerVersion" = "Version %@";
/* Button to close the panel */
"About Tab" = "Über";
"Permissions Tab" = "Berechtigungen";
// General Preferences Screen
"Start at Login" = "Clocker bei der Anmeldung starten";
"Sort by Time Difference" = "Nach Zeitdifferenz sortieren";
"Sort by Name" = "Nach Namen sortieren";
"Sort by Label" = "Nach Bezeichnung sortieren";
"Search Field Placeholder" = "Gebe eine Stadt, ein Bundesland oder Land ein";
"No Timezone Selected" = "Bitte wählen Sie eine Zeitzone!";
"Max Timezones Selected" = "Es werden maximal 100 Zeitzonen unterstützt!";
"Max Search Characters" = "Es sind nur 50 Zeichen erlaubt!";
"Add Button Title" = "Hinzufügen";
"Close Button Title" = "Schließen";
/* (No Comment) */
"Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!" = "Kontaktfelder sind optional! Ihre Kontaktinformationen läßt uns Sie kontaktieren, falls wir weitere Informationen benötigen oder helfen können!";
// Onboarding
"Open Clocker At Login" = "Clocker bei der Anmeldung starten";
"Launch Clocker" = "Clocker starten";
/* (No Comment) */
"Contact Information (Optional)" = "Kontaktinformationen (optional)";
// Welcome Onboarding
"It only takes 3 steps to set up Clocker." = "In nur drei Schritten ist Clocker fertig eingerichtet.";
"Get Started" = "Erste Schritte";
/* Continue Button Title */
// Permissions
"Calendar Access Title" = "Kalender-Zugriff";
"Reminders Access Title" = "Zugriff auf Erinnerungen";
"Later Config Description" = "Dies kann später in den Clocker Einstellungen konfiguriert werden.";
"Back" = "Zurück";
"Continue" = "Fortfahren";
/* (No Comment) */
"Day Display Options" = "Tagesanzeige Optionen";
/* (No Comment) */
"Clocker is more useful when it can display events from your calendars." = "Clocker ist nützlicher, wenn es Ereignisse aus Deinem Kalendern anzeigen kann.";
"Clocker is more useful when it can display events from your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy." = "Clocker ist nützlicher, wenn es Ereignisse aus Deinem Kalendern anzeigen kann. Du kannst diese Einstellung in Systemeinstellungen › Sicherheit Privatsphäre › Privatsphäre ändern.";
"Launch Preferences" = "Einstellungen öffnen";
"Grant Access" = "Zugriff erlauben";
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "Anstehende Termine aus Deinem persönlichen und geteilten Kalendern können in der Menüleiste und im Fenster angezeigt werden.";
"Granted" = "Gewährt";
"Denied" = "Abgelehnt";
/* Denied Button Text */
"Denied Button Text" = "Abgelehnt";
/* (No Comment) */
"Display the time in seconds" = "Zeit in Sekunden anzeigen";
/* Title asking users if they like the app */
"Enjoy using Clocker" = "Gefällt Ihnen Clocker";
/* Review */
"Enjoy using Clocker?" = "Gefällt Ihnen Clocker?";
/* (No Comment) */
"Favourite a timezone to enable menubar display options." = "Favorisieren Sie eine Zeitzone, um die Menüleiste-Anzeigeoptionen zu aktivieren.";
/* About View Screen */
"Feedback is always welcome:" = "Feedback ist immer willkommen:";
/* (No Comment) */
"Florida" = "Florida";
/* (No Comment) */
"Future Slider Range" = "Zukünftige Slider-Bereich";
/* Title for Welcome View Controller's Continue Button */
"Get Started" = "Jetzt Anfangen";
/* (No Comment) */
"Grant" = "Gewähren";
"Unexpected" = "Unerwartet";
/* (No Comment) */
"Grant Access" = "Zugriff gewähren";
/* Grant Button Text */
"Grant Button Text" = "Zulassen";
/* (No Comment) */
"Granted" = "Zugelassen";
/* Granted Button Text */
"Granted Button Text" = "Zugelassen";
/* (No Comment) */
"If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"" = "Wenn der Besprechung Titel \"Meeting with Neel\" ist und die Kurzlänge auf fünf gesetzt ist, erscheint der Text in der Menüleiste als \"Meeti...\"";
/* (No Comment) */
"If you'd like to help us localize the app in your language or receive infrequent app-related updates, please enter your email!" = "Wenn Sie uns helfen möchten, die App in Ihrer Sprache zu lokalisieren oder seltene app-bezogene Nachrichten erhalten wollen, geben Sie bitte Ihre E-Mail ein!";
/* (No Comment) */
"Include Date" = "Datum Anzeigen";
/* (No Comment) */
"Include Day" = "Tag Anzeigen";
/* (No Comment) */
"Include Place Name" = "Ortsname Anzeigen";
/* (No Comment) */
"iRateAppMessage" = "If you enjoy using %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!";
/* (No Comment) */
"iRateCancelButton" = "No, Thanks";
/* (No Comment) */
"iRateGameMessage" = "If you enjoy playing %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!";
/* (No Comment) */
"iRateMessageTitle" = "Rate %@";
/* (No Comment) */
"iRateRateButton" = "Rate It Now";
/* (No Comment) */
"iRateRemindButton" = "Remind Me Later";
/* (No Comment) */
"iRateUpdateMessage" = "Update now?";
/* App Setup Description */
"It only takes 3 steps to set up Clocker." = "Es sind nur 3 Schritte Clocker einzurichten.";
/* Welcome Onboarding */
"It only takes 3 steps to setup Clocker." = "Es sind nur 3 Schritte Clocker einzurichten.";
/* (No Comment) */
// Onboarding Search
"Quick Add Locations" = "Orte schnell hinzufügen";
"More search options in Clocker Preferences." = "Weitere Suchoptionen in den Clocker Einstellungen.";
"Enter 3 or more characters for locations you'll like to add" = "Gebe 3 oder mehr Zeichen für den Orte ein, die Du hinzufügen möchtest";
// Start at Login
"Launch at Login" = "Bei der Anmelden starten";
"This can be configured later in Clocker Preferences." = "Dies kann später in den Clocker Einstellungen konfiguriert werden.";
"Should Clocker open automatically on startup?" = "Soll Clocker beim Start automatisch geöffnet werden?";
// Final Onboarding Screen
"You're all set!" = "Du bist startklar!";
"Thank you for the details." = "Vielen Dank für die Details.";
"You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences." = "Du wirst ein Uhr-Symbol in Ihrer Menüleiste sehen, wenn Du die App startest. Wenn Du ein Dock-Symbol sehen möchtest, gehe in die Einstellungen.";
"If you'd like to help us localize the app in your language or receive infrequent app-related updates, please enter your email!" = "Wenn Du uns helfen möchtest die App in Deine Sprache zu übersetzen oder von Zeit zu Zeit Informationen zur App erhalten möchtest, gibt bitte hier Deine E-Mail ein!";
// Appearance Tab
"Panel Theme" = "Erscheinungsbild";
"Favourite a timezone to enable menubar display options." = "Favorisiere eine Zeitzone, um diese in der Menüleiste zu zeigen.";
"Main Panel Options" = "Optionen für Programmfenster";
"Time Format" = "Zeitformat";
"Day Display Options" = "Anzeigeoptionen für den Tag";
"Show Future Slider" = "\"Future Slider\" anzeigen";
"Show Sunrise/Sunset" = "Sonnenaufgang/-untergang anzeigen";
"Display the time in seconds" = "Zeit in Sekunden anzeigen";
"Larger Text" = "Größerer Text";
"Future Slider Range" = "Bereich für den \"Future Slider\"";
"Include Date" = "Datum hinzufügen";
"Include Day" = "Tag hinzufügen";
"Include Place Name" = "Ortsname hinzufügen";
"Menubar Display Options" = "Anzeigeoptionen für die Menüleiste";
"Menubar Mode" = "Menüleisten-Modus";
"Preview" = "Vorschau";
"Miscellaneous" = "Verschiedenes";
// Empty View
"No places added" = "Keine Orte hinzugefügt";
// Panel
"No upcoming event." = "Kein anstehendes Ereignis.";
"You have no events scheduled for tomorrow." = "Du hast keine Kalendereinträge für morgen.";
// Review
"Enjoy using Clocker?" = "Gefällt Dir Clocker?";
// App Feedback
"Tell us what you think!" = "Sag uns, was Du denkst!";
"Contact Information (Optional)" = "Kontaktinformationen (optional)";
"Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!" = "Kontaktinformationen sind optional! Diese helfen uns jedoch Dich zu erreichen, falls wir weitere Informationen benötigen oder helfen können!";
/* Describing we can change the options later in System Preferences */
"Later Config Description" = "Diese können später in Systemeinstellungen konfiguriert werden.";
/* Start at Login */
"Launch at Login" = "Launch at Login";
/* (No Comment) */
"Launch Clocker" = "Clocker Starten";
/* (No Comment) */
"Launch Preferences" = "Launch Preferences";
/* (No Comment) */
"Main Panel Options" = "Main Panel Options";
/* Max Character Count Allowed Error Message */
"Max Search Characters" = "Only 50 characters allowed!";
/* Max Timezones Error Message */
"Max Timezones Selected" = "Maximum 100 timezones allowed!";
/* (No Comment) */
"Menubar Display Options" = "Menubar Display Options";
/* (No Comment) */
"Menubar Mode" = "Menubar Mode";
/* (No Comment) */
"More search options in Clocker Preferences." = "More search options in Clocker Preferences.";
// About View Screen
"Feedback is always welcome:" = "Feedback ist immer willkommen:";
/* UI Tests */
// Calendars View
"Upcoming Event View Options" = "Zukünftige Ereignisse zeigen";
"Show Upcoming Event View" = "Anzeigeoptionen für zukünftige Ereignisse";
"Show All Day Meetings" = "Ganztägige Ereignisse anzeigen";
"Show Next Meeting Title in Menubar" = "Das nächste Ereignis in der Menüliste zeigen";
"Truncate menubar text longer than" = "Text in der Menüleiste kürzen, der länger ist als";
"characters" = "Zeichen";
"Show events from" = "Zeige Ereignisse aus";
"If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"" = "Wenn der Besprechungstitel \"Besprechung mit Neel\" ist und die Kürzungslänge auf 5 eingestellt wurde, dann erscheint der Text in der Menüleiste als \"Bespr...\"";
// Notes Popover
"Reminder Set" = "Erinnerung gespeichert";
"Successfully set." = "Erfolgreich gespeichert.";
// Errors
"You're offline, maybe?" = "Bist Du eventuell offline?";
"Try again, maybe?" = "Versuche es nochmal!";
"The Internet connection appears to be offline." = "Scheinbar besteht keine Verbindung zum Internet.";
// UI Tests
"New Zealand" = "Neuseeland";
/* Subtitle for no places added */
"No places added" = "No places added";
/* Message shown when the user taps on Add without selecting a timezone */
"No Timezone Selected" = "Please select a timezone!";
/* Title when there's no upcoming event */
"No upcoming event." = "No upcoming event.";
/* Onboarding */
"Open Clocker At Login" = "Open Clocker At Login";
/* Appearance Tab */
"Panel Theme" = "Panel Theme";
/* Permissions Tab Titles */
"Permissions" = "Permissions";
/* Title for Permissions screen */
"Permissions Tab" = "Permissions";
/* (No Comment) */
"Permissions-Header" = "Permissions";
/* Tab Item Titles */
"Preferences Tab" = "Preferences";
/* Text explaining options can be changed in the future through System Preferences */
"Privacy Text" = "You can change this later in the Privacy section of the System Preferences.";
/* Onboarding Search */
"Quick Add Locations" = "Quick Add Locations";
/* Notes Popover */
"Reminder Set" = "Reminder Set";
/* Reminders Permission Title */
"Reminders Access" = "Reminders Access";
/* Title for Reminders Access Label */
"Reminders Access Title" = "Reminders Access";
/* Reminders Detail Text */
"Reminders Detail" = "Set reminders in the timezone of the location of your choice. Your reminders are stored in the default Reminders app.";
/* (No Comment) */
"Florida" = "Florida";
"San Francisco" = "San Francisco";
/* Search Field Placeholder */
"Search Field Placeholder" = "Enter a city, state or country name";
/* (No Comment) */
"Enter 3 or more characters for locations you'll like to add" = "Enter 3 or more characters for locations you'll like to add";
/* Next Event Label for no Calendar access */
"See your next Calendar event here." = "See your next Calendar event here.";
/* (No Comment) */
"setup-steps" = "It only takes 3 steps to set up Clocker";
/* (No Comment) */
"Should Clocker open automatically on startup?" = "Should Clocker open automatically on startup?";
/* (No Comment) */
"Show All Day Meetings" = "Show All Day Meetings";
/* (No Comment) */
"Show events from" = "Show events from";
/* (No Comment) */
"Show Future Slider" = "Show Future Slider";
/* (No Comment) */
"Show Next Meeting Title in Menubar" = "Show Next Meeting Title in Menubar";
/* (No Comment) */
"Show Sunrise/Sunset" = "Show Sunrise/Sunset";
/* (No Comment) */
"Show Upcoming Event View" = "Show Upcoming Event View";
/* Start at Login */
"Sort by Label" = "Sort by Label";
/* Start at Login */
"Sort by Name" = "Sort by Name";
/* Start at Login */
"Sort by Time Difference" = "Sort by Time Difference";
/* Start at Login */
"Start at Login" = "Start Clocker at Login";
/* (No Comment) */
"start-at-login" = "Start At Login";
/* (No Comment) */
"Successfully set." = "Successfully set.";
/* App Feedback */
"Tell us what you think!" = "Tell us what you think!";
/* (No Comment) */
"Thank you for helping make Clocker even better!" = "Thank you for helping make Clocker even better!";
/* (No Comment) */
"Thank you for the details." = "Thank you for the details.";
/* (No Comment) */
"The Internet connection appears to be offline." = "The Internet connection appears to be offline.";
/* (No Comment) */
"This can be configured later in Clocker Preferences." = "This can be configured later in Clocker Preferences.";
/* (No Comment) */
"Time Format" = "Time Format";
/* (No Comment) */
"Truncate menubar text longer than" = "Menüleisten Text kürzen länger als";
/* (No Comment) */
"Try again, maybe?" = "Vielleicht erneut versuchen?";
/* (No Comment) */
"Unexpected" = "Unerwartet";
/* Calendars View */
"Upcoming Event View Options" = "Kommende Ereignis Anzeige Optionen";
/* (No Comment) */
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
/* Title when there's no event scheduled for tomorrow */
"You have no events scheduled for tomorrow." = "You have no events scheduled for tomorrow.";
/* (No Comment) */
"You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences." = "You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences.";
/* Final Onboarding Screen */
"You're all set!" = "You're all set!";
/* Errors */
"You're offline, maybe?" = "You're offline, maybe?";
"Preview" = "Preview";
"Miscellaneous" = "Miscellaneous";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

4
Clocker/Clocker/en.lproj/Localizable.strings

@ -156,3 +156,7 @@
"New Zealand" = "New Zealand";
"Florida" = "Florida";
"San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

47
Clocker/Clocker/en.lproj/Panel.xib

@ -16,6 +16,7 @@
<outlet property="leftButton" destination="WVY-D9-AAX" id="M2W-xG-chN"/>
<outlet property="leftField" destination="8Qj-Y9-Okf" id="q3N-ht-jCd"/>
<outlet property="mainTableView" destination="dFw-ts-8OZ" id="2kY-dd-rDV"/>
<outlet property="modernSlider" destination="lxA-64-3QU" id="kS5-ub-7gV"/>
<outlet property="nextEventLabel" destination="rld-Ag-KL1" id="GTY-j3-A1g"/>
<outlet property="pinButton" destination="YXE-4J-5cn" id="k6V-HK-7XG"/>
<outlet property="preferencesButton" destination="Ctq-BV-GPN" id="cdL-5h-qmx"/>
@ -41,7 +42,7 @@
<rect key="contentRect" x="1000" y="379" width="350" height="460"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
<view key="contentView" focusRingType="none" misplaced="YES" id="6" customClass="BackgroundPanelView" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="0.0" y="0.0" width="379" height="460"/>
<rect key="frame" x="0.0" y="0.0" width="350" height="460"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<stackView focusRingType="none" distribution="fill" orientation="vertical" alignment="leading" spacing="0.0" horizontalStackHuggingPriority="249.99998474121094" verticalStackHuggingPriority="249.99998474121094" detachesHiddenViews="YES" translatesAutoresizingMaskIntoConstraints="NO" id="OZA-6o-SbE">
@ -534,6 +535,48 @@
<constraint firstItem="Ctq-BV-GPN" firstAttribute="leading" secondItem="B8X-sx-cjT" secondAttribute="leading" constant="8" id="ydm-oF-sVc"/>
</constraints>
</customView>
<customView hidden="YES" wantsLayer="YES" focusRingType="none" id="8W7-rS-Uob" userLabel="Slider View">
<rect key="frame" x="0.0" y="205" width="365" height="50"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews>
<scrollView wantsLayer="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="htc-pO-AqH">
<rect key="frame" x="0.0" y="0.0" width="365" height="50"/>
<clipView key="contentView" id="N1e-zE-F86">
<rect key="frame" x="0.0" y="0.0" width="365" height="50"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<collectionView id="lxA-64-3QU">
<rect key="frame" x="0.0" y="0.0" width="365" height="158"/>
<autoresizingMask key="autoresizingMask" heightSizable="YES"/>
<collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" id="mgM-vQ-fB7">
<size key="itemSize" width="50" height="50"/>
</collectionViewFlowLayout>
<color key="primaryBackgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<connections>
<outlet property="dataSource" destination="-2" id="Exd-5i-4cB"/>
<outlet property="delegate" destination="-2" id="r49-5r-Rx5"/>
</connections>
</collectionView>
</subviews>
</clipView>
<scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="8II-oP-xbd">
<rect key="frame" x="1" y="33" width="363" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="f9b-8n-Bt1">
<rect key="frame" x="349" y="0.0" width="16" height="50"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
</subviews>
<constraints>
<constraint firstItem="htc-pO-AqH" firstAttribute="leading" secondItem="8W7-rS-Uob" secondAttribute="leading" id="0QY-hT-XLg"/>
<constraint firstAttribute="height" constant="50" id="5HT-Ps-YH3"/>
<constraint firstItem="htc-pO-AqH" firstAttribute="top" secondItem="8W7-rS-Uob" secondAttribute="top" id="Ag8-2G-tVA"/>
<constraint firstAttribute="bottom" secondItem="htc-pO-AqH" secondAttribute="bottom" id="YCJ-zB-dvc"/>
<constraint firstAttribute="trailing" secondItem="htc-pO-AqH" secondAttribute="trailing" id="d7f-wV-lqc"/>
</constraints>
</customView>
</subviews>
<constraints>
<constraint firstItem="B8X-sx-cjT" firstAttribute="leading" secondItem="OZA-6o-SbE" secondAttribute="leading" id="AUz-54-0mE"/>
@ -551,6 +594,7 @@
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
<integer value="1000"/>
</visibilityPriorities>
<customSpacing>
<real value="3.4028234663852886e+38"/>
@ -558,6 +602,7 @@
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
<real value="3.4028234663852886e+38"/>
</customSpacing>
</stackView>
</subviews>

3
Clocker/Clocker/es.lproj/Localizable.strings

@ -156,3 +156,6 @@
"New Zealand" = "New Zealand";
"Florida" = "Florida";
"San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

3
Clocker/Clocker/fr.lproj/Localizable.strings

@ -156,3 +156,6 @@
"New Zealand" = "New Zealand";
"Florida" = "Florida";
"San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

3
Clocker/Clocker/hi.lproj/Localizable.strings

@ -152,3 +152,6 @@
"New Zealand" = "नड";
"Florida" = "फि";
"San Francisco" = "सन फि";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

3
Clocker/Clocker/it.lproj/Localizable.strings

@ -157,3 +157,6 @@
"New Zealand" = "New Zealand";
"Florida" = "Florida";
"San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

2
Clocker/Clocker/ja.lproj/Localizable.strings

@ -156,3 +156,5 @@
"Florida" = "Florida";
"San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

129
Clocker/Clocker/ko.lproj/Localizable.strings

@ -6,26 +6,27 @@
*/
"Thank you for helping make Clocker even better!" = "Thank you for helping make Clocker even better!";
"iRateMessageTitle" = "Rate %@";
"iRateAppMessage" = "If you enjoy using %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!";
"iRateGameMessage" = "If you enjoy playing %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!";
"iRateCancelButton" = "No, Thanks";
"iRateRateButton" = "Rate It Now";
"iRateRemindButton" = "Remind Me Later";
"iRateUpdateMessage" = "Update now?";
"ClockerVersion" = "Version %@";
"CLFeedbackAlertTitle" = "Thank you for helping make Clocker even better!";
"app-name" = "Clocker";
"start-at-login" = "Start At Login";
"setup-steps" = "It only takes 3 steps to set up Clocker";
"Permissions-Header" = "Permissions";
"See your next Calendar event here." = "See your next Calendar event here.";
"Click here to start." = "Click here to start.";
"Reminders Access" = "Reminders Access";
"Calendar Access" = "Calendar Access";
"Permissions" = "Permissions";
"Calendar Detail" = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
"CFBundleDisplayName" = "시계";
"Thank you for helping make Clocker even better!" = "Clocker가 더 발전할 수 있도록 도와주셔서 정말 감사합니다!";
"iRateMessageTitle" = "비율 %@ ";
"iRateAppMessage" = "%@을 즐기고 계신다면, 잠시 평가를 위해 시간을 내주시겠습니까? 단 1분도 걸리지 않겠습니다. 지원해주셔서 감사합니다!";
"iRateGameMessage" = "%@을 즐기고 계신다면, 잠시 평가를 위해 시간을 내주시겠습니까? 단 1분도 걸리지 않겠습니다. 지원해주셔서 감사합니다!";
"iRateCancelButton" = "나중에 할게요";
"iRateRateButton" = "지금 평가하기";
"iRateRemindButton" = "나중에 다시 알리기";
"iRateUpdateMessage" = "지금 업데이트를 진행할까요?";
"ClockerVersion" = "버전 %@";
"CLFeedbackAlertTitle" = "Clocker가 더 발전할 수 있도록 도와주셔서 정말 감사합니다!";
"app-name" = "시계";
"start-at-login" = "로그인을 해주세요";
"setup-steps" = "시계를 설정하는데 3가지만 하시면 됩니다";
"Permissions-Header" = "권한";
"See your next Calendar event here." = "당신의 다음 일정을 여기서 보세요";
"Click here to start." = "여기를 눌러서 시작합니다.";
"Reminders Access" = "리마인더 권한";
"Calendar Access" = "캘린더 권한";
"Permissions" = "권한";
"Calendar Detail" = "여러분의 개인&공유 캘린더에서 다가오는 이벤트들은 메뉴바와 패널에서 보여질 수 있습니다.";
"Reminders Detail" = "Set reminders in the timezone of the location of your choice. Your reminders are stored in the default Reminders app.";
"Privacy Text" = "You can change this later in the Privacy section of the System Preferences.";
"Granted Button Text" = "Granted";
@ -51,22 +52,22 @@
"Search Field Placeholder" = "Enter a city, state or country name";
"No Timezone Selected" = "Please select a timezone!";
"Max Timezones Selected" = "Maximum 100 timezones allowed!";
"Max Search Characters" = "Only 50 characters allowed!";
"Add Button Title" = "Add";
"Close Button Title" = "Close";
"Max Search Characters" = "50 문자까지만 허용됩니다!";
"Add Button Title" = "추가";
"Close Button Title" = "닫기";
// Onboarding
"Open Clocker At Login" = "Open Clocker At Login";
"Launch Clocker" = "Launch Clocker";
"Open Clocker At Login" = "로그인해서 Clocker 열기";
"Launch Clocker" = "Clocker 실행하기";
// Welcome Onboarding
"It only takes 3 steps to set up Clocker." = "It only takes 3 steps to setup Clocker.";
"Get Started" = "Get Started";
// Permissions
"Calendar Access Title" = "Calendar Access";
"Reminders Access Title" = "Reminders Access";
"Later Config Description" = "These can be configured later in System Preferences.";
"Calendar Access Title" = "캘린더 접근";
"Reminders Access Title" = "리마인더 권한";
"Later Config Description" = "이것들은 나중에 설정에서 바꾸실 수 있습니다";
"Back" = "Back";
"Continue" = "Continue";
"Clocker is more useful when it can display events from your calendars." = "Clocker is more useful when it can display events from your calendars.";
@ -104,54 +105,60 @@
"Show Future Slider" = "Show Future Slider";
"Show Sunrise/Sunset" = "Show Sunrise/Sunset";
"Display the time in seconds" = "Display the time in seconds";
"Larger Text" = "Larger Text";
"Future Slider Range" = "Future Slider Range";
"Include Date" = "Include Date";
"Include Day" = "Include Day";
"Include Place Name" = "Include Place Name";
"Menubar Display Options" = "Menubar Display Options";
"Menubar Mode" = "Menubar Mode";
"Preview" = "Preview";
"Miscellaneous" = "Miscellaneous";
"Larger Text" = "글씨를 크게하기";
"Future Slider Range" = "미래 슬라이더 범위";
"Include Date" = "날짜 추가하기";
"Include Day" = "시간 추가하기";
"Include Place Name" = "장소 이름";
"Menubar Display Options" = "메뉴바 화면표시 설정";
"Menubar Mode" = "메뉴바 모드";
"Preview" = "미리보기";
"Miscellaneous" = "기타";
// Empty View
"No places added" = "No places added";
"No places added" = "추가된 장소가 없음";
// Panel
"No upcoming event." = "No upcoming event.";
"You have no events scheduled for tomorrow." = "You have no events scheduled for tomorrow.";
"No upcoming event." = "예정된 이벤트 없음";
"You have no events scheduled for tomorrow." = "내일 일정이 없어요!";
// Review
"Enjoy using Clocker?" = "Enjoy using Clocker?";
"Enjoy using Clocker?" = "Clocker 사용에 만족하십니까?";
// App Feedback
"Tell us what you think!" = "Tell us what you think!";
"Contact Information (Optional)" = "Contact Information (Optional)";
"Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!" = "Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!";
"Tell us what you think!" = "여러분의 의견을 들려주세요.";
"Contact Information (Optional)" = "연락처 정보 (선택)";
"Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!" = "연락처 필드는 선택 사항입니다! 귀하의 연락처 정보는 추가 정보가 필요하거나 도움이 필요한 경우 연락을 드릴 것입니다!";
// About View Screen
"Feedback is always welcome:" = "Feedback is always welcome:";
"Feedback is always welcome:" = "피드백은 언제나 환영입니다:";
// Calendars View
"Upcoming Event View Options" = "Upcoming Event View Options";
"Show Upcoming Event View" = "Show Upcoming Event View";
"Show All Day Meetings" = "Show All Day Meetings";
"Show Next Meeting Title in Menubar" = "Show Next Meeting Title in Menubar";
"Truncate menubar text longer than" = "Truncate menubar text longer than";
"characters" = "characters";
"Show events from" = "Show events from";
"If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"" = "If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"";
"Upcoming Event View Options" = "다가오는 이벤트 보기 옵션";
"Show Upcoming Event View" = "다가오는 일정 보기";
"Show All Day Meetings" = "모든 일정 보기";
"Show Next Meeting Title in Menubar" = "다음 일정을 메뉴바에서 보기";
"Truncate menubar text longer than" = "다음보다 긴 메뉴 표시 줄 텍스트를 자릅니다.
";
"characters" = "글자";
"Show events from" = "오늘부터 이벤트 표시";
"If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"" = "만약 미팅 제목이 \"Meeting with Neel\" 이면 5글자만 보여지기 때문에 주의해주세요. (\"Meeti...\")";
// Notes Popover
"Reminder Set" = "Reminder Set";
"Successfully set." = "Successfully set.";
"Reminder Set" = "알림 설정";
"Successfully set." = "설정이 완료되었습니다";
// Errors
"You're offline, maybe?" = "You're offline, maybe?";
"Try again, maybe?" = "Try again, maybe?";
"The Internet connection appears to be offline." = "The Internet connection appears to be offline.";
"You're offline, maybe?" = "당신은 오프라인입니다. 아마도?";
"Try again, maybe?" = "다시 시도 해보세요";
"The Internet connection appears to be offline." = "인터넷 연결이 오프라인 상태입니다.";
// UI Tests
"New Zealand" = "New Zealand";
"Florida" = "Florida";
"San Francisco" = "San Francisco";
"New Zealand" = "뉴질랜드";
"Florida" = "플로리다";
"San Francisco" = "샌프란시스코";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

3
Clocker/Clocker/nl.lproj/Localizable.strings

@ -156,3 +156,6 @@
"New Zealand" = "New Zealand";
"Florida" = "Florida";
"San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

162
Clocker/Clocker/pt-BR.lproj/Localizable.strings

@ -0,0 +1,162 @@
/*
Localizable.strings
Clocker
Created by Abhishek Banthia on 3/27/16.
*/
"CFBundleDisplayName" = "Clocker";
"Thank you for helping make Clocker even better!" = "Obrigado por ajudar a tornar o Clocker ainda melhor!";
"iRateMessageTitle" = "Rate %@";
"iRateAppMessage" = "If you enjoy using %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!";
"iRateGameMessage" = "If you enjoy playing %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!";
"iRateCancelButton" = "Não, Obrigado";
"iRateRateButton" = "Avaliar Agora";
"iRateRemindButton" = "Lembrar mais tarde";
"iRateUpdateMessage" = "Atualizar agora?";
"ClockerVersion" = "Versão %@";
"CLFeedbackAlertTitle" = "Obrigado por ajudar a tornar o Clocker ainda melhor!";
"app-name" = "Clocker";
"start-at-login" = "Iniciar ao iniciar sessão";
"setup-steps" = "It only takes 3 steps to set up Clocker";
"Permissions-Header" = "Permissões";
"See your next Calendar event here." = "Veja seu próximo evento do Calendário aqui.";
"Click here to start." = "Clique aqui para iniciar.";
"Reminders Access" = "Acessos aos Lembretes";
"Calendar Access" = "Acesso ao Calendário";
"Permissions" = "Permissões";
"Calendar Detail" = "Próximos eventos de seus calendários pessoais e compartilhados podem ser exibidos no menu e no painel.";
"Reminders Detail" = "Defina lembretes no fuso horário da localização de sua escolha. Seus lembretes são armazenados no aplicativo padrão Lembretes.";
"Privacy Text" = "Você pode alterar isso mais tarde na seção Privacidade das Preferências do Sistema.";
"Granted Button Text" = "Granted";
"Denied Button Text" = "Denied";
"Grant Button Text" = "Conceder";
// Welcome Onboarding
"It only takes 3 steps to setup Clocker." = "São apenas 3 passos para configurar o Clocker.";
"Get Started" = "Get Started";
// Tab Item Titles
"Preferences Tab" = "Preferências";
"Appearance Tab" = "Aparência";
"Calendar Tab" = "Calendário";
"About Tab" = "Sobre";
"Permissions Tab" = "Permissões";
// General Preferences Screen
"Start at Login" = "Start Clocker at Login";
"Sort by Time Difference" = "Sort by Time Difference";
"Sort by Name" = "Ordenar por nome";
"Sort by Label" = "Ordenar por Etiqueta";
"Search Field Placeholder" = "Insira uma cidade, estado ou país";
"No Timezone Selected" = "Por favor, selecione um fuso horário!";
"Max Timezones Selected" = "Maximum 100 timezones allowed!";
"Max Search Characters" = "Só são permitidos até 50 caracteres!";
"Add Button Title" = "Adicionar";
"Close Button Title" = "Fechar";
// Onboarding
"Open Clocker At Login" = "Open Clocker At Login";
"Launch Clocker" = "Launch Clocker";
// Welcome Onboarding
"It only takes 3 steps to set up Clocker." = "It only takes 3 steps to setup Clocker.";
"Get Started" = "Get Started";
// Permissions
"Calendar Access Title" = "Acesso ao Calendário";
"Reminders Access Title" = "Reminders Access";
"Later Config Description" = "These can be configured later in System Preferences.";
"Back" = "Voltar";
"Continue" = "Continuar";
"Clocker is more useful when it can display events from your calendars." = "O bloqueador é mais útil quando pode exibir eventos de seus calendários.";
"Clocker is more useful when it can display events from your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy." = "O bloqueador é mais útil quando pode exibir eventos de seus calendários. Você pode alterar essa configuração em Preferências do Sistema › Segurança e Privacidade › Privacidade.";
"Launch Preferences" = "Launch Preferences";
"Grant Access" = "Grant Access";
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "Próximos eventos de seus calendários pessoais e compartilhados podem ser exibidos no menu e no painel.";
"Granted" = "Granted";
"Denied" = "Denied";
"Grant" = "Grant";
"Unexpected" = "Inesperado";
// Onboarding Search
"Quick Add Locations" = "Quick Add Locations";
"More search options in Clocker Preferences." = "Mais opções de busca em Preferências do Clocker.";
"Enter 3 or more characters for locations you'll like to add" = "Enter 3 or more characters for locations you'll like to add";
// Start at Login
"Launch at Login" = "Launch at Login";
"This can be configured later in Clocker Preferences." = "Isso pode ser configurado mais tarde nas Preferências do Clocker.";
"Should Clocker open automatically on startup?" = "Should Clocker open automatically on startup?";
// Final Onboarding Screen
"You're all set!" = "Tudo pronto!";
"Thank you for the details." = "Obrigado pelos detalhes.";
"You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences." = "You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences.";
"If you'd like to help us localize the app in your language or receive infrequent app-related updates, please enter your email!" = "Se você quiser nos ajudar a localizar o app no seu idioma ou receber atualizações pouco frequentes, digite seu e-mail!";
// Appearance Tab
"Panel Theme" = "Tema do painel";
"Favourite a timezone to enable menubar display options." = "Favourite a timezone to enable menubar display options.";
"Main Panel Options" = "Main Panel Options";
"Time Format" = "Time Format";
"Day Display Options" = "Day Display Options";
"Show Future Slider" = "Show Future Slider";
"Show Sunrise/Sunset" = "Show Sunrise/Sunset";
"Display the time in seconds" = "Exibir o tempo em segundos";
"Larger Text" = "Texto Maior";
"Future Slider Range" = "Future Slider Range";
"Include Date" = "Incluir Data";
"Include Day" = "Incluir Dia";
"Include Place Name" = "Incluir Nome do Lugar";
"Menubar Display Options" = "Menubar Display Options";
"Menubar Mode" = "Menubar Mode";
"Preview" = "Pré-visualizar";
"Miscellaneous" = "Miscellaneous";
// Empty View
"No places added" = "Nenhum local adicionado";
// Panel
"No upcoming event." = "Sem eventos futuros.";
"You have no events scheduled for tomorrow." = "Você não tem eventos agendados para amanhã.";
// Review
"Enjoy using Clocker?" = "Gostando de usar o Clocker?";
// App Feedback
"Tell us what you think!" = "Conte-nos o que você pensa!";
"Contact Information (Optional)" = "Informações de Contato (Opcional)";
"Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!" = "Os campos de contato são opcionais! Suas informações de contato nos permitirão entrar em contato com você caso precisemos de mais informações ou possamos ajudar!";
// About View Screen
"Feedback is always welcome:" = "Feedback é sempre bem-vindo:";
// Calendars View
"Upcoming Event View Options" = "Upcoming Event View Options";
"Show Upcoming Event View" = "Show Upcoming Event View";
"Show All Day Meetings" = "Show All Day Meetings";
"Show Next Meeting Title in Menubar" = "Show Next Meeting Title in Menubar";
"Truncate menubar text longer than" = "Truncate menubar text longer than";
"characters" = "characters";
"Show events from" = "Show events from";
"If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"" = "If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"";
// Notes Popover
"Reminder Set" = "Reminder Set";
"Successfully set." = "Successfully set.";
// Errors
"You're offline, maybe?" = "You're offline, maybe?";
"Try again, maybe?" = "Try again, maybe?";
"The Internet connection appears to be offline." = "A conexão à Internet parece estar desligada.";
// UI Tests
"New Zealand" = "Nova Zelândia";
"Florida" = "Florida";
"San Francisco" = "San Francisco";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

3
Clocker/Clocker/ru.lproj/Localizable.strings

@ -330,3 +330,6 @@
"Preview" = "Preview";
"Miscellaneous" = "Miscellaneous";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

471
Clocker/Clocker/zh-Hans.lproj/Localizable.strings

@ -1,332 +1,155 @@
/* (No Comment) */
"About Tab" = "About";
"CFBundleDisplayName" = "Clocker";
/* Button to add a location */
"Add Button Title" = "Add";
/* (No Comment) */
"CFBundleDisplayName" = "解锁器";
"Thank you for helping make Clocker even better!" = "感谢您帮助 Clocker 做得更好!";
"iRateMessageTitle" = "评价 %@";
"iRateAppMessage" = "如果您喜欢使用 %@,能否请您抽出时间来对它进行评价?评价不会超过一分钟。感谢您的支持 !";
"iRateGameMessage" = "如果您喜欢使用 %@,能否请您抽出时间来对它进行评价?评价不会超过一分钟。感谢您的支持 !";
"iRateCancelButton" = "不用了,谢谢";
"iRateRateButton" = "立即评分";
"iRateRemindButton" = "稍后提醒我";
"iRateUpdateMessage" = "现在更新?";
"ClockerVersion" = "版本 %@";
"CLFeedbackAlertTitle" = "感谢您帮助 Clocker 做得更好!";
"app-name" = "Clocker";
/* (No Comment) */
"Appearance Tab" = "Appearance";
/* Button title for going back to the previous screen */
"Back" = "Back";
/* Calendar Permission Title */
"Calendar Access" = "Calendar Access";
/* Title for Calendar access label */
"Calendar Access Title" = "Calendar Access";
/* Calendar Detail Text */
"Calendar Detail" = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
/* (No Comment) */
"Calendar Tab" = "Calendar";
/* (No Comment) */
"characters" = "characters";
/* (No Comment) */
"CLFeedbackAlertTitle" = "Thank you for helping make Clocker even better!";
/* Button Title for no Calendar access */
"Click here to start." = "Click here to start.";
/* (No Comment) */
"Clocker is more useful when it can display events from your calendars." = "Clocker is more useful when it can display events from your calendars.";
/* (No Comment) */
"Clocker is more useful when it can display events from your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy." = "Clocker is more useful when it can display events from your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy.";
/* (No Comment) */
"ClockerVersion" = "Version %@";
/* Button to close the panel */
"Close Button Title" = "Close";
/* (No Comment) */
"Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!" = "Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!";
/* (No Comment) */
"Contact Information (Optional)" = "Contact Information (Optional)";
/* Continue Button Title */
"Continue" = "Continue";
/* (No Comment) */
"Day Display Options" = "Day Display Options";
/* (No Comment) */
"Denied" = "Denied";
/* Denied Button Text */
"Denied Button Text" = "Denied";
/* (No Comment) */
"Display the time in seconds" = "Display the time in seconds";
/* Title asking users if they like the app */
"Enjoy using Clocker" = "Enjoy using Clocker";
/* Review */
"Enjoy using Clocker?" = "Enjoy using Clocker?";
/* (No Comment) */
"Favourite a timezone to enable menubar display options." = "Favourite a timezone to enable menubar display options.";
/* About View Screen */
"Feedback is always welcome:" = "Feedback is always welcome:";
/* (No Comment) */
"Florida" = "Florida";
/* (No Comment) */
"Future Slider Range" = "Future Slider Range";
/* Title for Welcome View Controller's Continue Button */
"Get Started" = "立刻开始!";
/* (No Comment) */
"Grant" = "授权";
/* (No Comment) */
"Grant Access" = "授予访问权限";
/* Grant Button Text */
"start-at-login" = "开启时启动";
"setup-steps" = "只需要三步来设置 Clocker";
"Permissions-Header" = "权限";
"See your next Calendar event here." = "在这里查看你的下一个日历事件。";
"Click here to start." = "点此开始。";
"Reminders Access" = "提醒访问权限";
"Calendar Access" = "日历访问权限";
"Permissions" = "权限";
"Calendar Detail" = "未来你个人和分享的日历事件将显示在菜单栏和面板上。";
"Reminders Detail" = "在您选择的位置时区设置提醒。您的提醒存储在默认提醒应用中。";
"Privacy Text" = "您稍后可以在「系统偏好设置」的隐私部分更改此内容。";
"Granted Button Text" = "已授权";
"Denied Button Text" = "已拒绝";
"Grant Button Text" = "授权";
/* (No Comment) */
// Welcome Onboarding
"It only takes 3 steps to setup Clocker." = "只需要 3 步来设置 Clocker。";
"Get Started" = "开始";
// Tab Item Titles
"Preferences Tab" = "首选项";
"Appearance Tab" = "外观";
"Calendar Tab" = "日历";
"About Tab" = "关于";
"Permissions Tab" = "权限";
// General Preferences Screen
"Start at Login" = "登录时启动 Clocker";
"Sort by Time Difference" = "按时间差排序";
"Sort by Name" = "按名称排序";
"Sort by Label" = "按标签排序";
"Search Field Placeholder" = "输入城市、省/州或国家名称";
"No Timezone Selected" = "请选择一个时区!";
"Max Timezones Selected" = "最多允许 100 个时区!";
"Max Search Characters" = "最多允许 50 个字符!";
"Add Button Title" = "添加";
"Close Button Title" = "关闭";
// Onboarding
"Open Clocker At Login" = "登录时启动 Clocker";
"Launch Clocker" = "启动 Clocker";
// Welcome Onboarding
"It only takes 3 steps to set up Clocker." = "只需要三步来设置 Clocker。";
"Get Started" = "现在开始";
// Permissions
"Calendar Access Title" = "访问日历";
"Reminders Access Title" = "访问提醒";
"Later Config Description" = "这些可以稍后在系统偏好设置中配置。";
"Back" = "返回";
"Continue" = "继续";
"Clocker is more useful when it can display events from your calendars." = "Clocker 能显示日历中的事件时会更有用。";
"Clocker is more useful when it can display events from your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy." = "Clocker 在能显示日历中的事件时更有用。你可以在「系统偏好设置 > 安全性与隐私 > 隐私」中更改设置。";
"Launch Preferences" = "打开首选项";
"Grant Access" = "授予访问权限";
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "你个人和共享日历的未来事件将显示在菜单栏和面板上。";
"Granted" = "已授权";
"Denied" = "已拒绝";
"Grant" = "授权";
"Unexpected" = "意外的";
/* Granted Button Text */
"Granted Button Text" = "已授权";
/* (No Comment) */
"If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"" = "If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"";
/* (No Comment) */
"If you'd like to help us localize the app in your language or receive infrequent app-related updates, please enter your email!" = "If you'd like to help us localize the app in your language or receive infrequent app-related updates, please enter your email!";
/* (No Comment) */
"Include Date" = "包含日期";
/* (No Comment) */
"Include Day" = "Include Day";
/* (No Comment) */
"Include Place Name" = "Include Place Name";
/* (No Comment) */
"iRateAppMessage" = "If you enjoy using %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!";
/* (No Comment) */
"iRateCancelButton" = "No, Thanks";
/* (No Comment) */
"iRateGameMessage" = "If you enjoy playing %@, would you mind taking a moment to rate it? It won’t take more than a minute. Thanks for your support!";
/* (No Comment) */
"iRateMessageTitle" = "Rate %@";
/* (No Comment) */
"iRateRateButton" = "Rate It Now";
/* (No Comment) */
"iRateRemindButton" = "稍后提醒";
/* (No Comment) */
"iRateUpdateMessage" = "立即更新";
/* App Setup Description */
"It only takes 3 steps to set up Clocker." = "It only takes 3 steps to setup Clocker.";
/* Welcome Onboarding */
"It only takes 3 steps to setup Clocker." = "It only takes 3 steps to setup Clocker.";
/* (No Comment) */
"Larger Text" = "Larger Text";
/* Describing we can change the options later in System Preferences */
"Later Config Description" = "These can be configured later in System Preferences.";
// Onboarding Search
"Quick Add Locations" = "快速添加地点";
"More search options in Clocker Preferences." = "Clocker 首选项中的更多搜索选项。";
"Enter 3 or more characters for locations you'll like to add" = "为您想要添加的位置输入 3 个或更多字符";
/* Start at Login */
// Start at Login
"Launch at Login" = "登录时启动";
/* (No Comment) */
"Launch Clocker" = "Launch Clocker";
/* (No Comment) */
"Launch Preferences" = "Launch Preferences";
/* (No Comment) */
"Main Panel Options" = "Main Panel Options";
/* Max Character Count Allowed Error Message */
"Max Search Characters" = "Only 50 characters allowed!";
/* Max Timezones Error Message */
"Max Timezones Selected" = "Maximum 100 timezones allowed!";
/* (No Comment) */
"Menubar Display Options" = "Menubar Display Options";
/* (No Comment) */
"Menubar Mode" = "Menubar Mode";
/* (No Comment) */
"More search options in Clocker Preferences." = "More search options in Clocker Preferences.";
/* UI Tests */
"New Zealand" = "New Zealand";
/* Subtitle for no places added */
"No places added" = "No places added";
/* Message shown when the user taps on Add without selecting a timezone */
"No Timezone Selected" = "Please select a timezone!";
/* Title when there's no upcoming event */
"No upcoming event." = "No upcoming event.";
/* Onboarding */
"Open Clocker At Login" = "Open Clocker At Login";
/* Appearance Tab */
"Panel Theme" = "Panel Theme";
/* Permissions Tab Titles */
"Permissions" = "Permissions";
/* Title for Permissions screen */
"Permissions Tab" = "Permissions";
/* (No Comment) */
"Permissions-Header" = "Permissions";
/* Tab Item Titles */
"Preferences Tab" = "Preferences";
/* Text explaining options can be changed in the future through System Preferences */
"Privacy Text" = "You can change this later in the Privacy section of the System Preferences.";
/* Onboarding Search */
"Quick Add Locations" = "Quick Add Locations";
/* Notes Popover */
"Reminder Set" = "Reminder Set";
/* Reminders Permission Title */
"Reminders Access" = "Reminders Access";
/* Title for Reminders Access Label */
"Reminders Access Title" = "Reminders Access";
/* Reminders Detail Text */
"Reminders Detail" = "Set reminders in the timezone of the location of your choice. Your reminders are stored in the default Reminders app.";
/* (No Comment) */
"San Francisco" = "San Francisco";
/* Search Field Placeholder */
"Search Field Placeholder" = "Enter a city, state or country name";
/* (No Comment) */
"Enter 3 or more characters for locations you'll like to add" = "Enter 3 or more characters for locations you'll like to add";
/* Next Event Label for no Calendar access */
"See your next Calendar event here." = "See your next Calendar event here.";
/* (No Comment) */
"setup-steps" = "It only takes 3 steps to set up Clocker";
/* (No Comment) */
"Should Clocker open automatically on startup?" = "Should Clocker open automatically on startup?";
/* (No Comment) */
"Show All Day Meetings" = "Show All Day Meetings";
/* (No Comment) */
"Show events from" = "Show events from";
/* (No Comment) */
"Show Future Slider" = "Show Future Slider";
/* (No Comment) */
"Show Next Meeting Title in Menubar" = "Show Next Meeting Title in Menubar";
/* (No Comment) */
"Show Sunrise/Sunset" = "Show Sunrise/Sunset";
/* (No Comment) */
"Show Upcoming Event View" = "Show Upcoming Event View";
/* Start at Login */
"Sort by Label" = "Sort by Label";
/* Start at Login */
"Sort by Name" = "Sort by Name";
/* Start at Login */
"Sort by Time Difference" = "Sort by Time Difference";
/* Start at Login */
"Start at Login" = "Start Clocker at Login";
/* (No Comment) */
"start-at-login" = "登录时启动";
/* (No Comment) */
"Successfully set." = "Successfully set.";
/* App Feedback */
"Tell us what you think!" = "Tell us what you think!";
/* (No Comment) */
"Thank you for helping make Clocker even better!" = "Thank you for helping make Clocker even better!";
/* (No Comment) */
"Thank you for the details." = "Thank you for the details.";
/* (No Comment) */
"The Internet connection appears to be offline." = "The Internet connection appears to be offline.";
/* (No Comment) */
"This can be configured later in Clocker Preferences." = "This can be configured later in Clocker Preferences.";
/* (No Comment) */
"Time Format" = "Time Format";
/* (No Comment) */
"Truncate menubar text longer than" = "Truncate menubar text longer than";
/* (No Comment) */
"Try again, maybe?" = "Try again, maybe?";
/* (No Comment) */
"Unexpected" = "Unexpected";
/* Calendars View */
"Upcoming Event View Options" = "Upcoming Event View Options";
/* (No Comment) */
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "Upcoming events from your personal and shared calendars can be shown in the menubar and the panel.";
/* Title when there's no event scheduled for tomorrow */
"You have no events scheduled for tomorrow." = "You have no events scheduled for tomorrow.";
/* (No Comment) */
"You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences." = "You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences.";
/* Final Onboarding Screen */
"You're all set!" = "You're all set!";
/* Errors */
"You're offline, maybe?" = "You're offline, maybe?";
"Preview" = "Preview";
"Miscellaneous" = "Miscellaneous";
"This can be configured later in Clocker Preferences." = "这可以稍后在 Clocker 首选项中进行配置。";
"Should Clocker open automatically on startup?" = "是否在启动时自动打开 Clocker?";
// Final Onboarding Screen
"You're all set!" = "已完成全部设置!";
"Thank you for the details." = "感谢您的详细信息。";
"You'll see a clock icon in your Menu Bar when you launch the app. If you'd like to see a dock icon, go to Preferences." = "当你启动应用时,会在菜单栏看到一个时钟图标。如果想在 Dock 上显示图标,请在首选项设置。";
"If you'd like to help us localize the app in your language or receive infrequent app-related updates, please enter your email!" = "如果您想帮助翻译本应用或收到不定时的应用更新,请输入您的电子邮箱!";
// Appearance Tab
"Panel Theme" = "面板主题";
"Favourite a timezone to enable menubar display options." = "收藏一个时区以在菜单栏上显示可选项。";
"Main Panel Options" = "主面板选项";
"Time Format" = "时间格式";
"Day Display Options" = "日显示选项";
"Show Future Slider" = "显示未来滑块";
"Show Sunrise/Sunset" = "显示日出/日落";
"Display the time in seconds" = "显示秒数";
"Larger Text" = "更大字号";
"Future Slider Range" = "未来滑块范围";
"Include Date" = "包含日期";
"Include Day" = "包含日";
"Include Place Name" = "包含地名";
"Menubar Display Options" = "菜单栏显示选项";
"Menubar Mode" = "菜单栏模式";
"Preview" = "预览";
"Miscellaneous" = "杂项设置";
// Empty View
"No places added" = "没有添加地点";
// Panel
"No upcoming event." = "暂无事项";
"You have no events scheduled for tomorrow." = "您明天没有安排。";
// Review
"Enjoy using Clocker?" = "喜欢使用 Clocker 吗?";
// App Feedback
"Tell us what you think!" = "告诉我们您的想法!";
"Contact Information (Optional)" = "联系信息 (可选)";
"Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!" = "联系人字段是可选项!我们需要更多信息或帮助时,将使用联络信息联络您!";
// About View Screen
"Feedback is always welcome:" = "欢迎提供反馈:";
// Calendars View
"Upcoming Event View Options" = "即将到来的事件视图选项";
"Show Upcoming Event View" = "显示即将到来的事件视图";
"Show All Day Meetings" = "显示全天会议";
"Show Next Meeting Title in Menubar" = "在菜单栏中显示下一个会议标题";
"Truncate menubar text longer than" = "截断菜单栏文字长度大于";
"characters" = "字符";
"Show events from" = "显示事件来源";
"If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"" = "如果会议标题是“Meeting with Neel”,并且截断长度设置为 5 ,菜单栏的文本将显示为“Meeti...”";
// Notes Popover
"Reminder Set" = "提醒设置";
"Successfully set." = "设置成功";
// Errors
"You're offline, maybe?" = "您已经离线?";
"Try again, maybe?" = "稍后再试?";
"The Internet connection appears to be offline." = "网络连接已断开。";
// UI Tests
"New Zealand" = "新西兰";
"Florida" = "佛罗里达";
"San Francisco" = "旧金山";
// DST changes
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours";

1
Clocker/ClockerUITests/AboutUsTests.swift

@ -34,6 +34,7 @@ class AboutUsTests: XCTestCase {
let appDisplayName = "CFBundleDisplayName".localizedString()
let expectedVersion = "\(appDisplayName) 20.10.03 (83)"
guard let presentVersion = app.windows["Clocker"].staticTexts["ClockerVersion"].value as? String else {
XCTFail("Present version not present")
return

6
Clocker/ClockerUITests/FloatingWindowTests.swift

@ -25,11 +25,11 @@ class FloatingWindowTests: XCTestCase {
}
addUIInterruptionMonitor(withDescription: "Reminders Access") { (alert) -> Bool in
print("Interruption Handler called")
print(alert)
Logger.info("Interruption Handler called")
Logger.info(alert)
let alertButton = alert.buttons["OK"]
if alertButton.exists {
print("Okay button found")
Logger.info("Okay button found")
alertButton.tap()
return true
}

14
Clocker/ClockerUITests/OnboardingTests.swift

@ -123,8 +123,8 @@ class OnboardingTests: XCTestCase {
private func startupControllerTests() {
let onboardingWindow = app.windows["OnboardingWindow"]
XCTAssertTrue(onboardingWindow.buttons["Forward"].title == "Open Clocker At Login", "Forward button title's was unexpectedly wrong")
XCTAssertTrue(onboardingWindow.buttons["Alternate"].title == "Don't Open", "Alternate button title's was unexpectedly wrong")
XCTAssertTrue(onboardingWindow.buttons["Forward"].title == "Open Clocker At Login".localizedString(), "Forward button title's was unexpectedly wrong")
XCTAssertTrue(onboardingWindow.buttons["Alternate"].title == "Don't Open".localizedString(), "Alternate button title's was unexpectedly wrong")
XCTAssertTrue(onboardingWindow.staticTexts["Launch at Login".localizedString()].exists, "Header label's static text was unexpectedly wrong.")
XCTAssertTrue(onboardingWindow.staticTexts["Should Clocker open automatically on startup?".localizedString()].exists, "Accessory label's static text was unexpectedly wrong.")
@ -137,17 +137,17 @@ class OnboardingTests: XCTestCase {
XCTAssertTrue(onboardingWindow.buttons["Forward"].title == "Continue".localizedString(), "Forward button title's was unexpectedly wrong")
XCTAssertTrue(onboardingWindow.staticTexts["Quick Add Locations".localizedString()].exists, "Header label's static text was unexpectedly wrong.")
XCTAssertTrue(onboardingWindow.staticTexts["More search options in Clocker Preferences."].exists, "Accessory label's static text was unexpectedly wrong.")
XCTAssertTrue(onboardingWindow.staticTexts["More search options in Clocker Preferences.".localizedString()].exists, "Accessory label's static text was unexpectedly wrong.")
}
private func finalOnboardingControllerTests() {
let onboardingWindow = app.windows["OnboardingWindow"]
// Let's test the buttons
XCTAssertTrue(onboardingWindow.staticTexts["You're all set!"].exists, "Header label's static text was unexpectedly wrong.")
XCTAssertTrue(onboardingWindow.staticTexts["Thank you for the details."].exists, "Accessory label's static text was unexpectedly wrong.")
XCTAssertTrue(onboardingWindow.staticTexts["You're all set!".localizedString()].exists, "Header label's static text was unexpectedly wrong.")
XCTAssertTrue(onboardingWindow.staticTexts["Thank you for the details.".localizedString()].exists, "Accessory label's static text was unexpectedly wrong.")
XCTAssertFalse(onboardingWindow.buttons["Alternate"].exists, "Alternate button was unexpectedly present.")
XCTAssertTrue(onboardingWindow.buttons["Forward"].title == "Launch Clocker".localizedString(), "Forward button's title was unexpectedly wrong.")
XCTAssertFalse(onboardingWindow.buttons["Alternate".localizedString()].exists, "Alternate button was unexpectedly present.")
XCTAssertTrue(onboardingWindow.buttons["Forward".localizedString()].title == "Launch Clocker".localizedString(), "Forward button's title was unexpectedly wrong.")
}
}

4
Clocker/ClockerUITests/PreferencesTest.swift

@ -244,7 +244,7 @@ class PreferencesTest: XCTestCase {
XCTAssertTrue(maxCharacterQuery.count > 0)
addAPlace(place: "asdakjhdasdahsdasd", to: app, shouldSleep: false)
XCTAssertTrue(app.sheets.staticTexts["Please select a timezone!"].exists)
XCTAssertTrue(app.sheets.staticTexts["No Timezone Selected".localizedString()].exists)
let informativeLabelPredicate = NSPredicate(format: "placeholderValue like %@", "No results! 😔 Try entering the exact name.")
let sheets = app.sheets.firstMatch.staticTexts
@ -392,7 +392,7 @@ extension XCTestCase {
let isHittable = NSPredicate(format: "exists == true", "")
let addExpectation = expectation(for: isHittable,
evaluatedWith: results.firstMatch) { () -> Bool in
print("Handler called")
Logger.info("Handler called")
return true
}

2
Clocker/Dependencies/Date Additions/TimeChunk.swift

@ -67,7 +67,7 @@ public struct TimeChunk {
*/
public func to(_ unit: TimeUnits) -> Int {
if months != 0 {
print("Months are not supported for conversion due to their uncertain number of days.")
Logger.info("Months are not supported for conversion due to their uncertain number of days.")
return 0
}
if unit == .seconds {

8
Clocker/Dependencies/Date Additions/TimePeriod.swift

@ -390,7 +390,7 @@ public extension TimePeriodProtocol {
end = end?.add(chunk)
case .center:
// Do not lengthen by TimeChunk at center
print("Mutation via chunk from center anchor is not supported.")
Logger.info("Mutation via chunk from center anchor is not supported.")
case .end:
beginning = beginning?.subtract(chunk)
}
@ -426,7 +426,7 @@ public extension TimePeriodProtocol {
end = end?.subtract(chunk)
case .center:
// Do not shorten by TimeChunk at center
print("Mutation via chunk from center anchor is not supported.")
Logger.info("Mutation via chunk from center anchor is not supported.")
case .end:
beginning = beginning?.add(chunk)
}
@ -561,7 +561,7 @@ open class TimePeriod: TimePeriodProtocol {
timePeriod.beginning = beginning
timePeriod.end = end?.add(chunk)
case .center:
print("Mutation via chunk from center anchor is not supported.")
Logger.info("Mutation via chunk from center anchor is not supported.")
case .end:
timePeriod.beginning = beginning?.add(-chunk)
timePeriod.end = end
@ -610,7 +610,7 @@ open class TimePeriod: TimePeriodProtocol {
timePeriod.beginning = beginning
timePeriod.end = end?.subtract(chunk)
case .center:
print("Mutation via chunk from center anchor is not supported.")
Logger.info("Mutation via chunk from center anchor is not supported.")
case .end:
timePeriod.beginning = beginning?.add(-chunk)
timePeriod.end = end

2
Clocker/Dependencies/Date Additions/TimePeriodChain.swift

@ -79,7 +79,7 @@ open class TimePeriodChain: TimePeriodGroup {
// Insert new period
periods.insert(period, at: index)
} else {
print("All TimePeriods in a TimePeriodChain must contain a defined start and end date")
Logger.info("All TimePeriods in a TimePeriodChain must contain a defined start and end date")
return
}

14
Clocker/Events and Reminders/CalendarHandler.swift

@ -66,7 +66,7 @@ extension EventCenter {
let timeForEventToStart = event.event.startDate.timeIntervalSinceNow / 60
if timeForEventToStart > 30 {
print("Our next event: \(event.event.title ?? "Error") starts in \(timeForEventToStart) mins")
Logger.info("Our next event: \(event.event.title ?? "Error") starts in \(timeForEventToStart) mins")
continue
}
@ -209,12 +209,12 @@ extension EventCenter {
}
}
print("Fetched filtered events for \(filteredEvents.count) days\n")
Logger.info("Fetched filtered events for \(filteredEvents.count) days\n")
return
}
print("Unable to filter events because user hasn't selected calendars")
Logger.info("Unable to filter events because user hasn't selected calendars")
}
func saveDefaultIdentifiersList() {
@ -224,7 +224,7 @@ extension EventCenter {
if !allCalendars.isEmpty {
UserDefaults.standard.set(allCalendars, forKey: CLSelectedCalendars)
print("Finished saving all calendar identifiers in default")
Logger.info("Finished saving all calendar identifiers in default")
self.filterEvents()
}
}
@ -259,7 +259,7 @@ extension EventCenter {
func fetchEvents(_ start: Int, _ end: Int) {
if calendarAccessDenied() || calendarAccessNotDetermined() {
print("Refetching aborted because we don't have permission!")
Logger.info("Refetching aborted because we don't have permission!")
return
}
@ -294,7 +294,7 @@ extension EventCenter {
while date.compare(final) == .orderedAscending {
guard var nextDate = autoupdatingCalendar.date(byAdding: Calendar.Component.day, value: 1, to: date) else {
print("Could not calculate end date")
Logger.info("Could not calculate end date")
return
}
nextDate = autoupdatingCalendar.startOfDay(for: nextDate)
@ -320,7 +320,7 @@ extension EventCenter {
eventsForDate = eventsForDateMapper
print("Fetched events for \(eventsForDate.count) days")
Logger.info("Fetched events for \(eventsForDate.count) days")
filterEvents()
}

2
Clocker/Events and Reminders/EventCenter.swift

@ -34,7 +34,7 @@ class EventCenter: NSObject {
}
private func refetchAll() {
print("\nRefetching events from the store")
Logger.info("\nRefetching events from the store")
eventsForDate = [:]
filteredEvents = [:]

2
Clocker/Media.xcassets/Onboarding/Dark Menubar.imageset/Contents.json vendored

@ -5,7 +5,7 @@
"scale" : "1x"
},
{
"filename" : "Screen Shot 2020-10-11 at 2.19.26 PM.png",
"filename" : "Screen Shot 2020-10-11 at 2.16.37 PM.png",
"idiom" : "universal",
"scale" : "2x"
},

BIN
Clocker/Media.xcassets/Onboarding/Dark Menubar.imageset/Screen Shot 2020-10-11 at 2.16.37 PM.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
Clocker/Media.xcassets/Onboarding/Dark Menubar.imageset/Screen Shot 2020-10-11 at 2.19.26 PM.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

2
Clocker/Menu Bar/MenubarHandler.swift

@ -45,7 +45,7 @@ class MenubarHandler: NSObject {
let timeForEventToStart = event.event.startDate.timeIntervalSinceNow / 60
if timeForEventToStart > 30 {
print("Our next event: \(event.event.title ?? "Error") starts in \(timeForEventToStart) mins")
Logger.info("Our next event: \(event.event.title ?? "Error") starts in \(timeForEventToStart) mins")
continue
}

2
Clocker/Menu Bar/StatusContainerView.swift

@ -171,7 +171,7 @@ class StatusContainerView: NSView {
}
if newWidth != frame.size.width, newWidth > frame.size.width + 2.0 {
print("Correcting our width to \(newWidth) and the previous width was \(frame.size.width)")
Logger.info("Correcting our width to \(newWidth) and the previous width was \(frame.size.width)")
frame = CGRect(x: frame.origin.x, y: frame.origin.y, width: newWidth, height: frame.size.height)
}
}

16
Clocker/Menu Bar/StatusItemHandler.swift

@ -56,7 +56,7 @@ class StatusItemHandler: NSObject {
setClockerIcon()
}
print("\nStatus Bar Current State changed: \(currentState)\n")
Logger.info("\nStatus Bar Current State changed: \(currentState)\n")
}
}
@ -191,7 +191,7 @@ class StatusItemHandler: NSObject {
menubarTimer?.tolerance = shouldDisplaySeconds ? 0.5 : 20
guard let runLoopTimer = menubarTimer else {
print("Timer is unexpectedly nil")
Logger.info("Timer is unexpectedly nil")
return
}
@ -230,12 +230,12 @@ class StatusItemHandler: NSObject {
} else if let minutes = components.minute {
components.minute = minutes + 1
} else {
print("Unable to create date components for the menubar timewr")
Logger.info("Unable to create date components for the menubar timewr")
return nil
}
guard let fireDate = nsCalendar.date(from: components) else {
print("Unable to form Fire Date")
Logger.info("Unable to form Fire Date")
return nil
}
@ -263,7 +263,7 @@ class StatusItemHandler: NSObject {
}
private func setupForStandardTextMode() {
print("Initializing menubar timer")
Logger.info("Initializing menubar timer")
// Let's invalidate the previous timer
menubarTimer?.invalidate()
@ -281,7 +281,7 @@ class StatusItemHandler: NSObject {
let menubarFavourites = DataStore.shared().menubarTimezones() ?? []
if menubarFavourites.isEmpty, DataStore.shared().shouldDisplay(.showMeetingInMenubar) == false {
print("Invalidating menubar timer!")
Logger.info("Invalidating menubar timer!")
invalidation()
@ -290,7 +290,7 @@ class StatusItemHandler: NSObject {
}
} else if sync {
print("Invalidating menubar timer for sync purposes!")
Logger.info("Invalidating menubar timer for sync purposes!")
invalidation()
@ -299,7 +299,7 @@ class StatusItemHandler: NSObject {
}
} else {
print("Not stopping menubar timer!")
Logger.info("Not stopping menubar timer!")
}
}

2
Clocker/Onboarding/FinalOnboardingViewController.swift

@ -98,7 +98,7 @@ class FinalOnboardingViewController: NSViewController {
private func extraData() -> [String: String]? {
guard let validEmail = emailValidator.validate(field: emailTextField) else {
print("Not sending up email because it was invalid")
Logger.info("Not sending up email because it was invalid")
return nil
}

78
Clocker/Onboarding/Onboarding.storyboard

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="17154" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="fde-UX-327">
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="16097" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="fde-UX-327">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17154"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="16097"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
@ -46,7 +46,7 @@
</constraints>
</containerView>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="m1D-bY-RlD">
<rect key="frame" x="362" y="13" width="101" height="32"/>
<rect key="frame" x="367" y="13" width="95" height="32"/>
<buttonCell key="cell" type="push" title="Continue" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="5qt-i6-wXk">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@ -59,10 +59,10 @@ DQ
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="kbp-ED-vvP">
<rect key="frame" x="13" y="-2" width="64" height="62"/>
<rect key="frame" x="14" y="-1" width="70" height="61"/>
<constraints>
<constraint firstAttribute="height" constant="50" id="nfD-s1-MfF"/>
<constraint firstAttribute="width" constant="50" id="opl-FH-00w"/>
<constraint firstAttribute="width" relation="greaterThanOrEqual" constant="50" id="opl-FH-00w"/>
</constraints>
<buttonCell key="cell" type="push" title="Back" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="Tfk-vV-OpF">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
@ -73,7 +73,7 @@ DQ
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="W3z-nZ-e6B">
<rect key="frame" x="248" y="13" width="116" height="32"/>
<rect key="frame" x="258" y="13" width="109" height="32"/>
<buttonCell key="cell" type="push" title="Don't Open" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="tPS-m0-NWm">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@ -168,7 +168,7 @@ DQ
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="N6Z-mh-pET">
<rect key="frame" x="18" y="1" width="400" height="18"/>
<rect key="frame" x="18" y="6" width="400" height="18"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" id="lMj-6p-4uB">
<font key="font" size="13" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -176,7 +176,7 @@ DQ
</textFieldCell>
</textField>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="mF9-1w-sxR">
<rect key="frame" x="20" y="179" width="396" height="100"/>
<rect key="frame" x="20" y="184" width="396" height="100"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="751" translatesAutoresizingMaskIntoConstraints="NO" id="Lef-GT-zuM">
<rect key="frame" x="8" y="72" width="157" height="18"/>
@ -187,7 +187,7 @@ DQ
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="O0s-Bu-IPq">
<rect key="frame" x="298" y="62" width="85" height="32"/>
<rect key="frame" x="303" y="62" width="79" height="32"/>
<buttonCell key="cell" type="push" title="Action" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="BW3-qu-NiR">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@ -205,7 +205,7 @@ DQ
</textFieldCell>
</textField>
<progressIndicator wantsLayer="YES" horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" displayedWhenStopped="NO" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="Zhi-9z-C2u">
<rect key="frame" x="249" y="71" width="16" height="16"/>
<rect key="frame" x="253" y="71" width="16" height="16"/>
</progressIndicator>
</subviews>
<constraints>
@ -223,7 +223,7 @@ DQ
</constraints>
</customView>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="4eB-eD-0jK">
<rect key="frame" x="20" y="39" width="396" height="100"/>
<rect key="frame" x="20" y="44" width="396" height="100"/>
<subviews>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="noJ-fx-c1b">
<rect key="frame" x="8" y="48" width="148" height="42"/>
@ -250,7 +250,7 @@ DQ
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="dI2-oA-MBA">
<rect key="frame" x="298" y="52" width="85" height="32"/>
<rect key="frame" x="303" y="52" width="79" height="32"/>
<buttonCell key="cell" type="push" title="Action" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="i5r-db-Pnw">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
@ -260,7 +260,7 @@ DQ
</connections>
</button>
<progressIndicator wantsLayer="YES" horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" displayedWhenStopped="NO" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="0GH-vY-2Du">
<rect key="frame" x="249" y="61" width="16" height="16"/>
<rect key="frame" x="253" y="61" width="16" height="16"/>
</progressIndicator>
</subviews>
<constraints>
@ -291,7 +291,7 @@ DQ
</imageView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="iMf-Uy-zAf">
<rect key="frame" x="120" y="324" width="308" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" placeholderString="Onboarding Info" id="MOO-BA-qzM">
<textFieldCell key="cell" placeholderString="Onboarding Info" id="MOO-BA-qzM">
<font key="font" size="12" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
@ -314,7 +314,7 @@ DQ
<constraint firstItem="N6Z-mh-pET" firstAttribute="leading" secondItem="mF9-1w-sxR" secondAttribute="leading" id="M5v-XW-L1V"/>
<constraint firstItem="XfU-36-tPs" firstAttribute="top" secondItem="sib-OR-ym5" secondAttribute="top" constant="20" id="Ps0-DI-VvS"/>
<constraint firstItem="4eB-eD-0jK" firstAttribute="trailing" secondItem="mF9-1w-sxR" secondAttribute="trailing" id="Twh-8s-2qe"/>
<constraint firstItem="mF9-1w-sxR" firstAttribute="top" secondItem="iMf-Uy-zAf" secondAttribute="bottom" constant="45" id="X3I-8c-Qgd"/>
<constraint firstItem="mF9-1w-sxR" firstAttribute="top" secondItem="iMf-Uy-zAf" secondAttribute="bottom" constant="40" id="X3I-8c-Qgd"/>
<constraint firstItem="N6Z-mh-pET" firstAttribute="top" secondItem="4eB-eD-0jK" secondAttribute="bottom" constant="20" id="bDb-bD-u40"/>
<constraint firstItem="4eB-eD-0jK" firstAttribute="top" secondItem="mF9-1w-sxR" secondAttribute="bottom" constant="40" id="eDT-5v-xZY"/>
<constraint firstItem="pC3-D3-DSa" firstAttribute="leading" secondItem="XfU-36-tPs" secondAttribute="trailing" constant="20" id="lUs-se-BHO"/>
@ -361,24 +361,16 @@ DQ
</constraints>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="ClockerIcon-512" id="p3m-Oi-4D1"/>
</imageView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="OpV-ID-Ygr">
<rect key="frame" x="120" y="324" width="94" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" placeholderString="Onboarding Info" id="Y20-SO-sAO">
<font key="font" size="12" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="70Q-lk-Lwh">
<rect key="frame" x="118" y="335" width="203" height="45"/>
<textFieldCell key="cell" lineBreakMode="clipping" alignment="left" placeholderString="Screen Name" id="L5w-Cd-KTt">
<rect key="frame" x="118" y="335" width="318" height="45"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" alignment="left" placeholderString="Screen Name" id="L5w-Cd-KTt">
<font key="font" size="33" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="hLN-Aq-g8b">
<rect key="frame" x="120" y="266" width="298" height="18"/>
<rect key="frame" x="118" y="257" width="300" height="18"/>
<textFieldCell key="cell" lineBreakMode="clipping" placeholderString="Accessory Label" id="N7I-qA-txi">
<font key="font" size="13" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -386,25 +378,35 @@ DQ
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mDt-zc-oSU">
<rect key="frame" x="120" y="34" width="298" height="16"/>
<rect key="frame" x="118" y="34" width="300" height="16"/>
<textFieldCell key="cell" lineBreakMode="clipping" placeholderString="Alternate Way Description" id="TQL-aE-8L2">
<font key="font" size="12" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="EFy-SB-jXa">
<rect key="frame" x="118" y="300" width="320" height="32"/>
<textFieldCell key="cell" selectable="YES" placeholderString="Multiline Label that can span multiple lines in the window. Languages like German have really long words." id="RrM-dN-89g">
<font key="font" size="12" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="hLN-Aq-g8b" firstAttribute="leading" secondItem="OpV-ID-Ygr" secondAttribute="leading" id="8tu-GJ-fhS"/>
<constraint firstItem="OpV-ID-Ygr" firstAttribute="leading" secondItem="70Q-lk-Lwh" secondAttribute="leading" constant="2" id="A14-rJ-Ein"/>
<constraint firstItem="hLN-Aq-g8b" firstAttribute="top" secondItem="OpV-ID-Ygr" secondAttribute="bottom" constant="40" id="DOy-tp-XHM"/>
<constraint firstItem="EFy-SB-jXa" firstAttribute="top" secondItem="70Q-lk-Lwh" secondAttribute="bottom" constant="3" id="Ikv-w3-jqY"/>
<constraint firstItem="hLN-Aq-g8b" firstAttribute="leading" secondItem="EFy-SB-jXa" secondAttribute="leading" id="LOk-bE-f0r"/>
<constraint firstAttribute="trailing" secondItem="mDt-zc-oSU" secondAttribute="trailing" constant="20" id="Nc6-gO-D8h"/>
<constraint firstItem="EFy-SB-jXa" firstAttribute="leading" secondItem="70Q-lk-Lwh" secondAttribute="leading" id="UbP-E5-dUs"/>
<constraint firstItem="5Hu-Am-awL" firstAttribute="leading" secondItem="1dd-7B-Qgn" secondAttribute="leading" constant="20" id="YbY-Nf-3WG"/>
<constraint firstItem="70Q-lk-Lwh" firstAttribute="top" secondItem="5Hu-Am-awL" secondAttribute="top" id="aUd-GN-V5c"/>
<constraint firstAttribute="trailing" secondItem="hLN-Aq-g8b" secondAttribute="trailing" constant="20" id="e3v-NL-soi"/>
<constraint firstItem="OpV-ID-Ygr" firstAttribute="top" secondItem="70Q-lk-Lwh" secondAttribute="bottom" constant="-5" id="flv-ch-gpx"/>
<constraint firstAttribute="trailing" secondItem="EFy-SB-jXa" secondAttribute="trailing" id="jTF-1F-7Wy"/>
<constraint firstAttribute="trailing" secondItem="70Q-lk-Lwh" secondAttribute="trailing" constant="2" id="kbz-wE-TJq"/>
<constraint firstItem="5Hu-Am-awL" firstAttribute="top" secondItem="1dd-7B-Qgn" secondAttribute="top" constant="20" id="leb-oe-hz0"/>
<constraint firstAttribute="bottom" secondItem="mDt-zc-oSU" secondAttribute="bottom" constant="34" id="nJd-hW-vtc"/>
<constraint firstItem="hLN-Aq-g8b" firstAttribute="top" secondItem="EFy-SB-jXa" secondAttribute="bottom" constant="25" id="qEJ-Pz-FwK"/>
<constraint firstItem="mDt-zc-oSU" firstAttribute="leading" secondItem="hLN-Aq-g8b" secondAttribute="leading" id="vjW-P3-Q1E"/>
<constraint firstItem="70Q-lk-Lwh" firstAttribute="leading" secondItem="5Hu-Am-awL" secondAttribute="trailing" constant="20" id="z2h-c5-SFb"/>
</constraints>
@ -412,13 +414,13 @@ DQ
<connections>
<outlet property="accessoryLabel" destination="hLN-Aq-g8b" id="O18-AV-96s"/>
<outlet property="appName" destination="70Q-lk-Lwh" id="HwJ-Yk-mzy"/>
<outlet property="onboardingType" destination="OpV-ID-Ygr" id="R0V-0H-8jr"/>
<outlet property="onboardingType" destination="EFy-SB-jXa" id="a0n-bM-ssq"/>
<outlet property="privacyLabel" destination="mDt-zc-oSU" id="rJ9-Hv-65Y"/>
</connections>
</viewController>
<customObject id="gdU-Lx-HEm" userLabel="First Responder" customClass="NSResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1495.5" y="750"/>
<point key="canvasLocation" x="1495" y="750"/>
</scene>
<!--Onboarding Search Controller-->
<scene sceneID="u6P-zw-bJP">
@ -646,11 +648,11 @@ DQ
</textFieldCell>
</textField>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="nbC-4o-Xjf">
<rect key="frame" x="122" y="246" width="294" height="23"/>
<rect key="frame" x="122" y="245" width="294" height="24"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageAlignment="left" imageScaling="proportionallyDown" image="Dark Menubar" id="cZ2-x0-bJ2"/>
</imageView>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" translatesAutoresizingMaskIntoConstraints="NO" id="kMo-BE-OAn">
<rect key="frame" x="120" y="190" width="298" height="16"/>
<rect key="frame" x="120" y="189" width="298" height="16"/>
<textFieldCell key="cell" selectable="YES" title="Multiline Label" id="M4F-nv-Eyo">
<font key="font" size="12" name="Avenir-Book"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -658,7 +660,7 @@ DQ
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6WD-GP-iz1">
<rect key="frame" x="122" y="140" width="288" height="22"/>
<rect key="frame" x="122" y="139" width="288" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="OvB-hh-3zl"/>
</constraints>
@ -669,7 +671,7 @@ DQ
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="qLP-tx-m41" customClass="UnderlinedButton" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="117" y="117" width="293" height="0.0"/>
<rect key="frame" x="117" y="102" width="293" height="14"/>
<buttonCell key="cell" type="bevel" bezelStyle="rounded" alignment="left" imageScaling="proportionallyDown" inset="2" id="o87-us-e82">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" size="13" name="Avenir-Book"/>
@ -716,6 +718,6 @@ DQ
</scenes>
<resources>
<image name="ClockerIcon-512" width="1024" height="1024"/>
<image name="Dark Menubar" width="285" height="23"/>
<image name="Dark Menubar" width="276" height="24"/>
</resources>
</document>

11
Clocker/Onboarding/OnboardingParentViewController.swift

@ -68,11 +68,11 @@ class OnboardingParentViewController: NSViewController {
[negativeButton, backButton].forEach { $0?.isHidden = true }
if #available(OSX 11.0, *) {
negativeButton.controlSize = .large
positiveButton.controlSize = .large
backButton.controlSize = .large
}
// if #available(OSX 11.0, *) {
// negativeButton.controlSize = .large
// positiveButton.controlSize = .large
// backButton.controlSize = .large
// }
backButton.title = NSLocalizedString("Back",
comment: "Button title for going back to the previous screen")
@ -310,7 +310,6 @@ class OnboardingParentViewController: NSViewController {
func logExitPoint() {
let currentViewController = currentController()
print(currentViewController)
Logger.log(object: currentViewController, for: "Onboarding Process Exit")
}

12
Clocker/Onboarding/OnboardingSearchController.swift

@ -34,9 +34,9 @@ class OnboardingSearchController: NSViewController {
resultsTableView.dataSource = self
resultsTableView.target = self
resultsTableView.doubleAction = #selector(doubleClickAction(_:))
if #available(OSX 11.0, *) {
resultsTableView.style = .fullWidth
}
// if #available(OSX 11.0, *) {
// resultsTableView.style = .fullWidth
// }
setup()
@ -136,7 +136,7 @@ class OnboardingSearchController: NSViewController {
let decodedObject = try jsonDecoder.decode(Timezone.self, from: data)
return decodedObject
} catch {
print("decodedObject error: \n\(error)")
Logger.info("decodedObject error: \n\(error)")
return nil
}
}
@ -364,7 +364,7 @@ class OnboardingSearchController: NSViewController {
let decodedObject = try jsonDecoder.decode(SearchResult.self, from: data)
return decodedObject
} catch {
print("decodedObject error: \n\(error)")
Logger.info("decodedObject error: \n\(error)")
return nil
}
}
@ -453,7 +453,7 @@ extension OnboardingSearchController: NSSearchFieldDelegate {
return false
}
print("Not Handled")
Logger.info("Not Handled")
// return true if the action was handled; otherwise false
return false
}

16
Clocker/Overall App/AppDefaults.swift

@ -67,17 +67,6 @@ class AppDefaults {
if defaults.object(forKey: CLThemeKey) == nil {
Themer.shared().set(theme: 0)
}
// Set default to System theme for Mojave
if #available(macOS 10.14, *) {
if defaults.bool(forKey: CLDefaultThemeOnMojave) == false {
if isDarkModeOn() {
Themer.shared().set(theme: 2)
defaults.set(2, forKey: CLThemeKey)
}
defaults.set(true, forKey: CLDefaultThemeOnMojave)
}
}
}
private class func showCompactModeAlert() {
@ -126,8 +115,9 @@ class AppDefaults {
CLShowMeetingInMenubar: 1,
CLTruncateTextLength: 30,
CLSelectedCalendars: [],
CLAppDisplayOptions: 1,
CLMenubarCompactMode: 1]
CLAppDisplayOptions: 0,
CLMenubarCompactMode: 1,
CLDisplayDSTTransitionInfo: 0]
}
}

3
Clocker/Overall App/DataStore.swift

@ -16,6 +16,7 @@ enum ViewType {
case placeInMenubar
case dayInMenubar
case menubarCompactMode
case dstTransitionInfo
}
class DataStore: NSObject {
@ -138,6 +139,8 @@ class DataStore: NSObject {
return shouldDisplayHelper(CLShowDayInMenu)
case .appDisplayOptions:
return shouldDisplayHelper(CLAppDisplayOptions)
case .dstTransitionInfo:
return shouldDisplayHelper(CLDisplayDSTTransitionInfo)
case .menubarCompactMode:
guard let value = retrieve(key: CLMenubarCompactMode) as? Int else {
return false

12
Clocker/Overall App/Logger.swift

@ -5,8 +5,16 @@ import os.log
import os.signpost
class Logger: NSObject {
class func log(object _: [String: Any]?, for _: NSString) {
// TODO: Use a new analytics solution!
class func log(object annotations: [String: Any]?, for event: NSString) {
if #available(OSX 10.14, *) {
os_log(.default, "[%@] - [%@]", event, annotations ?? [:])
}
}
class func info(_ message: String) {
if #available(OSX 10.14, *) {
os_log(.info, "%@", message)
}
}
}

2
Clocker/Overall App/Strings.swift

@ -35,5 +35,5 @@ let CLOnboaringTestsLaunchArgument = "isTestingTheOnboardingFlow"
let CLMenubarCompactMode = "com.abhishek.menubarCompactMode"
let CLDefaultMenubarMode = "com.abhishek.shouldDefaultToCompactMode"
let CLInstallHomeIndicatorObject = "installHomeIndicatorObject"
let CLDefaultThemeOnMojave = "com.abhishek.defaultHasBeenSetOnMacOsMojave"
let CLSwitchToCompactModeAlert = "com.abhishek.switchToCompactMode"
let CLDisplayDSTTransitionInfo = "com.abhishek.showDSTTransitionInfo"

31
Clocker/Overall App/Themer.swift

@ -151,8 +151,9 @@ extension Themer {
}
func shutdownImage() -> NSImage {
if #available(OSX 11.0, *) {
return symbolImage(for: "ellipsis.circle")
if let symbolImageForShutdown = symbolImage(for: "ellipsis.circle") {
return symbolImageForShutdown
}
if #available(macOS 10.14, *) {
@ -170,8 +171,8 @@ extension Themer {
}
func preferenceImage() -> NSImage {
if #available(OSX 11.0, *) {
return symbolImage(for: "gear")
if let symbolImageForPreference = symbolImage(for: "gear") {
return symbolImageForPreference
}
if #available(macOS 10.14, *) {
@ -187,13 +188,13 @@ extension Themer {
return
themeIndex == .light
? NSImage(named: NSImage.Name("Settings"))!
: NSImage(named: NSImage.Name("Settings-White"))!
? NSImage(named: NSImage.Name("Settings"))!
: NSImage(named: NSImage.Name("Settings-White"))!
}
func pinImage() -> NSImage {
if #available(OSX 11.0, *) {
return symbolImage(for: "macwindow.on.rectangle")
if let pinImage = symbolImage(for: "macwindow.on.rectangle") {
return pinImage
}
if #available(macOS 10.14, *) {
@ -316,8 +317,8 @@ extension Themer {
}
func sharingImage() -> NSImage {
if #available(OSX 11.0, *) {
return symbolImage(for: "square.and.arrow.up.on.square.fill")
if let sharingImage = symbolImage(for: "square.and.arrow.up.on.square.fill") {
return sharingImage
}
if #available(macOS 10.14, *) {
@ -445,14 +446,14 @@ extension Themer {
NSColor(deviceRed: 42.0 / 255.0, green: 55.0 / 255.0, blue: 62.0 / 255.0, alpha: 1.0)
}
func symbolImage(for name: String) -> NSImage {
func symbolImage(for name: String) -> NSImage? {
assert(name.count > 0)
if #available(OSX 11.0, *) {
return NSImage(systemSymbolName: name,
accessibilityDescription: name)!
} else {
// Dummy image for older xcodes
return NSImage(named: NSImage.Name("Calendar Tab Icon"))!
}
}
return nil
}
}

8
Clocker/Overall App/VersionUpdateHandler.swift

@ -96,7 +96,7 @@ class VersionUpdateHandler: NSObject {
}
guard let appStoreId = appStoreID() else {
print("No App Store ID was found for Clocker")
Logger.info("No App Store ID was found for Clocker")
return URL(string: "")!
}
@ -197,7 +197,7 @@ class VersionUpdateHandler: NSObject {
if checkAtLaunch {
checkIfNewVersion()
} else if verboseLogging {
print("iVersion will not check for updatess because checkAtLaunch option is disabled")
Logger.info("iVersion will not check for updatess because checkAtLaunch option is disabled")
}
}
@ -311,9 +311,9 @@ class VersionUpdateHandler: NSObject {
if remoteVersionsDict.count <= 0 {
if downloadError != nil {
print("Update Check Failed because of \(downloadError!.localizedDescription)")
Logger.info("Update Check Failed because of \(downloadError!.localizedDescription)")
} else {
print("Version Update Check because an unknown error occurred")
Logger.info("Version Update Check because an unknown error occurred")
}
}
return

2
Clocker/Panel/Data Layer/TimezoneData.swift

@ -231,7 +231,7 @@ class TimezoneData: NSObject, NSCoding {
let old = NSKeyedUnarchiver.unarchiveObject(with: timezone)
if let oldModel = old as? CLTimezoneData {
// Convert it to new model and add it
print("We're still using old Objective-C models")
Logger.info("We're still using old Objective-C models")
let newTimezone = TimezoneData(with: oldModel)
newModels.append(newTimezone)
} else if let newModel = old as? TimezoneData {

35
Clocker/Panel/Data Layer/TimezoneDataOperations.swift

@ -33,6 +33,39 @@ extension TimezoneDataOperations {
return dateFormatter.string(from: newDate)
}
func nextDaylightSavingsTransitionIfAvailable(with sliderValue: Int) -> String? {
let currentTimezone = TimeZone(identifier: dataObject.timezone())
guard let nextDaylightSavingsTransition = currentTimezone?.nextDaylightSavingTimeTransition else {
return nil
}
guard let newDate = TimezoneDataOperations.gregorianCalendar?.date(byAdding: .minute,
value: sliderValue,
to: Date(),
options: .matchFirst) else {
assertionFailure("Data was unexpectedly nil")
return nil
}
let calendar = Calendar.autoupdatingCurrent
let numberOfDays = nextDaylightSavingsTransition.days(from: newDate, calendar: calendar)
// We'd like to show upcoming DST changes within the 7 day range.
// Using 8 as a fail-safe as timezones behind CDT can sometimes be wrongly attributed
if numberOfDays > 8 || numberOfDays < 0 {
return nil
}
if numberOfDays == 0 {
let hoursLeft = nextDaylightSavingsTransition.hours(from: newDate)
let suffix = hoursLeft == 1 ? "hour" : "hours"
return "Heads up! DST transition will occur in \(hoursLeft) \(suffix)."
}
let suffix = numberOfDays == 1 ? "day" : "days"
return "Heads up! DST transition will occur in \(numberOfDays) \(suffix)."
}
private func checkForUpcomingEvents() -> (String, String)? {
if DataStore.shared().shouldDisplay(.showMeetingInMenubar) {
let filteredDates = EventCenter.sharedCenter().eventsForDate
@ -46,7 +79,7 @@ extension TimezoneDataOperations {
let timeForEventToStart = event.event.startDate.timeIntervalSinceNow / 60
if timeForEventToStart > 30 {
print("Our next event: \(event.event.title ?? "Error") starts in \(timeForEventToStart) mins")
Logger.info("Our next event: \(event.event.title ?? "Error") starts in \(timeForEventToStart) mins")
continue
}

4
Clocker/Panel/Notes Popover/NotesPopover.swift

@ -150,7 +150,7 @@ class NotesPopover: NSViewController {
}
private func getCurrentTimezoneDate(completionHandler: @escaping (_ response: Date?) -> Void) {
guard let timezoneID = dataObject?.timezoneID else {
guard let timezoneID = dataObject?.timezone() else {
assertionFailure("Unable to retrieve timezoneID from the model")
completionHandler(nil)
return
@ -353,7 +353,7 @@ class NotesPopover: NSViewController {
let alertIndex = alertPopupButton.indexOfSelectedItem
if eventCenter.createReminder(with: model.customLabel!,
timezone: model.timezoneID!,
timezone: model.timezone(),
alertIndex: alertIndex,
reminderDate: reminderPicker.dateValue,
additionalNotes: model.note) {

4
Clocker/Panel/PanelController.swift

@ -239,7 +239,7 @@ class PanelController: ParentPanelController {
}
private func startTimer() {
print("Start timer called")
Logger.info("Start timer called")
parentTimer = Repeater(interval: .seconds(1), mode: .infinite) { _ in
OperationQueue.main.addOperation {
@ -254,7 +254,7 @@ class PanelController: ParentPanelController {
if count >= 1 || DataStore.shared().shouldDisplay(.showMeetingInMenubar) {
if let delegate = NSApplication.shared.delegate as? AppDelegate {
print("\nWe will be invalidating the menubar timer as we want the parent timer to take care of both panel and menubar ")
Logger.info("\nWe will be invalidating the menubar timer as we want the parent timer to take care of both panel and menubar ")
delegate.invalidateMenubarTimer(false)
}

33
Clocker/Panel/ParentPanelController.swift

@ -81,10 +81,11 @@ class ParentPanelController: NSWindowController {
@IBOutlet var sliderDatePicker: NSDatePicker!
@IBOutlet var modernSlider: NSCollectionView!
@IBOutlet var roundedDateView: NSView!
// Modern Slider
@IBOutlet var modernSlider: NSCollectionView!
var defaultPreferences: [Data] {
return DataStore.shared().timezones()
}
@ -167,9 +168,9 @@ class ParentPanelController: NSWindowController {
name: NSNotification.Name.NSSystemTimeZoneDidChange,
object: nil)
if #available(OSX 11.0, *) {
mainTableView.style = .fullWidth
}
// if #available(OSX 11.0, *) {
// mainTableView.style = .fullWidth
// }
if modernSlider != nil {
modernSlider.enclosingScrollView?.scrollerInsets = NSEdgeInsets(top: 0, left: 0, bottom: 100, right: 0)
@ -383,6 +384,10 @@ class ParentPanelController: NSWindowController {
newHeight = userFontSize == 4 ? 68.0 : 68.0
if let note = object?.note, note.isEmpty == false {
newHeight += 20
} else if DataStore.shared().shouldDisplay(.dstTransitionInfo),
let obj = object,
TimezoneDataOperations(with: obj).nextDaylightSavingsTransitionIfAvailable(with: futureSliderValue) != nil {
newHeight += 20
}
}
@ -390,7 +395,7 @@ class ParentPanelController: NSWindowController {
// Set it to 90 expicity in case the row height is calculated be higher.
newHeight = 88.0
if let note = object?.note, note.isEmpty {
if let note = object?.note, note.isEmpty, DataStore.shared().shouldDisplay(.dstTransitionInfo) == false, let obj = object, TimezoneDataOperations(with: obj).nextDaylightSavingsTransitionIfAvailable(with: futureSliderValue) == nil {
newHeight -= 20.0
}
}
@ -560,6 +565,14 @@ class ParentPanelController: NSWindowController {
cellView.relativeDate.stringValue = dataOperation.date(with: futureSliderValue, displayType: .panelDisplay)
cellView.currentLocationIndicator.isHidden = !model.isSystemTimezone
cellView.sunriseImage.image = model.isSunriseOrSunset ? Themer.shared().sunriseImage() : Themer.shared().sunsetImage()
if let note = model.note, !note.isEmpty {
cellView.noteLabel.stringValue = note
} else if DataStore.shared().shouldDisplay(.dstTransitionInfo),
let value = TimezoneDataOperations(with: model).nextDaylightSavingsTransitionIfAvailable(with: futureSliderValue) {
cellView.noteLabel.stringValue = value
} else {
cellView.noteLabel.stringValue = CLEmptyString
}
cellView.layout(with: model)
updateDatePicker()
}
@ -1018,19 +1031,17 @@ extension ParentPanelController: NSSharingServicePickerDelegate {
}
extension ParentPanelController: NSCollectionViewDataSource, NSCollectionViewDelegate {
static let markerUserIdentifier = "HourMarkerViewItem"
func collectionView(_: NSCollectionView, numberOfItemsInSection _: Int) -> Int {
return 24
}
func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
let item = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(ParentPanelController.markerUserIdentifier), for: indexPath) as! HourMarkerViewItem
item.setup(with: indexPath)
let item = collectionView.makeItem(withIdentifier: HourMarkerViewItem.reuseIdentifier, for: indexPath) as! HourMarkerViewItem
item.setup(with: indexPath.item)
return item
}
func collectionView(_: NSCollectionView, didSelectItemsAt indexPaths: Set<IndexPath>) {
Swift.print("Did Select Item at \(indexPaths.description)")
Logger.info("Did Select Item at \(indexPaths.description)")
}
}

31
Clocker/Panel/UI/HourMarkerViewItem.swift

@ -3,13 +3,34 @@
import Cocoa
class HourMarkerViewItem: NSCollectionViewItem {
static let reuseIdentifier = NSUserInterfaceItemIdentifier("HourMarkerViewItem")
@IBOutlet var hourLabel: NSTextField!
func setup(with indexPath: IndexPath) {
hourLabel.stringValue = "\(indexPath.item):00"
if indexPath.item == 2 {
highlightState = .forSelection
isSelected = true
func setup(with hour: Int) {
var dateComponents = DateComponents()
dateComponents.hour = hour
if let newDate = Calendar.autoupdatingCurrent.date(byAdding: dateComponents, to: Date().nextHour) {
let dateFormatter = DateFormatterManager.dateFormatterWithFormat(with: .none,
format: "HH:mm",
timezoneIdentifier: TimeZone.current.identifier,
locale: Locale.autoupdatingCurrent)
hourLabel.stringValue = dateFormatter.string(from: newDate)
}
}
override var acceptsFirstResponder: Bool {
return false
}
}
extension Date {
public var nextHour: Date {
let calendar = Calendar.current
let minutes = calendar.component(.minute, from: self)
let components = DateComponents(hour: 1, minute: -minutes)
return calendar.date(byAdding: components, to: self) ?? self
}
}

4
Clocker/Panel/UI/HourMarkerViewItem.xib

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="17154" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="17156" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17154"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17156"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>

2
Clocker/Panel/UI/PanelTableView.swift

@ -90,7 +90,7 @@ class PanelTableView: NSTableView {
private func evaluateForHighlight(at point: NSPoint) {
if enableHover == false {
print("Unable to show hover button because window is occluded!")
Logger.info("Unable to show hover button because window is occluded!")
return
}

14
Clocker/Panel/UI/TimezoneDataSource.swift

@ -58,11 +58,17 @@ extension TimezoneDataSource: NSTableViewDataSource, NSTableViewDelegate {
cellView.rowNumber = row
cellView.customName.stringValue = currentModel.formattedTimezoneLabel()
cellView.time.stringValue = operation.time(with: sliderValue)
cellView.noteLabel.stringValue = currentModel.note ?? CLEmptyString
cellView.noteLabel.toolTip = currentModel.note ?? CLEmptyString
cellView.currentLocationIndicator.isHidden = !currentModel.isSystemTimezone
cellView.time.setAccessibilityIdentifier("ActualTime")
cellView.relativeDate.setAccessibilityIdentifier("RelativeDate")
if let note = currentModel.note, !note.isEmpty {
cellView.noteLabel.stringValue = note
} else if DataStore.shared().shouldDisplay(.dstTransitionInfo), let value = operation.nextDaylightSavingsTransitionIfAvailable(with: sliderValue) {
cellView.noteLabel.stringValue = value
} else {
cellView.noteLabel.stringValue = CLEmptyString
}
cellView.layout(with: currentModel)
cellView.setAccessibilityIdentifier(currentModel.formattedTimezoneLabel())
@ -91,11 +97,13 @@ extension TimezoneDataSource: NSTableViewDataSource, NSTableViewDelegate {
}
if let note = model.note, !note.isEmpty {
rowHeight += userFontSize.intValue + 25
rowHeight += userFontSize.intValue + 15
} else if DataStore.shared().shouldDisplay(.dstTransitionInfo), TimezoneDataOperations(with: model).nextDaylightSavingsTransitionIfAvailable(with: sliderValue) != nil {
rowHeight += userFontSize.intValue + 15
}
if model.isSystemTimezone {
rowHeight += 5
rowHeight += 2
}
rowHeight += (userFontSize.intValue * 2)

18
Clocker/Preferences/Appearance/AppearanceViewController.swift

@ -104,8 +104,9 @@ class AppearanceViewController: ParentViewController {
let shouldDisplayCompact = DataStore.shared().shouldDisplay(.menubarCompactMode)
menubarMode.setSelected(true, forSegment: shouldDisplayCompact ? 0 : 1)
// True is Menubar Only and False is Menubar + Dock
let appDisplayOptions = DataStore.shared().shouldDisplay(.appDisplayOptions)
appDisplayControl.setSelected(true, forSegment: appDisplayOptions ? 1 : 0)
appDisplayControl.setSelected(true, forSegment: appDisplayOptions ? 0 : 1)
}
@IBOutlet var timeFormatLabel: NSTextField!
@ -330,6 +331,10 @@ class AppearanceViewController: ParentViewController {
@IBAction func fontSliderChanged(_: Any) {
previewPanelTableView.reloadData()
}
@IBAction func toggleDSTTransitionOption(_: Any) {
previewPanelTableView.reloadData()
}
}
extension AppearanceViewController: NSTableViewDataSource, NSTableViewDelegate {
@ -356,8 +361,13 @@ extension AppearanceViewController: NSTableViewDataSource, NSTableViewDelegate {
cellView.rowNumber = row
cellView.customName.stringValue = currentModel.formattedTimezoneLabel()
cellView.time.stringValue = operation.time(with: 0)
cellView.noteLabel.stringValue = currentModel.note ?? CLEmptyString
cellView.noteLabel.toolTip = currentModel.note ?? CLEmptyString
if DataStore.shared().shouldDisplay(.dstTransitionInfo) {
cellView.noteLabel.stringValue = "Heads up! DST Transition will occur in 3 days."
} else if let note = currentModel.note, !note.isEmpty {
cellView.noteLabel.stringValue = note
} else {
cellView.noteLabel.stringValue = CLEmptyString
}
cellView.currentLocationIndicator.isHidden = !currentModel.isSystemTimezone
cellView.time.setAccessibilityIdentifier("ActualTime")
cellView.layout(with: currentModel)
@ -375,6 +385,8 @@ extension AppearanceViewController: NSTableViewDataSource, NSTableViewDelegate {
let rowHeight: Int = userFontSize == 4 ? 60 : 65
if let note = model.note, !note.isEmpty {
return CGFloat(rowHeight + userFontSize.intValue + 25)
} else if DataStore.shared().shouldDisplay(.dstTransitionInfo) {
return CGFloat(rowHeight + userFontSize.intValue + 25)
}
return CGFloat(rowHeight + (userFontSize.intValue * 2))

2
Clocker/Preferences/Calendar/CalendarViewController.swift

@ -146,7 +146,7 @@ class CalendarViewController: ParentViewController {
if sender.selectedSegment == 0 {
if let isValid = statusItemHandler.menubarTimer?.isValid, isValid == true {
print("Timer is already in progress")
Logger.info("Timer is already in progress")
updateStatusItem()
return
}

2
Clocker/Preferences/General/PreferencesDataSource.swift

@ -130,7 +130,7 @@ extension PreferencesDataSource: NSTableViewDataSource {
return model.formattedAddress
}
return model.timezoneID
return model.timezone()
}
func tableView(_: NSTableView, setObjectValue object: Any?, for _: NSTableColumn?, row: Int) {

18
Clocker/Preferences/General/PreferencesViewController.swift

@ -41,7 +41,7 @@ class PreferencesViewController: ParentViewController {
guard let path = Bundle.main.path(forResource: "Keys", ofType: "plist"),
let dictionary = NSDictionary(contentsOfFile: path),
let apiKey = dictionary["GeocodingKey"] as? String else {
assertionFailure("Unable to find the API key")
// assertionFailure("Unable to find the API key")
return ""
}
return apiKey
@ -420,7 +420,7 @@ extension PreferencesViewController {
self.placeholderLabel.placeholderString = "Searching for \(searchString)"
print(self.placeholderLabel.placeholderString ?? "")
Logger.info(self.placeholderLabel.placeholderString ?? "")
self.dataTask = NetworkManager.task(with: self.generateSearchURL(),
completionHandler: { [weak self] response, error in
@ -474,7 +474,7 @@ extension PreferencesViewController {
return false
}
print(searchResultsDataSource.timezoneFilteredArray)
Logger.info(searchResultsDataSource.timezoneFilteredArray.debugDescription)
}
private func generateSearchURL() -> String {
@ -528,7 +528,7 @@ extension PreferencesViewController {
private func reloadSearchResults() {
if searchResultsDataSource.calculateChangesets() {
print("Reloading Search Results")
Logger.info("Reloading Search Results")
availableTimezoneTableView.reloadData()
}
}
@ -540,7 +540,7 @@ extension PreferencesViewController {
let decodedObject = try jsonDecoder.decode(SearchResult.self, from: data)
return decodedObject
} catch {
print("decodedObject error: \n\(error)")
Logger.info("decodedObject error: \n\(error)")
return nil
}
}
@ -552,7 +552,7 @@ extension PreferencesViewController {
let decodedObject = try jsonDecoder.decode(Timezone.self, from: data)
return decodedObject
} catch {
print("decodedObject error: \n\(error)")
Logger.info("decodedObject error: \n\(error)")
return nil
}
}
@ -633,7 +633,7 @@ extension PreferencesViewController {
// Mark if the timezone is same as local timezone
let timezoneObject = TimezoneData(with: newTimeZone)
timezoneObject.isSystemTimezone = timezoneObject.timezoneID == NSTimeZone.system.identifier
timezoneObject.isSystemTimezone = timezoneObject.timezone() == NSTimeZone.system.identifier
let operationsObject = TimezoneDataOperations(with: timezoneObject)
operationsObject.saveObject()
@ -950,8 +950,8 @@ extension PreferencesViewController {
return false
}
let timezone1 = NSTimeZone(name: object1.timezoneID!)
let timezone2 = NSTimeZone(name: object2.timezoneID!)
let timezone1 = NSTimeZone(name: object1.timezone())
let timezone2 = NSTimeZone(name: object2.timezone())
let difference1 = system.secondsFromGMT() - timezone1!.secondsFromGMT
let difference2 = system.secondsFromGMT() - timezone2!.secondsFromGMT

96
Clocker/Preferences/Preferences.storyboard

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="16097.2" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="RHq-9Z-auA">
<document type="com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB" version="3.0" toolsVersion="17156" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" initialViewController="RHq-9Z-auA">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="16097.2"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17156"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
@ -781,7 +781,7 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="9WW-jp-NeO">
<rect key="frame" x="203" y="267" width="143" height="24"/>
<rect key="frame" x="203" y="287" width="143" height="24"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="CcB-5w-IoG">
<font key="font" size="12" name="Avenir-Light"/>
<segments>
@ -795,7 +795,7 @@
</connections>
</segmentedControl>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="gEH-vT-EqV">
<rect key="frame" x="203" y="229" width="160" height="24"/>
<rect key="frame" x="203" y="249" width="160" height="24"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="5Rz-xo-JB7">
<font key="font" size="12" name="Avenir-Light"/>
<segments>
@ -809,7 +809,7 @@
</connections>
</segmentedControl>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="120" translatesAutoresizingMaskIntoConstraints="NO" id="xwt-pY-1w9">
<rect key="frame" x="30" y="194" width="152" height="18"/>
<rect key="frame" x="30" y="176" width="152" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="148" id="7fj-Em-Lyh"/>
</constraints>
@ -820,7 +820,7 @@
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="150" translatesAutoresizingMaskIntoConstraints="NO" id="gFE-hZ-J92">
<rect key="frame" x="45" y="308" width="137" height="18"/>
<rect key="frame" x="45" y="328" width="137" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="133" id="SCi-hT-hxG"/>
</constraints>
@ -831,7 +831,7 @@
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="100" translatesAutoresizingMaskIntoConstraints="NO" id="wtO-uL-QBf">
<rect key="frame" x="78" y="384" width="104" height="18"/>
<rect key="frame" x="78" y="404" width="104" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="100" id="WNN-Le-h1b"/>
</constraints>
@ -842,7 +842,7 @@
</textFieldCell>
</textField>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="d4S-hM-MSP">
<rect key="frame" x="203" y="305" width="292" height="24"/>
<rect key="frame" x="203" y="325" width="292" height="24"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="564-Re-f1d">
<font key="font" size="12" name="Avenir-Light"/>
<segments>
@ -858,7 +858,7 @@
</connections>
</segmentedControl>
<segmentedControl toolTip="Select a time-format!" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="699-dn-eyN">
<rect key="frame" x="203" y="381" width="236" height="24"/>
<rect key="frame" x="203" y="401" width="236" height="24"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="R6T-Ym-jpK">
<font key="font" size="13" name="Avenir-Light"/>
<segments>
@ -872,7 +872,7 @@
</connections>
</segmentedControl>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="60" translatesAutoresizingMaskIntoConstraints="NO" id="vrm-cg-RMn">
<rect key="frame" x="81" y="346" width="101" height="18"/>
<rect key="frame" x="81" y="366" width="101" height="18"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Panel Theme" id="ZKN-5V-B4D">
<font key="font" size="13" name="Avenir-Light"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@ -880,7 +880,7 @@
</textFieldCell>
</textField>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="8IA-JL-fje">
<rect key="frame" x="559" y="177" width="32" height="52"/>
<rect key="frame" x="559" y="159" width="32" height="52"/>
<constraints>
<constraint firstAttribute="width" constant="32" id="GZK-Zb-UYb"/>
<constraint firstAttribute="height" constant="52" id="SSv-hh-RFa"/>
@ -888,7 +888,7 @@
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" image="NSFontPanel" id="yoa-s4-khY"/>
</imageView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="120" translatesAutoresizingMaskIntoConstraints="NO" id="w0y-UQ-RC0">
<rect key="frame" x="19" y="232" width="163" height="18"/>
<rect key="frame" x="19" y="252" width="163" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="159" id="mNx-18-sdT"/>
</constraints>
@ -898,8 +898,22 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="DCB-IB-UxK">
<rect key="frame" x="203" y="211" width="82" height="24"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="PZZ-H7-LgV">
<font key="font" size="12" name="Avenir-Light"/>
<segments>
<segment label="Yes"/>
<segment label="No" selected="YES" tag="1"/>
</segments>
</segmentedCell>
<connections>
<action selector="toggleDSTTransitionOption:" target="1aL-zR-8L4" id="9bi-NL-gMv"/>
<binding destination="Gpv-Gr-MxZ" name="selectedIndex" keyPath="values.com.abhishek.showDSTTransitionInfo" id="eG0-sL-5hE"/>
</connections>
</segmentedControl>
<segmentedControl toolTip="Choose a theme for the main panel!" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="FZb-fP-hMJ">
<rect key="frame" x="203" y="343" width="265" height="24"/>
<rect key="frame" x="203" y="363" width="265" height="24"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="hcQ-xa-e2V">
<font key="font" size="12" name="Avenir-Light"/>
<segments>
@ -914,7 +928,7 @@
</connections>
</segmentedControl>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="120" translatesAutoresizingMaskIntoConstraints="NO" id="4lt-X6-3uU">
<rect key="frame" x="38" y="270" width="144" height="18"/>
<rect key="frame" x="38" y="290" width="144" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="140" id="hAp-By-Lzj"/>
</constraints>
@ -925,7 +939,7 @@
</textFieldCell>
</textField>
<slider verticalHuggingPriority="750" alphaValue="0.59999999999999998" translatesAutoresizingMaskIntoConstraints="NO" id="3cU-IS-3Qu">
<rect key="frame" x="203" y="190" width="350" height="24"/>
<rect key="frame" x="203" y="172" width="350" height="24"/>
<sliderCell key="cell" state="on" alignment="left" minValue="4" maxValue="7" doubleValue="4" tickMarkPosition="above" numberOfTickMarks="4" allowsTickMarkValuesOnly="YES" sliderType="linear" id="eAh-k3-cof"/>
<connections>
<action selector="fontSliderChanged:" target="1aL-zR-8L4" id="YAW-aA-5aR"/>
@ -933,7 +947,7 @@
</connections>
</slider>
<scrollView borderType="line" autohidesScrollers="YES" horizontalLineScroll="113" horizontalPageScroll="10" verticalLineScroll="113" verticalPageScroll="10" hasHorizontalScroller="NO" hasVerticalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Ytg-0u-Mtu">
<rect key="frame" x="104" y="40" width="400" height="100"/>
<rect key="frame" x="104" y="42" width="400" height="100"/>
<clipView key="contentView" id="gnX-f5-31D">
<rect key="frame" x="1" y="1" width="398" height="98"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@ -1110,7 +1124,7 @@
</scroller>
</scrollView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ZNm-TN-RRJ">
<rect key="frame" x="248" y="150" width="112" height="22"/>
<rect key="frame" x="248" y="147" width="112" height="22"/>
<constraints>
<constraint firstAttribute="width" constant="108" id="KwL-So-Ymu"/>
<constraint firstAttribute="height" constant="22" id="bBD-fJ-Xm7"/>
@ -1121,27 +1135,41 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" preferredMaxLayoutWidth="120" translatesAutoresizingMaskIntoConstraints="NO" id="ZWy-WW-6H9">
<rect key="frame" x="19" y="214" width="163" height="18"/>
<constraints>
<constraint firstAttribute="width" constant="159" id="NX0-Bo-SU8"/>
</constraints>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Show DST transition info" id="i0m-6h-scA">
<font key="font" size="13" name="Avenir-Light"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="4lt-X6-3uU" firstAttribute="trailing" secondItem="gFE-hZ-J92" secondAttribute="trailing" id="0LC-R1-cwL"/>
<constraint firstItem="4lt-X6-3uU" firstAttribute="top" secondItem="gFE-hZ-J92" secondAttribute="bottom" constant="20" id="0zz-yr-dkd"/>
<constraint firstAttribute="trailing" secondItem="d4S-hM-MSP" secondAttribute="trailing" constant="115" id="6EI-oM-u6q"/>
<constraint firstItem="d4S-hM-MSP" firstAttribute="leading" secondItem="FZb-fP-hMJ" secondAttribute="leading" id="6GY-mg-50H"/>
<constraint firstItem="ZWy-WW-6H9" firstAttribute="top" secondItem="w0y-UQ-RC0" secondAttribute="bottom" constant="20" id="725-Ob-eKH"/>
<constraint firstAttribute="trailing" secondItem="FZb-fP-hMJ" secondAttribute="trailing" constant="142" id="Dfr-Sc-kQB"/>
<constraint firstItem="vrm-cg-RMn" firstAttribute="trailing" secondItem="wtO-uL-QBf" secondAttribute="trailing" id="Dz6-2y-0Kj"/>
<constraint firstItem="vrm-cg-RMn" firstAttribute="top" secondItem="wtO-uL-QBf" secondAttribute="bottom" constant="20" id="E8U-ve-Yq8"/>
<constraint firstItem="Ytg-0u-Mtu" firstAttribute="centerX" secondItem="zFb-Gb-3dB" secondAttribute="centerX" id="EHm-Kq-6Nq"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="699-dn-eyN" secondAttribute="trailing" constant="10" id="EdO-mM-G6w"/>
<constraint firstItem="ZNm-TN-RRJ" firstAttribute="top" secondItem="3cU-IS-3Qu" secondAttribute="bottom" constant="20" id="KJj-ji-SG9"/>
<constraint firstItem="ZNm-TN-RRJ" firstAttribute="top" secondItem="3cU-IS-3Qu" secondAttribute="bottom" constant="5" id="KJj-ji-SG9"/>
<constraint firstItem="wtO-uL-QBf" firstAttribute="leading" secondItem="zFb-Gb-3dB" secondAttribute="leading" constant="80" id="KPc-a4-RWW"/>
<constraint firstItem="d4S-hM-MSP" firstAttribute="centerY" secondItem="gFE-hZ-J92" secondAttribute="centerY" id="MB4-vU-XFQ"/>
<constraint firstItem="gEH-vT-EqV" firstAttribute="leading" secondItem="9WW-jp-NeO" secondAttribute="leading" id="NBM-n8-g9p"/>
<constraint firstItem="9WW-jp-NeO" firstAttribute="leading" secondItem="d4S-hM-MSP" secondAttribute="leading" id="Nfi-6H-7VR"/>
<constraint firstItem="DCB-IB-UxK" firstAttribute="centerY" secondItem="ZWy-WW-6H9" secondAttribute="centerY" id="Ob9-nz-HhX"/>
<constraint firstItem="8IA-JL-fje" firstAttribute="centerY" secondItem="3cU-IS-3Qu" secondAttribute="centerY" id="QZn-RJ-b2s"/>
<constraint firstItem="wtO-uL-QBf" firstAttribute="top" secondItem="zFb-Gb-3dB" secondAttribute="top" constant="30" id="TUd-Wc-XZL"/>
<constraint firstItem="wtO-uL-QBf" firstAttribute="top" secondItem="zFb-Gb-3dB" secondAttribute="top" constant="10" id="TUd-Wc-XZL"/>
<constraint firstItem="w0y-UQ-RC0" firstAttribute="top" secondItem="4lt-X6-3uU" secondAttribute="bottom" constant="20" id="ULM-L5-4EP"/>
<constraint firstItem="vrm-cg-RMn" firstAttribute="width" secondItem="wtO-uL-QBf" secondAttribute="width" multiplier="0.97" id="W8Z-wH-RJT"/>
<constraint firstAttribute="trailing" secondItem="8IA-JL-fje" secondAttribute="trailing" constant="17" id="XEc-lD-5Pt"/>
<constraint firstItem="xwt-pY-1w9" firstAttribute="top" secondItem="ZWy-WW-6H9" secondAttribute="bottom" constant="20" id="bFw-FZ-dB7"/>
<constraint firstItem="ZNm-TN-RRJ" firstAttribute="centerX" secondItem="zFb-Gb-3dB" secondAttribute="centerX" id="bWQ-fX-DZe"/>
<constraint firstItem="699-dn-eyN" firstAttribute="centerY" secondItem="wtO-uL-QBf" secondAttribute="centerY" id="bfw-Ln-spi"/>
<constraint firstItem="3cU-IS-3Qu" firstAttribute="leading" secondItem="gEH-vT-EqV" secondAttribute="leading" id="dwP-Gf-Jak"/>
@ -1149,11 +1177,12 @@
<constraint firstItem="xwt-pY-1w9" firstAttribute="trailing" secondItem="w0y-UQ-RC0" secondAttribute="trailing" id="hi7-BQ-ZDh"/>
<constraint firstItem="gFE-hZ-J92" firstAttribute="top" secondItem="vrm-cg-RMn" secondAttribute="bottom" constant="20" id="ijE-Xu-svg"/>
<constraint firstAttribute="trailing" secondItem="gEH-vT-EqV" secondAttribute="trailing" constant="247" id="jQj-Gf-XPT"/>
<constraint firstItem="xwt-pY-1w9" firstAttribute="top" secondItem="w0y-UQ-RC0" secondAttribute="bottom" constant="20" id="krm-S3-2y5"/>
<constraint firstItem="699-dn-eyN" firstAttribute="leading" secondItem="wtO-uL-QBf" secondAttribute="trailing" constant="25" id="nM0-Kn-lTZ"/>
<constraint firstItem="3cU-IS-3Qu" firstAttribute="centerY" secondItem="xwt-pY-1w9" secondAttribute="centerY" id="oM8-iJ-okk"/>
<constraint firstItem="9WW-jp-NeO" firstAttribute="centerY" secondItem="4lt-X6-3uU" secondAttribute="centerY" id="oPk-1s-bdu"/>
<constraint firstItem="Ytg-0u-Mtu" firstAttribute="top" secondItem="ZNm-TN-RRJ" secondAttribute="bottom" constant="10" id="ouW-SE-Jmn"/>
<constraint firstItem="DCB-IB-UxK" firstAttribute="leading" secondItem="gEH-vT-EqV" secondAttribute="leading" id="odB-k0-PQW"/>
<constraint firstItem="Ytg-0u-Mtu" firstAttribute="top" secondItem="ZNm-TN-RRJ" secondAttribute="bottom" constant="5" id="ouW-SE-Jmn"/>
<constraint firstItem="ZWy-WW-6H9" firstAttribute="trailing" secondItem="w0y-UQ-RC0" secondAttribute="trailing" id="qxM-Ei-4zi"/>
<constraint firstItem="FZb-fP-hMJ" firstAttribute="leading" secondItem="699-dn-eyN" secondAttribute="leading" id="rCV-e3-pae"/>
<constraint firstAttribute="trailing" secondItem="9WW-jp-NeO" secondAttribute="trailing" constant="264" id="s9R-1X-ZOO"/>
<constraint firstItem="w0y-UQ-RC0" firstAttribute="trailing" secondItem="4lt-X6-3uU" secondAttribute="trailing" id="ubu-xP-pha"/>
@ -1493,7 +1522,7 @@
<autoresizingMask key="autoresizingMask"/>
<subviews>
<searchField toolTip="Search a timezone" wantsLayer="YES" focusRingType="none" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="Dha-h9-Nd0" customClass="ClockerSearchField" customModule="Clocker" customModuleProvider="target">
<rect key="frame" x="8" y="97" width="329" height="23"/>
<rect key="frame" x="8" y="49" width="329" height="23"/>
<searchFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" borderStyle="bezel" focusRingType="none" placeholderString="Enter a city, state, country name" usesSingleLineMode="YES" maximumRecents="5" id="ikU-Tm-0WZ">
<font key="font" size="13" name="Avenir-Light"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@ -1550,13 +1579,13 @@ DQ
</connections>
</button>
<scrollView focusRingType="none" borderType="none" autohidesScrollers="YES" horizontalLineScroll="32" horizontalPageScroll="10" verticalLineScroll="32" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0wY-ff-FLW">
<rect key="frame" x="8" y="30" width="329" height="57"/>
<rect key="frame" x="8" y="30" width="329" height="9"/>
<clipView key="contentView" drawsBackground="NO" id="rGc-3M-cCq">
<rect key="frame" x="0.0" y="0.0" width="329" height="57"/>
<rect key="frame" x="0.0" y="0.0" width="329" height="9"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" multipleSelection="NO" emptySelection="NO" autosaveColumns="NO" rowHeight="30" rowSizeStyle="automatic" viewBased="YES" id="xkl-2X-ZCb">
<rect key="frame" x="0.0" y="0.0" width="329" height="57"/>
<rect key="frame" x="0.0" y="0.0" width="329" height="9"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
@ -1646,14 +1675,14 @@ DQ
</scroller>
</scrollView>
<progressIndicator wantsLayer="YES" focusRingType="none" horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" displayedWhenStopped="NO" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" translatesAutoresizingMaskIntoConstraints="NO" id="0A5-gp-lay">
<rect key="frame" x="165" y="78" width="16" height="16"/>
<rect key="frame" x="165" y="54" width="16" height="16"/>
<constraints>
<constraint firstAttribute="height" constant="16" id="fgE-77-Vda"/>
<constraint firstAttribute="width" constant="16" id="pwe-em-e0a"/>
</constraints>
</progressIndicator>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="xgb-wU-8RU">
<rect key="frame" x="18" y="48" width="309" height="22"/>
<rect key="frame" x="18" y="24" width="309" height="22"/>
<constraints>
<constraint firstAttribute="height" constant="22" id="zqt-d8-yas"/>
</constraints>
@ -1701,7 +1730,7 @@ DQ
<rect key="frame" x="0.0" y="484" width="613" height="30"/>
<subviews>
<button toolTip="Sorts by time difference from your current timezone" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="P6d-qq-ycq">
<rect key="frame" x="277" y="3" width="13" height="25"/>
<rect key="frame" x="279" y="3" width="12" height="25"/>
<constraints>
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="160" id="cAs-on-f7X"/>
<constraint firstAttribute="height" constant="25" id="juv-QL-vMx"/>
@ -1716,7 +1745,7 @@ DQ
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="0HL-uj-s4v">
<rect key="frame" x="333" y="3" width="13" height="25"/>
<rect key="frame" x="333" y="3" width="12" height="25"/>
<constraints>
<constraint firstAttribute="height" constant="25" id="eZL-Gr-38S"/>
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="120" id="sJk-T7-7Lm"/>
@ -1731,7 +1760,7 @@ DQ
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="6fs-Mx-NcG">
<rect key="frame" x="305" y="3" width="13" height="25"/>
<rect key="frame" x="306" y="3" width="12" height="25"/>
<constraints>
<constraint firstAttribute="width" relation="lessThanOrEqual" constant="190" id="241-Rn-G6N"/>
<constraint firstAttribute="height" constant="25" id="weP-ll-vZ8"/>
@ -1973,6 +2002,11 @@ CA
<point key="canvasLocation" x="747" y="1244"/>
</scene>
</scenes>
<designables>
<designable name="PbD-dt-goz">
<size key="intrinsicContentSize" width="96" height="25"/>
</designable>
</designables>
<resources>
<image name="Add Icon" width="700" height="700"/>
<image name="Appearance Dynamic" width="350" height="350"/>
@ -1980,7 +2014,7 @@ CA
<image name="ClockerIcon-512" width="1024" height="1024"/>
<image name="CurrentLocation" width="350" height="350"/>
<image name="Extra" width="700" height="700"/>
<image name="NSDescendingSortIndicator" width="9" height="9"/>
<image name="NSDescendingSortIndicator" width="8" height="8"/>
<image name="NSFontPanel" width="32" height="32"/>
<image name="NSInfo" width="32" height="32"/>
<image name="NSPreferencesGeneral" width="32" height="32"/>

Loading…
Cancel
Save