Phase 9: Einrichtung, Autostart, Notarisierung — und die Mixer-Optik
Die Einrichtung beim ersten Start erklärt jede der vier Sachen einzeln und fragt jede einzeln an. Vier Systemdialoge hintereinander wären der übliche Weg und der falsche: wer nicht weiß wofür, klickt viermal „Nicht erlauben", und danach fragt macOS nie wieder. Sie kommt beim ersten Start immer, auch wenn zufällig schon alles erlaubt ist — sie erklärt auch den Helfer und den Autostart. Beim Autostart ist `requiresApproval` der Zustand, der weh tut. Wer das Anmeldeobjekt in den Systemeinstellungen abgeschaltet hat, kann in Onyx auf den Schalter drücken, so oft er will. Als „aus" angezeigt führt das in eine Schleife, also steht dort jetzt, wo es weitergeht. Der Mixer verliert den Schalter je Programm. Zehn Mini-Schalter untereinander sind das, was den Eindruck macht; am Regler zu ziehen ist ohnehin die Entscheidung, dieses Programm zu regeln, und der große Ausschalter stellt alles zurück. Der Regler ist selbst gezeichnet — der Systemregler bringt sein eigenes Erscheinungsbild mit und kann nicht zeigen, worauf es hier ankommt: den Pegel und die Grenze bei 100 %. Der Pegel wird im selben Durchlauf gemessen, in dem verstärkt wird, und über `Atomic` weitergereicht. Eine gewöhnliche Eigenschaft wäre ein Wettlauf, eine Sperre im Audiothread der klassische Weg zu Aussetzern. Dabei fällt das `Date()` aus dem Echtzeitpfad, das dort nie hingehört hat. Zwei Funde beim Bauen des Release-Wegs, beide hätten erst nach dem Hochladen zur Ablehnung geführt: der Helfer wurde ohne sicheren Zeitstempel signiert, und das Adapter-Framework ad-hoc. Beides gilt jetzt nur noch im Debug. Scripts/release.sh prüft Zertifikat und Notarisierungsprofil vorweg, statt nach zehn Minuten Bauen zu scheitern. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,333 +1,358 @@
|
||||
{
|
||||
"sourceLanguage": "en",
|
||||
"strings": {
|
||||
"": {},
|
||||
"%lld": {
|
||||
"comment": "A day of the month. The argument is the day of the month.",
|
||||
"isCommentAutoGenerated": true
|
||||
"sourceLanguage" : "en",
|
||||
"strings" : {
|
||||
"" : {
|
||||
|
||||
},
|
||||
"calendar.source.apple": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Apple Kalender"
|
||||
"%lld" : {
|
||||
"comment" : "A day of the month. The argument is the day of the month.",
|
||||
"isCommentAutoGenerated" : true
|
||||
},
|
||||
"calendar.source.apple" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Apple Kalender"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Apple Calendar"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Apple Calendar"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"calendar.source.both": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Beide"
|
||||
"calendar.source.both" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Beide"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Both"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Both"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"calendar.source.calendarr": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Calendarr"
|
||||
"calendar.source.calendarr" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Calendarr"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Calendarr"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Calendarr"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"calendar.source.readOnly": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Onyx liest nur. Es meldet sich nie selbst an und schreibt nie nach Calendarr."
|
||||
"calendar.source.readOnly" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Onyx liest nur. Es meldet sich nie selbst an und schreibt nie nach Calendarr."
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Onyx only reads. It never signs in and never writes to Calendarr."
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Onyx only reads. It never signs in and never writes to Calendarr."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"calendar.source.status.coverage": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Bekannt bis %@"
|
||||
"calendar.source.status.coverage" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Bekannt bis %@"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Known through %@"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Known through %@"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"calendar.source.status.incompatible": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Calendarr schreibt ein neueres Format. Bitte Onyx aktualisieren."
|
||||
"calendar.source.status.coverage %@" : {
|
||||
"comment" : "A footnote in the Calendarr settings, indicating the end of the coverage window.",
|
||||
"isCommentAutoGenerated" : true
|
||||
},
|
||||
"calendar.source.status.incompatible" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Calendarr schreibt ein neueres Format. Bitte Onyx aktualisieren."
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Calendarr writes a newer format. Please update Onyx."
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Calendarr writes a newer format. Please update Onyx."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"calendar.source.status.loggedOut": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "In Calendarr nicht angemeldet. Alte Termine werden nicht gezeigt."
|
||||
"calendar.source.status.loggedOut" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "In Calendarr nicht angemeldet. Alte Termine werden nicht gezeigt."
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Not signed in to Calendarr. Old events are not shown."
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Not signed in to Calendarr. Old events are not shown."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"calendar.source.status.neverWritten": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Calendarr einmal öffnen, damit ein Schnappschuss geschrieben wird."
|
||||
"calendar.source.status.neverWritten" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Calendarr einmal öffnen, damit ein Schnappschuss geschrieben wird."
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Open Calendarr once so it can write a snapshot."
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Open Calendarr once so it can write a snapshot."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"calendar.source.status.ready": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "%@ Termine, Stand %@"
|
||||
"calendar.source.status.ready" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "%@ Termine, Stand %@"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "%@ events, as of %@"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "%@ events, as of %@"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"calendar.source.status.unreadable": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Schnappschuss unlesbar: %@"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Snapshot unreadable: %@"
|
||||
"calendar.source.status.ready %@ %@" : {
|
||||
"comment" : "Die Anzahl der Termine in der The argument is the string “–”.",
|
||||
"isCommentAutoGenerated" : true,
|
||||
"localizations" : {
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "new",
|
||||
"value" : "calendar.source.status.ready %1$@ %2$@"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"calendar.source.title": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Terminquelle"
|
||||
"calendar.source.status.unreadable" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Schnappschuss unlesbar: %@"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Calendar source"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Snapshot unreadable: %@"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"widget.calendar.allDay": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Ganztägig"
|
||||
"calendar.source.status.unreadable %@" : {
|
||||
"comment" : "A warning message explaining that a Calendarr source is not readable. The argument is a human-readable description of the problem.",
|
||||
"isCommentAutoGenerated" : true
|
||||
},
|
||||
"calendar.source.title" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Terminquelle"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "All day"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Calendar source"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"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"
|
||||
"widget.calendar.allDay" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Ganztägig"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "No data available for this day"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "All day"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"widget.calendar.denied": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Kein Kalenderzugriff.\nIn den Systemeinstellungen erlauben."
|
||||
"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 calendar access.\nAllow it in System Settings."
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "No data available for this day"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"widget.calendar.incompatible": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Onyx ist zu alt für diese\nCalendarr-Version. Bitte aktualisieren."
|
||||
"widget.calendar.denied" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Kein Kalenderzugriff.\nIn den Systemeinstellungen erlauben."
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Onyx is too old for this\nCalendarr version. Please update."
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "No calendar access.\nAllow it in System Settings."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"widget.calendar.loggedOut": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "In Calendarr anmelden"
|
||||
"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": "Sign in to Calendarr"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Onyx is too old for this\nCalendarr version. Please update."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"widget.calendar.name": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Kalender"
|
||||
"widget.calendar.loggedOut" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "In Calendarr anmelden"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Calendar"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Sign in to Calendarr"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"widget.calendar.neverWritten": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Calendarr einmal öffnen,\ndamit Termine bereitstehen."
|
||||
"widget.calendar.name" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Kalender"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Open Calendarr once\nso events become available."
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Calendar"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"widget.calendar.noUpcoming": {
|
||||
"comment": "Nur zeigen, wenn der Zeitraum wirklich abgedeckt ist",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Nichts mehr für heute"
|
||||
"widget.calendar.neverWritten" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Calendarr einmal öffnen,\ndamit Termine bereitstehen."
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Nothing left today"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Open Calendarr once\nso events become available."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"widget.calendar.unreadable": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Termine nicht lesbar.\nKonfigurationsfehler."
|
||||
"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": "Events unreadable.\nConfiguration error."
|
||||
"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"
|
||||
}
|
||||
"version" : "1.1"
|
||||
}
|
||||
Reference in New Issue
Block a user