Der letzte Commit dieser Woche löscht eine einzige Zeile von der Marketing-Website: den Preis. Ich will ihn nicht verstecken, er verträgt sich nur schlecht mit dem neuen Probezeitraum. Sieben Tage sind gratis, danach nennt der App Store selbst die Zahlen. Das klingt nach einer kleinen Entscheidung. Die ganze Woche davor diente aber der Vorbereitung genau dieses Moments: Civo Cloud Manager sollte bereit sein für einen größeren Markt und die macOS-App-Entwicklung eine Stufe höher heben. Dazu gehörten sechzehn Sprachen, ein neues Icon, ein siebentägiger kostenloser Testzeitraum und eine Menge kleiner Fehler, die ich endlich vollständig abgearbeitet habe.
Civo Cloud Manager: von drei auf sechzehn Sprachen
Sechzehn Sprachen in wenigen Tagen, und warum das trotzdem nicht trivial ist
Bis Anfang dieser Woche unterstützte Civo Cloud Manager drei Sprachen, seit dem Ende der Woche sind es sechzehn: Englisch, Deutsch, Französisch, Spanisch, Japanisch, Chinesisch (vereinfacht und traditionell), Koreanisch, Arabisch, Portugiesisch, Russisch, Italienisch, Niederländisch, Polnisch, Schwedisch und Türkisch. Das klingt nach ein paar langen Stunden mit einem Übersetzungsdienst, und so war es auch. Schwierig war aber nicht das Übersetzen, sondern die Infrastruktur drumherum.
Jede neue Sprache zieht sich durch das ganze Projekt: durch die .xcstrings-Datei in Xcode, durch die Rechtsdokumente (Datenschutz, AGB, Impressum, die ich nebenbei auf DigitalFreedom Global LLC umgestellt habe), durch die Paywall-Texte, die Hilfeseiten und natürlich durch die sechzehn Sprachfassungen der Marketing-Website. Der entscheidende Commit war aead433. Danach folgten drei Nachbesserungen für Details, die ich im ersten Durchgang übersehen hatte: die Einheit für CPU-Kerne in der Instanzansicht, die Beschriftungen im Quota-Editor und die Hilfetexte zu den Käufen. Kleinigkeiten. Aber auf Japanisch sieht „1 Core“ eben anders aus als auf Deutsch, und das Betriebssystem kennt keine Gnade, wenn ein Format-String fehlt.
Wirklich aufgehalten hat mich die Prüfung der Lokalisierung beim Build. Xcode prüft Lokalisierungen nicht zur Laufzeit, und es gibt keinen automatischen Hinweis, wenn ein String in einer von sechzehn Sprachen fehlt. Deshalb habe ich ein eigenes Prüfskript geschrieben, das die Build-Ausgabe auswertet und fehlende Keys meldet. Es steht jetzt im Makefile und läuft vor jedem Release-Build. Das hätte ich früher haben sollen.
Das neue App-Icon und was dahintersteckt
Das alte Icon war orange und passte nie richtig, denn Civo hat eine klare Markenfarbe, und die ist ein helles Limettengrün. Gegen Ende der Woche habe ich das Icon auf ein grünes Motiv aus Wolke und Schild umgestellt und zugleich die Akzentfarbe der Marketing-Website von Orange auf das Civo-Grün gewechselt. Das klingt nach Kosmetik, und teilweise ist es das auch. Ein Icon, das optisch zur Plattform passt, auf die es sich bezieht, ist aber kein Zufall. Es ist das Erste, was ein Nutzer im App Store sieht. Wenn das Icon schon zeigt, dass die App zu Civo gehört, muss ich das im Text nicht mehr erklären.
Gleichzeitig flog das alte Platzhalter-Mockup von der Website. Dort stand seit Monaten ein allgemeines MacBook-Bild, das die App nie wirklich zeigte. Jetzt ist das Icon sauber freigestellt und gut erkennbar, und das Mockup ist weg. Auch das hätte ich ehrlich gesagt früher erledigen sollen.
Firewall-Persistenz und ein Fehler, der mich zweimal erwischt hat
Mit meinem ersten Ansatz war ich hier nicht zufrieden. Die Firewall-Funktion in Civo Cloud Manager öffnet und schließt Firewall-Regeln automatisch direkt aus der Menüleiste. Sie hatte ein Problem: Schlug das Schließen einer Regel fehl, etwa durch einen Netzwerkfehler oder ein API-Timeout, verlor die App ihren Zustand. Beim nächsten Start wusste sie nicht mehr, dass noch ein Wiederholungsversuch ausstand.
Behoben habe ich das in zwei Schritten. Zuerst (7c74cab) speichere ich die Fristen für das Schließen von Firewall-Regeln dauerhaft und schreibe fehlgeschlagene Löschanfragen in eine Warteschlange für Wiederholungen, die einen Neustart der App übersteht. Danach (70d1e98) habe ich den manuellen Zurücksetzen-Mechanismus angepasst: Wenn der Nutzer einen Fehler ausdrücklich bestätigt, wird der Zustand gespeichert, bevor die Fehlermeldung gelöscht wird, und nicht erst danach. Das klingt nach einer Kleinigkeit, ist aber ein klassischer Denkfehler rund um Race Conditions, der mir im ersten Durchgang unterlaufen war. Erst schreiben, dann löschen, nicht umgekehrt. Im zweiten Anlauf sitzt es.
Ebenfalls neu in dieser Woche: Die App prüft jetzt Kubernetes-Serverzertifikate, bevor sie einer TLS-Verbindung vertraut. Diesen Punkt hatte ich schon länger vor mir hergeschoben. Die Lösung steckt in b9fe474. Vor dem Verbindungsaufbau wird das Serverzertifikat gegen die CA geprüft, die im Konfigurationsprofil des Clusters hinterlegt ist. Wer mit selbst signierten Zertifikaten arbeitet, bekommt eine klare Rückmeldung statt eines stummen TLS-Fehlers.
Sieben Tage gratis, und warum der Preis von der Website musste
Über einen kostenlosen Testzeitraum hatte ich schon länger nachgedacht. Civo Cloud Manager richtet sich an DevOps-Engineers und Entwickler, die Civo Cloud nutzen. Diese Zielgruppe probiert Werkzeuge aus, bevor sie kauft. Ein einmaliger Kaufpreis ohne Testmöglichkeit ist hier eine Hürde, die ich nicht brauche. Deshalb gilt jetzt: sieben Tage gratis, danach der reguläre Preis über den App Store.
Genau deshalb ist der Preis von der Website verschwunden. Ich will ihn nicht verbergen. Eine Marketing-Website, die einen Preis nennt, den der App Store in anderer Währung, mit lokalen Steuern und regionaler Preisgestaltung anzeigt, stiftet aber mehr Verwirrung als Klarheit. Der App Store kann das besser darstellen als ich in statischem HTML. Also überlasse ich es ihm.
Nebenschauplätze dieser Woche
Die Marketing-Website (civo-cloud-manager.app) hat diese Woche mit der App Schritt gehalten. Ich habe SEO- und GEO-Fehler behoben, die mir beim Durchsehen der Search Console aufgefallen waren, und die Sprachliste der App an einer zentralen Stelle zusammengeführt, statt sie über drei Komponenten verteilt zu pflegen. Außerdem haben alle Sprachfassungen den vollständigen Themencluster bekommen. Sechs neue Sprachversionen der Website kamen ebenfalls dazu, was nur folgerichtig ist, wenn die App gerade in sechzehn Sprachen erscheint.
Eine kleine statische Website hatte wie in der Vorwoche genau einen Commit: Daten aufgefrischt, deployt, fertig. Diese Art von Wartung fällt nicht auf, weil sie funktioniert.
Was das für Sie bedeutet, wenn Sie eine macOS-App bauen lassen
Lokalisierung gehört zu den am meisten unterschätzten Entscheidungen, und sie wird am teuersten, wenn man sie nachträglich einbaut. Wer von Anfang an mit .xcstrings und einem sauberen Prüfskript arbeitet, kann sechzehn Sprachen in einer Woche ausrollen. Wer die Strings erst später aus dem Code herauslöst, zahlt dreifach, in Aufwand und in Fehlern.
Wenn Sie überlegen, eine native macOS-App entwickeln zu lassen, und wissen möchten, wie ich dabei vorgehe, von der Architektur bis zur Veröffentlichung im App Store, finden Sie unter Leistungen einen Überblick.
Den aktuellen Stand von Civo Cloud Manager sehen Sie auf civo-cloud-manager.app.