Menüleiste zeigt das Glyph, nicht das ganze App-Icon
Das vollständige App-Icon bringt die abgerundete Kachel samt Farbverlauf mit. Die gehört in Dock und Finder; in der Menüleiste steht sie als farbiger Klotz zwischen lauter Strichsymbolen. Geladen wird jetzt dieselbe SVG-Datei, aus der auch das App-Icon gebaut wird. NSImage liest sie als Vektor (_NSSVGImageRep), sie skaliert also verlustfrei auf die 18 pt der Menüleiste. Der Weg dorthin ist ein Kopierschritt und keine zweite Datei: actool kompiliert das .icon-Bündel zu .icns und Assets.car und legt nichts Lesbares ins Bundle, und eine einzelne Datei aus dem Bündel lässt sich nicht als Ressource referenzieren — XcodeGen bricht dabei ab. Ein Build-Schritt kopiert sie stattdessen, damit es bei einer Quelldatei bleibt. Weiterhin kein Template-Bild: als Schablone bliebe vom Kristall nur eine schwarze Silhouette.
This commit is contained in:
@@ -114,6 +114,7 @@
|
||||
6B11A5AC704B6429B9484789 /* Sources */,
|
||||
B211CE3C0EF94A8D680E4AE0 /* Resources */,
|
||||
7FF994FE5530D53BEFBE13FE /* Frameworks */,
|
||||
F10EA44D021D8D6C50BEDCAA /* Glyph für die Menüleiste ins Bundle kopieren */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -183,6 +184,29 @@
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
F10EA44D021D8D6C50BEDCAA /* Glyph für die Menüleiste ins Bundle kopieren */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
);
|
||||
inputPaths = (
|
||||
"$(SRCROOT)/Onyx/AppIcon.icon/Assets/quartz.svg",
|
||||
);
|
||||
name = "Glyph für die Menüleiste ins Bundle kopieren";
|
||||
outputFileListPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
"$(BUILT_PRODUCTS_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/quartz.svg",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "SRC=\"$SRCROOT/Onyx/AppIcon.icon/Assets/quartz.svg\"\nDST=\"$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/quartz.svg\"\nif [ -f \"$SRC\" ]; then\n mkdir -p \"$(dirname \"$DST\")\"\n cp \"$SRC\" \"$DST\"\nelse\n echo \"warning: $SRC fehlt — Menüleiste fällt auf ein SF-Symbol zurück\"\nfi\n";
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
6B11A5AC704B6429B9484789 /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
|
||||
@@ -1,490 +1,491 @@
|
||||
{
|
||||
"sourceLanguage": "en",
|
||||
"strings": {
|
||||
"menu.openPanel": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Panel öffnen"
|
||||
"sourceLanguage" : "en",
|
||||
"strings" : {
|
||||
"menu.openPanel" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Panel öffnen"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Open Panel"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Open Panel"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu.quit": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Onyx beenden"
|
||||
"menu.quit" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Onyx beenden"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Quit Onyx"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Quit Onyx"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"menu.settings": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Einstellungen …"
|
||||
"menu.settings" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Einstellungen …"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Settings…"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Settings…"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.display.all": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Allen Displays"
|
||||
"settings.display.all" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Allen Displays"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "All displays"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "All displays"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.display.builtInOnly": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Nur dem internen Display"
|
||||
"settings.display.builtInOnly" : {
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Nur dem internen Display"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Built-in display only"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Built-in display only"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"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."
|
||||
"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."
|
||||
"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"
|
||||
"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"
|
||||
"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."
|
||||
"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."
|
||||
"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"
|
||||
"settings.display.policy" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Panel anzeigen auf"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Show panel on"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Show panel on"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.permissions.calendar": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Kalender"
|
||||
"settings.permissions.calendar" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Kalender"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Calendar"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Calendar"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.permissions.calendar.why": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Onyx zeigt deine Termine im Kalender-Widget an. Es wird ausschließlich gelesen, nie geschrieben."
|
||||
"settings.permissions.calendar.why" : {
|
||||
"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."
|
||||
"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"
|
||||
"settings.permissions.granted" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Erteilt"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Granted"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Granted"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.permissions.openSystem": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Systemeinstellungen öffnen"
|
||||
"settings.permissions.location" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Standort"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Open System Settings"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Location"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.permissions.request": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Anfragen"
|
||||
"settings.permissions.location.why" : {
|
||||
"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": "Request"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Onyx shows the weather for your current location. Without access you can pick a fixed place instead."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.size.large": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Groß (2×2)"
|
||||
"settings.permissions.openSystem" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Systemeinstellungen öffnen"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Large (2×2)"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Open System Settings"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.size.medium": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Mittel (2×1)"
|
||||
"settings.permissions.request" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Anfragen"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Medium (2×1)"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Request"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.size.small": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Klein (1×1)"
|
||||
"settings.size.large" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Groß (2×2)"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Small (1×1)"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Large (2×2)"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.size.wide": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Breit (4×1)"
|
||||
"settings.size.medium" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Mittel (2×1)"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Wide (4×1)"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Medium (2×1)"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.tab.display": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Anzeige"
|
||||
"settings.size.small" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Klein (1×1)"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Display"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Small (1×1)"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.tab.permissions": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Berechtigungen"
|
||||
"settings.size.wide" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Breit (4×1)"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Permissions"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Wide (4×1)"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.tab.widgets": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Widgets"
|
||||
"settings.tab.display" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Anzeige"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Widgets"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Display"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.widgets.add": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Hinzufügen"
|
||||
"settings.tab.permissions" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Berechtigungen"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Add"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Permissions"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.widgets.available": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Verfügbar"
|
||||
"settings.tab.widgets" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Widgets"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Available"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Widgets"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.widgets.empty": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Keine Widgets im Panel. Das Panel bleibt leer, bis du eins hinzufügst."
|
||||
"settings.widgets.add" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Hinzufügen"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "No widgets in the panel. It stays empty until you add one."
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Add"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"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."
|
||||
"settings.widgets.available" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Verfügbar"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "The order determines the arrangement in the panel. Each widget takes the first spot it fits into."
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Available"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.widgets.inPanel": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Im Panel"
|
||||
"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": "In the panel"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "No widgets in the panel. It stays empty until you add one."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.widgets.remove": {
|
||||
"extractionState": "stale",
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Aus dem Panel entfernen"
|
||||
"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": "Remove from panel"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "The order determines the arrangement in the panel. Each widget takes the first spot it fits into."
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.permissions.location": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Standort"
|
||||
"settings.widgets.inPanel" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Im Panel"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Location"
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "In the panel"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"settings.permissions.location.why": {
|
||||
"localizations": {
|
||||
"de": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Onyx zeigt das Wetter an deinem aktuellen Standort. Ohne Zugriff kannst du stattdessen einen festen Ort wählen."
|
||||
"settings.widgets.remove" : {
|
||||
"extractionState" : "stale",
|
||||
"localizations" : {
|
||||
"de" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Aus dem Panel entfernen"
|
||||
}
|
||||
},
|
||||
"en": {
|
||||
"stringUnit": {
|
||||
"state": "translated",
|
||||
"value": "Onyx shows the weather for your current location. Without access you can pick a fixed place instead."
|
||||
"en" : {
|
||||
"stringUnit" : {
|
||||
"state" : "translated",
|
||||
"value" : "Remove from panel"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"version": "1.0"
|
||||
"version" : "1.0"
|
||||
}
|
||||
@@ -159,30 +159,38 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
|
||||
onyxItem = item
|
||||
}
|
||||
|
||||
/// Das App-Icon, auf Menüleistengröße gebracht.
|
||||
/// Das Glyph aus dem App-Icon, auf Menüleistengröße gebracht.
|
||||
///
|
||||
/// Bewusst **kein** Template-Bild: als Schablone bliebe von dem Kristall nur
|
||||
/// eine schwarze Silhouette übrig, und der Verlauf — das Erkennungsmerkmal
|
||||
/// des Icons — wäre weg. Der Preis dafür ist, dass es sich nicht automatisch
|
||||
/// an helle und dunkle Menüleisten anpasst.
|
||||
/// Nicht das vollständige App-Icon: das bringt die abgerundete Kachel samt
|
||||
/// Farbverlauf mit, und die gehört in Dock und Finder, nicht in die
|
||||
/// Menüleiste. Dort steht sie als farbiger Klotz zwischen lauter
|
||||
/// Strichsymbolen.
|
||||
///
|
||||
/// 18 pt ist die übliche Höhe für Menüleistensymbole; die Leiste ist 22 pt
|
||||
/// hoch und braucht oben und unten Luft.
|
||||
/// Geladen wird dieselbe SVG-Datei, aus der auch das App-Icon gebaut wird —
|
||||
/// NSImage liest sie als Vektor (`_NSSVGImageRep`), sie skaliert also
|
||||
/// verlustfrei. Bewusst **kein** Template-Bild: als Schablone bliebe vom
|
||||
/// Kristall eine schwarze Silhouette. Der Preis ist, dass er sich nicht
|
||||
/// automatisch an helle und dunkle Menüleisten anpasst.
|
||||
///
|
||||
/// 18 pt ist die übliche Höhe; die Leiste ist 22 pt hoch und braucht oben
|
||||
/// und unten Luft.
|
||||
private static func menuBarIcon() -> NSImage {
|
||||
guard let source = NSApp.applicationIconImage else {
|
||||
// Sollte nicht vorkommen, aber ein Menüleisteneintrag ohne Symbol
|
||||
// wäre unsichtbar und die App damit unerreichbar.
|
||||
return NSImage(systemSymbolName: "circle.hexagongrid.fill",
|
||||
accessibilityDescription: "Onyx") ?? NSImage()
|
||||
let size = NSSize(width: 18, height: 18)
|
||||
|
||||
if let url = Bundle.main.url(forResource: "quartz", withExtension: "svg"),
|
||||
let glyph = NSImage(contentsOf: url) {
|
||||
let image = NSImage(size: size, flipped: false) { rect in
|
||||
glyph.draw(in: rect, from: .zero, operation: .sourceOver, fraction: 1)
|
||||
return true
|
||||
}
|
||||
image.accessibilityDescription = "Onyx"
|
||||
return image
|
||||
}
|
||||
|
||||
let size = NSSize(width: 18, height: 18)
|
||||
let image = NSImage(size: size, flipped: false) { rect in
|
||||
source.draw(in: rect, from: .zero, operation: .sourceOver, fraction: 1)
|
||||
return true
|
||||
}
|
||||
image.accessibilityDescription = "Onyx"
|
||||
return image
|
||||
// Ein Menüleisteneintrag ohne Bild wäre unsichtbar und die App darüber
|
||||
// unerreichbar — deshalb ein Rückfall statt eines leeren Knopfs.
|
||||
return NSImage(systemSymbolName: "circle.hexagongrid.fill",
|
||||
accessibilityDescription: "Onyx") ?? NSImage()
|
||||
}
|
||||
|
||||
private func observeMenuBarPreference() {
|
||||
|
||||
20
project.yml
20
project.yml
@@ -49,6 +49,26 @@ targets:
|
||||
product: CalendarProvider
|
||||
- package: OnyxKit
|
||||
product: WeatherProvider
|
||||
postBuildScripts:
|
||||
# Das Menüleistensymbol soll das Glyph aus dem App-Icon zeigen, nicht die
|
||||
# abgerundete Kachel mit Verlauf. actool kompiliert das .icon-Bündel zu
|
||||
# .icns und Assets.car und legt nichts Lesbares ins Bundle — und eine
|
||||
# einzelne Datei daraus lässt sich nicht als Ressource referenzieren.
|
||||
# Deshalb kopieren statt duplizieren: es bleibt bei einer Quelldatei.
|
||||
- name: Glyph für die Menüleiste ins Bundle kopieren
|
||||
script: |
|
||||
SRC="$SRCROOT/Onyx/AppIcon.icon/Assets/quartz.svg"
|
||||
DST="$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/quartz.svg"
|
||||
if [ -f "$SRC" ]; then
|
||||
mkdir -p "$(dirname "$DST")"
|
||||
cp "$SRC" "$DST"
|
||||
else
|
||||
echo "warning: $SRC fehlt — Menüleiste fällt auf ein SF-Symbol zurück"
|
||||
fi
|
||||
inputFiles:
|
||||
- $(SRCROOT)/Onyx/AppIcon.icon/Assets/quartz.svg
|
||||
outputFiles:
|
||||
- $(BUILT_PRODUCTS_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/quartz.svg
|
||||
settings:
|
||||
base:
|
||||
PRODUCT_BUNDLE_IDENTIFIER: com.scarriffleservices.onyx
|
||||
|
||||
Reference in New Issue
Block a user