fix: User-facing Strings Cards → Cardecky komplett, Build 3

User-facing Rebrand:
- LoginView Heading (war schon in v0.8.5)
- NotificationManager.title (war schon in v0.8.5)
- ShareEditorView Footer-Text: "...in der Cards-App" → "...in der Cardecky-App"
- StudyAppIntents Description: "Öffnet Cards" → "Öffnet Cardecky"
- Localizable.xcstrings: "Cards" key → "Cardecky"
- NSPhotoLibraryUsageDescription: "Cards greift..." → "Cardecky greift..."
- Log.app.info("Cards starting") → "Cardecky starting"
- MARKETING_COPY.md: alle "Cards"-Treffer in DE + EN auf Cardecky
- RELEASE_CHECKLIST: App-Name "Cards" → "Cardecky"

Build-Nummer 2 → 3 (Apple lehnt doppelte Build-Nummern ab, Code-
Hash hat sich geändert).

Code-Identifier bleiben: CardsAPI, CardsTheme, CardsNativeApp,
CardsWidgetExtension, CardsShareExtension — interne Symbol-Namen,
nicht user-facing.

Archive verifiziert: CFBundleDisplayName=Cardecky, Build=3.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-05-13 15:11:11 +02:00
parent 2eb7f61f9c
commit b5edf5cf2e
7 changed files with 19 additions and 19 deletions

View file

@ -39,7 +39,7 @@ struct ShareEditorView: View {
} }
} }
Section { Section {
Text("Wähle das Ziel-Deck in der Cards-App.") Text("Wähle das Ziel-Deck in der Cardecky-App.")
.font(.caption) .font(.caption)
.foregroundStyle(.secondary) .foregroundStyle(.secondary)
} }

View file

