Add per-language thinking verbs; close major i18n translation gap
- ThinkingVerbs now picks from a hand-written verb list per active display language (en/nb/sv/da/de/fr) instead of always English, fixed to be nonisolated at the type level (this project defaults to MainActor isolation, which was breaking the static verb arrays). - SyncStatusIndicator.tooltipText was typed String instead of LocalizedStringKey, silently bypassing localization for .help() — fixed. - Translated ~150 strings (750 individual translations) into nb/sv/da/de/fr that had never been localized: the entire slash- command dropdown, sync status labels, reasoning-effort descriptions, model sort options, and settings rows added across recent features (Git Sync conflict recovery, crash recovery, notes, backup, external MCP servers). Most were invisible to xcodebuild -exportLocalizations because they're LocalizedStringKey- typed properties/helpers rather than literal Text() calls, per the same gap documented from the original Phase 7 audit. - AI-translated per the README's existing disclosure; verified live in nb and fr builds, and diffed the catalog to confirm zero pre-existing translations were altered, only additions.
This commit is contained in:
+4742
-92
File diff suppressed because it is too large
Load Diff
@@ -23,14 +23,44 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
struct ThinkingVerbs {
|
/// Marked `nonisolated` at the type level (not per-member) since this project builds with
|
||||||
/// Get a random thinking verb with ellipsis
|
/// `-default-isolation=MainActor` — without it, every member (including the static `let` verb
|
||||||
|
/// arrays) defaults to MainActor-isolated, which then conflicts with `nonisolated` funcs trying
|
||||||
|
/// to reference them. See CLAUDE.md's Swift 6 Compatibility section / MEMORY.md's Common Gotchas.
|
||||||
|
nonisolated struct ThinkingVerbs {
|
||||||
|
/// Get a random thinking verb with ellipsis, in the app's active display language.
|
||||||
|
/// Each language has its own hand-written set (not a translation of the English one) —
|
||||||
|
/// literal translations of English wordplay ("Waking up the hamsters") often land flat
|
||||||
|
/// or sound plain odd in another language, so every list was written to be funny/natural
|
||||||
|
/// on its own terms while covering the same rough categories (classic, technical, mystical,
|
||||||
|
/// quirky, etc).
|
||||||
static func random() -> String {
|
static func random() -> String {
|
||||||
verbs.randomElement()! + "..."
|
verbs(for: currentLanguageCode).randomElement()! + "..."
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Collection of fun thinking verbs and phrases
|
/// Mirrors how Text()/String(localized:) resolve the active language: the first of the
|
||||||
private static let verbs = [
|
/// user's preferred languages that this bundle actually ships a localization for (falls
|
||||||
|
/// back to English otherwise). See CLAUDE.md's supported-language list (en, nb, sv, da, de, fr).
|
||||||
|
private static var currentLanguageCode: String {
|
||||||
|
Bundle.main.preferredLocalizations.first ?? "en"
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Internal (not private) so tests can verify the language→list mapping without depending
|
||||||
|
/// on Bundle.main's runtime localization state.
|
||||||
|
static func verbs(for languageCode: String) -> [String] {
|
||||||
|
switch languageCode {
|
||||||
|
case "nb": return nbVerbs
|
||||||
|
case "sv": return svVerbs
|
||||||
|
case "da": return daVerbs
|
||||||
|
case "de": return deVerbs
|
||||||
|
case "fr": return frVerbs
|
||||||
|
default: return enVerbs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - English
|
||||||
|
|
||||||
|
private static let enVerbs = [
|
||||||
// Classic thinking
|
// Classic thinking
|
||||||
"Thinking",
|
"Thinking",
|
||||||
"Pondering",
|
"Pondering",
|
||||||
@@ -144,4 +174,589 @@ struct ThinkingVerbs {
|
|||||||
"Loading brilliance",
|
"Loading brilliance",
|
||||||
"Unfurling wisdom"
|
"Unfurling wisdom"
|
||||||
]
|
]
|
||||||
|
|
||||||
|
// MARK: - Norwegian Bokmål
|
||||||
|
|
||||||
|
private static let nbVerbs = [
|
||||||
|
// Classic thinking
|
||||||
|
"Tenker",
|
||||||
|
"Grunner",
|
||||||
|
"Fundere",
|
||||||
|
"Reflekterer",
|
||||||
|
"Mediterer",
|
||||||
|
"Spekulerer",
|
||||||
|
"Overveier",
|
||||||
|
|
||||||
|
// Fancy/sophisticated
|
||||||
|
"Kontemplerer",
|
||||||
|
"Filosoferer",
|
||||||
|
"Resonnerer",
|
||||||
|
"Analyserer dypt",
|
||||||
|
"Bryner hjernen",
|
||||||
|
|
||||||
|
// Technical/AI themed
|
||||||
|
"Beregner",
|
||||||
|
"Prosesserer",
|
||||||
|
"Analyserer",
|
||||||
|
"Syntetiserer",
|
||||||
|
"Kalkulerer",
|
||||||
|
"Utleder",
|
||||||
|
"Kompilerer tanker",
|
||||||
|
"Kjører algoritmer",
|
||||||
|
"Knuser data",
|
||||||
|
"Parser nevroner",
|
||||||
|
|
||||||
|
// Creative/playful
|
||||||
|
"Dagdrømmer",
|
||||||
|
"Idémyldrer",
|
||||||
|
"Koker sammen tanker",
|
||||||
|
"Rører i tankegryta",
|
||||||
|
"Lar det godgjøre seg",
|
||||||
|
"Spinner nevroner",
|
||||||
|
"Varmer opp knollen",
|
||||||
|
"Klekker ut idéer",
|
||||||
|
|
||||||
|
// Mystical/fun
|
||||||
|
"Rådfører orakelet",
|
||||||
|
"Leser kaffegrut",
|
||||||
|
"Maner frem visdom",
|
||||||
|
"Trollbinder et svar",
|
||||||
|
"Kaster nevrale garn",
|
||||||
|
"Spår svaret",
|
||||||
|
|
||||||
|
// Quirky/silly
|
||||||
|
"Gjør greia",
|
||||||
|
"Trylle frem et svar",
|
||||||
|
"Aktiverer hjerneceller",
|
||||||
|
"Bøyer nevronene",
|
||||||
|
"Varmer opp transistorene",
|
||||||
|
"Rever opp synapsene",
|
||||||
|
"Kiler hjernebarken",
|
||||||
|
"Vekker hamsterne",
|
||||||
|
"Rådfører tomrommet",
|
||||||
|
"Spør den magiske 8-ballen",
|
||||||
|
|
||||||
|
// Self-aware/meta
|
||||||
|
"Later som om jeg tenker",
|
||||||
|
"Ser opptatt ut",
|
||||||
|
"Trekker ut tiden",
|
||||||
|
"Teller sauer",
|
||||||
|
"Tvinner tomlene",
|
||||||
|
"Ordner tankene",
|
||||||
|
"Leter etter riktige ord",
|
||||||
|
|
||||||
|
// Speed variations
|
||||||
|
"Tenker fort",
|
||||||
|
"Lynraskt tankearbeid",
|
||||||
|
"Dyptenkende",
|
||||||
|
"Hypertenker",
|
||||||
|
|
||||||
|
// Action-oriented
|
||||||
|
"Snekrer sammen et svar",
|
||||||
|
"Vever ord",
|
||||||
|
"Setter sammen tanker",
|
||||||
|
"Konstruerer svar",
|
||||||
|
"Formulerer idéer",
|
||||||
|
"Dirigerer nevroner",
|
||||||
|
"Koreograferer bits",
|
||||||
|
|
||||||
|
// Whimsical
|
||||||
|
"Får en åpenbaring",
|
||||||
|
"Kobler prikkene",
|
||||||
|
"Følger tråden",
|
||||||
|
"Jager tanker",
|
||||||
|
"Gjeter idéer",
|
||||||
|
"Reder ut nevronfloken",
|
||||||
|
|
||||||
|
// Time-based
|
||||||
|
"Tar en tenkepause",
|
||||||
|
"Puster rolig",
|
||||||
|
"Tar fem",
|
||||||
|
"Samler tankene",
|
||||||
|
"Henter pusten",
|
||||||
|
|
||||||
|
// Just plain weird
|
||||||
|
"Piper og beregner",
|
||||||
|
"Aktiverer hjernemodus",
|
||||||
|
"Slår på smartheten",
|
||||||
|
"Laster ned tanker",
|
||||||
|
"Bufrer intelligens",
|
||||||
|
"Laster inn genialitet",
|
||||||
|
"Folder ut visdom",
|
||||||
|
"Roter i idébanken",
|
||||||
|
"Sorterer tankene",
|
||||||
|
"Venter på et lyn av genialitet",
|
||||||
|
"Plager hjernen med det",
|
||||||
|
"Kokende av idéer",
|
||||||
|
"Grubler høyt",
|
||||||
|
"Filosoferer over saken"
|
||||||
|
]
|
||||||
|
|
||||||
|
// MARK: - Swedish
|
||||||
|
|
||||||
|
private static let svVerbs = [
|
||||||
|
// Classic thinking
|
||||||
|
"Tänker",
|
||||||
|
"Funderar",
|
||||||
|
"Grubblar",
|
||||||
|
"Reflekterar",
|
||||||
|
"Mediterar",
|
||||||
|
"Spekulerar",
|
||||||
|
"Överväger",
|
||||||
|
|
||||||
|
// Fancy/sophisticated
|
||||||
|
"Kontemplerar",
|
||||||
|
"Filosoferar",
|
||||||
|
"Resonerar",
|
||||||
|
"Djupanalyserar",
|
||||||
|
"Vässar hjärnan",
|
||||||
|
|
||||||
|
// Technical/AI themed
|
||||||
|
"Beräknar",
|
||||||
|
"Processar",
|
||||||
|
"Analyserar",
|
||||||
|
"Syntetiserar",
|
||||||
|
"Kalkylerar",
|
||||||
|
"Härleder",
|
||||||
|
"Kompilerar tankar",
|
||||||
|
"Kör algoritmer",
|
||||||
|
"Mosar data",
|
||||||
|
"Parsar nervceller",
|
||||||
|
|
||||||
|
// Creative/playful
|
||||||
|
"Dagdrömmer",
|
||||||
|
"Idékläcker",
|
||||||
|
"Kokar ihop tankar",
|
||||||
|
"Rör i tankegrytan",
|
||||||
|
"Låter det mogna",
|
||||||
|
"Snurrar nervceller",
|
||||||
|
"Värmer upp knoppen",
|
||||||
|
"Ruvar på idéer",
|
||||||
|
|
||||||
|
// Mystical/fun
|
||||||
|
"Rådfrågar oraklet",
|
||||||
|
"Läser i kaffesumpen",
|
||||||
|
"Frammanar visdom",
|
||||||
|
"Trollbinder ett svar",
|
||||||
|
"Kastar neurala nät",
|
||||||
|
"Spår svaret",
|
||||||
|
|
||||||
|
// Quirky/silly
|
||||||
|
"Gör grejen",
|
||||||
|
"Trollar fram ett svar",
|
||||||
|
"Aktiverar hjärnceller",
|
||||||
|
"Böjer nervcellerna",
|
||||||
|
"Värmer upp transistorerna",
|
||||||
|
"Varvar upp synapserna",
|
||||||
|
"Kittlar hjärnbarken",
|
||||||
|
"Väcker hamstrarna",
|
||||||
|
"Rådfrågar tomrummet",
|
||||||
|
"Frågar magiska åttan",
|
||||||
|
|
||||||
|
// Self-aware/meta
|
||||||
|
"Låtsas tänka",
|
||||||
|
"Ser upptagen ut",
|
||||||
|
"Drar ut på tiden",
|
||||||
|
"Räknar får",
|
||||||
|
"Tvinnar tummarna",
|
||||||
|
"Ordnar tankarna",
|
||||||
|
"Letar rätt ord",
|
||||||
|
|
||||||
|
// Speed variations
|
||||||
|
"Tänker snabbt",
|
||||||
|
"Blixtsnabb tankeverksamhet",
|
||||||
|
"Djuptänkande",
|
||||||
|
"Hypertänker",
|
||||||
|
|
||||||
|
// Action-oriented
|
||||||
|
"Snickrar ihop ett svar",
|
||||||
|
"Väver ord",
|
||||||
|
"Sätter ihop tankar",
|
||||||
|
"Konstruerar svar",
|
||||||
|
"Formulerar idéer",
|
||||||
|
"Dirigerar nervceller",
|
||||||
|
"Koreograferar bitar",
|
||||||
|
|
||||||
|
// Whimsical
|
||||||
|
"Får en aha-upplevelse",
|
||||||
|
"Kopplar ihop punkterna",
|
||||||
|
"Följer tråden",
|
||||||
|
"Jagar tankar",
|
||||||
|
"Vallar idéer",
|
||||||
|
"Reder ut nervtrasslet",
|
||||||
|
|
||||||
|
// Time-based
|
||||||
|
"Tar en tankepaus",
|
||||||
|
"Andas lugnt",
|
||||||
|
"Tar fem",
|
||||||
|
"Samlar tankarna",
|
||||||
|
"Hämtar andan",
|
||||||
|
|
||||||
|
// Just plain weird
|
||||||
|
"Piper och beräknar",
|
||||||
|
"Aktiverar hjärnläge",
|
||||||
|
"Slår på smartheten",
|
||||||
|
"Laddar ner tankar",
|
||||||
|
"Buffrar intelligens",
|
||||||
|
"Laddar in briljans",
|
||||||
|
"Vecklar ut visdom",
|
||||||
|
"Rotar i idébanken",
|
||||||
|
"Sorterar tankarna",
|
||||||
|
"Väntar på ett geniblixt",
|
||||||
|
"Bryr hjärnan med det",
|
||||||
|
"Kokar av idéer",
|
||||||
|
"Grubblar högt",
|
||||||
|
"Filosoferar över saken"
|
||||||
|
]
|
||||||
|
|
||||||
|
// MARK: - Danish
|
||||||
|
|
||||||
|
private static let daVerbs = [
|
||||||
|
// Classic thinking
|
||||||
|
"Tænker",
|
||||||
|
"Grunder",
|
||||||
|
"Grubler",
|
||||||
|
"Reflekterer",
|
||||||
|
"Mediterer",
|
||||||
|
"Spekulerer",
|
||||||
|
"Overvejer",
|
||||||
|
|
||||||
|
// Fancy/sophisticated
|
||||||
|
"Kontemplerer",
|
||||||
|
"Filosoferer",
|
||||||
|
"Ræsonnerer",
|
||||||
|
"Dybdeanalyserer",
|
||||||
|
"Skærper hjernen",
|
||||||
|
|
||||||
|
// Technical/AI themed
|
||||||
|
"Beregner",
|
||||||
|
"Processerer",
|
||||||
|
"Analyserer",
|
||||||
|
"Syntetiserer",
|
||||||
|
"Kalkulerer",
|
||||||
|
"Udleder",
|
||||||
|
"Kompilerer tanker",
|
||||||
|
"Kører algoritmer",
|
||||||
|
"Knuser data",
|
||||||
|
"Parser neuroner",
|
||||||
|
|
||||||
|
// Creative/playful
|
||||||
|
"Dagdrømmer",
|
||||||
|
"Idémylrer",
|
||||||
|
"Koger tanker sammen",
|
||||||
|
"Rører i tankegryden",
|
||||||
|
"Lader det simre",
|
||||||
|
"Snurrer neuroner",
|
||||||
|
"Varmer knolden op",
|
||||||
|
"Udruger idéer",
|
||||||
|
|
||||||
|
// Mystical/fun
|
||||||
|
"Rådspørger orakelet",
|
||||||
|
"Læser kaffegrums",
|
||||||
|
"Fremmaner visdom",
|
||||||
|
"Tryller et svar frem",
|
||||||
|
"Kaster neurale net",
|
||||||
|
"Spår svaret",
|
||||||
|
|
||||||
|
// Quirky/silly
|
||||||
|
"Gør tingen",
|
||||||
|
"Trylle-fremkalder et svar",
|
||||||
|
"Aktiverer hjerneceller",
|
||||||
|
"Bøjer neuronerne",
|
||||||
|
"Varmer transistorerne op",
|
||||||
|
"Ruller synapserne op",
|
||||||
|
"Kilder hjernebarken",
|
||||||
|
"Vækker hamsterne",
|
||||||
|
"Rådspørger tomrummet",
|
||||||
|
"Spørger den magiske 8-tal",
|
||||||
|
|
||||||
|
// Self-aware/meta
|
||||||
|
"Lader som om jeg tænker",
|
||||||
|
"Ser optaget ud",
|
||||||
|
"Trækker tiden ud",
|
||||||
|
"Tæller får",
|
||||||
|
"Snor tommelfingrene",
|
||||||
|
"Ordner tankerne",
|
||||||
|
"Leder efter de rette ord",
|
||||||
|
|
||||||
|
// Speed variations
|
||||||
|
"Tænker hurtigt",
|
||||||
|
"Lynhurtig tænkning",
|
||||||
|
"Dybttænkende",
|
||||||
|
"Hypertænker",
|
||||||
|
|
||||||
|
// Action-oriented
|
||||||
|
"Snedkererer et svar",
|
||||||
|
"Væver ord",
|
||||||
|
"Samler tanker",
|
||||||
|
"Konstruerer svar",
|
||||||
|
"Formulerer idéer",
|
||||||
|
"Dirigerer neuroner",
|
||||||
|
"Koreograferer bits",
|
||||||
|
|
||||||
|
// Whimsical
|
||||||
|
"Får en åbenbaring",
|
||||||
|
"Forbinder prikkerne",
|
||||||
|
"Følger tråden",
|
||||||
|
"Jagter tanker",
|
||||||
|
"Vogter idéer",
|
||||||
|
"Reder neurontrådene ud",
|
||||||
|
|
||||||
|
// Time-based
|
||||||
|
"Tager en tænkepause",
|
||||||
|
"Trækker vejret roligt",
|
||||||
|
"Tager fem",
|
||||||
|
"Samler tankerne",
|
||||||
|
"Henter vejret",
|
||||||
|
|
||||||
|
// Just plain weird
|
||||||
|
"Bipper og beregner",
|
||||||
|
"Aktiverer hjernemodus",
|
||||||
|
"Tænder for kløgt",
|
||||||
|
"Downloader tanker",
|
||||||
|
"Bufrer intelligens",
|
||||||
|
"Indlæser genialitet",
|
||||||
|
"Folder visdom ud",
|
||||||
|
"Roder i idébanken",
|
||||||
|
"Sorterer tankerne",
|
||||||
|
"Venter på et lyn af genialitet",
|
||||||
|
"Plager hjernen med det",
|
||||||
|
"Kogende af idéer",
|
||||||
|
"Grunder højt",
|
||||||
|
"Filosoferer over sagen"
|
||||||
|
]
|
||||||
|
|
||||||
|
// MARK: - German
|
||||||
|
|
||||||
|
private static let deVerbs = [
|
||||||
|
// Classic thinking
|
||||||
|
"Denkt nach",
|
||||||
|
"Grübelt",
|
||||||
|
"Sinniert",
|
||||||
|
"Reflektiert",
|
||||||
|
"Meditiert",
|
||||||
|
"Spekuliert",
|
||||||
|
"Überlegt",
|
||||||
|
|
||||||
|
// Fancy/sophisticated
|
||||||
|
"Kontempliert",
|
||||||
|
"Philosophiert",
|
||||||
|
"Räsoniert",
|
||||||
|
"Analysiert tiefgründig",
|
||||||
|
"Schärft das Denkvermögen",
|
||||||
|
|
||||||
|
// Technical/AI themed
|
||||||
|
"Berechnet",
|
||||||
|
"Verarbeitet",
|
||||||
|
"Analysiert",
|
||||||
|
"Synthetisiert",
|
||||||
|
"Kalkuliert",
|
||||||
|
"Leitet ab",
|
||||||
|
"Kompiliert Gedanken",
|
||||||
|
"Lässt Algorithmen laufen",
|
||||||
|
"Zermalmt Daten",
|
||||||
|
"Parst Neuronen",
|
||||||
|
|
||||||
|
// Creative/playful
|
||||||
|
"Tagträumt",
|
||||||
|
"Brainstormt",
|
||||||
|
"Braut Gedanken zusammen",
|
||||||
|
"Rührt im Gedankentopf",
|
||||||
|
"Lässt es köcheln",
|
||||||
|
"Dreht Neuronen",
|
||||||
|
"Wärmt die Denkerstube auf",
|
||||||
|
"Brütet Ideen aus",
|
||||||
|
|
||||||
|
// Mystical/fun
|
||||||
|
"Befragt das Orakel",
|
||||||
|
"Liest im Kaffeesatz",
|
||||||
|
"Beschwört Weisheit",
|
||||||
|
"Zaubert eine Antwort",
|
||||||
|
"Wirft neuronale Netze aus",
|
||||||
|
"Weissagt die Antwort",
|
||||||
|
|
||||||
|
// Quirky/silly
|
||||||
|
"Macht sein Ding",
|
||||||
|
"Zaubert eine Antwort herbei",
|
||||||
|
"Aktiviert Gehirnzellen",
|
||||||
|
"Biegt Neuronen",
|
||||||
|
"Wärmt die Transistoren auf",
|
||||||
|
"Dreht die Synapsen hoch",
|
||||||
|
"Kitzelt die Großhirnrinde",
|
||||||
|
"Weckt die Hamster",
|
||||||
|
"Befragt die Leere",
|
||||||
|
"Fragt die magische Kugel",
|
||||||
|
|
||||||
|
// Self-aware/meta
|
||||||
|
"Tut nur so, als würde es denken",
|
||||||
|
"Sieht beschäftigt aus",
|
||||||
|
"Zieht Zeit",
|
||||||
|
"Zählt Schafe",
|
||||||
|
"Dreht Däumchen",
|
||||||
|
"Ordnet die Gedanken",
|
||||||
|
"Sucht die richtigen Worte",
|
||||||
|
|
||||||
|
// Speed variations
|
||||||
|
"Denkt schnell",
|
||||||
|
"Blitzschnelles Denken",
|
||||||
|
"Tiefes Nachdenken",
|
||||||
|
"Hyperdenken",
|
||||||
|
|
||||||
|
// Action-oriented
|
||||||
|
"Zimmert eine Antwort",
|
||||||
|
"Webt Worte",
|
||||||
|
"Fügt Gedanken zusammen",
|
||||||
|
"Konstruiert Antworten",
|
||||||
|
"Formuliert Ideen",
|
||||||
|
"Dirigiert Neuronen",
|
||||||
|
"Choreografiert Bits",
|
||||||
|
|
||||||
|
// Whimsical
|
||||||
|
"Hat eine Eingebung",
|
||||||
|
"Verbindet die Punkte",
|
||||||
|
"Folgt dem roten Faden",
|
||||||
|
"Jagt Gedanken",
|
||||||
|
"Hütet Ideen",
|
||||||
|
"Entwirrt die Neuronen",
|
||||||
|
|
||||||
|
// Time-based
|
||||||
|
"Nimmt sich einen Moment",
|
||||||
|
"Atmet tief durch",
|
||||||
|
"Macht kurz Pause",
|
||||||
|
"Sammelt die Gedanken",
|
||||||
|
"Holt Luft",
|
||||||
|
|
||||||
|
// Just plain weird
|
||||||
|
"Piept und rechnet",
|
||||||
|
"Aktiviert den Gehirnmodus",
|
||||||
|
"Schaltet auf Schlaumodus",
|
||||||
|
"Lädt Gedanken herunter",
|
||||||
|
"Puffert Intelligenz",
|
||||||
|
"Lädt Genialität",
|
||||||
|
"Entfaltet Weisheit",
|
||||||
|
"Wühlt in der Ideenkiste",
|
||||||
|
"Sortiert die Gedanken",
|
||||||
|
"Wartet auf einen Geistesblitz",
|
||||||
|
"Quält das Gehirn damit",
|
||||||
|
"Kocht vor Ideen",
|
||||||
|
"Grübelt laut",
|
||||||
|
"Philosophiert über die Sache"
|
||||||
|
]
|
||||||
|
|
||||||
|
// MARK: - French
|
||||||
|
|
||||||
|
private static let frVerbs = [
|
||||||
|
// Classic thinking
|
||||||
|
"Réfléchit",
|
||||||
|
"Songe",
|
||||||
|
"Médite",
|
||||||
|
"Contemple",
|
||||||
|
"Spécule",
|
||||||
|
"Délibère",
|
||||||
|
"Rumine",
|
||||||
|
|
||||||
|
// Fancy/sophisticated
|
||||||
|
"Philosophise",
|
||||||
|
"Raisonne",
|
||||||
|
"Cogite",
|
||||||
|
"Analyse en profondeur",
|
||||||
|
"Aiguise ses neurones",
|
||||||
|
|
||||||
|
// Technical/AI themed
|
||||||
|
"Calcule",
|
||||||
|
"Traite",
|
||||||
|
"Analyse",
|
||||||
|
"Synthétise",
|
||||||
|
"Déduit",
|
||||||
|
"Compile des pensées",
|
||||||
|
"Fait tourner des algorithmes",
|
||||||
|
"Broie des données",
|
||||||
|
"Parse des neurones",
|
||||||
|
"Chiffre les possibilités",
|
||||||
|
|
||||||
|
// Creative/playful
|
||||||
|
"Rêvasse",
|
||||||
|
"Brainstorme",
|
||||||
|
"Mijote des idées",
|
||||||
|
"Remue la marmite à idées",
|
||||||
|
"Laisse mijoter",
|
||||||
|
"Fait tourner ses neurones",
|
||||||
|
"Chauffe la matière grise",
|
||||||
|
"Couve une idée",
|
||||||
|
|
||||||
|
// Mystical/fun
|
||||||
|
"Consulte l'oracle",
|
||||||
|
"Lit dans le marc de café",
|
||||||
|
"Invoque la sagesse",
|
||||||
|
"Conjure une réponse",
|
||||||
|
"Lance des filets neuronaux",
|
||||||
|
"Prédit la réponse",
|
||||||
|
|
||||||
|
// Quirky/silly
|
||||||
|
"Fait son truc",
|
||||||
|
"Fait apparaître une réponse par magie",
|
||||||
|
"Active ses neurones",
|
||||||
|
"Étire ses neurones",
|
||||||
|
"Chauffe les transistors",
|
||||||
|
"Emballe les synapses",
|
||||||
|
"Chatouille le cortex",
|
||||||
|
"Réveille les hamsters",
|
||||||
|
"Consulte le vide",
|
||||||
|
"Interroge la boule magique",
|
||||||
|
|
||||||
|
// Self-aware/meta
|
||||||
|
"Fait semblant de réfléchir",
|
||||||
|
"A l'air occupé",
|
||||||
|
"Fait durer le suspense",
|
||||||
|
"Compte les moutons",
|
||||||
|
"Se tourne les pouces",
|
||||||
|
"Met de l'ordre dans ses pensées",
|
||||||
|
"Cherche les mots justes",
|
||||||
|
|
||||||
|
// Speed variations
|
||||||
|
"Réfléchit vite",
|
||||||
|
"Pensée éclair",
|
||||||
|
"Réflexion profonde",
|
||||||
|
"Hyper-réflexion",
|
||||||
|
|
||||||
|
// Action-oriented
|
||||||
|
"Bricole une réponse",
|
||||||
|
"Tisse des mots",
|
||||||
|
"Assemble des idées",
|
||||||
|
"Construit une réponse",
|
||||||
|
"Formule des idées",
|
||||||
|
"Dirige ses neurones",
|
||||||
|
"Chorégraphie des bits",
|
||||||
|
|
||||||
|
// Whimsical
|
||||||
|
"A une révélation",
|
||||||
|
"Relie les points",
|
||||||
|
"Suit le fil",
|
||||||
|
"Traque une pensée",
|
||||||
|
"Rassemble ses idées",
|
||||||
|
"Démêle ses neurones",
|
||||||
|
|
||||||
|
// Time-based
|
||||||
|
"Prend un instant",
|
||||||
|
"Respire un grand coup",
|
||||||
|
"Fait une pause",
|
||||||
|
"Rassemble ses pensées",
|
||||||
|
"Reprend son souffle",
|
||||||
|
|
||||||
|
// Just plain weird
|
||||||
|
"Bip bip, ça calcule",
|
||||||
|
"Active le mode cerveau",
|
||||||
|
"Passe en mode intelligent",
|
||||||
|
"Télécharge des pensées",
|
||||||
|
"Met l'intelligence en cache",
|
||||||
|
"Charge du génie",
|
||||||
|
"Déploie sa sagesse",
|
||||||
|
"Fouille sa boîte à idées",
|
||||||
|
"Trie ses pensées",
|
||||||
|
"Attend un éclair de génie",
|
||||||
|
"Torture son cerveau",
|
||||||
|
"Bouillonne d'idées",
|
||||||
|
"Rumine à voix haute",
|
||||||
|
"Philosophise sur la question"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ enum SyncState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var tooltipText: String {
|
var tooltipText: LocalizedStringKey {
|
||||||
switch self {
|
switch self {
|
||||||
case .disabled:
|
case .disabled:
|
||||||
return "Auto-sync disabled"
|
return "Auto-sync disabled"
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"strings" : {
|
"strings" : {
|
||||||
"CFBundleName" : {
|
"CFBundleName" : {
|
||||||
"comment" : "Bundle name",
|
"comment" : "Bundle name",
|
||||||
"extractionState" : "extracted_with_value",
|
"extractionState" : "stale",
|
||||||
"localizations" : {
|
"localizations" : {
|
||||||
"da" : {
|
"da" : {
|
||||||
"stringUnit" : {
|
"stringUnit" : {
|
||||||
@@ -36,54 +36,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
|
||||||
"NSCalendarsFullAccessUsageDescription" : {
|
|
||||||
"comment" : "Privacy - Calendars Full Access Usage Description",
|
|
||||||
"extractionState" : "extracted_with_value",
|
|
||||||
"localizations" : {
|
|
||||||
"en" : {
|
|
||||||
"stringUnit" : {
|
|
||||||
"state" : "new",
|
|
||||||
"value" : "Confab can read and create calendar events when you ask it to, if you enable Calendar access in Settings."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"NSContactsUsageDescription" : {
|
|
||||||
"comment" : "Privacy - Contacts Usage Description",
|
|
||||||
"extractionState" : "extracted_with_value",
|
|
||||||
"localizations" : {
|
|
||||||
"en" : {
|
|
||||||
"stringUnit" : {
|
|
||||||
"state" : "new",
|
|
||||||
"value" : "Confab can search your contacts when you ask it to, if you enable Contacts access in Settings."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"NSLocationWhenInUseUsageDescription" : {
|
|
||||||
"comment" : "Privacy - Location When In Use Usage Description",
|
|
||||||
"extractionState" : "extracted_with_value",
|
|
||||||
"localizations" : {
|
|
||||||
"en" : {
|
|
||||||
"stringUnit" : {
|
|
||||||
"state" : "new",
|
|
||||||
"value" : "Confab can use your current location to answer questions, if you enable Location & Maps access in Settings."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"NSRemindersFullAccessUsageDescription" : {
|
|
||||||
"comment" : "Privacy - Reminders Full Access Usage Description",
|
|
||||||
"extractionState" : "extracted_with_value",
|
|
||||||
"localizations" : {
|
|
||||||
"en" : {
|
|
||||||
"stringUnit" : {
|
|
||||||
"state" : "new",
|
|
||||||
"value" : "Confab can read and create reminders when you ask it to, if you enable Reminders access in Settings."
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version" : "1.1"
|
"version" : "1.1"
|
||||||
|
|||||||
@@ -0,0 +1,60 @@
|
|||||||
|
//
|
||||||
|
// ThinkingVerbsTests.swift
|
||||||
|
// oAITests
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: PolyForm-Noncommercial-1.0.0
|
||||||
|
// Copyright (C) 2026 Rune Olsen
|
||||||
|
|
||||||
|
import Testing
|
||||||
|
import Foundation
|
||||||
|
@testable import Confab
|
||||||
|
|
||||||
|
@Suite("ThinkingVerbs language selection")
|
||||||
|
struct ThinkingVerbsTests {
|
||||||
|
|
||||||
|
private let supportedCodes = ["en", "nb", "sv", "da", "de", "fr"]
|
||||||
|
|
||||||
|
@Test("Every supported language has its own non-empty verb list")
|
||||||
|
func perLanguageListsAreNonEmpty() {
|
||||||
|
for code in supportedCodes {
|
||||||
|
#expect(!ThinkingVerbs.verbs(for: code).isEmpty)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test("Unknown language codes fall back to English")
|
||||||
|
func unknownCodeFallsBackToEnglish() {
|
||||||
|
#expect(ThinkingVerbs.verbs(for: "xx") == ThinkingVerbs.verbs(for: "en"))
|
||||||
|
#expect(ThinkingVerbs.verbs(for: "") == ThinkingVerbs.verbs(for: "en"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test("Each supported language's list is genuinely distinct, not a fallback copy of English")
|
||||||
|
func perLanguageListsAreDistinctFromEnglish() {
|
||||||
|
let english = ThinkingVerbs.verbs(for: "en")
|
||||||
|
for code in supportedCodes where code != "en" {
|
||||||
|
#expect(ThinkingVerbs.verbs(for: code) != english)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test("Language lists are comparable in size — none is a token stub")
|
||||||
|
func perLanguageListsAreComparablyMore() {
|
||||||
|
let minimumCount = 40
|
||||||
|
for code in supportedCodes {
|
||||||
|
#expect(ThinkingVerbs.verbs(for: code).count >= minimumCount)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test("No duplicate entries within a single language's list")
|
||||||
|
func noDuplicatesWithinLanguage() {
|
||||||
|
for code in supportedCodes {
|
||||||
|
let list = ThinkingVerbs.verbs(for: code)
|
||||||
|
#expect(Set(list).count == list.count)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test("random() returns a non-empty string ending in an ellipsis")
|
||||||
|
func randomProducesEllipsisSuffixedString() {
|
||||||
|
let result = ThinkingVerbs.random()
|
||||||
|
#expect(!result.isEmpty)
|
||||||
|
#expect(result.hasSuffix("..."))
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user