Zwei Fehler, beide durch Messen gefunden statt durch Raten — und einer davon war meine eigene fehlerhafte Diagnose: `log show` wurde von zsh abgefangen, ich hatte stderr umgeleitet und die Fehlermeldung nie gesehen. Meine Aussage "keine TCC-Einträge, also wurde nie gefragt" stützte sich damit auf einen Befehl, der gar nicht lief. Einstellungsfenster: SwiftUIs Settings-Szene wird über den privaten Selektor showSettingsWindow: geöffnet, dessen Name sich zwischen macOS-Versionen schon geändert hat und der bei .accessory-Apps ohne Menüleiste unzuverlässig ankommt. Der Menüeintrag tat schlicht nichts. Jetzt ein eigenes NSWindow. Kalenderberechtigung, zwei Ursachen übereinander: Xcode lagert im Debug-Build den Programmcode in eine eigene dylib aus (für SwiftUI-Vorschauen). Das Hauptprogramm ist dann nur ein Rumpf, und TCC ordnete die Anfrage dem Rumpf zu — kTCCServiceCalendar erreichte tccd überhaupt nicht. ENABLE_DEBUG_DYLIB = NO behebt das; danach erscheint die Anfrage im Protokoll. Danach immer noch kein Dialog: promptType 1, aber promptPolicy 0. TCC bereitet den Dialog vor und entscheidet sich dagegen, weil keine App im Vordergrund ist, an die er gehören könnte. NSApp.activate davor hilft nicht — Aktivierung wirkt asynchron und ist beim Aufruf noch nicht durch. Deshalb wird beim ersten Start das Einstellungsfenster auf dem Reiter Berechtigungen geöffnet: dort steht ein echtes Fenster im Vordergrund, und der Nutzer weiß, warum gefragt wird. Folgefehler dabei: ohne Berechtigung zeigte das Widget "Nichts mehr für heute" — eine Aussage, die es ohne Zugriff gar nicht treffen kann. refresh() fragt jetzt nicht mehr selbst nach und meldet ohne Berechtigung ehrlich `denied`. Fehler aus requestFullAccessToEvents werden nicht mehr mit try? verschluckt.
159 lines
3.9 KiB
Plaintext
159 lines
3.9 KiB
Plaintext
{
|
|
"sourceLanguage" : "en",
|
|
"strings" : {
|
|
"" : {
|
|
|
|
},
|
|
"%lld" : {
|
|
"comment" : "A day of the month. The argument is the day of the month.",
|
|
"isCommentAutoGenerated" : true
|
|
},
|
|
"widget.calendar.allDay" : {
|
|
"localizations" : {
|
|
"de" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "Ganztägig"
|
|
}
|
|
},
|
|
"en" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "All day"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"widget.calendar.day.unknown" : {
|
|
"comment" : "Erklärt einen ausgegrauten Tag: keine Information, nicht keine Termine",
|
|
"localizations" : {
|
|
"de" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "Für diesen Tag liegen keine Daten vor"
|
|
}
|
|
},
|
|
"en" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "No data available for this day"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"widget.calendar.denied" : {
|
|
"localizations" : {
|
|
"de" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "Kein Kalenderzugriff.\nIn den Systemeinstellungen erlauben."
|
|
}
|
|
},
|
|
"en" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "No calendar access.\nAllow it in System Settings."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"widget.calendar.incompatible" : {
|
|
"localizations" : {
|
|
"de" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "Onyx ist zu alt für diese\nCalendarr-Version. Bitte aktualisieren."
|
|
}
|
|
},
|
|
"en" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "Onyx is too old for this\nCalendarr version. Please update."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"widget.calendar.loggedOut" : {
|
|
"localizations" : {
|
|
"de" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "In Calendarr anmelden"
|
|
}
|
|
},
|
|
"en" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "Sign in to Calendarr"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"widget.calendar.name" : {
|
|
"localizations" : {
|
|
"de" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "Kalender"
|
|
}
|
|
},
|
|
"en" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "Calendar"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"widget.calendar.neverWritten" : {
|
|
"localizations" : {
|
|
"de" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "Calendarr einmal öffnen,\ndamit Termine bereitstehen."
|
|
}
|
|
},
|
|
"en" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "Open Calendarr once\nso events become available."
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"widget.calendar.noUpcoming" : {
|
|
"comment" : "Nur zeigen, wenn der Zeitraum wirklich abgedeckt ist",
|
|
"localizations" : {
|
|
"de" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "Nichts mehr für heute"
|
|
}
|
|
},
|
|
"en" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "Nothing left today"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"widget.calendar.unreadable" : {
|
|
"localizations" : {
|
|
"de" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "Termine nicht lesbar.\nKonfigurationsfehler."
|
|
}
|
|
},
|
|
"en" : {
|
|
"stringUnit" : {
|
|
"state" : "translated",
|
|
"value" : "Events unreadable.\nConfiguration error."
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"version" : "1.1"
|
|
} |