Die M-Serie-Konvention gilt auch auf dem M5: Tp* sind die CPU-Kerne, Tg* die GPU-Cluster. Gezeigt wird der wärmste Punkt, nicht der Durchschnitt — gedrosselt wird nach dem heißesten Kern. Gemessen: CPU 76 °C, GPU 70 °C. Die Fühlerliste wird zur Laufzeit gesucht statt fest verdrahtet: welche es gibt, hängt am Modell. Auf diesem Mac sind es 285 Temperaturfühler. Zwei Leistungsprobleme, gefunden bevor sie jemandem auffallen konnten: Die Suche geht alle 3486 Keys durch und braucht knapp eine Sekunde. Auf dem Hauptthread wäre das eine spürbare Startverzögerung — sie läuft jetzt im Hintergrund, bis dahin zeigt die Oberfläche "—" statt einer erfundenen Zahl. Fünfzig Fühler zu lesen kostete 34 ms je Abtastung, bei 1 Hz also 3,4 % CPU. Zwei Maßnahmen: Typ und Größe je Key werden zwischengespeichert (sie stehen in der Firmware fest, sie bei jedem Lesen zu erfragen verdoppelte die IOKit-Aufrufe), und Temperaturen werden höchstens alle zwei Sekunden neu gelesen — sie bewegen sich in einer Sekunde ohnehin kaum. Ergebnis: 6 ms Grundlast, 18 ms alle zwei Sekunden, im Mittel gut 1 %. Dabei noch eine Eigenheit gefunden: die Byte-Reihenfolge im SMC ist nicht durchgängig. Messwerte wie B0AV kommen little-endian aus dem Akku-Baustein, die Metadaten des SMC selbst dagegen big-endian. #KEY little-endian gelesen ergibt 2 651 652 096 statt 3486 — die Fühlersuche brach damit still ab und alle Temperaturen blieben leer. Lüfterdrehzahlen stehen jetzt im Sensor-Popover, mit Balken zwischen Minimum und Maximum der Firmware: "2321 U/min" allein sagt niemandem, ob das viel ist. Die Steuerung selbst kommt mit Phase 6 — Schreibzugriff auf den SMC verlangt root — und der Popover sagt das auch. 145 Tests grün.
746 lines
18 KiB
Plaintext
746 lines
18 KiB
Plaintext
{
|
||
"sourceLanguage" : "en",
|
||
"strings" : {
|
||
"menu.openPanel" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Panel öffnen"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Open Panel"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"menu.quit" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Onyx beenden"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Quit Onyx"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"menu.settings" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Einstellungen …"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Settings…"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"metric.battery" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Akku"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Battery"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"metric.cpu" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "CPU"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "CPU"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"metric.gpu" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "GPU"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "GPU"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"metric.memory" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Speicher"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Memory"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"metric.sensors" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Sensoren"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Sensors"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"network.name" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Netzwerk"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Network"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.display.all" : {
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Allen Displays"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "All displays"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.display.builtInOnly" : {
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Nur dem internen Display"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Built-in display only"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.display.dockIcon" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Symbol im Dock anzeigen"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Show icon in the Dock"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.display.dockIcon.hint" : {
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Standardmäßig aus. Onyx lebt in der Notch und in der Menüleiste und hat kein Hauptfenster — im Dock wäre es ein Symbol, das beim Anklicken nichts öffnet, und es stünde im Programmumschalter zwischen den Programmen, mit denen du arbeitest."
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Off by default. Onyx lives in the notch and the menu bar and has no main window — in the Dock it would be an icon that opens nothing, and it would sit in the app switcher among the apps you actually work with."
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.display.hint" : {
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Auf Displays ohne echte Notch erscheint oben mittig ein Balken, der sich genauso verhält. Ist der Deckel geschlossen und kein internes Display vorhanden, erscheint das Panel trotzdem auf einem externen — sonst wäre Onyx nicht erreichbar."
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "On displays without a real notch, a bar appears at the top centre and behaves the same. With the lid closed and no built-in display present, the panel still appears on an external one — otherwise Onyx would be unreachable."
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.display.menuBarIcon" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Symbol in der Menüleiste anzeigen"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Show icon in the menu bar"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.display.menuBarIcon.hint" : {
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Über das Symbol erreichst du Panel, Einstellungen und Beenden. Ohne es kommst du nur über die Notch an Onyx heran."
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "The icon gives you the panel, settings and quit. Without it, the notch is the only way to reach Onyx."
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.display.policy" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Panel anzeigen auf"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Show panel on"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.menubar.bars" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Balken"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Bars"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.menubar.graph" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Verlauf"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Graph"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.menubar.hint" : {
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Jedes Modul erscheint als eigenes Symbol in der Menüleiste und teilt sich die Messung mit dem Widget im Panel. Standardmäßig ist keines an — die Menüleiste ist knapp, auf einem Notch-Display zusätzlich in der Mitte blockiert."
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Each module appears as its own menu bar icon and shares its measurement with the panel widget. None are on by default — the menu bar is tight, and on a notched display the middle is blocked as well."
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.menubar.symbol" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Nur Symbol"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Symbol only"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.menubar.value" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Wert"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Value"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.menubar.valueAndGraph" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Wert und Verlauf"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Value and graph"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.permissions.calendar" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Kalender"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Calendar"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.permissions.calendar.why" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Onyx zeigt deine Termine im Kalender-Widget an. Es wird ausschließlich gelesen, nie geschrieben."
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Onyx shows your events in the calendar widget. It only ever reads, never writes."
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.permissions.granted" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Erteilt"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Granted"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.permissions.location" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Standort"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Location"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.permissions.location.why" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Onyx zeigt das Wetter an deinem aktuellen Standort. Ohne Zugriff kannst du stattdessen einen festen Ort wählen."
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Onyx shows the weather for your current location. Without access you can pick a fixed place instead."
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.permissions.openSystem" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Systemeinstellungen öffnen"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Open System Settings"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.permissions.request" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Anfragen"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Request"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.size.large" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Groß (2×2)"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Large (2×2)"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.size.medium" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Mittel (2×1)"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Medium (2×1)"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.size.small" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Klein (1×1)"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Small (1×1)"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.size.wide" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Breit (4×1)"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Wide (4×1)"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.tab.display" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Anzeige"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Display"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.tab.menubar" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Menüleiste"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Menu bar"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.tab.permissions" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Berechtigungen"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Permissions"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.tab.widgets" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Widgets"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Widgets"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.widgets.add" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Hinzufügen"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Add"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.widgets.available" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Verfügbar"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Available"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.widgets.empty" : {
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Keine Widgets im Panel. Das Panel bleibt leer, bis du eins hinzufügst."
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "No widgets in the panel. It stays empty until you add one."
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.widgets.hint" : {
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Die Reihenfolge bestimmt die Anordnung im Panel. Jedes Widget rückt an die erste Stelle, an die es passt."
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "The order determines the arrangement in the panel. Each widget takes the first spot it fits into."
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.widgets.inPanel" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Im Panel"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "In the panel"
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"settings.widgets.remove" : {
|
||
"extractionState" : "stale",
|
||
"localizations" : {
|
||
"de" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Aus dem Panel entfernen"
|
||
}
|
||
},
|
||
"en" : {
|
||
"stringUnit" : {
|
||
"state" : "translated",
|
||
"value" : "Remove from panel"
|
||
}
|
||
}
|
||
}
|
||
}
|
||
},
|
||
"version" : "1.0"
|
||
} |