@ -18,7 +18,7 @@ struct CardsNativeApp: App {
auth.bootstrap() auth.bootstrap()
_auth = State(initialValue: auth) _auth = State(initialValue: auth)
mediaCache = MediaCache(api: CardsAPI(auth: auth)) mediaCache = MediaCache(api: CardsAPI(auth: auth))
Log.app.info("Cards starting — auth status: \(String(describing: auth.status), privacy: .public)") Log.app.info("Cardecky starting — auth status: \(String(describing: auth.status), privacy: .public)")
} }
var body: some Scene { var body: some Scene {

View file

@ -7,7 +7,7 @@ import SwiftUI
struct StudyCardsIntent: AppIntent { struct StudyCardsIntent: AppIntent {
static let title: LocalizedStringResource = "Karten lernen" static let title: LocalizedStringResource = "Karten lernen"
static let description = IntentDescription( static let description = IntentDescription(
"Öffnet Cards und zeigt deine Decks mit fälligen Karten.", "Öffnet Cardecky und zeigt deine Decks mit fälligen Karten.",
categoryName: "Lernen" categoryName: "Lernen"
) )
static let openAppWhenRun: Bool = true static let openAppWhenRun: Bool = true

View file

@ -31,7 +31,7 @@
"Card-Type »%@« kommt in einer späteren Phase" : { "Card-Type »%@« kommt in einer späteren Phase" : {
}, },
"Cards" : { "Cardecky" : {
}, },
"Changelog" : { "Changelog" : {

View file

@ -7,7 +7,7 @@ gegenlesen, Tonalität an Vereins-Stil schärfen (siehe `mana/docs/BRAND.md`,
## Name + Subtitle ## Name + Subtitle
**App-Name:** `Cards` **App-Name:** `Cardecky`
**Subtitle (max 30 Zeichen):** `Karteikarten — mana e.V.` **Subtitle (max 30 Zeichen):** `Karteikarten — mana e.V.`
## Keywords (max 100 Zeichen, comma-separated) ## Keywords (max 100 Zeichen, comma-separated)
@ -21,7 +21,7 @@ Karteikarten,Spaced Repetition,Lernen,Vokabeln,Anki,Flashcards,FSRS,mana,Verein,
## Description — DE (max 4000 Zeichen) ## Description — DE (max 4000 Zeichen)
``` ```
Cards ist die Karteikarten-App des Vereins mana e.V. — Spaced Cardecky ist die Karteikarten-App des Vereins mana e.V. — Spaced
Repetition wie es sein soll: ohne Werbung, ohne Tracking, ohne Repetition wie es sein soll: ohne Werbung, ohne Tracking, ohne
Abo-Zwang. Abo-Zwang.
@ -33,13 +33,13 @@ KARTEN, WIE DU SIE BRAUCHST
- Audio-Karten für Sprachen und Aussprache - Audio-Karten für Sprachen und Aussprache
MODERNER LERN-ALGORITHMUS MODERNER LERN-ALGORITHMUS
Cards nutzt FSRS (Free Spaced Repetition Scheduler), den genauesten Cardecky nutzt FSRS (Free Spaced Repetition Scheduler), den genauesten
offenen Algorithmus für Karteikarten. Karten kommen wieder, wenn du offenen Algorithmus für Karteikarten. Karten kommen wieder, wenn du
sie wirklich brauchst — nicht nach willkürlichen Intervallen. sie wirklich brauchst — nicht nach willkürlichen Intervallen.
OFFLINE LERNEN OFFLINE LERNEN
Karten cachen lokal auf deinem Gerät. Im Flugzeug, in der U-Bahn, Karten cachen lokal auf deinem Gerät. Im Flugzeug, in der U-Bahn,
ohne WLAN — Cards funktioniert. Deine Bewertungen werden gequeued ohne WLAN — Cardecky funktioniert. Deine Bewertungen werden gequeued
und beim nächsten Online-Moment automatisch hochgeladen. und beim nächsten Online-Moment automatisch hochgeladen.
WIDGETS UND NOTIFICATIONS WIDGETS UND NOTIFICATIONS
@ -53,7 +53,7 @@ Sprachen, Wissenschaft. Abonnieren = Karten landen direkt in deiner
Bibliothek, du kannst sie nach Belieben anpassen. Bibliothek, du kannst sie nach Belieben anpassen.
VEREIN, NICHT FIRMA VEREIN, NICHT FIRMA
Cards wird vom Verein mana e.V. (Schweiz, in Gründung) betrieben. Cardecky wird vom Verein mana e.V. (Schweiz, in Gründung) betrieben.
Kein Tracking, kein Werbe-Anbieter, kein Crash-Reporter. Wenn du dem Kein Tracking, kein Werbe-Anbieter, kein Crash-Reporter. Wenn du dem
Verein etwas zurückgeben willst: mana-ev.ch/spende. Verein etwas zurückgeben willst: mana-ev.ch/spende.
@ -71,7 +71,7 @@ selbst.
## Description — EN (max 4000 Zeichen) ## Description — EN (max 4000 Zeichen)
``` ```
Cards is the flashcard app from mana e.V. — spaced repetition the Cardecky is the flashcard app from mana e.V. — spaced repetition the
way it should be: no ads, no tracking, no subscription pressure. way it should be: no ads, no tracking, no subscription pressure.
THE CARDS YOU NEED THE CARDS YOU NEED
@ -80,12 +80,12 @@ THE CARDS YOU NEED
- Audio cards for languages and pronunciation - Audio cards for languages and pronunciation
MODERN SPACED-REPETITION MODERN SPACED-REPETITION
Cards uses FSRS (Free Spaced Repetition Scheduler), the most accurate Cardecky uses FSRS (Free Spaced Repetition Scheduler), the most accurate
open algorithm available. Cards come back when you actually need them. open algorithm available. Your cards come back when you actually need them.
OFFLINE-FIRST OFFLINE-FIRST
Decks cache locally on your device. On a plane, in the subway, off Decks cache locally on your device. On a plane, in the subway, off
the grid — Cards keeps working. Your reviews queue up and sync on the grid — Cardecky keeps working. Your reviews queue up and sync on
the next online moment. the next online moment.
WIDGETS AND REMINDERS WIDGETS AND REMINDERS
@ -97,7 +97,7 @@ Browse public decks from the Cardecky community: geography, languages,
science. Subscribe = decks land in your library, ready to be edited. science. Subscribe = decks land in your library, ready to be edited.
ASSOCIATION, NOT CORPORATION ASSOCIATION, NOT CORPORATION
Cards is operated by mana e.V. (Switzerland, formation in progress). Cardecky is operated by mana e.V. (Switzerland, formation in progress).
No tracking, no ad networks, no crash reporters. Want to give back? No tracking, no ad networks, no crash reporters. Want to give back?
mana-ev.ch/donate. mana-ev.ch/donate.

View file

@ -88,7 +88,7 @@ AASA) und über Xcode (für Build + Sign).
- [ ] **App-Eintrag erstellen** unter https://appstoreconnect.apple.com - [ ] **App-Eintrag erstellen** unter https://appstoreconnect.apple.com
mit Bundle-ID `ev.mana.cardecky`. mit Bundle-ID `ev.mana.cardecky`.
- [ ] **App-Name** + **Subtitle** (max 30 Zeichen): - [ ] **App-Name** + **Subtitle** (max 30 Zeichen):
- Name: "Cards" - Name: "Cardecky"
- Subtitle: "Karteikarten — Verein mana" - Subtitle: "Karteikarten — Verein mana"
- [ ] **Description** (de + en, max 4000 Zeichen). Vorschlag in - [ ] **Description** (de + en, max 4000 Zeichen). Vorschlag in
[`docs/MARKETING_COPY.md`](MARKETING_COPY.md) — vor Submission [`docs/MARKETING_COPY.md`](MARKETING_COPY.md) — vor Submission

View file

@ -55,7 +55,7 @@ targets:
path: Sources/Resources/Info.plist path: Sources/Resources/Info.plist
properties: properties:
CFBundleShortVersionString: "0.1.0" CFBundleShortVersionString: "0.1.0"
CFBundleVersion: "2" CFBundleVersion: "3"
CFBundleDevelopmentRegion: de CFBundleDevelopmentRegion: de
CFBundleDisplayName: Cardecky CFBundleDisplayName: Cardecky
LSApplicationCategoryType: "public.app-category.education" LSApplicationCategoryType: "public.app-category.education"
@ -75,7 +75,7 @@ targets:
- cards - cards
NSUserActivityTypes: NSUserActivityTypes:
- NSUserActivityTypeBrowsingWeb - NSUserActivityTypeBrowsingWeb
NSPhotoLibraryUsageDescription: "Cards greift auf deine Fotos zu, damit du Bilder zu Image-Occlusion-Karten hinzufügen kannst." NSPhotoLibraryUsageDescription: "Cardecky greift auf deine Fotos zu, damit du Bilder zu Image-Occlusion-Karten hinzufügen kannst."
ITSAppUsesNonExemptEncryption: false ITSAppUsesNonExemptEncryption: false
entitlements: entitlements:
path: Sources/Resources/CardsNative.entitlements path: Sources/Resources/CardsNative.entitlements
@ -111,7 +111,7 @@ targets:
properties: properties:
CFBundleDisplayName: Als Karte speichern CFBundleDisplayName: Als Karte speichern
CFBundleShortVersionString: "0.1.0" CFBundleShortVersionString: "0.1.0"
CFBundleVersion: "2" CFBundleVersion: "3"
NSExtension: NSExtension:
NSExtensionPointIdentifier: com.apple.share-services NSExtensionPointIdentifier: com.apple.share-services
NSExtensionPrincipalClass: $(PRODUCT_MODULE_NAME).ShareViewController NSExtensionPrincipalClass: $(PRODUCT_MODULE_NAME).ShareViewController
@ -144,7 +144,7 @@ targets:
properties: properties:
CFBundleDisplayName: Cardecky Widget CFBundleDisplayName: Cardecky Widget
CFBundleShortVersionString: "0.1.0" CFBundleShortVersionString: "0.1.0"
CFBundleVersion: "2" CFBundleVersion: "3"
NSExtension: NSExtension:
NSExtensionPointIdentifier: com.apple.widgetkit-extension NSExtensionPointIdentifier: com.apple.widgetkit-extension
entitlements: entitlements: