Tests & Lokalisierung: Abschluss-Audit v1.0

- LogEntryType: CaseIterable-Konformität hinzugefügt
- ModelTests: todoCompleted in allTypesHaveIconAndColor; 2 neue Regressionstests (allCases count=4, stabile rawValues)
- Localizable.xcstrings: 30 fehlende EN-Übersetzungen ergänzt (SettingsView-Sektionen, KI Insights, Todos, Onboarding-Texte u.a.)

502 Tests, 0 Fehler.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-23 13:22:42 +02:00
parent 31a7a2d5df
commit 8427f55f21
3 changed files with 4454 additions and 4219 deletions
+252 -30
View File
@@ -570,7 +570,14 @@
}
},
"Alle": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "All"
}
}
}
},
"Alle %lld Einträge anzeigen": {
"localizations": {
@@ -975,7 +982,14 @@
}
},
"Auf Max upgraden": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Upgrade to Max"
}
}
}
},
"Auf Max upgraden KI-Analyse freischalten": {
"extractionState": "stale",
@@ -1283,7 +1297,14 @@
}
},
"Darstellung & Profil": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Appearance & Profile"
}
}
}
},
"Das kann bis zu einer Minute dauern.": {
"comment": "LogbuchView AI analysis loading subtitle",
@@ -1850,7 +1871,14 @@
}
},
"Du schlägst lieber etwas vor, das ihr beide gut kennt.": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "You prefer to suggest something you both know well."
}
}
}
},
"Du schlägt lieber etwas vor, das ihr beide gut kennt.": {
"extractionState": "stale",
@@ -2147,7 +2175,14 @@
}
},
"Entwickler": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Developer"
}
}
}
},
"Entwickler-Log": {
"comment": "SettingsView / LogExportView developer log nav title",
@@ -2337,7 +2372,14 @@
}
},
"FaceTime": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "FaceTime"
}
}
}
},
"Fällig am": {
"comment": "AddTodoView label for due date picker",
@@ -2503,7 +2545,14 @@
}
},
"Füge zuerst Personen im Tab „Menschen“ hinzu.": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Add people in the “People” tab first."
}
}
}
},
"Füge zuerst Personen im Tab „Menschen” hinzu.": {
"comment": "TodayPersonPickerSheet empty state hint when no contacts exist yet",
@@ -2530,7 +2579,14 @@
}
},
"Funktionen": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Features"
}
}
}
},
"Für wen?": {
"comment": "TodayPersonPickerSheet navigation title",
@@ -2635,7 +2691,14 @@
}
},
"Geräteübergreifend synchronisiert": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Synced across devices"
}
}
}
},
"Geschenkidee anzeigen": {
"comment": "TodayView GiftSuggestionRow collapsed state button",
@@ -2876,7 +2939,14 @@
}
},
"Guten Morgen.": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Good morning."
}
}
}
},
"Guten Tag": {
"comment": "TodayView afternoon greeting (without punctuation, name appended in code)",
@@ -3272,7 +3342,14 @@
}
},
"KI Insights freischalten": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Unlock AI Insights"
}
}
}
},
"KI Insights zu %@": {
"comment": "AIAnalysisSheet navigation title mit Personenname",
@@ -3286,10 +3363,24 @@
}
},
"KI Insights, Themes & mehr": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "AI Insights, Themes & more"
}
}
}
},
"KI Modell": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "AI Model"
}
}
}
},
"KI-Analyse": {
"comment": "SettingsView section header for AI settings",
@@ -3719,7 +3810,14 @@
}
},
"Mit '+ Todo' planst du konkrete Aufgaben für diese Person mit optionaler Erinnerung, damit nichts vergessen wird.": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Use '+ Todo' to plan specific tasks for this person with an optional reminder so nothing gets forgotten."
}
}
}
},
"Mittel": {
"extractionState": "stale",
@@ -4236,7 +4334,14 @@
}
},
"nahbar Pro oder Max": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "nahbar Pro or Max"
}
}
}
},
"nahbar-log.txt": {
"comment": "The file name of the log export.",
@@ -4386,7 +4491,14 @@
}
},
"noch keine": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "none yet"
}
}
}
},
"Noch keine Einträge": {
"comment": "LogbuchView empty state title",
@@ -4511,10 +4623,36 @@
}
},
"Nudge alle %lld Tage · Quiz abgeschlossen": {
"localizations": {
"en": {
"variations": {
"plural": {
"one": {
"stringUnit": {
"state": "translated",
"value": "Nudge every %lld day · Quiz complete"
}
},
"other": {
"stringUnit": {
"state": "translated",
"value": "Nudge every %lld days · Quiz complete"
}
}
}
}
}
}
},
"Nur lokal gespeichert": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Stored locally only"
}
}
}
},
"Nur Moment löschen": {
"localizations": {
@@ -4585,7 +4723,14 @@
}
},
"OK": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "OK"
}
}
}
},
"Onboarding abschließen und App starten": {
"comment": "OnboardingPrivacyView CTA button accessibility label",
@@ -4729,7 +4874,14 @@
}
},
"Persönlichkeitsquiz": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Personality Quiz"
}
}
}
},
"Persönlichkeitsquiz starten": {
"localizations": {
@@ -4832,7 +4984,14 @@
}
},
"Push nach dem Treffen": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Push after meeting"
}
}
}
},
"Push-Benachrichtigung nach dem Besuch": {
"comment": "SettingsView aftermath notification toggle subtitle",
@@ -5188,7 +5347,14 @@
}
},
"System": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "System"
}
}
}
},
"Tag": {
"comment": "PaywallView subscription period label (day)",
@@ -5213,7 +5379,14 @@
}
},
"Tägliche Erinnerung für Anrufe": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Daily reminder for calls"
}
}
}
},
"Teile WhatsApp-Nachrichten direkt in nahbar sie werden als Momente gespeichert.": {
"comment": "FeatureTourStep description WhatsApp share feature",
@@ -5284,7 +5457,14 @@
}
},
"Termin mit %@": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Appointment with %@"
}
}
}
},
"Termin mit %@ — %@": {
"localizations": {
@@ -5297,7 +5477,14 @@
}
},
"Termine & Geburtstage": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Appointments & Birthdays"
}
}
}
},
"Themenvorschläge": {
"comment": "AddMomentView conversation suggestions section title",
@@ -5335,7 +5522,14 @@
}
},
"Tippe auf '+ Moment', um Treffen oder Gespräche festzuhalten so weißt du immer, worüber ihr das letzte Mal geredet habt.": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Tap '+ Moment' to log meetings or conversations so you always know what you talked about last time."
}
}
}
},
"Tippe auf + um jemanden hinzuzufügen.": {
"comment": "A description of how to add a new contact.",
@@ -5440,7 +5634,14 @@
}
},
"Todos anlegen": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Create Todos"
}
}
}
},
"Touch ID aktiviert": {
"comment": "SettingsView biometric label when Touch ID is active",
@@ -5973,10 +6174,24 @@
}
},
"Wähle bis zu 3 Menschen aus deinem Adressbuch, die dir wichtig sind.": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Choose up to 3 people from your contacts who matter to you."
}
}
}
},
"Wähle bis zu 3 Menschen aus, die dir wichtig sind.": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Choose up to 3 people who matter to you."
}
}
}
},
"Wähle deinen Plan": {
"comment": "PaywallView header title",
@@ -6576,7 +6791,14 @@
}
},
"Zurücksetzen": {
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "Reset"
}
}
}
},
"Zusammen essen": {
"comment": "PersonDetailView activity suggestion: have a meal together (group)",
+1 -1
View File
@@ -331,7 +331,7 @@ class Person {
// MARK: - LogEntryType
enum LogEntryType: String, Codable {
enum LogEntryType: String, Codable, CaseIterable {
case nextStep = "Schritt abgeschlossen"
case calendarEvent = "Termin geplant"
case call = "Anruf"
+17 -4
View File
@@ -511,10 +511,23 @@ struct LogEntryComputedPropertyTests {
@Test("alle LogEntryTypes haben ein nicht-leeres Icon und color")
func allTypesHaveIconAndColor() {
let types: [LogEntryType] = [.nextStep, .calendarEvent, .call]
for type_ in types {
#expect(!type_.icon.isEmpty)
#expect(!type_.color.isEmpty)
for type_ in LogEntryType.allCases {
#expect(!type_.icon.isEmpty, "\(type_.rawValue) hat leeres icon")
#expect(!type_.color.isEmpty, "\(type_.rawValue) hat leere color")
}
}
@Test(".todoCompleted ist in allCases enthalten Regressionswächter")
func todoCompletedInAllCases() {
#expect(LogEntryType.allCases.contains(.todoCompleted))
#expect(LogEntryType.allCases.count == 4)
}
@Test("Stabile rawValues Regressionswächter")
func stableRawValues() {
#expect(LogEntryType.nextStep.rawValue == "Schritt abgeschlossen")
#expect(LogEntryType.calendarEvent.rawValue == "Termin geplant")
#expect(LogEntryType.call.rawValue == "Anruf")
#expect(LogEntryType.todoCompleted.rawValue == "Todo abgeschlossen")
}
}