Просмотр исходного кода

feat(app): danish translations

Adam 1 месяц назад
Родитель
Сommit
8b0353cb2a

+ 8 - 2
packages/app/src/context/language.tsx

@@ -9,19 +9,21 @@ import { dict as ko } from "@/i18n/ko"
 import { dict as de } from "@/i18n/de"
 import { dict as es } from "@/i18n/es"
 import { dict as fr } from "@/i18n/fr"
+import { dict as da } from "@/i18n/da"
 import { dict as uiEn } from "@opencode-ai/ui/i18n/en"
 import { dict as uiZh } from "@opencode-ai/ui/i18n/zh"
 import { dict as uiKo } from "@opencode-ai/ui/i18n/ko"
 import { dict as uiDe } from "@opencode-ai/ui/i18n/de"
 import { dict as uiEs } from "@opencode-ai/ui/i18n/es"
 import { dict as uiFr } from "@opencode-ai/ui/i18n/fr"
+import { dict as uiDa } from "@opencode-ai/ui/i18n/da"
 
-export type Locale = "en" | "zh" | "ko" | "de" | "es" | "fr"
+export type Locale = "en" | "zh" | "ko" | "de" | "es" | "fr" | "da"
 
 type RawDictionary = typeof en & typeof uiEn
 type Dictionary = i18n.Flatten<RawDictionary>
 
-const LOCALES: readonly Locale[] = ["en", "zh", "ko", "de", "es", "fr"]
+const LOCALES: readonly Locale[] = ["en", "zh", "ko", "de", "es", "fr", "da"]
 
 function detectLocale(): Locale {
   if (typeof navigator !== "object") return "en"
@@ -34,6 +36,7 @@ function detectLocale(): Locale {
     if (language.toLowerCase().startsWith("de")) return "de"
     if (language.toLowerCase().startsWith("es")) return "es"
     if (language.toLowerCase().startsWith("fr")) return "fr"
+    if (language.toLowerCase().startsWith("da")) return "da"
   }
 
   return "en"
@@ -55,6 +58,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
       if (store.locale === "de") return "de"
       if (store.locale === "es") return "es"
       if (store.locale === "fr") return "fr"
+      if (store.locale === "da") return "da"
       return "en"
     })
 
@@ -71,6 +75,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
       if (locale() === "de") return { ...base, ...i18n.flatten({ ...de, ...uiDe }) }
       if (locale() === "es") return { ...base, ...i18n.flatten({ ...es, ...uiEs }) }
       if (locale() === "fr") return { ...base, ...i18n.flatten({ ...fr, ...uiFr }) }
+      if (locale() === "da") return { ...base, ...i18n.flatten({ ...da, ...uiDa }) }
       return { ...base, ...i18n.flatten({ ...ko, ...uiKo }) }
     })
 
@@ -83,6 +88,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
       de: "language.de",
       es: "language.es",
       fr: "language.fr",
+      da: "language.da",
     }
 
     const label = (value: Locale) => t(labelKey[value])

+ 554 - 0
packages/app/src/i18n/da.ts

@@ -0,0 +1,554 @@
+export const dict = {
+  "command.category.suggested": "Foreslået",
+  "command.category.view": "Vis",
+  "command.category.project": "Projekt",
+  "command.category.provider": "Udbyder",
+  "command.category.server": "Server",
+  "command.category.session": "Session",
+  "command.category.theme": "Tema",
+  "command.category.language": "Sprog",
+  "command.category.file": "Fil",
+  "command.category.terminal": "Terminal",
+  "command.category.model": "Model",
+  "command.category.mcp": "MCP",
+  "command.category.agent": "Agent",
+  "command.category.permissions": "Tilladelser",
+
+  "theme.scheme.system": "System",
+  "theme.scheme.light": "Lys",
+  "theme.scheme.dark": "Mørk",
+
+  "command.sidebar.toggle": "Skift sidebjælke",
+  "command.project.open": "Åbn projekt",
+  "command.provider.connect": "Tilslut udbyder",
+  "command.server.switch": "Skift server",
+  "command.session.previous": "Forrige session",
+  "command.session.next": "Næste session",
+  "command.session.archive": "Arkivér session",
+
+  "command.palette": "Kommandopalette",
+
+  "command.theme.cycle": "Skift tema",
+  "command.theme.set": "Brug tema: {{theme}}",
+  "command.theme.scheme.cycle": "Skift farveskema",
+  "command.theme.scheme.set": "Brug farveskema: {{scheme}}",
+
+  "command.language.cycle": "Skift sprog",
+  "command.language.set": "Brug sprog: {{language}}",
+
+  "command.session.new": "Ny session",
+  "command.file.open": "Åbn fil",
+  "command.file.open.description": "Søg i filer og kommandoer",
+  "command.terminal.toggle": "Skift terminal",
+  "command.review.toggle": "Skift gennemgang",
+  "command.terminal.new": "Ny terminal",
+  "command.terminal.new.description": "Opret en ny terminalfane",
+  "command.steps.toggle": "Skift trin",
+  "command.steps.toggle.description": "Vis eller skjul trin for den aktuelle besked",
+  "command.message.previous": "Forrige besked",
+  "command.message.previous.description": "Gå til den forrige brugerbesked",
+  "command.message.next": "Næste besked",
+  "command.message.next.description": "Gå til den næste brugerbesked",
+  "command.model.choose": "Vælg model",
+  "command.model.choose.description": "Vælg en anden model",
+  "command.mcp.toggle": "Skift MCP'er",
+  "command.mcp.toggle.description": "Skift MCP'er",
+  "command.agent.cycle": "Skift agent",
+  "command.agent.cycle.description": "Skift til næste agent",
+  "command.agent.cycle.reverse": "Skift agent baglæns",
+  "command.agent.cycle.reverse.description": "Skift til forrige agent",
+  "command.model.variant.cycle": "Skift tænkeindsats",
+  "command.model.variant.cycle.description": "Skift til næste indsatsniveau",
+  "command.permissions.autoaccept.enable": "Accepter ændringer automatisk",
+  "command.permissions.autoaccept.disable": "Stop automatisk accept af ændringer",
+  "command.session.undo": "Fortryd",
+  "command.session.undo.description": "Fortryd den sidste besked",
+  "command.session.redo": "Omgør",
+  "command.session.redo.description": "Omgør den sidste fortrudte besked",
+  "command.session.compact": "Komprimér session",
+  "command.session.compact.description": "Opsummer sessionen for at reducere kontekststørrelsen",
+  "command.session.fork": "Forgren fra besked",
+  "command.session.fork.description": "Opret en ny session fra en tidligere besked",
+  "command.session.share": "Del session",
+  "command.session.share.description": "Del denne session og kopier URL'en til udklipsholderen",
+  "command.session.unshare": "Stop deling af session",
+  "command.session.unshare.description": "Stop med at dele denne session",
+
+  "palette.search.placeholder": "Søg i filer og kommandoer",
+  "palette.empty": "Ingen resultater fundet",
+  "palette.group.commands": "Kommandoer",
+  "palette.group.files": "Filer",
+
+  "dialog.provider.search.placeholder": "Søg udbydere",
+  "dialog.provider.empty": "Ingen udbydere fundet",
+  "dialog.provider.group.popular": "Populære",
+  "dialog.provider.group.other": "Andre",
+  "dialog.provider.tag.recommended": "Anbefalet",
+  "dialog.provider.anthropic.note": "Forbind med Claude Pro/Max eller API-nøgle",
+
+  "dialog.model.select.title": "Vælg model",
+  "dialog.model.search.placeholder": "Søg modeller",
+  "dialog.model.empty": "Ingen modeller fundet",
+  "dialog.model.manage": "Administrer modeller",
+  "dialog.model.manage.description": "Tilpas hvilke modeller der vises i modelvælgeren.",
+
+  "dialog.model.unpaid.freeModels.title": "Gratis modeller leveret af OpenCode",
+  "dialog.model.unpaid.addMore.title": "Tilføj flere modeller fra populære udbydere",
+
+  "dialog.provider.viewAll": "Vis alle udbydere",
+
+  "provider.connect.title": "Forbind {{provider}}",
+  "provider.connect.title.anthropicProMax": "Log ind med Claude Pro/Max",
+  "provider.connect.selectMethod": "Vælg loginmetode for {{provider}}.",
+  "provider.connect.method.apiKey": "API-nøgle",
+  "provider.connect.status.inProgress": "Godkendelse i gang...",
+  "provider.connect.status.waiting": "Venter på godkendelse...",
+  "provider.connect.status.failed": "Godkendelse mislykkedes: {{error}}",
+  "provider.connect.apiKey.description":
+    "Indtast din {{provider}} API-nøgle for at forbinde din konto og bruge {{provider}} modeller i OpenCode.",
+  "provider.connect.apiKey.label": "{{provider}} API-nøgle",
+  "provider.connect.apiKey.placeholder": "API-nøgle",
+  "provider.connect.apiKey.required": "API-nøgle er påkrævet",
+  "provider.connect.opencodeZen.line1":
+    "OpenCode Zen giver dig adgang til et udvalg af pålidelige optimerede modeller til kodningsagenter.",
+  "provider.connect.opencodeZen.line2":
+    "Med en enkelt API-nøgle får du adgang til modeller som Claude, GPT, Gemini, GLM og flere.",
+  "provider.connect.opencodeZen.visit.prefix": "Besøg ",
+  "provider.connect.opencodeZen.visit.suffix": " for at hente din API-nøgle.",
+  "provider.connect.oauth.code.visit.prefix": "Besøg ",
+  "provider.connect.oauth.code.visit.link": "dette link",
+  "provider.connect.oauth.code.visit.suffix":
+    " for at hente din godkendelseskode for at forbinde din konto og bruge {{provider}} modeller i OpenCode.",
+  "provider.connect.oauth.code.label": "{{method}} godkendelseskode",
+  "provider.connect.oauth.code.placeholder": "Godkendelseskode",
+  "provider.connect.oauth.code.required": "Godkendelseskode er påkrævet",
+  "provider.connect.oauth.code.invalid": "Ugyldig godkendelseskode",
+  "provider.connect.oauth.auto.visit.prefix": "Besøg ",
+  "provider.connect.oauth.auto.visit.link": "dette link",
+  "provider.connect.oauth.auto.visit.suffix":
+    " og indtast koden nedenfor for at forbinde din konto og bruge {{provider}} modeller i OpenCode.",
+  "provider.connect.oauth.auto.confirmationCode": "Bekræftelseskode",
+  "provider.connect.toast.connected.title": "{{provider}} forbundet",
+  "provider.connect.toast.connected.description": "{{provider}} modeller er nu tilgængelige.",
+
+  "model.tag.free": "Gratis",
+  "model.tag.latest": "Nyeste",
+
+  "common.search.placeholder": "Søg",
+  "common.loading": "Indlæser",
+  "common.cancel": "Annuller",
+  "common.submit": "Indsend",
+  "common.save": "Gem",
+  "common.saving": "Gemmer...",
+  "common.default": "Standard",
+  "common.attachment": "vedhæftning",
+
+  "prompt.placeholder.shell": "Indtast shell-kommando...",
+  "prompt.placeholder.normal": 'Spørg om hvad som helst... "{{example}}"',
+  "prompt.mode.shell": "Shell",
+  "prompt.mode.shell.exit": "esc for at afslutte",
+
+  "prompt.example.1": "Ret en TODO i koden",
+  "prompt.example.2": "Hvad er teknologistakken for dette projekt?",
+  "prompt.example.3": "Ret ødelagte tests",
+  "prompt.example.4": "Forklar hvordan godkendelse fungerer",
+  "prompt.example.5": "Find og ret sikkerhedshuller",
+  "prompt.example.6": "Tilføj enhedstests for brugerservice",
+  "prompt.example.7": "Refaktorer denne funktion så den er mere læsbar",
+  "prompt.example.8": "Hvad betyder denne fejl?",
+  "prompt.example.9": "Hjælp mig med at debugge dette problem",
+  "prompt.example.10": "Generer API-dokumentation",
+  "prompt.example.11": "Optimer databaseforespørgsler",
+  "prompt.example.12": "Tilføj validering af input",
+  "prompt.example.13": "Opret en ny komponent til...",
+  "prompt.example.14": "Hvordan deployerer jeg dette projekt?",
+  "prompt.example.15": "Gennemgå min kode for bedste praksis",
+  "prompt.example.16": "Tilføj fejlhåndtering til denne funktion",
+  "prompt.example.17": "Forklar dette regex-mønster",
+  "prompt.example.18": "Konverter dette til TypeScript",
+  "prompt.example.19": "Tilføj logning i hele koden",
+  "prompt.example.20": "Hvilke afhængigheder er forældede?",
+  "prompt.example.21": "Hjælp mig med at skrive et migreringsscript",
+  "prompt.example.22": "Implementer caching for dette endpoint",
+  "prompt.example.23": "Tilføj sideinddeling til denne liste",
+  "prompt.example.24": "Opret en CLI-kommando til...",
+  "prompt.example.25": "Hvordan fungerer miljøvariabler her?",
+
+  "prompt.popover.emptyResults": "Ingen matchende resultater",
+  "prompt.popover.emptyCommands": "Ingen matchende kommandoer",
+  "prompt.dropzone.label": "Slip billeder eller PDF'er her",
+  "prompt.slash.badge.custom": "brugerdefineret",
+  "prompt.context.active": "aktiv",
+  "prompt.context.includeActiveFile": "Inkluder aktiv fil",
+  "prompt.action.attachFile": "Vedhæft fil",
+  "prompt.action.send": "Send",
+  "prompt.action.stop": "Stop",
+
+  "prompt.toast.pasteUnsupported.title": "Ikke understøttet indsæt",
+  "prompt.toast.pasteUnsupported.description": "Kun billeder eller PDF'er kan indsættes her.",
+  "prompt.toast.modelAgentRequired.title": "Vælg en agent og model",
+  "prompt.toast.modelAgentRequired.description": "Vælg en agent og model før du sender en forespørgsel.",
+  "prompt.toast.worktreeCreateFailed.title": "Kunne ikke oprette worktree",
+  "prompt.toast.sessionCreateFailed.title": "Kunne ikke oprette session",
+  "prompt.toast.shellSendFailed.title": "Kunne ikke sende shell-kommando",
+  "prompt.toast.commandSendFailed.title": "Kunne ikke sende kommando",
+  "prompt.toast.promptSendFailed.title": "Kunne ikke sende forespørgsel",
+
+  "dialog.mcp.title": "MCP'er",
+  "dialog.mcp.description": "{{enabled}} af {{total}} aktiveret",
+  "dialog.mcp.empty": "Ingen MCP'er konfigureret",
+
+  "mcp.status.connected": "forbundet",
+  "mcp.status.failed": "mislykkedes",
+  "mcp.status.needs_auth": "kræver godkendelse",
+  "mcp.status.disabled": "deaktiveret",
+
+  "dialog.fork.empty": "Ingen beskeder at forgrene fra",
+
+  "dialog.directory.search.placeholder": "Søg mapper",
+  "dialog.directory.empty": "Ingen mapper fundet",
+
+  "dialog.server.title": "Servere",
+  "dialog.server.description": "Skift hvilken OpenCode-server denne app forbinder til.",
+  "dialog.server.search.placeholder": "Søg servere",
+  "dialog.server.empty": "Ingen servere endnu",
+  "dialog.server.add.title": "Tilføj en server",
+  "dialog.server.add.url": "Server URL",
+  "dialog.server.add.placeholder": "http://localhost:4096",
+  "dialog.server.add.error": "Kunne ikke forbinde til server",
+  "dialog.server.add.checking": "Tjekker...",
+  "dialog.server.add.button": "Tilføj",
+  "dialog.server.default.title": "Standardserver",
+  "dialog.server.default.description":
+    "Forbind til denne server ved start af app i stedet for at starte en lokal server. Kræver genstart.",
+  "dialog.server.default.none": "Ingen server valgt",
+  "dialog.server.default.set": "Sæt nuværende server som standard",
+  "dialog.server.default.clear": "Ryd",
+
+  "dialog.project.edit.title": "Rediger projekt",
+  "dialog.project.edit.name": "Navn",
+  "dialog.project.edit.icon": "Ikon",
+  "dialog.project.edit.icon.alt": "Projektikon",
+  "dialog.project.edit.icon.hint": "Klik eller træk et billede",
+  "dialog.project.edit.icon.recommended": "Anbefalet: 128x128px",
+  "dialog.project.edit.color": "Farve",
+
+  "context.breakdown.title": "Kontekstfordeling",
+  "context.breakdown.note":
+    'Omtrentlig fordeling af input-tokens. "Andre" inkluderer værktøjsdefinitioner og overhead.',
+  "context.breakdown.system": "System",
+  "context.breakdown.user": "Bruger",
+  "context.breakdown.assistant": "Assistent",
+  "context.breakdown.tool": "Værktøjskald",
+  "context.breakdown.other": "Andre",
+
+  "context.systemPrompt.title": "Systemprompt",
+  "context.rawMessages.title": "Rå beskeder",
+
+  "context.stats.session": "Session",
+  "context.stats.messages": "Beskeder",
+  "context.stats.provider": "Udbyder",
+  "context.stats.model": "Model",
+  "context.stats.limit": "Kontekstgrænse",
+  "context.stats.totalTokens": "Total Tokens",
+  "context.stats.usage": "Forbrug",
+  "context.stats.inputTokens": "Input Tokens",
+  "context.stats.outputTokens": "Output Tokens",
+  "context.stats.reasoningTokens": "Tænke Tokens",
+  "context.stats.cacheTokens": "Cache Tokens (læs/skriv)",
+  "context.stats.userMessages": "Brugerbeskeder",
+  "context.stats.assistantMessages": "Assistentbeskeder",
+  "context.stats.totalCost": "Samlede omkostninger",
+  "context.stats.sessionCreated": "Session oprettet",
+  "context.stats.lastActivity": "Seneste aktivitet",
+
+  "context.usage.tokens": "Tokens",
+  "context.usage.usage": "Forbrug",
+  "context.usage.cost": "Omkostning",
+  "context.usage.clickToView": "Klik for at se kontekst",
+
+  "language.en": "Engelsk",
+  "language.zh": "Kinesisk",
+  "language.ko": "Koreansk",
+  "language.de": "Tysk",
+  "language.es": "Spansk",
+  "language.fr": "Fransk",
+  "language.ja": "Japansk",
+  "language.da": "Dansk",
+
+  "toast.language.title": "Sprog",
+  "toast.language.description": "Skiftede til {{language}}",
+
+  "toast.theme.title": "Tema skiftet",
+  "toast.scheme.title": "Farveskema",
+
+  "toast.permissions.autoaccept.on.title": "Accepterer ændringer automatisk",
+  "toast.permissions.autoaccept.on.description": "Redigerings- og skrivetilladelser vil automatisk blive godkendt",
+  "toast.permissions.autoaccept.off.title": "Stoppede automatisk accept af ændringer",
+  "toast.permissions.autoaccept.off.description": "Redigerings- og skrivetilladelser vil kræve godkendelse",
+
+  "toast.model.none.title": "Ingen model valgt",
+  "toast.model.none.description": "Forbind en udbyder for at opsummere denne session",
+
+  "toast.file.loadFailed.title": "Kunne ikke indlæse fil",
+
+  "toast.session.share.copyFailed.title": "Kunne ikke kopiere URL til udklipsholder",
+  "toast.session.share.success.title": "Session delt",
+  "toast.session.share.success.description": "Delings-URL kopieret til udklipsholder!",
+  "toast.session.share.failed.title": "Kunne ikke dele session",
+  "toast.session.share.failed.description": "Der opstod en fejl under deling af sessionen",
+
+  "toast.session.unshare.success.title": "Deling af session stoppet",
+  "toast.session.unshare.success.description": "Deling af session blev stoppet!",
+  "toast.session.unshare.failed.title": "Kunne ikke stoppe deling af session",
+  "toast.session.unshare.failed.description": "Der opstod en fejl under stop af sessionsdeling",
+
+  "toast.session.listFailed.title": "Kunne ikke indlæse sessioner for {{project}}",
+
+  "toast.update.title": "Opdatering tilgængelig",
+  "toast.update.description": "En ny version af OpenCode ({{version}}) er nu tilgængelig til installation.",
+  "toast.update.action.installRestart": "Installer og genstart",
+  "toast.update.action.notYet": "Ikke endnu",
+
+  "error.page.title": "Noget gik galt",
+  "error.page.description": "Der opstod en fejl under indlæsning af applikationen.",
+  "error.page.details.label": "Fejldetaljer",
+  "error.page.action.restart": "Genstart",
+  "error.page.action.checking": "Tjekker...",
+  "error.page.action.checkUpdates": "Tjek for opdateringer",
+  "error.page.action.updateTo": "Opdater til {{version}}",
+  "error.page.report.prefix": "Rapporter venligst denne fejl til OpenCode-teamet",
+  "error.page.report.discord": "på Discord",
+  "error.page.version": "Version: {{version}}",
+
+  "error.dev.rootNotFound":
+    "Rodelement ikke fundet. Har du glemt at tilføje det til din index.html? Eller måske er id-attributten stavet forkert?",
+
+  "error.globalSync.connectFailed": "Kunne ikke forbinde til server. Kører der en server på `{{url}}`?",
+
+  "error.chain.unknown": "Ukendt fejl",
+  "error.chain.causedBy": "Forårsaget af:",
+  "error.chain.apiError": "API-fejl",
+  "error.chain.status": "Status: {{status}}",
+  "error.chain.retryable": "Kan forsøges igen: {{retryable}}",
+  "error.chain.responseBody": "Svarindhold:\n{{body}}",
+  "error.chain.didYouMean": "Mente du: {{suggestions}}",
+  "error.chain.modelNotFound": "Model ikke fundet: {{provider}}/{{model}}",
+  "error.chain.checkConfig": "Tjek dine konfigurations (opencode.json) udbyder/modelnavne",
+  "error.chain.mcpFailed": 'MCP-server "{{name}}" fejlede. Bemærk, OpenCode understøtter ikke MCP-godkendelse endnu.',
+  "error.chain.providerAuthFailed": "Udbydergodkendelse mislykkedes ({{provider}}): {{message}}",
+  "error.chain.providerInitFailed":
+    'Kunne ikke initialisere udbyder "{{provider}}". Tjek legitimationsoplysninger og konfiguration.',
+  "error.chain.configJsonInvalid": "Konfigurationsfil på {{path}} er ikke gyldig JSON(C)",
+  "error.chain.configJsonInvalidWithMessage": "Konfigurationsfil på {{path}} er ikke gyldig JSON(C): {{message}}",
+  "error.chain.configDirectoryTypo":
+    'Mappe "{{dir}}" i {{path}} er ikke gyldig. Omdøb mappen til "{{suggestion}}" eller fjern den. Dette er en almindelig slåfejl.',
+  "error.chain.configFrontmatterError": "Kunne ikke parse frontmatter i {{path}}:\n{{message}}",
+  "error.chain.configInvalid": "Konfigurationsfil på {{path}} er ugyldig",
+  "error.chain.configInvalidWithMessage": "Konfigurationsfil på {{path}} er ugyldig: {{message}}",
+
+  "notification.permission.title": "Tilladelse påkrævet",
+  "notification.permission.description": "{{sessionTitle}} i {{projectName}} kræver tilladelse",
+  "notification.question.title": "Spørgsmål",
+  "notification.question.description": "{{sessionTitle}} i {{projectName}} har et spørgsmål",
+  "notification.action.goToSession": "Gå til session",
+
+  "notification.session.responseReady.title": "Svar klar",
+  "notification.session.error.title": "Sessionsfejl",
+  "notification.session.error.fallbackDescription": "Der opstod en fejl",
+
+  "home.recentProjects": "Seneste projekter",
+  "home.empty.title": "Ingen seneste projekter",
+  "home.empty.description": "Kom i gang ved at åbne et lokalt projekt",
+
+  "session.tab.session": "Session",
+  "session.tab.review": "Gennemgang",
+  "session.tab.context": "Kontekst",
+  "session.review.filesChanged": "{{count}} Filer ændret",
+  "session.review.loadingChanges": "Indlæser ændringer...",
+  "session.review.empty": "Ingen ændringer i denne session endnu",
+  "session.messages.renderEarlier": "Vis tidligere beskeder",
+  "session.messages.loadingEarlier": "Indlæser tidligere beskeder...",
+  "session.messages.loadEarlier": "Indlæs tidligere beskeder",
+  "session.messages.loading": "Indlæser beskeder...",
+
+  "session.context.addToContext": "Tilføj {{selection}} til kontekst",
+
+  "session.new.worktree.main": "Hovedgren",
+  "session.new.worktree.mainWithBranch": "Hovedgren ({{branch}})",
+  "session.new.worktree.create": "Opret nyt worktree",
+  "session.new.lastModified": "Sidst ændret",
+
+  "session.header.search.placeholder": "Søg {{project}}",
+
+  "session.share.popover.title": "Udgiv på nettet",
+  "session.share.popover.description.shared":
+    "Denne session er offentlig på nettet. Den er tilgængelig for alle med linket.",
+  "session.share.popover.description.unshared":
+    "Del session offentligt på nettet. Den vil være tilgængelig for alle med linket.",
+  "session.share.action.share": "Del",
+  "session.share.action.publish": "Udgiv",
+  "session.share.action.publishing": "Udgiver...",
+  "session.share.action.unpublish": "Afpublicer",
+  "session.share.action.unpublishing": "Afpublicerer...",
+  "session.share.action.view": "Vis",
+  "session.share.copy.copied": "Kopieret",
+  "session.share.copy.copyLink": "Kopier link",
+
+  "lsp.tooltip.none": "Ingen LSP-servere",
+  "lsp.label.connected": "{{count}} LSP",
+
+  "prompt.loading": "Indlæser prompt...",
+  "terminal.loading": "Indlæser terminal...",
+  "terminal.title": "Terminal",
+  "terminal.title.numbered": "Terminal {{number}}",
+
+  "common.closeTab": "Luk fane",
+  "common.dismiss": "Afvis",
+  "common.requestFailed": "Forespørgsel mislykkedes",
+  "common.moreOptions": "Flere muligheder",
+  "common.learnMore": "Lær mere",
+  "common.rename": "Omdøb",
+  "common.reset": "Nulstil",
+  "common.delete": "Slet",
+  "common.close": "Luk",
+  "common.edit": "Rediger",
+  "common.loadMore": "Indlæs flere",
+
+  "sidebar.settings": "Indstillinger",
+  "sidebar.help": "Hjælp",
+  "sidebar.workspaces.enable": "Aktiver arbejdsområder",
+  "sidebar.workspaces.disable": "Deaktiver arbejdsområder",
+  "sidebar.gettingStarted.title": "Kom i gang",
+  "sidebar.gettingStarted.line1": "OpenCode inkluderer gratis modeller så du kan starte med det samme.",
+  "sidebar.gettingStarted.line2": "Forbind enhver udbyder for at bruge modeller, inkl. Claude, GPT, Gemini osv.",
+  "sidebar.project.recentSessions": "Seneste sessioner",
+  "sidebar.project.viewAllSessions": "Vis alle sessioner",
+
+  "settings.section.desktop": "Desktop",
+  "settings.tab.general": "Generelt",
+  "settings.tab.shortcuts": "Genveje",
+
+  "settings.general.section.appearance": "Udseende",
+  "settings.general.section.notifications": "Systemmeddelelser",
+  "settings.general.section.sounds": "Lydeffekter",
+
+  "settings.general.row.language.title": "Sprog",
+  "settings.general.row.language.description": "Ændr visningssproget for OpenCode",
+  "settings.general.row.appearance.title": "Udseende",
+  "settings.general.row.appearance.description": "Tilpas hvordan OpenCode ser ud på din enhed",
+  "settings.general.row.theme.title": "Tema",
+  "settings.general.row.theme.description": "Tilpas hvordan OpenCode er temabestemt.",
+  "settings.general.row.font.title": "Skrifttype",
+  "settings.general.row.font.description": "Tilpas mono-skrifttypen brugt i kodeblokke",
+
+  "settings.general.notifications.agent.title": "Agent",
+  "settings.general.notifications.agent.description":
+    "Vis systemmeddelelse når agenten er færdig eller kræver opmærksomhed",
+  "settings.general.notifications.permissions.title": "Tilladelser",
+  "settings.general.notifications.permissions.description": "Vis systemmeddelelse når en tilladelse er påkrævet",
+  "settings.general.notifications.errors.title": "Fejl",
+  "settings.general.notifications.errors.description": "Vis systemmeddelelse når der opstår en fejl",
+
+  "settings.general.sounds.agent.title": "Agent",
+  "settings.general.sounds.agent.description": "Afspil lyd når agenten er færdig eller kræver opmærksomhed",
+  "settings.general.sounds.permissions.title": "Tilladelser",
+  "settings.general.sounds.permissions.description": "Afspil lyd når en tilladelse er påkrævet",
+  "settings.general.sounds.errors.title": "Fejl",
+  "settings.general.sounds.errors.description": "Afspil lyd når der opstår en fejl",
+
+  "settings.shortcuts.title": "Tastaturgenveje",
+  "settings.shortcuts.reset.button": "Nulstil til standard",
+  "settings.shortcuts.reset.toast.title": "Genveje nulstillet",
+  "settings.shortcuts.reset.toast.description": "Tastaturgenveje er blevet nulstillet til standard.",
+  "settings.shortcuts.conflict.title": "Genvej allerede i brug",
+  "settings.shortcuts.conflict.description": "{{keybind}} er allerede tildelt til {{titles}}.",
+  "settings.shortcuts.unassigned": "Ikke tildelt",
+  "settings.shortcuts.pressKeys": "Tryk på taster",
+
+  "settings.shortcuts.group.general": "Generelt",
+  "settings.shortcuts.group.session": "Session",
+  "settings.shortcuts.group.navigation": "Navigation",
+  "settings.shortcuts.group.modelAndAgent": "Model og agent",
+  "settings.shortcuts.group.terminal": "Terminal",
+  "settings.shortcuts.group.prompt": "Prompt",
+
+  "settings.providers.title": "Udbydere",
+  "settings.providers.description": "Udbyderindstillinger vil kunne konfigureres her.",
+  "settings.models.title": "Modeller",
+  "settings.models.description": "Modelindstillinger vil kunne konfigureres her.",
+  "settings.agents.title": "Agenter",
+  "settings.agents.description": "Agentindstillinger vil kunne konfigureres her.",
+  "settings.commands.title": "Kommandoer",
+  "settings.commands.description": "Kommandoindstillinger vil kunne konfigureres her.",
+  "settings.mcp.title": "MCP",
+  "settings.mcp.description": "MCP-indstillinger vil kunne konfigureres her.",
+
+  "settings.permissions.title": "Tilladelser",
+  "settings.permissions.description": "Styr hvilke værktøjer serveren kan bruge som standard.",
+  "settings.permissions.section.tools": "Værktøjer",
+  "settings.permissions.toast.updateFailed.title": "Kunne ikke opdatere tilladelser",
+
+  "settings.permissions.action.allow": "Tillad",
+  "settings.permissions.action.ask": "Spørg",
+  "settings.permissions.action.deny": "Afvis",
+
+  "settings.permissions.tool.read.title": "Læs",
+  "settings.permissions.tool.read.description": "Læsning af en fil (matcher filstien)",
+  "settings.permissions.tool.edit.title": "Rediger",
+  "settings.permissions.tool.edit.description":
+    "Ændre filer, herunder redigeringer, skrivninger, patches og multi-redigeringer",
+  "settings.permissions.tool.glob.title": "Glob",
+  "settings.permissions.tool.glob.description": "Match filer ved hjælp af glob-mønstre",
+  "settings.permissions.tool.grep.title": "Grep",
+  "settings.permissions.tool.grep.description": "Søg i filindhold ved hjælp af regulære udtryk",
+  "settings.permissions.tool.list.title": "Liste",
+  "settings.permissions.tool.list.description": "List filer i en mappe",
+  "settings.permissions.tool.bash.title": "Bash",
+  "settings.permissions.tool.bash.description": "Kør shell-kommandoer",
+  "settings.permissions.tool.task.title": "Opgave",
+  "settings.permissions.tool.task.description": "Start underagenter",
+  "settings.permissions.tool.skill.title": "Færdighed",
+  "settings.permissions.tool.skill.description": "Indlæs en færdighed efter navn",
+  "settings.permissions.tool.lsp.title": "LSP",
+  "settings.permissions.tool.lsp.description": "Kør sprogserverforespørgsler",
+  "settings.permissions.tool.todoread.title": "Læs To-do",
+  "settings.permissions.tool.todoread.description": "Læs to-do listen",
+  "settings.permissions.tool.todowrite.title": "Skriv To-do",
+  "settings.permissions.tool.todowrite.description": "Opdater to-do listen",
+  "settings.permissions.tool.webfetch.title": "Webhentning",
+  "settings.permissions.tool.webfetch.description": "Hent indhold fra en URL",
+  "settings.permissions.tool.websearch.title": "Websøgning",
+  "settings.permissions.tool.websearch.description": "Søg på nettet",
+  "settings.permissions.tool.codesearch.title": "Kodesøgning",
+  "settings.permissions.tool.codesearch.description": "Søg kode på nettet",
+  "settings.permissions.tool.external_directory.title": "Ekstern mappe",
+  "settings.permissions.tool.external_directory.description": "Få adgang til filer uden for projektmappen",
+  "settings.permissions.tool.doom_loop.title": "Doom Loop",
+  "settings.permissions.tool.doom_loop.description": "Opdag gentagne værktøjskald med identisk input",
+
+  "workspace.new": "Nyt arbejdsområde",
+  "workspace.type.local": "lokal",
+  "workspace.type.sandbox": "sandkasse",
+  "workspace.create.failed.title": "Kunne ikke oprette arbejdsområde",
+  "workspace.delete.failed.title": "Kunne ikke slette arbejdsområde",
+  "workspace.resetting.title": "Nulstiller arbejdsområde",
+  "workspace.resetting.description": "Dette kan tage et minut.",
+  "workspace.reset.failed.title": "Kunne ikke nulstille arbejdsområde",
+  "workspace.reset.success.title": "Arbejdsområde nulstillet",
+  "workspace.reset.success.description": "Arbejdsområdet matcher nu hovedgrenen.",
+  "workspace.status.checking": "Tjekker for uflettede ændringer...",
+  "workspace.status.error": "Kunne ikke bekræfte git-status.",
+  "workspace.status.clean": "Ingen uflettede ændringer fundet.",
+  "workspace.status.dirty": "Uflettede ændringer fundet i dette arbejdsområde.",
+  "workspace.delete.title": "Slet arbejdsområde",
+  "workspace.delete.confirm": 'Slet arbejdsområde "{{name}}"?',
+  "workspace.delete.button": "Slet arbejdsområde",
+  "workspace.reset.title": "Nulstil arbejdsområde",
+  "workspace.reset.confirm": 'Nulstil arbejdsområde "{{name}}"?',
+  "workspace.reset.button": "Nulstil arbejdsområde",
+  "workspace.reset.archived.none": "Ingen aktive sessioner vil blive arkiveret.",
+  "workspace.reset.archived.one": "1 session vil blive arkiveret.",
+  "workspace.reset.archived.many": "{{count}} sessioner vil blive arkiveret.",
+  "workspace.reset.note": "Dette vil nulstille arbejdsområdet til at matche hovedgrenen.",
+}

