Abhishek
3 years ago
4 changed files with 268 additions and 15 deletions
@ -0,0 +1,165 @@ |
|||||||
|
/* |
||||||
|
Localizable.strings |
||||||
|
Clocker |
||||||
|
|
||||||
|
Created by Abhishek Banthia on 7/9/21. |
||||||
|
|
||||||
|
*/ |
||||||
|
|
||||||
|
"CFBundleDisplayName" = "Clocker"; |
||||||
|
"Thank you for helping make Clocker even better!" = "Hvala što pomažeš poboljšati Clocker!"; |
||||||
|
"iRateMessageTitle" = "Ocijeni %@"; |
||||||
|
"iRateAppMessage" = "Ako voliš koristiti %@, ocijeni program. Postupak ocjenjivanja traje manje od jedne minute. Hvala na podršci!"; |
||||||
|
"iRateGameMessage" = "Ako voliš igrati %@, ocijeni program. Postupak ocjenjivanja traje manje od jedne minute. Hvala na podršci!"; |
||||||
|
"iRateCancelButton" = "Ne, hvala"; |
||||||
|
"iRateRateButton" = "Ocijeni"; |
||||||
|
"iRateRemindButton" = "Podsjeti me kasnije"; |
||||||
|
"iRateUpdateMessage" = "Sada aktualizirati?"; |
||||||
|
"ClockerVersion" = "Verzija %@"; |
||||||
|
"CLFeedbackAlertTitle" = "Hvala što pomažeš poboljšati Clocker!"; |
||||||
|
"app-name" = "Clocker"; |
||||||
|
"start-at-login" = "Pokreni nakon prijave"; |
||||||
|
"setup-steps" = "Za postavljanje programa Clocker potrebna su samo tri koraka"; |
||||||
|
"Permissions-Header" = "Dozvole"; |
||||||
|
"See your next Calendar event here." = "Ovdje pogledaj svoje sljedeće kalendarske događaje."; |
||||||
|
"Click here to start." = "Pritisni ovdje za pokretanje."; |
||||||
|
"Reminders Access" = "Pristup podsjetnicima"; |
||||||
|
"Calendar Access" = "Pristup kalendaru"; |
||||||
|
"Permissions" = "Dozvole"; |
||||||
|
"Calendar Detail" = "Predstojeći događaji iz tvojih osobnih i zajedničkih kalendara mogu se prikazati u traci izbornika i na ploči."; |
||||||
|
"Reminders Detail" = "Postavi podsjetnike u tvoju vremensku zonu mjesta. Tvoji se podsjetnici spremaju u standardni program Podsjetnici."; |
||||||
|
"Privacy Text" = "Ovo možeš kasnije promijeniti u odjeljku Privatnost u Postavkama sustava."; |
||||||
|
"Granted Button Text" = "Dozvoljeno"; |
||||||
|
"Denied Button Text" = "Zabranjeno"; |
||||||
|
"Grant Button Text" = "Dozvoli"; |
||||||
|
|
||||||
|
// Welcome Onboarding |
||||||
|
"It only takes 3 steps to setup Clocker." = "Za postavljanje programa Clocker potrebna su samo tri koraka."; |
||||||
|
"Get Started" = "PoÄŤetak"; |
||||||
|
|
||||||
|
// Tab Item Titles |
||||||
|
"Preferences Tab" = "Postavke"; |
||||||
|
"Appearance Tab" = "Izgled"; |
||||||
|
"Calendar Tab" = "Kalendar"; |
||||||
|
"About Tab" = "Informacije"; |
||||||
|
"Permissions Tab" = "Dozvole"; |
||||||
|
|
||||||
|
// General Preferences Screen |
||||||
|
"Start at Login" = "Pokreni Clocker nakon prijave"; |
||||||
|
"Sort by Time Difference" = "Razvrstaj po vremenskoj ralzici"; |
||||||
|
"Sort by Name" = "Razvrstaj po imenu"; |
||||||
|
"Sort by Label" = "Razvrstaj po oznaci"; |
||||||
|
"Search Field Placeholder" = "Upiši grad, državu ili zemlju"; |
||||||
|
"No Timezone Selected" = "Odaberi vremensku zonu!"; |
||||||
|
"Max Timezones Selected" = "OgraniÄŤeno na 100 vremenskih zona!"; |
||||||
|
"Max Search Characters" = "OgraniÄŤeno na 50 znakova!"; |
||||||
|
"Add Button Title" = "Dodaj"; |
||||||
|
"Close Button Title" = "Zatvori"; |
||||||
|
|
||||||
|
// Onboarding |
||||||
|
"Open Clocker At Login" = "Otvori Clocker nakon prijave"; |
||||||
|
"Launch Clocker" = "Pokreni Clocker"; |
||||||
|
|
||||||
|
// Welcome Onboarding |
||||||
|
"It only takes 3 steps to set up Clocker." = "Za postavljanje programa Clocker potrebna su samo tri koraka."; |
||||||
|
"Get Started" = "PoÄŤetak"; |
||||||
|
|
||||||
|
// Permissions |
||||||
|
"Calendar Access Title" = "Pristup kalendaru"; |
||||||
|
"Reminders Access Title" = "Pristup podsjetnicima"; |
||||||
|
"Later Config Description" = "Mogu se kasnije konfigurirati u postavkama sustava."; |
||||||
|
"Back" = "Natrag"; |
||||||
|
"Continue" = "Nastavi"; |
||||||
|
"Clocker is more useful when it can display events from your calendars." = "Clocker je korisniji kad može prikazivati događaje u tvojim kalendarima."; |
||||||
|
"Clocker is more useful when it can display events from your calendars. You can change this setting in System Preferences › Security & Privacy › Privacy." = "Clocker je korisniji kad može prikazivati događaje u tvojim kalendarima. Ovu postavku možeš promijeniti u Postavke sustava › Sigurnost i privatnost › Privatnost."; |
||||||
|
/* Text for button that takes the user to the System Preferences app. In case the user hasn't given Calendar/Reminders access permission, this button takes you to the System Preferences app where the user can give proper permissions to Clocker. */ |
||||||
|
"Launch Preferences" = "Pokreni postavke"; |
||||||
|
"Grant Access" = "Dopusti pristup"; |
||||||
|
"Upcoming events from your personal and shared calendars can be shown in the menubar and the panel." = "Predstojeći događaji iz tvojih osobnih i zajedničkih kalendara mogu se prikazati u traci izbornika i na ploči."; |
||||||
|
"Granted" = "Dodijeljeno"; |
||||||
|
"Denied" = "Odbijeno"; |
||||||
|
"Grant" = "Odobrenje"; |
||||||
|
"Unexpected" = "NeoÄŤekivano"; |
||||||
|
|
||||||
|
// Onboarding Search |
||||||
|
"Quick Add Locations" = "Brzo dodavanje mjesta"; |
||||||
|
"More search options in Clocker Preferences." = "Daljnje opcije pretage u Clocker postavkama."; |
||||||
|
"Enter 3 or more characters for locations you'll like to add" = "Upiši tri ili više znakova za mjesta koja želiš dodati"; |
||||||
|
|
||||||
|
// Start at Login |
||||||
|
"Launch at Login" = "Pokreni nakon prijave"; |
||||||
|
"This can be configured later in Clocker Preferences." = "Ovo se moĹľe kasnije konfigurirati u Clocker postavkama."; |
||||||
|
"Should Clocker open automatically on startup?" = "Želiš li automatski pokrenuti Clocker nakon pokretanja računala?"; |
||||||
|
|
||||||
|
// Final Onboarding Screen |
||||||
|
"You're all set!" = "Sve je spremno!"; |
||||||
|
"Thank you for the details." = "Hvala ti na detalju."; |
||||||
|
"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." = "Kad pokreneš program, u traci izbornika vidjet ćeš ikonu sata. Ako želiš vidjeti ikonu u traci programa, idi na Postavke."; |
||||||
|
"If you'd like to help us localize the app in your language or receive infrequent app-related updates, please enter your email!" = "Ako želiš pomoći prevesti program na tvoj jezik ili primati rijetke obavijesti o novim verzijama programa, upiši tvoju e-mail adresu!"; |
||||||
|
|
||||||
|
// Appearance Tab |
||||||
|
"Panel Theme" = "Tema ploÄŤe"; |
||||||
|
"Favourite a timezone to enable menubar display options." = "Odaberi vremensku zonu za aktiviranje opcija prikaza trake izbornika."; |
||||||
|
"Main Panel Options" = "Opcije glavne ploÄŤe"; |
||||||
|
"Time Format" = "Format za vrijeme"; |
||||||
|
"Day Display Options" = "Opcije za prikaz dana"; |
||||||
|
"Show Future Slider" = "Prikaži klizač budućnosti"; |
||||||
|
"Show Sunrise/Sunset" = "PrikaĹľi izlazak/zalazak sunca"; |
||||||
|
"Display the time in seconds" = "PrikaĹľi vrijeme u sekundama"; |
||||||
|
"Larger Text" = "Veći tekst"; |
||||||
|
"Future Slider Range" = "Klizač za raspon budućnosti"; |
||||||
|
"Include Date" = "UkljuÄŤi datum"; |
||||||
|
"Include Day" = "UkljuÄŤi dan"; |
||||||
|
"Include Place Name" = "UkljuÄŤi ime mjesta"; |
||||||
|
"Menubar Display Options" = "Opcije prikaza izbornika"; |
||||||
|
/* Appears in Preferences -> Appearance which allows the user to switch between the compact and standard menubar mode. It doesn't lead anywhere. */ |
||||||
|
"Menubar Mode" = "Modus izbornika"; |
||||||
|
"Preview" = " Pregled"; |
||||||
|
"Miscellaneous" = "Razno"; |
||||||
|
|
||||||
|
// Empty View |
||||||
|
"No places added" = "Nema dodanih mjesta"; |
||||||
|
|
||||||
|
// Panel |
||||||
|
"No upcoming event." = "Nema predstojećih događaja."; |
||||||
|
"You have no events scheduled for tomorrow." = "Za sutra nemaš zakazanih događaja."; |
||||||
|
|
||||||
|
// Review |
||||||
|
"Enjoy using Clocker?" = "Voliš Clocker?"; |
||||||
|
|
||||||
|
// App Feedback |
||||||
|
"Tell us what you think!" = "Javi nam što misliš!"; |
||||||
|
"Contact Information (Optional)" = "Kontaktni podaci (opcionalno)"; |
||||||
|
"Contact fields are optional! Your contact information will let us contact you in case we need more information or can help!" = "Polja za kontakt nisu obavezna! Tvoji kontaktni podaci omogućit će nam da te kontaktiramo u slučaju da trebamo daljnje informacije ili ako možemo pomoći!"; |
||||||
|
|
||||||
|
// About View Screen |
||||||
|
"Feedback is always welcome:" = "Uvijek se radujemo povratnim informacijama:"; |
||||||
|
|
||||||
|
// Calendars View |
||||||
|
"Upcoming Event View Options" = "Opcije prikaza predstojećih događaja"; |
||||||
|
"Show Upcoming Event View" = "Prikaži prikaz predstojećih događaja"; |
||||||
|
"Show All Day Meetings" = "PrikaĹľi cjelodnevne sastanke"; |
||||||
|
"Show Next Meeting Title in Menubar" = "Prikaži sljedeći sastanak u traci izbornika"; |
||||||
|
"Truncate menubar text longer than" = "Skrati tekst izbone trake koji je duĹľi od"; |
||||||
|
"characters" = "znakova"; |
||||||
|
"Show events from" = "Prikaži događaje od"; |
||||||
|
"If meeting title is \"Meeting with Neel\" and truncate length is set to 5, text in menubar will appear as \"Meeti...\"" = "Ako je naslov sastanka „Sastanak s Vladimirom”, a kraćenje je postavljeno na 5, tekst na traci pojavit će se kao „Sasta …”"; |
||||||
|
|
||||||
|
// Notes Popover |
||||||
|
"Reminder Set" = "Postavljanje podsjetnika"; |
||||||
|
"Successfully set." = "Uspješno postavljeno."; |
||||||
|
|
||||||
|
// Errors |
||||||
|
"You're offline, maybe?" = "Možda nemaš vezu s internetom?"; |
||||||
|
"Try again, maybe?" = "Želiš li ponovo pokušati?"; |
||||||
|
"The Internet connection appears to be offline." = "ÄŚini se da ne postoji veza s internetom."; |
||||||
|
|
||||||
|
// UI Tests |
||||||
|
"New Zealand" = "Novi Zeland"; |
||||||
|
"Florida" = "Florida"; |
||||||
|
"San Francisco" = "San Francisco"; |
||||||
|
|
||||||
|
// DST changes |
||||||
|
"Daylights Saving transition will occur in < 24 hours" = "Daylights Saving transition will occur in < 24 hours"; |
||||||
|
|
||||||
|
"Copied to Clipboard" = "Copied to Clipboard"; |
@ -0,0 +1,89 @@ |
|||||||
|
// Copyright © 2015 Abhishek Banthia |
||||||
|
|
||||||
|
import Foundation |
||||||
|
import AppKit |
||||||
|
|
||||||
|
class UpcomingEventStatusItemView: NSView { |
||||||
|
static let containerWidth = 70 |
||||||
|
|
||||||
|
private let nextEventField = NSTextField(labelWithString: "Next Event") |
||||||
|
private let etaField = NSTextField(labelWithString: "5 mins") |
||||||
|
var dataObject: EventInfo! { |
||||||
|
didSet { |
||||||
|
initialSetup() |
||||||
|
} |
||||||
|
} |
||||||
|
private var timeAttributes: [NSAttributedString.Key: AnyObject] { |
||||||
|
let textColor = hasDarkAppearance ? NSColor.white : NSColor.black |
||||||
|
|
||||||
|
let attributes = [ |
||||||
|
NSAttributedString.Key.font: compactModeTimeFont, |
||||||
|
NSAttributedString.Key.foregroundColor: textColor, |
||||||
|
NSAttributedString.Key.backgroundColor: NSColor.clear, |
||||||
|
NSAttributedString.Key.paragraphStyle: defaultParagraphStyle, |
||||||
|
] |
||||||
|
return attributes |
||||||
|
} |
||||||
|
|
||||||
|
private var textFontAttributes: [NSAttributedString.Key: Any] { |
||||||
|
let textColor = hasDarkAppearance ? NSColor.white : NSColor.black |
||||||
|
|
||||||
|
let textFontAttributes = [ |
||||||
|
NSAttributedString.Key.font: NSFont.boldSystemFont(ofSize: 10), |
||||||
|
NSAttributedString.Key.foregroundColor: textColor, |
||||||
|
NSAttributedString.Key.backgroundColor: NSColor.clear, |
||||||
|
NSAttributedString.Key.paragraphStyle: defaultParagraphStyle, |
||||||
|
] |
||||||
|
return textFontAttributes |
||||||
|
} |
||||||
|
|
||||||
|
override init(frame frameRect: NSRect) { |
||||||
|
super.init(frame: frameRect) |
||||||
|
|
||||||
|
[etaField, nextEventField].forEach { |
||||||
|
$0.wantsLayer = true |
||||||
|
$0.applyDefaultStyle() |
||||||
|
$0.translatesAutoresizingMaskIntoConstraints = false |
||||||
|
addSubview($0) |
||||||
|
} |
||||||
|
|
||||||
|
etaField.disableWrapping() |
||||||
|
|
||||||
|
NSLayoutConstraint.activate([ |
||||||
|
nextEventField.leadingAnchor.constraint(equalTo: leadingAnchor), |
||||||
|
nextEventField.trailingAnchor.constraint(equalTo: trailingAnchor), |
||||||
|
nextEventField.topAnchor.constraint(equalTo: topAnchor, constant: 7), |
||||||
|
nextEventField.heightAnchor.constraint(equalTo: heightAnchor, multiplier: 0.35), |
||||||
|
]) |
||||||
|
|
||||||
|
NSLayoutConstraint.activate([ |
||||||
|
etaField.leadingAnchor.constraint(equalTo: leadingAnchor), |
||||||
|
etaField.trailingAnchor.constraint(equalTo: trailingAnchor, constant: 0), |
||||||
|
etaField.topAnchor.constraint(equalTo: nextEventField.bottomAnchor), |
||||||
|
etaField.bottomAnchor.constraint(equalTo: bottomAnchor), |
||||||
|
]) |
||||||
|
} |
||||||
|
|
||||||
|
required init?(coder: NSCoder) { |
||||||
|
fatalError("init(coder:) has not been implemented") |
||||||
|
} |
||||||
|
|
||||||
|
private func initialSetup() { |
||||||
|
nextEventField.attributedStringValue = NSAttributedString(string: "Next Event", attributes: textFontAttributes) |
||||||
|
etaField.attributedStringValue = NSAttributedString(string: dataObject.metadataForMeeting(), attributes: timeAttributes) |
||||||
|
} |
||||||
|
|
||||||
|
func updateWithNextEventInfo(_ metadata: String) { |
||||||
|
nextEventField.attributedStringValue = NSAttributedString(string: "Next Event", attributes: textFontAttributes) |
||||||
|
etaField.attributedStringValue = NSAttributedString(string: metadata, attributes: timeAttributes) |
||||||
|
} |
||||||
|
|
||||||
|
override func mouseDown(with event: NSEvent) { |
||||||
|
super.mouseDown(with: event) |
||||||
|
guard let mainDelegate = NSApplication.shared.delegate as? AppDelegate else { |
||||||
|
return |
||||||
|
} |
||||||
|
|
||||||
|
mainDelegate.togglePanel(event) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue