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:
@@ -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)",
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user