+ 1 - 0
packages/app/src/i18n/de.ts

@@ -279,6 +279,7 @@ export const dict = {
   "language.es": "Spanisch",
   "language.fr": "Französisch",
   "language.ja": "Japanisch",
+  "language.da": "Dänisch",
 
   "toast.language.title": "Sprache",
   "toast.language.description": "Zu {{language}} gewechselt",

+ 1 - 0
packages/app/src/i18n/en.ts

@@ -273,6 +273,7 @@ export const dict = {
   "language.es": "Spanish",
   "language.fr": "French",
   "language.ja": "Japanese",
+  "language.da": "Danish",
 
   "toast.language.title": "Language",
   "toast.language.description": "Switched to {{language}}",

+ 1 - 0
packages/app/src/i18n/es.ts

@@ -274,6 +274,7 @@ export const dict = {
   "language.es": "Español",
   "language.fr": "Francés",
   "language.ja": "Japonés",
+  "language.da": "Danés",
 
   "toast.language.title": "Idioma",
   "toast.language.description": "Cambiado a {{language}}",

+ 1 - 0
packages/app/src/i18n/fr.ts

@@ -274,6 +274,7 @@ export const dict = {
   "language.es": "Espagnol",
   "language.fr": "Français",
   "language.ja": "Japonais",
+  "language.da": "Danois",
 
   "toast.language.title": "Langue",
   "toast.language.description": "Passé à {{language}}",

+ 1 - 0
packages/app/src/i18n/ja.ts

@@ -272,6 +272,7 @@ export const dict = {
   "language.es": "スペイン語",
   "language.fr": "フランス語",
   "language.ja": "日本語",
+  "language.da": "デンマーク語",
 
   "toast.language.title": "言語",
   "toast.language.description": "{{language}}に切り替えました",

+ 1 - 0
packages/app/src/i18n/ko.ts

@@ -276,6 +276,7 @@ export const dict = {
   "language.es": "스페인어",
   "language.fr": "프랑스어",
   "language.ja": "일본어",
+  "language.da": "덴마크어",
 
   "toast.language.title": "언어",
   "toast.language.description": "{{language}}(으)로 전환됨",

+ 1 - 0
packages/app/src/i18n/zh.ts

@@ -272,6 +272,7 @@ export const dict = {
   "language.es": "西班牙语",
   "language.fr": "法语",
   "language.ja": "日语",
+  "language.da": "丹麦语",
 
   "toast.language.title": "语言",
   "toast.language.description": "已切换到{{language}}",

+ 90 - 0
packages/ui/src/i18n/da.ts

@@ -0,0 +1,90 @@
+export const dict = {
+  "ui.sessionReview.title": "Sessionsændringer",
+  "ui.sessionReview.diffStyle.unified": "Samlet",
+  "ui.sessionReview.diffStyle.split": "Opdelt",
+  "ui.sessionReview.expandAll": "Udvid alle",
+  "ui.sessionReview.collapseAll": "Skjul alle",
+
+  "ui.sessionTurn.steps.show": "Vis trin",
+  "ui.sessionTurn.steps.hide": "Skjul trin",
+  "ui.sessionTurn.summary.response": "Svar",
+  "ui.sessionTurn.diff.showMore": "Vis flere ændringer ({{count}})",
+
+  "ui.sessionTurn.retry.retrying": "prøver igen",
+  "ui.sessionTurn.retry.inSeconds": "om {{seconds}}s",
+
+  "ui.sessionTurn.status.delegating": "Delegerer arbejde",
+  "ui.sessionTurn.status.planning": "Planlægger næste trin",
+  "ui.sessionTurn.status.gatheringContext": "Indsamler kontekst",
+  "ui.sessionTurn.status.searchingCodebase": "Søger i koden",
+  "ui.sessionTurn.status.searchingWeb": "Søger på nettet",
+  "ui.sessionTurn.status.makingEdits": "Laver ændringer",
+  "ui.sessionTurn.status.runningCommands": "Kører kommandoer",
+  "ui.sessionTurn.status.thinking": "Tænker",
+  "ui.sessionTurn.status.thinkingWithTopic": "Tænker - {{topic}}",
+  "ui.sessionTurn.status.gatheringThoughts": "Samler tanker",
+  "ui.sessionTurn.status.consideringNextSteps": "Overvejer næste skridt",
+
+  "ui.messagePart.diagnostic.error": "Fejl",
+  "ui.messagePart.title.edit": "Rediger",
+  "ui.messagePart.title.write": "Skriv",
+  "ui.messagePart.option.typeOwnAnswer": "Skriv dit eget svar",
+  "ui.messagePart.review.title": "Gennemgå dine svar",
+
+  "ui.list.loading": "Indlæser",
+  "ui.list.empty": "Ingen resultater",
+  "ui.list.emptyWithFilter.prefix": "Ingen resultater for",
+  "ui.list.emptyWithFilter.suffix": "",
+
+  "ui.messageNav.newMessage": "Ny besked",
+
+  "ui.textField.copyToClipboard": "Kopier til udklipsholder",
+  "ui.textField.copied": "Kopieret",
+
+  "ui.imagePreview.alt": "Billedforhåndsvisning",
+
+  "ui.tool.read": "Læs",
+  "ui.tool.list": "Liste",
+  "ui.tool.glob": "Glob",
+  "ui.tool.grep": "Grep",
+  "ui.tool.webfetch": "Webhentning",
+  "ui.tool.shell": "Shell",
+  "ui.tool.patch": "Patch",
+  "ui.tool.todos": "To-dos",
+  "ui.tool.todos.read": "Læs to-dos",
+  "ui.tool.questions": "Spørgsmål",
+  "ui.tool.agent": "{{type}} Agent",
+
+  "ui.common.file.one": "fil",
+  "ui.common.file.other": "filer",
+  "ui.common.question.one": "spørgsmål",
+  "ui.common.question.other": "spørgsmål",
+
+  "ui.common.add": "Tilføj",
+  "ui.common.cancel": "Annuller",
+  "ui.common.confirm": "Bekræft",
+  "ui.common.dismiss": "Afvis",
+  "ui.common.next": "Næste",
+  "ui.common.submit": "Indsend",
+
+  "ui.permission.deny": "Afvis",
+  "ui.permission.allowAlways": "Tillad altid",
+  "ui.permission.allowOnce": "Tillad én gang",
+
+  "ui.message.expand": "Udvid besked",
+  "ui.message.collapse": "Skjul besked",
+  "ui.message.copy": "Kopier",
+  "ui.message.copied": "Kopieret!",
+  "ui.message.attachment.alt": "vedhæftning",
+
+  "ui.patch.action.deleted": "Slettet",
+  "ui.patch.action.created": "Oprettet",
+  "ui.patch.action.moved": "Flyttet",
+  "ui.patch.action.patched": "Patched",
+
+  "ui.question.subtitle.answered": "{{count}} besvaret",
+  "ui.question.answer.none": "(intet svar)",
+  "ui.question.review.notAnswered": "(ikke besvaret)",
+  "ui.question.multiHint": "(vælg alle der gælder)",
+  "ui.question.custom.placeholder": "Skriv dit svar...",
+}