From c21fe49f4f03e78e7d3d61098b28619756fae416 Mon Sep 17 00:00:00 2001 From: Rune Olsen Date: Wed, 5 Aug 2026 12:57:49 +0200 Subject: [PATCH] Add per-language thinking verbs; close major i18n translation gap MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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. --- oAI/Localizable.xcstrings | 4834 +++++++++++++++++++++- oAI/Services/ThinkingVerbs.swift | 625 ++- oAI/Views/Main/SyncStatusIndicator.swift | 2 +- oAI/oAI-InfoPlist.xcstrings | 50 +- oAITests/ThinkingVerbsTests.swift | 60 + 5 files changed, 5424 insertions(+), 147 deletions(-) create mode 100644 oAITests/ThinkingVerbsTests.swift diff --git a/oAI/Localizable.xcstrings b/oAI/Localizable.xcstrings index 7e88e58..c216872 100644 --- a/oAI/Localizable.xcstrings +++ b/oAI/Localizable.xcstrings @@ -71,6 +71,40 @@ } } }, + "'%@' is a reserved prefix. Choose a different name." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' er et reserveret præfiks. Vælg et andet navn." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "„%@“ ist ein reserviertes Präfix. Wähle einen anderen Namen." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "« %@ » est un préfixe réservé. Choisissez un autre nom." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' er et reservert prefiks. Velg et annet navn." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "'%@' är ett reserverat prefix. Välj ett annat namn." + } + } + } + }, "(always used)" : { "localizations" : { "da" : { @@ -315,7 +349,42 @@ } } }, + "%@ conversations" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ samtaler" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ Gespräche" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ conversations" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ samtaler" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ konversationer" + } + } + } + }, "%@ min" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -385,7 +454,42 @@ } } }, + "%@ selected" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ valgt" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ ausgewählt" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ sélectionnées" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ valgt" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ valda" + } + } + } + }, "%@ tokens" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -419,6 +523,74 @@ } } }, + "%@_" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@_" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@_" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@_" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@_" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@_" + } + } + } + }, + "%@." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@." + } + } + } + }, "%@s" : { "localizations" : { "da" : { @@ -628,6 +800,7 @@ } }, "^[%@ file](inflect: true)" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -695,7 +868,48 @@ } } }, + "^[%@ message](inflect: true) · %@ tokens" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "new", + "value" : "^[%1$@ message](inflect: true) · %2$@ tokens" + } + }, + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "^[%1$@ besked](inflect: true) · %2$@ tokens" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "^[%1$@ Nachricht](inflect: true) · %2$@ tokens" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "^[%1$@ message](inflect: true) · %2$@ tokens" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "^[%1$@ melding](inflect: true) · %2$@ tokens" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "^[%1$@ meddelande](inflect: true) · %2$@ tokens" + } + } + } + }, "^[%@ running](inflect: true)" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -730,6 +944,7 @@ } }, "^[%@ skill](inflect: true) active — appended to every system prompt" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -764,6 +979,7 @@ } }, "^[%@ skill](inflect: true) exported to Downloads" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -798,6 +1014,7 @@ } }, "^[%@ skill](inflect: true) imported" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -1006,6 +1223,74 @@ } } }, + "⚠️ Beta — Apple's Foundation Models framework is still in active development." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️ Beta — Apples Foundation Models-framework er stadig under aktiv udvikling." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️ Beta — Apples Foundation-Models-Framework befindet sich noch in aktiver Entwicklung." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️ Bêta — le framework Foundation Models d'Apple est encore en développement actif." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️ Beta — Apples Foundation Models-rammeverk er fortsatt under aktiv utvikling." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️ Beta — Apples Foundation Models-ramverk är fortfarande under aktiv utveckling." + } + } + } + }, + "⚠️ Beta — Apple's on-device model is still in active development (currently macOS 27 beta). Expect rough edges: a small 4K context window, occasional generation errors, and no tool support yet." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️ Beta — Apples model på enheden er stadig under aktiv udvikling (i øjeblikket macOS 27 beta). Forvent grovheder: et lille 4K-kontekstvindue, lejlighedsvise genereringsfejl og ingen værktøjsstøtte endnu." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️ Beta — Apples On-Device-Modell befindet sich noch in aktiver Entwicklung (derzeit macOS 27 Beta). Erwarte Kanten: ein kleines 4K-Kontextfenster, gelegentliche Generierungsfehler und noch keine Tool-Unterstützung." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️ Bêta — le modèle sur l'appareil d'Apple est encore en développement actif (actuellement macOS 27 bêta). Attendez-vous à des aspérités : une petite fenêtre de contexte de 4K, des erreurs de génération occasionnelles, et pas encore de prise en charge des outils." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️ Beta — Apples modell på enheten er fortsatt under aktiv utvikling (for tiden macOS 27 beta). Forvent noe ruhet: et lite 4K-kontekstvindu, sporadiske genereringsfeil, og ingen verktøystøtte ennå." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "⚠️ Beta — Apples modell på enheten är fortfarande under aktiv utveckling (för närvarande macOS 27 beta). Förvänta dig vissa skavanker: ett litet 4K-kontextfönster, enstaka genereringsfel och inget verktygsstöd ännu." + } + } + } + }, "⚠️ Beta — Paperless integration is under active development. Some features may be incomplete or behave unexpectedly." : { "comment" : "A warning displayed in the settings view.", "isCommentAutoGenerated" : true, @@ -1494,6 +1779,40 @@ } } }, + "1 second" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 sekund" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 Sekunde" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 seconde" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 sekund" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "1 sekund" + } + } + } + }, "1. Open Anytype → Settings → Integrations" : { "localizations" : { "da" : { @@ -1565,6 +1884,7 @@ } }, "1K tokens" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -1706,7 +2026,42 @@ } } }, + "10 seconds" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "10 sekunder" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "10 Sekunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "10 secondes" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "10 sekunder" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "10 sekunder" + } + } + } + }, "10K tokens" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -1740,7 +2095,76 @@ } } }, + "30 seconds" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 sekunder" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 Sekunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 secondes" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 sekunder" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "30 sekunder" + } + } + } + }, + "60 seconds" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "60 sekunder" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "60 Sekunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "60 secondes" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "60 sekunder" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "60 sekunder" + } + } + } + }, "100K tokens" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -1809,6 +2233,7 @@ } }, "A new version is available — click to open the releases page" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -1879,6 +2304,7 @@ } }, "About Confab" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -1913,6 +2339,7 @@ } }, "Access denied — enable in System Settings" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -1947,6 +2374,7 @@ } }, "Access granted" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -1981,6 +2409,7 @@ } }, "Access not granted" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2083,6 +2512,7 @@ } }, "Actions" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2225,6 +2655,7 @@ } }, "Activity" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2258,7 +2689,76 @@ } } }, + "Add a server below, e.g.: safaridriver --mcp" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføj en server nedenfor, f.eks.: safaridriver --mcp" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Füge unten einen Server hinzu, z. B.: safaridriver --mcp" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajoutez un serveur ci-dessous, par ex. : safaridriver --mcp" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg til en server nedenfor, f.eks.: safaridriver --mcp" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lägg till en server nedan, t.ex.: safaridriver --mcp" + } + } + } + }, + "Add External MCP Server" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføj ekstern MCP-server" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Externen MCP-Server hinzufügen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajouter un serveur MCP externe" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg til ekstern MCP-server" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lägg till extern MCP-server" + } + } + } + }, "Add File" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2293,6 +2793,7 @@ } }, "Add Folder…" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2327,6 +2828,7 @@ } }, "Advanced search — semantic search, bulk delete, export" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2360,7 +2862,42 @@ } } }, + "AFFECTED FILES" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "BERØRTE FILER" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "BETROFFENE DATEIEN" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "FICHIERS CONCERNÉS" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "BERØRTE FILER" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "BERÖRDA FILER" + } + } + } + }, "After idle timeout" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2429,6 +2966,7 @@ } }, "Agent name" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2531,6 +3069,7 @@ } }, "AI Configuration" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2565,6 +3104,7 @@ } }, "AI Email Handler" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2599,6 +3139,7 @@ } }, "AI Model" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2633,6 +3174,7 @@ } }, "AI Provider" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2700,7 +3242,42 @@ } } }, + "All-Time" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Samlet" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gesamt" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Total" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Totalt" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Totalt" + } + } + } + }, "Allow for Session" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2735,6 +3312,7 @@ } }, "Allow Once" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2873,6 +3451,7 @@ } }, "Allowed Folders" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2943,6 +3522,7 @@ } }, "API Key" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -2977,6 +3557,7 @@ } }, "API Keys" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -3047,6 +3628,7 @@ } }, "API Token" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -3081,6 +3663,7 @@ } }, "API URL" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -3114,7 +3697,42 @@ } } }, + "Apple Intelligence" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apple Intelligence" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apple Intelligence" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apple Intelligence" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apple Intelligence" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Apple Intelligence" + } + } + } + }, "Architecture" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -3149,6 +3767,7 @@ } }, "Attach file" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -3183,6 +3802,7 @@ } }, "Authentication" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -3251,6 +3871,7 @@ } }, "Auto-export on save" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -3285,6 +3906,7 @@ } }, "Auto-pull on launch" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -3319,6 +3941,7 @@ } }, "Auto-Save" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -3353,6 +3976,7 @@ } }, "Auto-sync can cause conflicts if running on multiple machines simultaneously." : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -3527,6 +4151,7 @@ } }, "Base URL" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -3629,6 +4254,7 @@ } }, "Brief description shown in the command dropdown" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -3663,6 +4289,7 @@ } }, "Brief summary (optional — auto-extracted from content if left blank)" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -3733,6 +4360,7 @@ } }, "Calendar" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -3767,6 +4395,7 @@ } }, "Cancel" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -3837,6 +4466,7 @@ } }, "Categories" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -4045,6 +4675,7 @@ } }, "Choose…" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -4079,6 +4710,7 @@ } }, "Clear" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -4149,6 +4781,7 @@ } }, "Clear Chat" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -4183,6 +4816,7 @@ } }, "Clear Email Log?" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -4250,7 +4884,42 @@ } } }, + "Clone Repository" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klon repository" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Repository klonen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cloner le dépôt" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klon repositorium" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klona förvar" + } + } + } + }, "Combine" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -4528,7 +5197,183 @@ } } }, + "Confab" : { + "comment" : "The name of the app.", + "isCommentAutoGenerated" : true, + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab" + } + } + } + }, + "Confab (formerly oAI) v2.4 was the last version to support Intel Macs and Rosetta. Starting with macOS 28, Confab will require Apple Silicon. Consider upgrading your Mac to continue receiving updates." : { + "comment" : "A warning that Intel Macs are no longer supported.", + "isCommentAutoGenerated" : true, + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab (tidligere oAI) v2.4 var den sidste version, der understøttede Intel-Mac og Rosetta. Fra macOS 28 vil Confab kræve Apple Silicon. Overvej at opgradere din Mac for at fortsætte med at få opdateringer." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab (früher oAI) v2.4 war die letzte Version, die Intel-Macs und Rosetta unterstützte. Ab macOS 28 benötigt Confab Apple Silicon. Erwäge ein Upgrade deines Mac, um weiterhin Updates zu erhalten." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab (anciennement oAI) v2.4 était la dernière version à prendre en charge les Mac Intel et Rosetta. À partir de macOS 28, Confab nécessitera Apple Silicon. Envisage de mettre à niveau ton Mac pour continuer à recevoir des mises à jour." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab (tidligere oAI) v2.4 var den siste versjonen som støttet Intel-Mac og Rosetta. Fra macOS 28 vil Confab kreve Apple Silicon. Vurder å oppgradere Mac-en din for å fortsette å få oppdateringer." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab (tidigare oAI) v2.4 var den sista versionen som stödde Intel-Mac och Rosetta. Från macOS 28 kommer Confab att kräva Apple Silicon. Överväg att uppgradera din Mac för att fortsätta få uppdateringar." + } + } + } + }, + "Confab Help" : { + "extractionState" : "stale", + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab-hjælp" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab-Hilfe" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aide Confab" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab-hjelp" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab-hjälp" + } + } + } + }, + "Confab syncs in the background automatically, and just hit a file that collided with a leftover local copy of itself" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab synkroniserer automatisk i baggrunden og stødte lige på en fil, der kolliderede med en efterladt lokal kopi af sig selv" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab synchronisiert automatisch im Hintergrund und ist gerade auf eine Datei gestoßen, die mit einer zurückgebliebenen lokalen Kopie von sich selbst kollidierte" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab se synchronise automatiquement en arrière-plan, et vient de rencontrer un fichier en conflit avec une copie locale résiduelle de lui-même" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab synkroniserer automatisk i bakgrunnen, og støtte nettopp på en fil som kolliderte med en gjenværende lokal kopi av seg selv" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Confab synkroniserar automatiskt i bakgrunden, och stötte just på en fil som kolliderade med en kvarbliven lokal kopia av sig själv" + } + } + } + }, + "Connect any stdio MCP server (e.g. safaridriver --mcp) to give the AI access to its tools. Tool names are prefixed with the server slug." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Forbind enhver stdio MCP-server (f.eks. safaridriver --mcp) for at give AI'en adgang til dens værktøjer. Værktøjsnavne får serverens slug som præfiks." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verbinde einen beliebigen stdio-MCP-Server (z. B. safaridriver --mcp), um der KI Zugriff auf dessen Tools zu geben. Tool-Namen erhalten den Server-Slug als Präfix." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Connectez n'importe quel serveur MCP stdio (par ex. safaridriver --mcp) pour donner à l'IA accès à ses outils. Les noms d'outils sont préfixés par le slug du serveur." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Koble til en hvilken som helst stdio MCP-server (f.eks. safaridriver --mcp) for å gi AI-en tilgang til verktøyene dens. Verktøynavn får serverens slug som prefiks." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anslut vilken stdio MCP-server som helst (t.ex. safaridriver --mcp) för att ge AI:n tillgång till dess verktyg. Verktygsnamn prefixas med serverns slug." + } + } + } + }, "Connection" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -4563,6 +5408,7 @@ } }, "Contacts" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -4633,6 +5479,7 @@ } }, "Context Window" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -4701,6 +5548,7 @@ } }, "Conversation Memory" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -4805,6 +5653,7 @@ } }, "Copy Image" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -4908,10 +5757,9 @@ } } }, - "Cost warning: each sub-agent runs its own full chain of model calls. A single request that spawns several agents can cost several times a normal reply. The AI is instructed to only use this for genuinely parallel research, but model behavior can vary — leave this off unless you want that tradeoff." : { - - }, + "Cost warning: each sub-agent runs its own full chain of model calls. A single request that spawns several agents can cost several times a normal reply. The AI is instructed to only use this for genuinely parallel research, but model behavior can vary — leave this off unless you want that tradeoff." : {}, "Costs" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -4945,6 +5793,40 @@ } } }, + "Couldn't load release notes. Check your internet connection and try again." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke indlæse udgivelsesnoter. Tjek din internetforbindelse, og prøv igen." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Versionshinweise konnten nicht geladen werden. Überprüfe deine Internetverbindung und versuche es erneut." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Impossible de charger les notes de version. Vérifiez votre connexion internet et réessayez." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne ikke laste inn utgivelsesnotater. Sjekk internettforbindelsen din, og prøv igjen." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Det gick inte att läsa in versionsanteckningar. Kontrollera din internetanslutning och försök igen." + } + } + } + }, "Create a dedicated email account specifically for AI handling. Do NOT use your personal email address." : { "localizations" : { "da" : { @@ -5016,6 +5898,7 @@ } }, "Create Directories" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5084,6 +5967,7 @@ } }, "Credits" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5118,6 +6002,7 @@ } }, "Cron expression (e.g. 0 * * * *)" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5151,7 +6036,42 @@ } } }, + "Daily" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dagligt" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Täglich" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quotidien" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Daglig" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dagligen" + } + } + } + }, "Default Model" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5220,6 +6140,7 @@ } }, "Default Provider" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5254,6 +6175,7 @@ } }, "Delete" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5322,6 +6244,7 @@ } }, "Delete conversation" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5356,6 +6279,7 @@ } }, "Delete Files" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5390,6 +6314,7 @@ } }, "Delete original conversations after combining" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5424,6 +6349,7 @@ } }, "Delete shortcut" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5458,6 +6384,7 @@ } }, "Delete skill" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5492,6 +6419,7 @@ } }, "Deny" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5562,6 +6490,7 @@ } }, "Dialog Text" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5630,6 +6559,7 @@ } }, "Dismiss" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5664,6 +6594,7 @@ } }, "Done" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5698,6 +6629,7 @@ } }, "Download v%@" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5732,6 +6664,7 @@ } }, "Duplicate Shortcut" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5766,6 +6699,7 @@ } }, "e.g. Code Review, Test Writer, Security Auditor" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -5833,6 +6767,40 @@ } } }, + "Each conversation can keep its own persistent notes.md file, read and written automatically by the AI once turned on with /notes on. Use this to browse or edit notes files directly in Finder." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hver samtale kan have sin egen vedvarende notes.md-fil, som AI'en automatisk læser og skriver til, når den er slået til med /notes on. Brug denne til at gennemse eller redigere notesfiler direkte i Finder." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jede Unterhaltung kann eine eigene, dauerhafte notes.md-Datei führen, die die KI automatisch liest und schreibt, sobald sie mit /notes on aktiviert wurde. Nutze dies, um Notizdateien direkt im Finder zu durchsuchen oder zu bearbeiten." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chaque conversation peut conserver son propre fichier notes.md persistant, lu et écrit automatiquement par l'IA une fois activé avec /notes on. Utilisez ceci pour parcourir ou modifier les fichiers de notes directement dans le Finder." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hver samtale kan ha sin egen vedvarende notes.md-fil, som AI-en automatisk leser og skriver til når den er slått på med /notes on. Bruk dette til å bla gjennom eller redigere notatfiler direkte i Finder." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Varje konversation kan ha sin egen beständiga notes.md-fil, som AI:n automatiskt läser och skriver till när den slås på med /notes on. Använd detta för att bläddra i eller redigera anteckningsfiler direkt i Finder." + } + } + } + }, "Edit" : { "comment" : "A button to edit a skill.", "isCommentAutoGenerated" : true, @@ -5974,6 +6942,7 @@ } }, "Email Log" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6008,6 +6977,7 @@ } }, "Email Server" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6076,6 +7046,7 @@ } }, "Email Trigger" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6110,6 +7081,7 @@ } }, "Embed All Conversations" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6178,6 +7150,7 @@ } }, "Enable Anytype" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6212,6 +7185,7 @@ } }, "Enable Auto-Save" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6246,6 +7220,7 @@ } }, "Enable Bash Execution" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6280,6 +7255,7 @@ } }, "Enable Email Handler" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6350,6 +7326,7 @@ } }, "Enable Embeddings" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6384,6 +7361,7 @@ } }, "Enable Git Sync" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6418,6 +7396,7 @@ } }, "Enable Jarvis" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6452,6 +7431,7 @@ } }, "Enable MCP" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6486,6 +7466,7 @@ } }, "Enable Online Mode" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6520,6 +7501,7 @@ } }, "Enable Paperless" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6554,6 +7536,7 @@ } }, "Enable Rate Limit" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6588,6 +7571,7 @@ } }, "Enable Streaming" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6622,6 +7606,7 @@ } }, "Enable Summarization" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6656,6 +7641,7 @@ } }, "Enabled" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6690,6 +7676,7 @@ } }, "Enter your Ollama server URL to enable the Ollama provider" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6830,6 +7817,7 @@ } }, "Executes immediately — no extra input needed" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6864,6 +7852,7 @@ } }, "Export" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6898,6 +7887,7 @@ } }, "Export All" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6932,6 +7922,7 @@ } }, "Export as Markdown…" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6966,6 +7957,7 @@ } }, "Export shortcut" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -6999,7 +7991,42 @@ } } }, + "External MCP Servers" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksterne MCP-servere" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Externe MCP-Server" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serveurs MCP externes" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksterne MCP-servere" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Externa MCP-servrar" + } + } + } + }, "Features" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7104,6 +8131,7 @@ } }, "Filter by category" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7172,6 +8200,7 @@ } }, "Filtering" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7205,7 +8234,144 @@ } } }, + "Fix It Yourself" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ordn det selv" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Selbst beheben" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Le faire soi-même" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fiks det selv" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fixa det själv" + } + } + } + }, + "Fixed — your conversations are back in sync." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Løst — dine samtaler er synkroniseret igen." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Behoben — deine Unterhaltungen sind wieder synchron." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Corrigé — vos conversations sont de nouveau synchronisées." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fikset — samtalene dine er synkronisert igjen." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Löst — dina konversationer är synkroniserade igen." + } + } + } + }, + "Fixing..." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ordner..." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wird behoben..." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Correction en cours..." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fikser..." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fixar..." + } + } + } + }, + "Four steps, then Confab takes over again" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fire trin, så tager Confab over igen" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vier Schritte, dann übernimmt Confab wieder" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quatre étapes, puis Confab reprend la main" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fire steg, så tar Confab over igjen" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fyra steg, sedan tar Confab över igen" + } + } + } + }, "Generate an API key in your Jarvis settings and paste it above." : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7240,6 +8406,7 @@ } }, "Generate embeddings for all existing messages (one-time operation)" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7273,7 +8440,42 @@ } } }, + "git pull --ff-only" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "git pull --ff-only" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "git pull --ff-only" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "git pull --ff-only" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "git pull --ff-only" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "git pull --ff-only" + } + } + } + }, "Git Sync" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7342,6 +8544,7 @@ } }, "Google API Key" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7376,6 +8579,7 @@ } }, "Got It" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7410,6 +8614,7 @@ } }, "GUI Text" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7480,6 +8685,7 @@ } }, "Hide" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7514,6 +8720,7 @@ } }, "Hide Reasoning in Response" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7686,6 +8893,7 @@ } }, "iCloud Drive Backup" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7720,6 +8928,7 @@ } }, "Icon Size" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7754,6 +8963,7 @@ } }, "ID" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7788,6 +8998,7 @@ } }, "Idle" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7822,6 +9033,7 @@ } }, "Idle Timeout" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7856,6 +9068,7 @@ } }, "Image Gen" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7890,6 +9103,7 @@ } }, "IMAP Host" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7924,6 +9138,7 @@ } }, "IMAP Port" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7958,6 +9173,7 @@ } }, "immediate" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -7992,6 +9208,7 @@ } }, "Import" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8026,6 +9243,7 @@ } }, "In-App Help" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8059,40 +9277,6 @@ } } }, - "Clone Repository" : { - "localizations" : { - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Klon repository" - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Repository klonen" - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Cloner le dépôt" - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "Klon repositorium" - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Klona förvar" - } - } - } - }, "Inject into system prompt for every conversation" : { "localizations" : { "da" : { @@ -8162,6 +9346,7 @@ } }, "Input Text" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8196,6 +9381,7 @@ } }, "Instruct Type" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8230,6 +9416,7 @@ } }, "Intel Mac Support Ending" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8264,6 +9451,7 @@ } }, "Jarvis" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8297,7 +9485,42 @@ } } }, + "Jarvis is oAI-Web, a self-hosted companion server that lets Confab sync and connect remotely." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jarvis er oAI-Web, en selv-hostet følgeserver, der lader Confab synkronisere og oprette forbindelse eksternt." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jarvis ist oAI-Web, ein selbst gehosteter Begleitserver, mit dem Confab remote synchronisieren und sich verbinden kann." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jarvis, c'est oAI-Web, un serveur compagnon auto-hébergé qui permet à Confab de se synchroniser et de se connecter à distance." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jarvis er oAI-Web, en selvhostet følgeserver som lar Confab synkronisere og koble til eksternt." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jarvis är oAI-Web, en självhostad följeslagarserver som låter Confab synkronisera och ansluta på distans." + } + } + } + }, "Keep Both" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8332,6 +9555,7 @@ } }, "Keyboard Shortcuts" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8402,6 +9626,7 @@ } }, "Last Backup" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8470,6 +9695,7 @@ } }, "Later" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8504,6 +9730,7 @@ } }, "Leave blank for default" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8572,6 +9799,7 @@ } }, "Let the AI access your Calendar, Reminders, and Location & Maps to answer questions about your schedule and surroundings. Each service is opt-in and uses standard macOS permission prompts. This functionality is in beta and may change." : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8605,10 +9833,43 @@ } } }, - "Let the AI spawn read-only research sub-agents to investigate multiple things in parallel (read files, list/search directories, search the web — no writing, no bash). Intended for genuinely independent research tasks, not everyday questions." : { - + "Let the AI access your Calendar, Reminders, Contacts, and Location & Maps to answer questions about your schedule and surroundings. Each service is opt-in and uses standard macOS permission prompts. This functionality is in beta and may change." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lad AI'en få adgang til din Kalender, Påmindelser, Kontakter og Lokation og Kort for at besvare spørgsmål om din tidsplan og dine omgivelser. Hver tjeneste er valgfri og bruger standard macOS-tilladelsesprompter. Denne funktion er i beta og kan ændre sig." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erlaube der KI Zugriff auf deinen Kalender, deine Erinnerungen, Kontakte sowie Standort & Karten, um Fragen zu deinem Terminplan und deiner Umgebung zu beantworten. Jeder Dienst ist optional und nutzt die üblichen macOS-Berechtigungsabfragen. Diese Funktion befindet sich in der Beta-Phase und kann sich ändern." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Laissez l'IA accéder à votre Calendrier, vos Rappels, vos Contacts et Position et Plans pour répondre à des questions sur votre emploi du temps et votre environnement. Chaque service est optionnel et utilise les demandes d'autorisation standard de macOS. Cette fonctionnalité est en bêta et peut évoluer." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "La AI-en få tilgang til Kalenderen, Påminnelser, Kontakter og Posisjon og Kart for å svare på spørsmål om timeplanen og omgivelsene dine. Hver tjeneste er valgfri og bruker standard macOS-tillatelsesspørsmål. Denne funksjonaliteten er i beta og kan endre seg." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Låt AI:n få åtkomst till din Kalender, Påminnelser, Kontakter och Plats och Kartor för att svara på frågor om ditt schema och din omgivning. Varje tjänst är valfri och använder standardbehörighetsfrågor i macOS. Den här funktionen är i betaversion och kan komma att ändras." + } + } + } }, + "Let the AI spawn read-only research sub-agents to investigate multiple things in parallel (read files, list/search directories, search the web — no writing, no bash). Intended for genuinely independent research tasks, not everyday questions." : {}, "Loading usage…" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8643,6 +9904,7 @@ } }, "Loading..." : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8677,6 +9939,7 @@ } }, "Local Path" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8711,6 +9974,7 @@ } }, "Location & Maps" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8745,6 +10009,7 @@ } }, "Log Level" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8779,6 +10044,7 @@ } }, "Logging" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8883,6 +10149,7 @@ } }, "Manual Sync" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8953,6 +10220,7 @@ } }, "Max Context Tokens" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -8987,6 +10255,7 @@ } }, "Max Emails Per Hour" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9021,6 +10290,7 @@ } }, "Max Response Tokens" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9055,6 +10325,7 @@ } }, "Max Tokens" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9123,6 +10394,7 @@ } }, "Max Tool Calls" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9225,6 +10497,7 @@ } }, "Memory & Context" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9293,6 +10566,7 @@ } }, "Message Threshold" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9395,6 +10669,7 @@ } }, "Method" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9429,6 +10704,7 @@ } }, "Min Messages" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9496,7 +10772,42 @@ } } }, + "Mirrors your in-progress conversation to disk so a crash or force-quit doesn't lose it. Never shown as a saved conversation." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spejler din igangværende samtale til disken, så et nedbrud eller en tvunget lukning ikke mister den. Vises aldrig som en gemt samtale." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spiegelt deine laufende Unterhaltung auf die Festplatte, damit ein Absturz oder erzwungenes Beenden sie nicht verliert. Wird nie als gespeicherte Unterhaltung angezeigt." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Reflète votre conversation en cours sur le disque afin qu'un plantage ou une fermeture forcée ne la perde pas. Jamais affichée comme une conversation enregistrée." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Speiler den pågående samtalen din til disk, slik at en krasj eller tvungen lukking ikke mister den. Vises aldri som en lagret samtale." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Speglar din pågående konversation till disken så att en krasch eller tvingad avslutning inte förlorar den. Visas aldrig som en sparad konversation." + } + } + } + }, "Modality" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9531,6 +10842,7 @@ } }, "Model" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9599,6 +10911,7 @@ } }, "Model Details" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9669,6 +10982,7 @@ } }, "Model Parameters" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9703,6 +11017,7 @@ } }, "Model Settings" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9771,6 +11086,7 @@ } }, "Move & Copy Files" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9804,6 +11120,40 @@ } } }, + "Move to Folder (%@)" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Flyt til mappe (%@)" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "In Ordner verschieben (%@)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Déplacer vers le dossier (%@)" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Flytt til mappe (%@)" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Flytta till mapp (%@)" + } + } + } + }, "Multi-provider AI chat client" : { "comment" : "A description of Confab.", "isCommentAutoGenerated" : true, @@ -9877,6 +11227,7 @@ } }, "needs input" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9911,6 +11262,7 @@ } }, "Needs input — user types after the command" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -9981,6 +11333,7 @@ } }, "New Agent" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -10083,6 +11436,7 @@ } }, "New Shortcut" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -10117,6 +11471,7 @@ } }, "New Skill" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -10187,6 +11542,7 @@ } }, "No default model configured — set one in Settings → General." : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -10256,6 +11612,40 @@ } } }, + "No external servers configured" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingen eksterne servere konfigureret" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Keine externen Server konfiguriert" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aucun serveur externe configuré" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingen eksterne servere konfigurert" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inga externa servrar konfigurerade" + } + } + } + }, "No files attached. Add JSON, YAML, CSV or TXT files to inject data into the system prompt alongside this skill." : { "comment" : "A message displayed when a user has not attached any files to a skill.", "isCommentAutoGenerated" : true, @@ -10362,6 +11752,40 @@ } } }, + "No release notes are available yet for %@." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Der er endnu ikke udgivelsesnoter tilgængelige for %@." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Für %@ sind noch keine Versionshinweise verfügbar." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aucune note de version n'est encore disponible pour %@." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Det er ikke tilgjengelig utgivelsesnotater for %@ ennå." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Det finns inga versionsanteckningar tillgängliga för %@ än." + } + } + } + }, "No results for \"%@\"" : { "comment" : "A message displayed when there are no search results. The argument is the search term.", "isCommentAutoGenerated" : true, @@ -10576,113 +12000,76 @@ } } }, - "Confab" : { - "comment" : "The name of the app.", - "isCommentAutoGenerated" : true, + "No usage data yet" : { "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Confab" + "value" : "Ingen brugsdata endnu" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Confab" + "value" : "Noch keine Nutzungsdaten" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Confab" + "value" : "Aucune donnée d'utilisation pour le moment" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Confab" + "value" : "Ingen bruksdata ennå" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Confab" + "value" : "Ingen användningsdata än" } } } }, - "Confab Help" : { + "Off" : { "localizations" : { "da" : { "stringUnit" : { "state" : "translated", - "value" : "Confab-hjælp" + "value" : "Fra" } }, "de" : { "stringUnit" : { "state" : "translated", - "value" : "Confab-Hilfe" + "value" : "Aus" } }, "fr" : { "stringUnit" : { "state" : "translated", - "value" : "Aide Confab" + "value" : "Désactivé" } }, "nb" : { "stringUnit" : { "state" : "translated", - "value" : "Confab-hjelp" + "value" : "Av" } }, "sv" : { "stringUnit" : { "state" : "translated", - "value" : "Confab-hjälp" - } - } - } - }, - "Confab (formerly oAI) v2.4 was the last version to support Intel Macs and Rosetta. Starting with macOS 28, Confab will require Apple Silicon. Consider upgrading your Mac to continue receiving updates." : { - "comment" : "A warning that Intel Macs are no longer supported.", - "isCommentAutoGenerated" : true, - "localizations" : { - "da" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confab (tidligere oAI) v2.4 var den sidste version, der understøttede Intel-Mac og Rosetta. Fra macOS 28 vil Confab kræve Apple Silicon. Overvej at opgradere din Mac for at fortsætte med at få opdateringer." - } - }, - "de" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confab (früher oAI) v2.4 war die letzte Version, die Intel-Macs und Rosetta unterstützte. Ab macOS 28 benötigt Confab Apple Silicon. Erwäge ein Upgrade deines Mac, um weiterhin Updates zu erhalten." - } - }, - "fr" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confab (anciennement oAI) v2.4 était la dernière version à prendre en charge les Mac Intel et Rosetta. À partir de macOS 28, Confab nécessitera Apple Silicon. Envisage de mettre à niveau ton Mac pour continuer à recevoir des mises à jour." - } - }, - "nb" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confab (tidligere oAI) v2.4 var den siste versjonen som støttet Intel-Mac og Rosetta. Fra macOS 28 vil Confab kreve Apple Silicon. Vurder å oppgradere Mac-en din for å fortsette å få oppdateringer." - } - }, - "sv" : { - "stringUnit" : { - "state" : "translated", - "value" : "Confab (tidigare oAI) v2.4 var den sista versionen som stödde Intel-Mac och Rosetta. Från macOS 28 kommer Confab att kräva Apple Silicon. Överväg att uppgradera din Mac för att fortsätta få uppdateringar." + "value" : "Av" } } } }, "OK" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -10753,6 +12140,7 @@ } }, "Ollama URL" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -10787,6 +12175,7 @@ } }, "On app quit" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -10821,6 +12210,7 @@ } }, "On model switch" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -10854,7 +12244,110 @@ } } }, + "On-Device (4K context)" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "På enheden (4K kontekst)" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Auf dem Gerät (4K Kontext)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sur l'appareil (contexte 4K)" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "På enheten (4K kontekst)" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "På enheten (4K kontext)" + } + } + } + }, + "On-device and free — no credits or API key needed." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "På enheden og gratis — ingen kreditter eller API-nøgle nødvendig." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Auf dem Gerät und kostenlos — kein Guthaben oder API-Schlüssel nötig." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sur l'appareil et gratuit — aucun crédit ni clé API nécessaire." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "På enheten og gratis — ingen kreditter eller API-nøkkel nødvendig." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "På enheten och gratis — inga krediter eller API-nyckel behövs." + } + } + } + }, + "One or more of these files aren't ones Confab recognizes as safe to remove automatically — please fix this one yourself." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "En eller flere af disse filer er ikke nogen, Confab genkender som sikre at fjerne automatisk — ordn venligst denne selv." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eine oder mehrere dieser Dateien erkennt Confab nicht als sicher zum automatischen Entfernen — bitte behebe dies selbst." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Un ou plusieurs de ces fichiers ne sont pas reconnus par Confab comme sûrs à supprimer automatiquement — veuillez corriger cela vous-même." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "En eller flere av disse filene er ikke slike Confab gjenkjenner som trygge å fjerne automatisk — fiks denne selv." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "En eller flera av dessa filer är inte sådana Confab känner igen som säkra att ta bort automatiskt — fixa den här själv." + } + } + } + }, "Online" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -10889,6 +12382,7 @@ } }, "Online Mode (Web Search)" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -10923,6 +12417,7 @@ } }, "Online Mode: Off" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -10957,6 +12452,7 @@ } }, "Online Mode: On" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11025,6 +12521,7 @@ } }, "Open Chat…" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11059,6 +12556,7 @@ } }, "Open System Settings" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11369,6 +12867,7 @@ } }, "Optional description" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11437,6 +12936,7 @@ } }, "Overview" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11471,6 +12971,7 @@ } }, "Password" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11505,6 +13006,7 @@ } }, "Paused" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11539,6 +13041,7 @@ } }, "Permissions" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11607,6 +13110,7 @@ } }, "Pricing" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11641,6 +13145,7 @@ } }, "Progressive Summarization" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11709,6 +13214,7 @@ } }, "Provider" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11743,6 +13249,7 @@ } }, "Rate Limiting" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11845,6 +13352,7 @@ } }, "Reasoning (Thinking)" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11879,6 +13387,7 @@ } }, "Reasoning Effort" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11913,6 +13422,7 @@ } }, "Refresh" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11947,6 +13457,7 @@ } }, "Refresh agents" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -11981,6 +13492,7 @@ } }, "Release Page" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12015,6 +13527,7 @@ } }, "Reminders" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12083,6 +13596,7 @@ } }, "Remove file" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12117,6 +13631,7 @@ } }, "Rename" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12151,6 +13666,7 @@ } }, "Rename conversation" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12185,6 +13701,7 @@ } }, "Replace" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12219,6 +13736,7 @@ } }, "Request Access" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12253,6 +13771,7 @@ } }, "Require Approval" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12287,6 +13806,7 @@ } }, "Require Approval for Changes" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12320,10 +13840,9 @@ } } }, - "Research Agents" : { - - }, + "Research Agents" : {}, "Respect .gitignore" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12358,6 +13877,7 @@ } }, "Response Generation" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12392,6 +13912,7 @@ } }, "Response Settings" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12462,6 +13983,7 @@ } }, "Retry" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12496,6 +14018,7 @@ } }, "Run agent now" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12670,6 +14193,7 @@ } }, "Save" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12704,6 +14228,7 @@ } }, "Save Chat" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12738,6 +14263,7 @@ } }, "Save Chat As…" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12772,6 +14298,7 @@ } }, "Save to Downloads" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12806,6 +14333,7 @@ } }, "Schedule" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12840,6 +14368,7 @@ } }, "Search by sender, subject, or content..." : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12874,6 +14403,7 @@ } }, "Search by text or date (dd.mm.yyyy)..." : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12908,6 +14438,7 @@ } }, "Search commands, shortcuts, features..." : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12942,6 +14473,7 @@ } }, "Search Conversations" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -12976,6 +14508,7 @@ } }, "Search conversations..." : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13010,6 +14543,7 @@ } }, "Search conversations…" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13044,6 +14578,7 @@ } }, "Search Engine ID" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13078,6 +14613,7 @@ } }, "Search models..." : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13112,6 +14648,7 @@ } }, "Search Provider" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13180,6 +14717,7 @@ } }, "Select" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13214,6 +14752,7 @@ } }, "Select model" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13248,6 +14787,7 @@ } }, "Select Model" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13282,6 +14822,7 @@ } }, "Select model..." : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13316,6 +14857,7 @@ } }, "Semantic" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13350,6 +14892,7 @@ } }, "Semantic Search" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13384,6 +14927,7 @@ } }, "Send message" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13418,6 +14962,7 @@ } }, "Server URL" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13452,6 +14997,7 @@ } }, "Services" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13485,7 +15031,42 @@ } } }, + "Session" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Session" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sitzung" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Session" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Økt" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Session" + } + } + } + }, "Session Info" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13520,6 +15101,7 @@ } }, "Settings" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13554,6 +15136,7 @@ } }, "Settings…" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13624,6 +15207,7 @@ } }, "Show" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13658,6 +15242,7 @@ } }, "Show favorites only" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13692,6 +15277,7 @@ } }, "Show Icon Labels" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13726,6 +15312,7 @@ } }, "Show model info" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13900,6 +15487,7 @@ } }, "Skip" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13934,6 +15522,7 @@ } }, "Smart Context Selection" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -13968,6 +15557,7 @@ } }, "SMTP Host" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14002,6 +15592,7 @@ } }, "SMTP Port" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14036,6 +15627,7 @@ } }, "Software Update" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14138,6 +15730,7 @@ } }, "Star this message to always include it in context" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14171,7 +15764,42 @@ } } }, + "Starred models sync automatically via the same iCloud Drive folder — star a model on one Mac and it appears starred on your others within a launch or two." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stjernemarkerede modeller synkroniseres automatisk via den samme iCloud Drive-mappe — stjernemarker en model på én Mac, og den vises stjernemarkeret på dine andre inden for en opstart eller to." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favorisierte Modelle werden automatisch über denselben iCloud-Drive-Ordner synchronisiert — markiere ein Modell auf einem Mac als Favorit, und es erscheint innerhalb von ein bis zwei Starts auch auf deinen anderen Macs als favorisiert." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Les modèles favoris se synchronisent automatiquement via le même dossier iCloud Drive — mettez une étoile à un modèle sur un Mac, et il apparaîtra étoilé sur vos autres Mac en un ou deux lancements." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stjernemerkede modeller synkroniseres automatisk via den samme iCloud Drive-mappen — stjernemerk en modell på én Mac, så vises den stjernemerket på de andre innen en oppstart eller to." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Stjärnmärkta modeller synkroniseras automatiskt via samma iCloud Drive-mapp — stjärnmärk en modell på en Mac så visas den stjärnmärkt på dina andra inom en start eller två." + } + } + } + }, "Statistics" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14206,6 +15834,7 @@ } }, "Stats" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14240,6 +15869,7 @@ } }, "Status" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14273,7 +15903,42 @@ } } }, + "Still couldn't sync: %@" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne stadig ikke synkronisere: %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synchronisierung weiterhin fehlgeschlagen: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Toujours impossible de synchroniser : %@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunne fortsatt ikke synkronisere: %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kunde fortfarande inte synkronisera: %@" + } + } + } + }, "Stop agent" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14308,6 +15973,7 @@ } }, "Stop generation" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14376,6 +16042,7 @@ } }, "Subject Identifier" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14410,6 +16077,7 @@ } }, "Switch provider" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14512,6 +16180,7 @@ } }, "Sync Options" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14545,7 +16214,42 @@ } } }, + "Sync Ran Into a Conflict" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkronisering stødte på en konflikt" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synchronisierung ist auf einen Konflikt gestoßen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "La synchronisation a rencontré un conflit" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkronisering støtte på en konflikt" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkroniseringen stötte på en konflikt" + } + } + } + }, "System Prompt (Optional)" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14580,6 +16284,7 @@ } }, "System Prompts" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14614,6 +16319,7 @@ } }, "Temperature" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14788,6 +16494,7 @@ } }, "Text Sizes" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -14959,7 +16666,42 @@ } } }, + "These are Confab's own sync bookkeeping files, not your conversations — nothing you've written is at risk either way." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dette er Confabs egne synkroniseringsbogføringsfiler, ikke dine samtaler — intet du har skrevet, er i fare uanset hvad." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Das sind Confabs eigene Synchronisierungs-Buchhaltungsdateien, nicht deine Unterhaltungen — nichts, was du geschrieben hast, ist in irgendeiner Weise gefährdet." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ce sont les propres fichiers de suivi de synchronisation de Confab, pas vos conversations — rien de ce que vous avez écrit n'est en danger, dans un cas comme dans l'autre." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dette er Confabs egne synkroniseringsbokføringsfiler, ikke samtalene dine — ingenting du har skrevet er i fare uansett." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Det här är Confabs egna synkroniseringsbokföringsfiler, inte dina konversationer — inget du har skrivit är i fara oavsett." + } + } + } + }, "Thinking" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -15098,6 +16840,7 @@ } }, "Timeout (seconds)" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -15132,6 +16875,7 @@ } }, "Token" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -15202,6 +16946,7 @@ } }, "Token Usage" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -15236,6 +16981,7 @@ } }, "Tokenizer" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -15303,7 +17049,42 @@ } } }, + "Tool prefix:" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Værktøjspræfiks:" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tool-Präfix:" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Préfixe d'outil :" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verktøyprefiks:" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verktygsprefix:" + } + } + } + }, "Toolbar" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -15338,6 +17119,7 @@ } }, "Tools" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -15615,6 +17397,40 @@ } } }, + "Unfiled" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uden mappe" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ohne Ordner" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sans dossier" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Uten mappe" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utan mapp" + } + } + } + }, "Update Available%@" : { "comment" : "A button that opens a website with information about a new version of Confab. The argument is the version number of the new version.", "isCommentAutoGenerated" : true, @@ -15652,6 +17468,7 @@ } }, "URL" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -15828,6 +17645,7 @@ } }, "Use AI-powered semantic search instead of keyword matching" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -15862,6 +17680,7 @@ } }, "Use Only Your Prompt" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -15896,6 +17715,7 @@ } }, "username" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -15930,6 +17750,7 @@ } }, "Username" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -16077,6 +17898,7 @@ } }, "View" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -16145,6 +17967,7 @@ } }, "Vision" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -16179,6 +18002,7 @@ } }, "Web Search" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -16212,6 +18036,74 @@ } } }, + "Weekly" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ugentligt" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wöchentlich" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hebdomadaire" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ukentlig" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Veckovis" + } + } + } + }, + "When enabled, Confab backs up automatically in the background (checked at launch and hourly while running) — no need to press \"Back Up Now\" yourself." : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Når aktiveret, sikkerhedskopierer Confab automatisk i baggrunden (tjekket ved opstart og hver time mens den kører) — ingen grund til selv at trykke på \"Sikkerhedskopier nu\"." + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Wenn aktiviert, sichert Confab automatisch im Hintergrund (geprüft beim Start und stündlich während der Ausführung) — du musst nicht selbst auf „Jetzt sichern“ drücken." + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Une fois activé, Confab effectue une sauvegarde automatique en arrière-plan (vérifiée au lancement et toutes les heures pendant l'exécution) — pas besoin d'appuyer vous-même sur « Sauvegarder maintenant »." + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Når aktivert, sikkerhetskopierer Confab automatisk i bakgrunnen (sjekket ved oppstart og hver time mens den kjører) — ingen grunn til å trykke \"Sikkerhetskopier nå\" selv." + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "När aktiverat säkerhetskopierar Confab automatiskt i bakgrunden (kontrolleras vid start och varje timme medan appen körs) — inget behov av att trycka på \"Säkerhetskopiera nu\" själv." + } + } + } + }, "When enabled, listing and searching skip gitignored files. Write operations always ignore .gitignore." : { "localizations" : { "da" : { @@ -16247,6 +18139,7 @@ } }, "Working Directory" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -16317,6 +18210,7 @@ } }, "Write & Edit Files" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -16351,6 +18245,7 @@ } }, "Write Actions" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -16421,6 +18316,7 @@ } }, "Your Shortcuts" : { + "extractionState" : "stale", "localizations" : { "da" : { "stringUnit" : { @@ -16489,6 +18385,2760 @@ } } } + }, + "Click to re-save \"%@\"" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klik for at gemme \"%@\" igen" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klicke, um „%@“ erneut zu speichern" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Cliquez pour ré-enregistrer « %@ »" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klikk for å lagre \"%@\" på nytt" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klicka för att spara \"%@\" igen" + } + } + } + }, + "Saved — no changes" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gemt — ingen ændringer" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gespeichert — keine Änderungen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enregistré — aucune modification" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lagret — ingen endringer" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sparad — inga ändringar" + } + } + } + }, + "Not saved — use /save " : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ikke gemt — brug /save " + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nicht gespeichert — verwende /save " + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non enregistré — utilisez /save " + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ikke lagret — bruk /save " + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inte sparad — använd /save " + } + } + } + }, + "Sync" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkronisering" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synchronisierung" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synchronisation" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkronisering" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkronisering" + } + } + } + }, + "Syncing" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkroniserer" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synchronisiert" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synchronisation…" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkroniserer" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkroniserar" + } + } + } + }, + "Error" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fejl" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fehler" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Erreur" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Feil" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fel" + } + } + } + }, + "Synced" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkroniseret" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synchronisiert" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synchronisé" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkronisert" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkroniserad" + } + } + } + }, + "Sync not configured" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkronisering ikke konfigureret" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synchronisierung nicht konfiguriert" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synchronisation non configurée" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkronisering ikke konfigurert" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkronisering ej konfigurerad" + } + } + } + }, + "Sync failed: %@" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkronisering mislykkedes: %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synchronisierung fehlgeschlagen: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Échec de la synchronisation : %@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkronisering mislyktes: %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Synkroniseringen misslyckades: %@" + } + } + } + }, + "Not configured" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ikke konfigureret" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nicht konfiguriert" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non configuré" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ikke konfigurert" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ej konfigurerad" + } + } + } + }, + "Not cloned" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ikke klonet" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nicht geklont" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Non cloné" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ikke klonet" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ej klonad" + } + } + } + }, + "Ready" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klar" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bereit" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prêt" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klar" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Klar" + } + } + } + }, + "Last synced: %@" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sidst synkroniseret: %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zuletzt synchronisiert: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dernière synchronisation : %@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sist synkronisert: %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Senast synkroniserad: %@" + } + } + } + }, + "Last Sync: %@" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sidste synkronisering: %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Letzte Synchronisierung: %@" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dernière synchro : %@" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sist synkronisert: %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Senaste synkronisering: %@" + } + } + } + }, + "Default" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Standard" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Standard" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Par défaut" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Standard" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Standard" + } + } + } + }, + "Price: Low to High" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pris: Lav til høj" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preis: Niedrig zu hoch" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prix : croissant" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pris: Lav til høy" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pris: Lågt till högt" + } + } + } + }, + "Price: High to Low" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pris: Høj til lav" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Preis: Hoch zu niedrig" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prix : décroissant" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pris: Høy til lav" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Pris: Högt till lågt" + } + } + } + }, + "Context: High to Low" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontekst: Høj til lav" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontext: Hoch zu niedrig" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Contexte : décroissant" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontekst: Høy til lav" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontext: Högt till lågt" + } + } + } + }, + "Uses ~80% of max tokens for reasoning — best for hard problems" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bruger ~80% af maks. tokens til ræsonnement — bedst til svære problemer" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verwendet ~80 % der maximalen Tokens für den Denkprozess — am besten für schwierige Probleme" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilise ~80 % des tokens max pour le raisonnement — idéal pour les problèmes complexes" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bruker ~80 % av maks. tokens til resonnering — best for vanskelige problemer" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Använder ~80 % av max antal tokens för resonemang — bäst för svåra problem" + } + } + } + }, + "Uses ~50% of max tokens for reasoning — balanced default" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bruger ~50% af maks. tokens til ræsonnement — afbalanceret standard" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verwendet ~50 % der maximalen Tokens für den Denkprozess — ausgewogener Standard" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilise ~50 % des tokens max pour le raisonnement — équilibre par défaut" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bruker ~50 % av maks. tokens til resonnering — balansert standard" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Använder ~50 % av max antal tokens för resonemang — balanserad standard" + } + } + } + }, + "Uses ~20% of max tokens for reasoning — faster, cheaper" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bruger ~20% af maks. tokens til ræsonnement — hurtigere, billigere" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verwendet ~20 % der maximalen Tokens für den Denkprozess — schneller, günstiger" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilise ~20 % des tokens max pour le raisonnement — plus rapide, moins cher" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bruker ~20 % av maks. tokens til resonnering — raskere, billigere" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Använder ~20 % av max antal tokens för resonemang — snabbare, billigare" + } + } + } + }, + "Uses ~10% of max tokens for reasoning — lightest thinking" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bruger ~10% af maks. tokens til ræsonnement — mindst tænkning" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Verwendet ~10 % der maximalen Tokens für den Denkprozess — geringste Denktiefe" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utilise ~10 % des tokens max pour le raisonnement — réflexion minimale" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bruker ~10 % av maks. tokens til resonnering — lettest tenkning" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Använder ~10 % av max antal tokens för resonemang — lättaste tänkandet" + } + } + } + }, + "Show help and available commands" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis hjælp og tilgængelige kommandoer" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zeigt Hilfe und verfügbare Befehle" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Affiche l'aide et les commandes disponibles" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis hjelp og tilgjengelige kommandoer" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Visa hjälp och tillgängliga kommandon" + } + } + } + }, + "View command history" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis kommandohistorik" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Befehlshistorie anzeigen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afficher l'historique des commandes" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis kommandohistorikk" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Visa kommandohistorik" + } + } + } + }, + "Select AI model" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vælg AI-model" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "KI-Modell auswählen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sélectionner le modèle d'IA" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Velg AI-modell" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Välj AI-modell" + } + } + } + }, + "Clear chat history" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ryd chathistorik" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Chatverlauf löschen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Effacer l'historique du chat" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tøm chattehistorikk" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Rensa chatthistorik" + } + } + } + }, + "Retry last message" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prøv sidste besked igen" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Letzte Nachricht erneut senden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Réessayer le dernier message" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prøv siste melding på nytt" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Försök igen med senaste meddelandet" + } + } + } + }, + "Manage your prompt shortcuts" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Administrer dine prompt-genveje" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Prompt-Shortcuts verwalten" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gérer vos raccourcis de prompt" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Administrer prompt-snarveiene dine" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hantera dina promptgenvägar" + } + } + } + }, + "Manage your agent skills" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Administrer dine agent-færdigheder" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Agent-Skills verwalten" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gérer vos agent skills" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Administrer agent-ferdighetene dine" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hantera dina agent-färdigheter" + } + } + } + }, + "Open Jarvis agent manager" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Åbn Jarvis-agenthåndtering" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Jarvis-Agentenverwaltung öffnen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ouvrir le gestionnaire d'agent Jarvis" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Åpne Jarvis-agenthåndtering" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Öppna Jarvis-agenthantering" + } + } + } + }, + "Enable conversation memory" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivér samtalehukommelse" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gesprächsspeicher aktivieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activer la mémoire de conversation" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiver samtaleminne" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivera konversationsminne" + } + } + } + }, + "Disable conversation memory" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deaktivér samtalehukommelse" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gesprächsspeicher deaktivieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Désactiver la mémoire de conversation" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deaktiver samtaleminne" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inaktivera konversationsminne" + } + } + } + }, + "Enable web search" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivér websøgning" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Websuche aktivieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activer la recherche web" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiver websøk" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivera webbsökning" + } + } + } + }, + "Disable web search" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deaktivér websøgning" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Websuche deaktivieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Désactiver la recherche web" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deaktiver websøk" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inaktivera webbsökning" + } + } + } + }, + "Show session statistics" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis sessionsstatistik" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sitzungsstatistiken anzeigen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afficher les statistiques de session" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis øktstatistikk" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Visa sessionsstatistik" + } + } + } + }, + "Open settings" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Åbn indstillinger" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Einstellungen öffnen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ouvrir les réglages" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Åpne innstillinger" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Öppna inställningar" + } + } + } + }, + "Switch AI provider" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Skift AI-udbyder" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "KI-Anbieter wechseln" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Changer de fournisseur d'IA" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Bytt AI-tilbyder" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Byt AI-leverantör" + } + } + } + }, + "Save conversation" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gem samtale" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unterhaltung speichern" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enregistrer la conversation" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lagre samtale" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spara konversation" + } + } + } + }, + "Load conversation" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Indlæs samtale" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unterhaltung laden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Charger une conversation" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Last inn samtale" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Läs in konversation" + } + } + } + }, + "List saved conversations" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis gemte samtaler" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gespeicherte Unterhaltungen auflisten" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lister les conversations enregistrées" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis lagrede samtaler" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lista sparade konversationer" + } + } + } + }, + "Export as Markdown" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksportér som Markdown" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Als Markdown exportieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exporter en Markdown" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksporter som Markdown" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportera som Markdown" + } + } + } + }, + "Export as HTML" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksportér som HTML" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Als HTML exportieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exporter en HTML" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksporter som HTML" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportera som HTML" + } + } + } + }, + "Export as PDF" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksportér som PDF" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Als PDF exportieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exporter en PDF" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksporter som PDF" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportera som PDF" + } + } + } + }, + "Export as JSON" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksportér som JSON" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Als JSON exportieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exporter en JSON" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksporter som JSON" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportera som JSON" + } + } + } + }, + "Show model information" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis modelinformation" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modellinformationen anzeigen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afficher les informations du modèle" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis modellinformasjon" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Visa modellinformation" + } + } + } + }, + "Check account credits" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tjek kontokreditter" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontoguthaben prüfen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vérifier les crédits du compte" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sjekk kontokreditter" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kontrollera kontokrediter" + } + } + } + }, + "Enable MCP (file access)" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivér MCP (filadgang)" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "MCP aktivieren (Dateizugriff)" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activer MCP (accès aux fichiers)" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiver MCP (filtilgang)" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivera MCP (filåtkomst)" + } + } + } + }, + "Disable MCP" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deaktivér MCP" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "MCP deaktivieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Désactiver MCP" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deaktiver MCP" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inaktivera MCP" + } + } + } + }, + "Show MCP status" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis MCP-status" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "MCP-Status anzeigen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afficher l'état de MCP" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis MCP-status" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Visa MCP-status" + } + } + } + }, + "List MCP folders" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis MCP-mapper" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "MCP-Ordner auflisten" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lister les dossiers MCP" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis MCP-mapper" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lista MCP-mappar" + } + } + } + }, + "Add folder for MCP" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tilføj mappe til MCP" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ordner für MCP hinzufügen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ajouter un dossier pour MCP" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Legg til mappe for MCP" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lägg till mapp för MCP" + } + } + } + }, + "Enable MCP write permissions" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivér MCP-skriverettigheder" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "MCP-Schreibrechte aktivieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activer les droits d'écriture MCP" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiver MCP-skriverettigheter" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivera MCP-skrivbehörigheter" + } + } + } + }, + "Disable MCP write permissions" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deaktivér MCP-skriverettigheder" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "MCP-Schreibrechte deaktivieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Désactiver les droits d'écriture MCP" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deaktiver MCP-skriverettigheter" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inaktivera MCP-skrivbehörigheter" + } + } + } + }, + "Enable persistent notes for this conversation" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivér vedvarende noter for denne samtale" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dauerhafte Notizen für diese Unterhaltung aktivieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activer les notes persistantes pour cette conversation" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiver vedvarende notater for denne samtalen" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivera beständiga anteckningar för denna konversation" + } + } + } + }, + "Disable persistent notes for this conversation" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deaktivér vedvarende noter for denne samtale" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dauerhafte Notizen für diese Unterhaltung deaktivieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Désactiver les notes persistantes pour cette conversation" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Deaktiver vedvarende notater for denne samtalen" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inaktivera beständiga anteckningar för denna konversation" + } + } + } + }, + "Show this conversation's notes" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis denne samtales noter" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notizen dieser Unterhaltung anzeigen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Afficher les notes de cette conversation" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Vis notatene for denne samtalen" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Visa anteckningarna för denna konversation" + } + } + } + }, + "Exported %@.md" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksporterede %@.md" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@.md exportiert" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@.md exporté" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksporterte %@.md" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exporterade %@.md" + } + } + } + }, + "Exported %@.zip" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksporterede %@.zip" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@.zip exportiert" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@.zip exporté" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksporterte %@.zip" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exporterade %@.zip" + } + } + } + }, + "No valid shortcuts found" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingen gyldige genveje fundet" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Keine gültigen Shortcuts gefunden" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aucun raccourci valide trouvé" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Ingen gyldige snarveier funnet" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Inga giltiga genvägar hittades" + } + } + } + }, + "Exported to Downloads/shortcuts.json" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksporteret til Downloads/shortcuts.json" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exportiert nach Downloads/shortcuts.json" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exporté vers Téléchargements/shortcuts.json" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksportert til Nedlastinger/shortcuts.json" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exporterad till Hämtade filer/shortcuts.json" + } + } + } + }, + "Imported %@" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Importerede %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ importiert" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ importé" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Importerte %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Importerade %@" + } + } + } + }, + "Exported %@" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksporterede %@" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ exportiert" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "%@ exporté" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Eksporterte %@" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Exporterade %@" + } + } + } + }, + "Arguments" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Argumenter" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Argumente" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Arguments" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Argumenter" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Argument" + } + } + } + }, + "Automatic Backup" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatisk sikkerhedskopi" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatische Sicherung" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Sauvegarde automatique" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatisk sikkerhetskopi" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Automatisk säkerhetskopiering" + } + } + } + }, + "Configured Servers" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurerede servere" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurierte Server" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Serveurs configurés" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurerte servere" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konfigurerade servrar" + } + } + } + }, + "Conversation Notes" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Samtalenoter" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unterhaltungsnotizen" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notes de conversation" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Samtalenotater" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Konversationsanteckningar" + } + } + } + }, + "Crash Recovery" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nedbrudsgendannelse" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Absturzwiederherstellung" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Récupération après plantage" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Krasjgjenoppretting" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Kraschåterställning" + } + } + } + }, + "Enable Research Agents" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivér research-agenter" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Recherche-Agenten aktivieren" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Activer les agents de recherche" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktiver research-agenter" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Aktivera forskningsagenter" + } + } + } + }, + "Favorite Models" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favoritmodeller" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favoritenmodelle" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Modèles favoris" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favorittmodeller" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Favoritmodeller" + } + } + } + }, + "Frequency" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Frekvens" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Häufigkeit" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Fréquence" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Frekvens" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Frekvens" + } + } + } + }, + "Max Concurrent Agents" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Maks. samtidige agenter" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Max. gleichzeitige Agenten" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Nb max d'agents simultanés" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Maks. samtidige agenter" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Max antal samtidiga agenter" + } + } + } + }, + "Notes Folder" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notesmappe" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notizordner" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Dossier des notes" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Notatmappe" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anteckningsmapp" + } + } + } + }, + "Released" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Udgivet" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Veröffentlicht" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Publié" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utgitt" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Utgiven" + } + } + } + }, + "Save Draft Every" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Gem kladde hvert" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Entwurf speichern alle" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Enregistrer le brouillon toutes les" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Lagre utkast hvert" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Spara utkast var" + } + } + } + }, + "Timeout" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Timeout" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Zeitlimit" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Délai d'expiration" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tidsavbrudd" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Tidsgräns" + } + } + } + }, + "Anthropic" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anthropic" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anthropic" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anthropic" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anthropic" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anthropic" + } + } + } + }, + "Anytype" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anytype" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anytype" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anytype" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anytype" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Anytype" + } + } + } + }, + "OpenAI" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "OpenAI" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "OpenAI" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "OpenAI" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "OpenAI" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "OpenAI" + } + } + } + }, + "OpenRouter" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "OpenRouter" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "OpenRouter" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "OpenRouter" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "OpenRouter" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "OpenRouter" + } + } + } + }, + "Paperless-NGX" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paperless-NGX" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paperless-NGX" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paperless-NGX" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paperless-NGX" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "Paperless-NGX" + } + } + } + }, + "iCloud Drive" : { + "localizations" : { + "da" : { + "stringUnit" : { + "state" : "translated", + "value" : "iCloud Drive" + } + }, + "de" : { + "stringUnit" : { + "state" : "translated", + "value" : "iCloud Drive" + } + }, + "fr" : { + "stringUnit" : { + "state" : "translated", + "value" : "iCloud Drive" + } + }, + "nb" : { + "stringUnit" : { + "state" : "translated", + "value" : "iCloud Drive" + } + }, + "sv" : { + "stringUnit" : { + "state" : "translated", + "value" : "iCloud Drive" + } + } + } } }, "version" : "1.1" diff --git a/oAI/Services/ThinkingVerbs.swift b/oAI/Services/ThinkingVerbs.swift index 55806c8..2be5f52 100644 --- a/oAI/Services/ThinkingVerbs.swift +++ b/oAI/Services/ThinkingVerbs.swift @@ -23,14 +23,44 @@ import Foundation -struct ThinkingVerbs { - /// Get a random thinking verb with ellipsis +/// Marked `nonisolated` at the type level (not per-member) since this project builds with +/// `-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 { - verbs.randomElement()! + "..." + verbs(for: currentLanguageCode).randomElement()! + "..." } - /// Collection of fun thinking verbs and phrases - private static let verbs = [ + /// Mirrors how Text()/String(localized:) resolve the active language: the first of the + /// 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 "Thinking", "Pondering", @@ -144,4 +174,589 @@ struct ThinkingVerbs { "Loading brilliance", "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" + ] } diff --git a/oAI/Views/Main/SyncStatusIndicator.swift b/oAI/Views/Main/SyncStatusIndicator.swift index 59a54a0..91de639 100644 --- a/oAI/Views/Main/SyncStatusIndicator.swift +++ b/oAI/Views/Main/SyncStatusIndicator.swift @@ -47,7 +47,7 @@ enum SyncState { } } - var tooltipText: String { + var tooltipText: LocalizedStringKey { switch self { case .disabled: return "Auto-sync disabled" diff --git a/oAI/oAI-InfoPlist.xcstrings b/oAI/oAI-InfoPlist.xcstrings index 11e8759..cb3c243 100644 --- a/oAI/oAI-InfoPlist.xcstrings +++ b/oAI/oAI-InfoPlist.xcstrings @@ -3,7 +3,7 @@ "strings" : { "CFBundleName" : { "comment" : "Bundle name", - "extractionState" : "extracted_with_value", + "extractionState" : "stale", "localizations" : { "da" : { "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" diff --git a/oAITests/ThinkingVerbsTests.swift b/oAITests/ThinkingVerbsTests.swift new file mode 100644 index 0000000..8632c4d --- /dev/null +++ b/oAITests/ThinkingVerbsTests.swift @@ -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("...")) + } +}