Sfoglia il codice sorgente

feat: Add support for Norwegian translations (#10018)

Sondre 1 mese fa
parent
commit
8427f40e8d

+ 9 - 3
packages/app/src/context/language.tsx

@@ -15,6 +15,7 @@ import { dict as ja } from "@/i18n/ja"
 import { dict as pl } from "@/i18n/pl"
 import { dict as ru } from "@/i18n/ru"
 import { dict as ar } from "@/i18n/ar"
+import { dict as no } from "@/i18n/no"
 import { dict as uiEn } from "@opencode-ai/ui/i18n/en"
 import { dict as uiZh } from "@opencode-ai/ui/i18n/zh"
 import { dict as uiZht } from "@opencode-ai/ui/i18n/zht"
@@ -27,13 +28,14 @@ import { dict as uiJa } from "@opencode-ai/ui/i18n/ja"
 import { dict as uiPl } from "@opencode-ai/ui/i18n/pl"
 import { dict as uiRu } from "@opencode-ai/ui/i18n/ru"
 import { dict as uiAr } from "@opencode-ai/ui/i18n/ar"
+import { dict as uiNo } from "@opencode-ai/ui/i18n/no"
 
-export type Locale = "en" | "zh" | "zht" | "ko" | "de" | "es" | "fr" | "da" | "ja" | "pl" | "ru" | "ar"
+export type Locale = "en" | "zh" | "zht" | "ko" | "de" | "es" | "fr" | "da" | "ja" | "pl" | "ru" | "ar" | "no"
 
 type RawDictionary = typeof en & typeof uiEn
 type Dictionary = i18n.Flatten<RawDictionary>
 
-const LOCALES: readonly Locale[] = ["en", "zh", "zht", "ko", "de", "es", "fr", "da", "ja", "pl", "ru", "ar"]
+const LOCALES: readonly Locale[] = ["en", "zh", "zht", "ko", "de", "es", "fr", "da", "ja", "pl", "ru", "ar", "no"]
 
 function detectLocale(): Locale {
   if (typeof navigator !== "object") return "en"
@@ -54,6 +56,7 @@ function detectLocale(): Locale {
     if (language.toLowerCase().startsWith("pl")) return "pl"
     if (language.toLowerCase().startsWith("ru")) return "ru"
     if (language.toLowerCase().startsWith("ar")) return "ar"
+    if (language.toLowerCase().startsWith("no") || language.toLowerCase().startsWith("nb") || language.toLowerCase().startsWith("nn")) return "no"
   }
 
   return "en"
@@ -81,6 +84,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
       if (store.locale === "pl") return "pl"
       if (store.locale === "ru") return "ru"
       if (store.locale === "ar") return "ar"
+      if (store.locale === "no") return "no"
       return "en"
     })
 
@@ -103,6 +107,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
       if (locale() === "pl") return { ...base, ...i18n.flatten({ ...pl, ...uiPl }) }
       if (locale() === "ru") return { ...base, ...i18n.flatten({ ...ru, ...uiRu }) }
       if (locale() === "ar") return { ...base, ...i18n.flatten({ ...ar, ...uiAr }) }
+      if (locale() === "no") return { ...base, ...i18n.flatten({ ...no, ...uiNo }) }
       return { ...base, ...i18n.flatten({ ...ko, ...uiKo }) }
     })
 
@@ -121,6 +126,7 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
       pl: "language.pl",
       ru: "language.ru",
       ar: "language.ar",
+      no: "language.no",
     }
 
     const label = (value: Locale) => t(labelKey[value])
@@ -141,4 +147,4 @@ export const { use: useLanguage, provider: LanguageProvider } = createSimpleCont
       },
     }
   },
-})
+})

+ 2 - 1
packages/app/src/i18n/ar.ts

@@ -304,6 +304,7 @@ export const dict = {
   "language.ru": "الروسية",
   "language.pl": "البولندية",
   "language.ar": "العربية",
+  "language.no": "النرويجية",
 
   "toast.language.title": "لغة",
   "toast.language.description": "تم التبديل إلى {{language}}",
@@ -643,4 +644,4 @@ export const dict = {
   "workspace.reset.archived.one": "ستتم أرشفة جلسة واحدة.",
   "workspace.reset.archived.many": "ستتم أرشفة {{count}} جلسات.",
   "workspace.reset.note": "سيؤدي هذا إلى إعادة تعيين مساحة العمل لتتطابق مع الفرع الافتراضي.",
-}
+}

+ 2 - 1
packages/app/src/i18n/da.ts

@@ -287,6 +287,7 @@ export const dict = {
   "language.ru": "Russisk",
   "language.pl": "Polsk",
   "language.ar": "Arabisk",
+  "language.no": "Norsk",
 
   "toast.language.title": "Sprog",
   "toast.language.description": "Skiftede til {{language}}",
@@ -569,4 +570,4 @@ export const dict = {
   "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.",
-}
+}

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

@@ -292,6 +292,7 @@ export const dict = {
   "language.ru": "Russisch",
   "language.pl": "Polnisch",
   "language.ar": "Arabisch",
+  "language.no": "Norwegisch",
 
   "toast.language.title": "Sprache",
   "toast.language.description": "Zu {{language}} gewechselt",
@@ -578,4 +579,4 @@ export const dict = {
   "workspace.reset.archived.one": "1 Sitzung wird archiviert.",
   "workspace.reset.archived.many": "{{count}} Sitzungen werden archiviert.",
   "workspace.reset.note": "Dadurch wird der Arbeitsbereich auf den Standard-Branch zurückgesetzt.",
-} satisfies Partial<Record<Keys, string>>
+} satisfies Partial<Record<Keys, string>>

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

@@ -304,6 +304,7 @@ export const dict = {
   "language.ru": "Russian",
   "language.pl": "Polish",
   "language.ar": "Arabic",
+  "language.no": "Norwegian",
 
   "toast.language.title": "Language",
   "toast.language.description": "Switched to {{language}}",
@@ -647,4 +648,4 @@ export const dict = {
   "workspace.reset.archived.one": "1 session will be archived.",
   "workspace.reset.archived.many": "{{count}} sessions will be archived.",
   "workspace.reset.note": "This will reset the workspace to match the default branch.",
-}
+}

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

@@ -287,6 +287,7 @@ export const dict = {
   "language.ru": "Ruso",
   "language.pl": "Polaco",
   "language.ar": "Árabe",
+  "language.no": "Noruego",
 
   "toast.language.title": "Idioma",
   "toast.language.description": "Cambiado a {{language}}",
@@ -572,4 +573,4 @@ export const dict = {
   "workspace.reset.archived.one": "1 sesión será archivada.",
   "workspace.reset.archived.many": "{{count}} sesiones serán archivadas.",
   "workspace.reset.note": "Esto restablecerá el espacio de trabajo para coincidir con la rama predeterminada.",
-}
+}

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

@@ -287,6 +287,7 @@ export const dict = {
   "language.ru": "Russe",
   "language.pl": "Polonais",
   "language.ar": "Arabe",
+  "language.no": "Norvégien",
 
   "toast.language.title": "Langue",
   "toast.language.description": "Passé à {{language}}",
@@ -579,4 +580,4 @@ export const dict = {
   "workspace.reset.archived.one": "1 session sera archivée.",
   "workspace.reset.archived.many": "{{count}} sessions seront archivées.",
   "workspace.reset.note": "Cela réinitialisera l'espace de travail pour correspondre à la branche par défaut.",
-}
+}

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

@@ -285,6 +285,7 @@ export const dict = {
   "language.ru": "ロシア語",
   "language.pl": "ポーランド語",
   "language.ar": "アラビア語",
+  "language.no": "ノルウェー語",
 
   "toast.language.title": "言語",
   "toast.language.description": "{{language}}に切り替えました",
@@ -566,4 +567,4 @@ export const dict = {
   "workspace.reset.archived.one": "1つのセッションがアーカイブされます。",
   "workspace.reset.archived.many": "{{count}}個のセッションがアーカイブされます。",
   "workspace.reset.note": "これにより、ワークスペースはデフォルトブランチと一致するようにリセットされます。",
-}
+}

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

@@ -289,6 +289,7 @@ export const dict = {
   "language.ru": "러시아어",
   "language.pl": "폴란드어",
   "language.ar": "아랍어",
+  "language.no": "노르웨이어",
 
   "toast.language.title": "언어",
   "toast.language.description": "{{language}}(으)로 전환됨",
@@ -567,4 +568,4 @@ export const dict = {
   "workspace.reset.archived.one": "1개의 세션이 보관됩니다.",
   "workspace.reset.archived.many": "{{count}}개의 세션이 보관됩니다.",
   "workspace.reset.note": "이 작업은 작업 공간을 기본 브랜치와 일치하도록 재설정합니다.",
-}
+}

+ 599 - 0
packages/app/src/i18n/no.ts

@@ -0,0 +1,599 @@
+import { dict as en } from "./en"
+type Keys = keyof typeof en
+
+export const dict: Record<Keys, string> = {
+  "command.category.suggested": "Foreslått",
+  "command.category.view": "Visning",
+  "command.category.project": "Prosjekt",
+  "command.category.provider": "Leverandør",
+  "command.category.server": "Server",
+  "command.category.session": "Sesjon",
+  "command.category.theme": "Tema",
+  "command.category.language": "Språk",
+  "command.category.file": "Fil",
+  "command.category.terminal": "Terminal",
+  "command.category.model": "Modell",
+  "command.category.mcp": "MCP",
+  "command.category.agent": "Agent",
+  "command.category.permissions": "Tillatelser",
+  "command.category.workspace": "Arbeidsområde",
+  "command.category.settings": "Innstillinger",
+
+  "theme.scheme.system": "System",
+  "theme.scheme.light": "Lys",
+  "theme.scheme.dark": "Mørk",
+
+  "command.sidebar.toggle": "Veksle sidepanel",
+  "command.project.open": "Åpne prosjekt",
+  "command.provider.connect": "Koble til leverandør",
+  "command.server.switch": "Bytt server",
+  "command.settings.open": "Åpne innstillinger",
+  "command.session.previous": "Forrige sesjon",
+  "command.session.next": "Neste sesjon",
+  "command.session.archive": "Arkiver sesjon",
+
+  "command.palette": "Kommandopalett",
+
+  "command.theme.cycle": "Bytt tema",
+  "command.theme.set": "Bruk tema: {{theme}}",
+  "command.theme.scheme.cycle": "Bytt fargevalg",
+  "command.theme.scheme.set": "Bruk fargevalg: {{scheme}}",
+
+  "command.language.cycle": "Bytt språk",
+  "command.language.set": "Bruk språk: {{language}}",
+
+  "command.session.new": "Ny sesjon",
+  "command.file.open": "Åpne fil",
+  "command.file.open.description": "Søk i filer og kommandoer",
+  "command.terminal.toggle": "Veksle terminal",
+  "command.review.toggle": "Veksle gjennomgang",
+  "command.terminal.new": "Ny terminal",
+  "command.terminal.new.description": "Opprett en ny terminalfane",
+  "command.steps.toggle": "Veksle trinn",
+  "command.steps.toggle.description": "Vis eller skjul trinn for gjeldende melding",
+  "command.message.previous": "Forrige melding",
+  "command.message.previous.description": "Gå til forrige brukermelding",
+  "command.message.next": "Neste melding",
+  "command.message.next.description": "Gå til neste brukermelding",
+  "command.model.choose": "Velg modell",
+  "command.model.choose.description": "Velg en annen modell",
+  "command.mcp.toggle": "Veksle MCP-er",
+  "command.mcp.toggle.description": "Veksle MCP-er",
+  "command.agent.cycle": "Bytt agent",
+  "command.agent.cycle.description": "Bytt til neste agent",
+  "command.agent.cycle.reverse": "Bytt agent bakover",
+  "command.agent.cycle.reverse.description": "Bytt til forrige agent",
+  "command.model.variant.cycle": "Bytt tenkeinnsats",
+  "command.model.variant.cycle.description": "Bytt til neste innsatsnivå",
+  "command.permissions.autoaccept.enable": "Godta endringer automatisk",
+  "command.permissions.autoaccept.disable": "Slutt å godta endringer automatisk",
+  "command.session.undo": "Angre",
+  "command.session.undo.description": "Angre siste melding",
+  "command.session.redo": "Gjør om",
+  "command.session.redo.description": "Gjør om siste angrede melding",
+  "command.session.compact": "Komprimer sesjon",
+  "command.session.compact.description": "Oppsummer sesjonen for å redusere kontekststørrelsen",
+  "command.session.fork": "Forgren fra melding",
+  "command.session.fork.description": "Opprett en ny sesjon fra en tidligere melding",
+  "command.session.share": "Del sesjon",
+  "command.session.share.description": "Del denne sesjonen og kopier URL-en til utklippstavlen",
+  "command.session.unshare": "Slutt å dele sesjon",
+  "command.session.unshare.description": "Slutt å dele denne sesjonen",
+
+  "palette.search.placeholder": "Søk i filer og kommandoer",
+  "palette.empty": "Ingen resultater funnet",
+  "palette.group.commands": "Kommandoer",
+  "palette.group.files": "Filer",
+
+  "dialog.provider.search.placeholder": "Søk etter leverandører",
+  "dialog.provider.empty": "Ingen leverandører funnet",
+  "dialog.provider.group.popular": "Populære",
+  "dialog.provider.group.other": "Andre",
+  "dialog.provider.tag.recommended": "Anbefalt",
+  "dialog.provider.anthropic.note": "Koble til med Claude Pro/Max eller API-nøkkel",
+
+  "dialog.model.select.title": "Velg modell",
+  "dialog.model.search.placeholder": "Søk etter modeller",
+  "dialog.model.empty": "Ingen modellresultater",
+  "dialog.model.manage": "Administrer modeller",
+  "dialog.model.manage.description": "Tilpass hvilke modeller som vises i modellvelgeren.",
+
+  "dialog.model.unpaid.freeModels.title": "Gratis modeller levert av OpenCode",
+  "dialog.model.unpaid.addMore.title": "Legg til flere modeller fra populære leverandører",
+
+  "dialog.provider.viewAll": "Vis alle leverandører",
+
+  "provider.connect.title": "Koble til {{provider}}",
+  "provider.connect.title.anthropicProMax": "Logg inn med Claude Pro/Max",
+  "provider.connect.selectMethod": "Velg innloggingsmetode for {{provider}}.",
+  "provider.connect.method.apiKey": "API-nøkkel",
+  "provider.connect.status.inProgress": "Autorisering pågår...",
+  "provider.connect.status.waiting": "Venter på autorisering...",
+  "provider.connect.status.failed": "Autorisering mislyktes: {{error}}",
+  "provider.connect.apiKey.description":
+    "Skriv inn din {{provider}} API-nøkkel for å koble til kontoen din og bruke {{provider}}-modeller i OpenCode.",
+  "provider.connect.apiKey.label": "{{provider}} API-nøkkel",
+  "provider.connect.apiKey.placeholder": "API-nøkkel",
+  "provider.connect.apiKey.required": "API-nøkkel er påkrevd",
+  "provider.connect.opencodeZen.line1":
+    "OpenCode Zen gir deg tilgang til et utvalg av pålitelige optimaliserte modeller for kodeagenter.",
+  "provider.connect.opencodeZen.line2":
+    "Med én enkelt API-nøkkel får du tilgang til modeller som Claude, GPT, Gemini, GLM og flere.",
+  "provider.connect.opencodeZen.visit.prefix": "Besøk ",
+  "provider.connect.opencodeZen.visit.link": "opencode.ai/zen",
+  "provider.connect.opencodeZen.visit.suffix": " for å hente API-nøkkelen din.",
+  "provider.connect.oauth.code.visit.prefix": "Besøk ",
+  "provider.connect.oauth.code.visit.link": "denne lenken",
+  "provider.connect.oauth.code.visit.suffix":
+    " for å hente autorisasjonskoden din for å koble til kontoen din og bruke {{provider}}-modeller i OpenCode.",
+  "provider.connect.oauth.code.label": "{{method}} autorisasjonskode",
+  "provider.connect.oauth.code.placeholder": "Autorisasjonskode",
+  "provider.connect.oauth.code.required": "Autorisasjonskode er påkrevd",
+  "provider.connect.oauth.code.invalid": "Ugyldig autorisasjonskode",
+  "provider.connect.oauth.auto.visit.prefix": "Besøk ",
+  "provider.connect.oauth.auto.visit.link": "denne lenken",
+  "provider.connect.oauth.auto.visit.suffix":
+    " og skriv inn koden nedenfor for å koble til kontoen din og bruke {{provider}}-modeller i OpenCode.",
+  "provider.connect.oauth.auto.confirmationCode": "Bekreftelseskode",
+  "provider.connect.toast.connected.title": "{{provider}} tilkoblet",
+  "provider.connect.toast.connected.description": "{{provider}}-modeller er nå tilgjengelige.",
+
+  "model.tag.free": "Gratis",
+  "model.tag.latest": "Nyeste",
+  "model.provider.anthropic": "Anthropic",
+  "model.provider.openai": "OpenAI",
+  "model.provider.google": "Google",
+  "model.provider.xai": "xAI",
+  "model.provider.meta": "Meta",
+  "model.input.text": "tekst",
+  "model.input.image": "bilde",
+  "model.input.audio": "lyd",
+  "model.input.video": "video",
+  "model.input.pdf": "pdf",
+  "model.tooltip.allows": "Tillater: {{inputs}}",
+  "model.tooltip.reasoning.allowed": "Tillater resonnering",
+  "model.tooltip.reasoning.none": "Ingen resonnering",
+  "model.tooltip.context": "Kontekstgrense {{limit}}",
+
+  "common.search.placeholder": "Søk",
+  "common.goBack": "Gå tilbake",
+  "common.loading": "Laster",
+  "common.loading.ellipsis": "...",
+  "common.cancel": "Avbryt",
+  "common.submit": "Send inn",
+  "common.save": "Lagre",
+  "common.saving": "Lagrer...",
+  "common.default": "Standard",
+  "common.attachment": "vedlegg",
+
+  "prompt.placeholder.shell": "Skriv inn shell-kommando...",
+  "prompt.placeholder.normal": 'Spør om hva som helst... "{{example}}"',
+  "prompt.mode.shell": "Shell",
+  "prompt.mode.shell.exit": "ESC for å avslutte",
+
+  "prompt.example.1": "Fiks en TODO i kodebasen",
+  "prompt.example.2": "Hva er teknologistabelen i dette prosjektet?",
+  "prompt.example.3": "Fiks ødelagte tester",
+  "prompt.example.4": "Forklar hvordan autentisering fungerer",
+  "prompt.example.5": "Finn og fiks sikkerhetssårbarheter",
+  "prompt.example.6": "Legg til enhetstester for brukerservicen",
+  "prompt.example.7": "Refaktorer denne funksjonen for bedre lesbarhet",
+  "prompt.example.8": "Hva betyr denne feilen?",
+  "prompt.example.9": "Hjelp meg med å feilsøke dette problemet",
+  "prompt.example.10": "Generer API-dokumentasjon",
+  "prompt.example.11": "Optimaliser databasespørringer",
+  "prompt.example.12": "Legg til inputvalidering",
+  "prompt.example.13": "Lag en ny komponent for...",
+  "prompt.example.14": "Hvordan deployer jeg dette prosjektet?",
+  "prompt.example.15": "Gjennomgå koden min for beste praksis",
+  "prompt.example.16": "Legg til feilhåndtering i denne funksjonen",
+  "prompt.example.17": "Forklar dette regex-mønsteret",
+  "prompt.example.18": "Konverter dette til TypeScript",
+  "prompt.example.19": "Legg til logging i hele kodebasen",
+  "prompt.example.20": "Hvilke avhengigheter er utdaterte?",
+  "prompt.example.21": "Hjelp meg med å skrive et migreringsskript",
+  "prompt.example.22": "Implementer caching for dette endepunktet",
+  "prompt.example.23": "Legg til paginering i denne listen",
+  "prompt.example.24": "Lag en CLI-kommando for...",
+  "prompt.example.25": "Hvordan fungerer miljøvariabler her?",
+
+  "prompt.popover.emptyResults": "Ingen matchende resultater",
+  "prompt.popover.emptyCommands": "Ingen matchende kommandoer",
+  "prompt.dropzone.label": "Slipp bilder eller PDF-er her",
+  "prompt.slash.badge.custom": "egendefinert",
+  "prompt.context.active": "aktiv",
+  "prompt.context.includeActiveFile": "Inkluder aktiv fil",
+  "prompt.context.removeActiveFile": "Fjern aktiv fil fra kontekst",
+  "prompt.context.removeFile": "Fjern fil fra kontekst",
+  "prompt.action.attachFile": "Legg ved fil",
+  "prompt.attachment.remove": "Fjern vedlegg",
+  "prompt.action.send": "Send",
+  "prompt.action.stop": "Stopp",
+
+  "prompt.toast.pasteUnsupported.title": "Liming ikke støttet",
+  "prompt.toast.pasteUnsupported.description": "Kun bilder eller PDF-er kan limes inn her.",
+  "prompt.toast.modelAgentRequired.title": "Velg en agent og modell",
+  "prompt.toast.modelAgentRequired.description": "Velg en agent og modell før du sender en forespørsel.",
+  "prompt.toast.worktreeCreateFailed.title": "Kunne ikke opprette worktree",
+  "prompt.toast.sessionCreateFailed.title": "Kunne ikke opprette sesjon",
+  "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ørsel",
+
+  "dialog.mcp.title": "MCP-er",
+  "dialog.mcp.description": "{{enabled}} av {{total}} aktivert",
+  "dialog.mcp.empty": "Ingen MCP-er konfigurert",
+
+  "mcp.status.connected": "tilkoblet",
+  "mcp.status.failed": "mislyktes",
+  "mcp.status.needs_auth": "trenger autentisering",
+  "mcp.status.disabled": "deaktivert",
+
+  "dialog.fork.empty": "Ingen meldinger å forgrene fra",
+
+  "dialog.directory.search.placeholder": "Søk etter mapper",
+  "dialog.directory.empty": "Ingen mapper funnet",
+
+  "dialog.server.title": "Servere",
+  "dialog.server.description": "Bytt hvilken OpenCode-server denne appen kobler til.",
+  "dialog.server.search.placeholder": "Søk etter servere",
+  "dialog.server.empty": "Ingen servere ennå",
+  "dialog.server.add.title": "Legg til en server",
+  "dialog.server.add.url": "Server-URL",
+  "dialog.server.add.placeholder": "http://localhost:4096",
+  "dialog.server.add.error": "Kunne ikke koble til server",
+  "dialog.server.add.checking": "Sjekker...",
+  "dialog.server.add.button": "Legg til",
+  "dialog.server.default.title": "Standardserver",
+  "dialog.server.default.description":
+    "Koble til denne serveren ved oppstart i stedet for å starte en lokal server. Krever omstart.",
+  "dialog.server.default.none": "Ingen server valgt",
+  "dialog.server.default.set": "Sett gjeldende server som standard",
+  "dialog.server.default.clear": "Tøm",
+  "dialog.server.action.remove": "Fjern server",
+
+  "dialog.project.edit.title": "Rediger prosjekt",
+  "dialog.project.edit.name": "Navn",
+  "dialog.project.edit.icon": "Ikon",
+  "dialog.project.edit.icon.alt": "Prosjektikon",
+  "dialog.project.edit.icon.hint": "Klikk eller dra et bilde",
+  "dialog.project.edit.icon.recommended": "Anbefalt: 128x128px",
+  "dialog.project.edit.color": "Farge",
+  "dialog.project.edit.color.select": "Velg fargen {{color}}",
+
+  "context.breakdown.title": "Kontekstfordeling",
+  "context.breakdown.note":
+    'Omtrentlig fordeling av input-tokens. "Annet" inkluderer verktøydefinisjoner og overhead.',
+  "context.breakdown.system": "System",
+  "context.breakdown.user": "Bruker",
+  "context.breakdown.assistant": "Assistent",
+  "context.breakdown.tool": "Verktøykall",
+  "context.breakdown.other": "Annet",
+
+  "context.systemPrompt.title": "Systemprompt",
+  "context.rawMessages.title": "Rå meldinger",
+
+  "context.stats.session": "Sesjon",
+  "context.stats.messages": "Meldinger",
+  "context.stats.provider": "Leverandør",
+  "context.stats.model": "Modell",
+  "context.stats.limit": "Kontekstgrense",
+  "context.stats.totalTokens": "Totalt antall tokens",
+  "context.stats.usage": "Forbruk",
+  "context.stats.inputTokens": "Input-tokens",
+  "context.stats.outputTokens": "Output-tokens",
+  "context.stats.reasoningTokens": "Resonnerings-tokens",
+  "context.stats.cacheTokens": "Cache-tokens (les/skriv)",
+  "context.stats.userMessages": "Brukermeldinger",
+  "context.stats.assistantMessages": "Assistentmeldinger",
+  "context.stats.totalCost": "Total kostnad",
+  "context.stats.sessionCreated": "Sesjon opprettet",
+  "context.stats.lastActivity": "Siste aktivitet",
+
+  "context.usage.tokens": "Tokens",
+  "context.usage.usage": "Forbruk",
+  "context.usage.cost": "Kostnad",
+  "context.usage.clickToView": "Klikk for å se kontekst",
+  "context.usage.view": "Se kontekstforbruk",
+
+  "language.en": "Engelsk",
+  "language.zh": "Kinesisk (forenklet)",
+  "language.zht": "Kinesisk (tradisjonell)",
+  "language.ko": "Koreansk",
+  "language.de": "Tysk",
+  "language.es": "Spansk",
+  "language.fr": "Fransk",
+  "language.ja": "Japansk",
+  "language.da": "Dansk",
+  "language.ru": "Russisk",
+  "language.pl": "Polsk",
+  "language.ar": "Arabisk",
+  "language.no": "Norsk",
+
+  "toast.language.title": "Språk",
+  "toast.language.description": "Byttet til {{language}}",
+
+  "toast.theme.title": "Tema byttet",
+  "toast.scheme.title": "Fargevalg",
+
+  "toast.permissions.autoaccept.on.title": "Godtar endringer automatisk",
+  "toast.permissions.autoaccept.on.description": "Redigerings- og skrivetillatelser vil bli godkjent automatisk",
+  "toast.permissions.autoaccept.off.title": "Sluttet å godta endringer automatisk",
+  "toast.permissions.autoaccept.off.description": "Redigerings- og skrivetillatelser vil kreve godkjenning",
+
+  "toast.model.none.title": "Ingen modell valgt",
+  "toast.model.none.description": "Koble til en leverandør for å oppsummere denne sesjonen",
+
+  "toast.file.loadFailed.title": "Kunne ikke laste fil",
+
+  "toast.session.share.copyFailed.title": "Kunne ikke kopiere URL til utklippstavlen",
+  "toast.session.share.success.title": "Sesjon delt",
+  "toast.session.share.success.description": "Delings-URL kopiert til utklippstavlen!",
+  "toast.session.share.failed.title": "Kunne ikke dele sesjon",
+  "toast.session.share.failed.description": "Det oppstod en feil under deling av sesjonen",
+
+  "toast.session.unshare.success.title": "Deling av sesjon stoppet",
+  "toast.session.unshare.success.description": "Sesjonen deles ikke lenger!",
+  "toast.session.unshare.failed.title": "Kunne ikke stoppe deling av sesjon",
+  "toast.session.unshare.failed.description": "Det oppstod en feil da delingen av sesjonen skulle stoppes",
+
+  "toast.session.listFailed.title": "Kunne ikke laste sesjoner for {{project}}",
+
+  "toast.update.title": "Oppdatering tilgjengelig",
+  "toast.update.description": "En ny versjon av OpenCode ({{version}}) er nå tilgjengelig for installasjon.",
+  "toast.update.action.installRestart": "Installer og start på nytt",
+  "toast.update.action.notYet": "Ikke nå",
+
+  "error.page.title": "Noe gikk galt",
+  "error.page.description": "Det oppstod en feil under lasting av applikasjonen.",
+  "error.page.details.label": "Feildetaljer",
+  "error.page.action.restart": "Start på nytt",
+  "error.page.action.checking": "Sjekker...",
+  "error.page.action.checkUpdates": "Se etter oppdateringer",
+  "error.page.action.updateTo": "Oppdater til {{version}}",
+  "error.page.report.prefix": "Vennligst rapporter denne feilen til OpenCode-teamet",
+  "error.page.report.discord": "på Discord",
+  "error.page.version": "Versjon: {{version}}",
+
+  "error.dev.rootNotFound":
+    "Rotelement ikke funnet. Glemte du å legge det til i index.html? Eller kanskje id-attributten er feilstavet?",
+
+  "error.globalSync.connectFailed": "Kunne ikke koble til server. Kjører det en server på `{{url}}`?",
+
+  "error.chain.unknown": "Ukjent feil",
+  "error.chain.causedBy": "Forårsaket av:",
+  "error.chain.apiError": "API-feil",
+  "error.chain.status": "Status: {{status}}",
+  "error.chain.retryable": "Kan prøves på nytt: {{retryable}}",
+  "error.chain.responseBody": "Responsinnhold:\n{{body}}",
+  "error.chain.didYouMean": "Mente du: {{suggestions}}",
+  "error.chain.modelNotFound": "Modell ikke funnet: {{provider}}/{{model}}",
+  "error.chain.checkConfig": "Sjekk leverandør-/modellnavnene i konfigurasjonen din (opencode.json)",
+  "error.chain.mcpFailed": 'MCP-server "{{name}}" mislyktes. Merk at OpenCode ikke støtter MCP-autentisering ennå.',
+  "error.chain.providerAuthFailed": "Leverandørautentisering mislyktes ({{provider}}): {{message}}",
+  "error.chain.providerInitFailed":
+    'Kunne ikke initialisere leverandør "{{provider}}". Sjekk legitimasjon og konfigurasjon.',
+  "error.chain.configJsonInvalid": "Konfigurasjonsfilen på {{path}} er ikke gyldig JSON(C)",
+  "error.chain.configJsonInvalidWithMessage": "Konfigurasjonsfilen på {{path}} er ikke gyldig JSON(C): {{message}}",
+  "error.chain.configDirectoryTypo":
+    'Mappen "{{dir}}" i {{path}} er ikke gyldig. Gi mappen nytt navn til "{{suggestion}}" eller fjern den. Dette er en vanlig skrivefeil.',
+  "error.chain.configFrontmatterError": "Kunne ikke analysere frontmatter i {{path}}:\n{{message}}",
+  "error.chain.configInvalid": "Konfigurasjonsfilen på {{path}} er ugyldig",
+  "error.chain.configInvalidWithMessage": "Konfigurasjonsfilen på {{path}} er ugyldig: {{message}}",
+
+  "notification.permission.title": "Tillatelse påkrevd",
+  "notification.permission.description": "{{sessionTitle}} i {{projectName}} trenger tillatelse",
+  "notification.question.title": "Spørsmål",
+  "notification.question.description": "{{sessionTitle}} i {{projectName}} har et spørsmål",
+  "notification.action.goToSession": "Gå til sesjon",
+
+  "notification.session.responseReady.title": "Svar klart",
+  "notification.session.error.title": "Sesjonsfeil",
+  "notification.session.error.fallbackDescription": "Det oppstod en feil",
+
+  "home.recentProjects": "Nylige prosjekter",
+  "home.empty.title": "Ingen nylige prosjekter",
+  "home.empty.description": "Kom i gang ved å åpne et lokalt prosjekt",
+
+  "session.tab.session": "Sesjon",
+  "session.tab.review": "Gjennomgang",
+  "session.tab.context": "Kontekst",
+  "session.panel.reviewAndFiles": "Gjennomgang og filer",
+  "session.review.filesChanged": "{{count}} filer endret",
+  "session.review.loadingChanges": "Laster endringer...",
+  "session.review.empty": "Ingen endringer i denne sesjonen ennå",
+  "session.messages.renderEarlier": "Vis tidligere meldinger",
+  "session.messages.loadingEarlier": "Laster inn tidligere meldinger...",
+  "session.messages.loadEarlier": "Last inn tidligere meldinger",
+  "session.messages.loading": "Laster meldinger...",
+  "session.messages.jumpToLatest": "Hopp til nyeste",
+
+  "session.context.addToContext": "Legg til {{selection}} i kontekst",
+
+  "session.new.worktree.main": "Hovedgren",
+  "session.new.worktree.mainWithBranch": "Hovedgren ({{branch}})",
+  "session.new.worktree.create": "Opprett nytt worktree",
+  "session.new.lastModified": "Sist endret",
+
+  "session.header.search.placeholder": "Søk i {{project}}",
+  "session.header.searchFiles": "Søk etter filer",
+
+  "session.share.popover.title": "Publiser på nett",
+  "session.share.popover.description.shared":
+    "Denne sesjonen er offentlig på nettet. Den er tilgjengelig for alle med lenken.",
+  "session.share.popover.description.unshared":
+    "Del sesjonen offentlig på nettet. Den vil være tilgjengelig for alle med lenken.",
+  "session.share.action.share": "Del",
+  "session.share.action.publish": "Publiser",
+  "session.share.action.publishing": "Publiserer...",
+  "session.share.action.unpublish": "Avpubliser",
+  "session.share.action.unpublishing": "Avpubliserer...",
+  "session.share.action.view": "Vis",
+  "session.share.copy.copied": "Kopiert",
+  "session.share.copy.copyLink": "Kopier lenke",
+
+  "lsp.tooltip.none": "Ingen LSP-servere",
+  "lsp.label.connected": "{{count}} LSP",
+
+  "prompt.loading": "Laster prompt...",
+  "terminal.loading": "Laster terminal...",
+  "terminal.title": "Terminal",
+  "terminal.title.numbered": "Terminal {{number}}",
+  "terminal.close": "Lukk terminal",
+  "terminal.connectionLost.title": "Tilkobling mistet",
+  "terminal.connectionLost.description":
+    "Terminalforbindelsen ble avbrutt. Dette kan skje når serveren starter på nytt.",
+
+  "common.closeTab": "Lukk fane",
+  "common.dismiss": "Avvis",
+  "common.requestFailed": "Forespørsel mislyktes",
+  "common.moreOptions": "Flere alternativer",
+  "common.learnMore": "Lær mer",
+  "common.rename": "Gi nytt navn",
+  "common.reset": "Tilbakestill",
+  "common.delete": "Slett",
+  "common.close": "Lukk",
+  "common.edit": "Rediger",
+  "common.loadMore": "Last flere",
+  "common.key.esc": "ESC",
+
+  "sidebar.menu.toggle": "Veksle meny",
+  "sidebar.nav.projectsAndSessions": "Prosjekter og sesjoner",
+  "sidebar.settings": "Innstillinger",
+  "sidebar.help": "Hjelp",
+  "sidebar.workspaces.enable": "Aktiver arbeidsområder",
+  "sidebar.workspaces.disable": "Deaktiver arbeidsområder",
+  "sidebar.gettingStarted.title": "Kom i gang",
+  "sidebar.gettingStarted.line1": "OpenCode inkluderer gratis modeller så du kan starte umiddelbart.",
+  "sidebar.gettingStarted.line2": "Koble til en leverandør for å bruke modeller, inkl. Claude, GPT, Gemini osv.",
+  "sidebar.project.recentSessions": "Nylige sesjoner",
+  "sidebar.project.viewAllSessions": "Vis alle sesjoner",
+
+  "settings.section.desktop": "Skrivebord",
+  "settings.tab.general": "Generelt",
+  "settings.tab.shortcuts": "Snarveier",
+
+  "settings.general.section.appearance": "Utseende",
+  "settings.general.section.notifications": "Systemvarsler",
+  "settings.general.section.sounds": "Lydeffekter",
+
+  "settings.general.row.language.title": "Språk",
+  "settings.general.row.language.description": "Endre visningsspråket for OpenCode",
+  "settings.general.row.appearance.title": "Utseende",
+  "settings.general.row.appearance.description": "Tilpass hvordan OpenCode ser ut på enheten din",
+  "settings.general.row.theme.title": "Tema",
+  "settings.general.row.theme.description": "Tilpass hvordan OpenCode er tematisert.",
+  "settings.general.row.font.title": "Skrift",
+  "settings.general.row.font.description": "Tilpass mono-skriften som brukes i kodeblokker",
+
+  "settings.general.notifications.agent.title": "Agent",
+  "settings.general.notifications.agent.description":
+    "Vis systemvarsel når agenten er ferdig eller trenger oppmerksomhet",
+  "settings.general.notifications.permissions.title": "Tillatelser",
+  "settings.general.notifications.permissions.description": "Vis systemvarsel når en tillatelse er påkrevd",
+  "settings.general.notifications.errors.title": "Feil",
+  "settings.general.notifications.errors.description": "Vis systemvarsel når det oppstår en feil",
+
+  "settings.general.sounds.agent.title": "Agent",
+  "settings.general.sounds.agent.description": "Spill av lyd når agenten er ferdig eller trenger oppmerksomhet",
+  "settings.general.sounds.permissions.title": "Tillatelser",
+  "settings.general.sounds.permissions.description": "Spill av lyd når en tillatelse er påkrevd",
+  "settings.general.sounds.errors.title": "Feil",
+  "settings.general.sounds.errors.description": "Spill av lyd når det oppstår en feil",
+
+  "settings.shortcuts.title": "Tastatursnarveier",
+  "settings.shortcuts.reset.button": "Tilbakestill til standard",
+  "settings.shortcuts.reset.toast.title": "Snarveier tilbakestilt",
+  "settings.shortcuts.reset.toast.description": "Tastatursnarveier er tilbakestilt til standard.",
+  "settings.shortcuts.conflict.title": "Snarvei allerede i bruk",
+  "settings.shortcuts.conflict.description": "{{keybind}} er allerede tilordnet til {{titles}}.",
+  "settings.shortcuts.unassigned": "Ikke tilordnet",
+  "settings.shortcuts.pressKeys": "Trykk taster",
+  "settings.shortcuts.search.placeholder": "Søk etter snarveier",
+  "settings.shortcuts.search.empty": "Ingen snarveier funnet",
+
+  "settings.shortcuts.group.general": "Generelt",
+  "settings.shortcuts.group.session": "Sesjon",
+  "settings.shortcuts.group.navigation": "Navigasjon",
+  "settings.shortcuts.group.modelAndAgent": "Modell og agent",
+  "settings.shortcuts.group.terminal": "Terminal",
+  "settings.shortcuts.group.prompt": "Prompt",
+
+  "settings.providers.title": "Leverandører",
+  "settings.providers.description": "Leverandørinnstillinger vil kunne konfigureres her.",
+  "settings.models.title": "Modeller",
+  "settings.models.description": "Modellinnstillinger vil kunne konfigureres her.",
+  "settings.agents.title": "Agenter",
+  "settings.agents.description": "Agentinnstillinger vil kunne konfigureres her.",
+  "settings.commands.title": "Kommandoer",
+  "settings.commands.description": "Kommandoinnstillinger vil kunne konfigureres her.",
+  "settings.mcp.title": "MCP",
+  "settings.mcp.description": "MCP-innstillinger vil kunne konfigureres her.",
+
+  "settings.permissions.title": "Tillatelser",
+  "settings.permissions.description": "Kontroller hvilke verktøy serveren kan bruke som standard.",
+  "settings.permissions.section.tools": "Verktøy",
+  "settings.permissions.toast.updateFailed.title": "Kunne ikke oppdatere tillatelser",
+
+  "settings.permissions.action.allow": "Tillat",
+  "settings.permissions.action.ask": "Spør",
+  "settings.permissions.action.deny": "Avslå",
+
+  "settings.permissions.tool.read.title": "Les",
+  "settings.permissions.tool.read.description": "Lesing av en fil (matcher filbanen)",
+  "settings.permissions.tool.edit.title": "Rediger",
+  "settings.permissions.tool.edit.description": "Endre filer, inkludert redigeringer, skriving, patcher og multi-redigeringer",
+  "settings.permissions.tool.glob.title": "Glob",
+  "settings.permissions.tool.glob.description": "Match filer ved hjelp av glob-mønstre",
+  "settings.permissions.tool.grep.title": "Grep",
+  "settings.permissions.tool.grep.description": "Søk i filinnhold ved hjelp av regulære uttrykk",
+  "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": "Kjør shell-kommandoer",
+  "settings.permissions.tool.task.title": "Oppgave",
+  "settings.permissions.tool.task.description": "Start underagenter",
+  "settings.permissions.tool.skill.title": "Ferdighet",
+  "settings.permissions.tool.skill.description": "Last en ferdighet etter navn",
+  "settings.permissions.tool.lsp.title": "LSP",
+  "settings.permissions.tool.lsp.description": "Kjør språkserverforespørsler",
+  "settings.permissions.tool.todoread.title": "Les gjøremål",
+  "settings.permissions.tool.todoread.description": "Les gjøremålslisten",
+  "settings.permissions.tool.todowrite.title": "Skriv gjøremål",
+  "settings.permissions.tool.todowrite.description": "Oppdater gjøremålslisten",
+  "settings.permissions.tool.webfetch.title": "Webhenting",
+  "settings.permissions.tool.webfetch.description": "Hent innhold fra en URL",
+  "settings.permissions.tool.websearch.title": "Websøk",
+  "settings.permissions.tool.websearch.description": "Søk på nettet",
+  "settings.permissions.tool.codesearch.title": "Kodesøk",
+  "settings.permissions.tool.codesearch.description": "Søk etter kode på nettet",
+  "settings.permissions.tool.external_directory.title": "Ekstern mappe",
+  "settings.permissions.tool.external_directory.description": "Få tilgang til filer utenfor prosjektmappen",
+  "settings.permissions.tool.doom_loop.title": "Doom Loop",
+  "settings.permissions.tool.doom_loop.description": "Oppdager gjentatte verktøykall med identisk input",
+
+  "workspace.new": "Nytt arbeidsområde",
+  "workspace.type.local": "lokal",
+  "workspace.type.sandbox": "sandkasse",
+  "workspace.create.failed.title": "Kunne ikke opprette arbeidsområde",
+  "workspace.delete.failed.title": "Kunne ikke slette arbeidsområde",
+  "workspace.resetting.title": "Tilbakestiller arbeidsområde",
+  "workspace.resetting.description": "Dette kan ta et minutt.",
+  "workspace.reset.failed.title": "Kunne ikke tilbakestille arbeidsområde",
+  "workspace.reset.success.title": "Arbeidsområde tilbakestilt",
+  "workspace.reset.success.description": "Arbeidsområdet samsvarer nå med standardgrenen.",
+  "workspace.status.checking": "Sjekker for ikke-sammenslåtte endringer...",
+  "workspace.status.error": "Kunne ikke bekrefte git-status.",
+  "workspace.status.clean": "Ingen ikke-sammenslåtte endringer oppdaget.",
+  "workspace.status.dirty": "Ikke-sammenslåtte endringer oppdaget i dette arbeidsområdet.",
+  "workspace.delete.title": "Slett arbeidsområde",
+  "workspace.delete.confirm": 'Slette arbeidsområdet "{{name}}"?',
+  "workspace.delete.button": "Slett arbeidsområde",
+  "workspace.reset.title": "Tilbakestill arbeidsområde",
+  "workspace.reset.confirm": 'Tilbakestille arbeidsområdet "{{name}}"?',
+  "workspace.reset.button": "Tilbakestill arbeidsområde",
+  "workspace.reset.archived.none": "Ingen aktive sesjoner vil bli arkivert.",
+  "workspace.reset.archived.one": "1 sesjon vil bli arkivert.",
+  "workspace.reset.archived.many": "{{count}} sesjoner vil bli arkivert.",
+  "workspace.reset.note": "Dette vil tilbakestille arbeidsområdet til å samsvare med standardgrenen.",
+}

+ 2 - 1
packages/app/src/i18n/pl.ts

@@ -303,6 +303,7 @@ export const dict = {
   "language.pl": "Polski",
   "language.ru": "Rosyjski",
   "language.ar": "Arabski",
+  "language.no": "Norweski",
 
   "toast.language.title": "Język",
   "toast.language.description": "Przełączono na {{language}}",
@@ -648,4 +649,4 @@ export const dict = {
   "workspace.reset.archived.one": "1 sesja zostanie zarchiwizowana.",
   "workspace.reset.archived.many": "{{count}} sesji zostanie zarchiwizowanych.",
   "workspace.reset.note": "To zresetuje przestrzeń roboczą, aby odpowiadała domyślnej gałęzi.",
-}
+}

+ 2 - 1
packages/app/src/i18n/ru.ts

@@ -303,6 +303,7 @@ export const dict = {
   "language.da": "Датский",
   "language.ru": "Русский",
   "language.ar": "Арабский",
+  "language.no": "Норвежский",
 
   "toast.language.title": "Язык",
   "toast.language.description": "Переключено на {{language}}",
@@ -651,4 +652,4 @@ export const dict = {
   "workspace.reset.archived.one": "1 сессия будет архивирована.",
   "workspace.reset.archived.many": "{{count}} сессий будет архивировано.",
   "workspace.reset.note": "Рабочее пространство будет сброшено в соответствие с веткой по умолчанию.",
-}
+}

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

@@ -285,6 +285,7 @@ export const dict = {
   "language.ru": "俄语",
   "language.pl": "波兰语",
   "language.ar": "阿拉伯语",
+  "language.no": "挪威语",
 
   "toast.language.title": "语言",
   "toast.language.description": "已切换到{{language}}",
@@ -561,4 +562,4 @@ export const dict = {
   "workspace.reset.archived.one": "将归档 1 个会话。",
   "workspace.reset.archived.many": "将归档 {{count}} 个会话。",
   "workspace.reset.note": "这将把工作区重置为与默认分支一致。",
-} satisfies Partial<Record<Keys, string>>
+} satisfies Partial<Record<Keys, string>>

+ 2 - 1
packages/app/src/i18n/zht.ts

@@ -281,6 +281,7 @@ export const dict = {
   "language.ko": "韓語",
   "language.ru": "俄語",
   "language.ar": "阿拉伯語",
+  "language.no": "挪威語",
 
   "toast.language.title": "語言",
   "toast.language.description": "已切換到 {{language}}",
@@ -557,4 +558,4 @@ export const dict = {
   "workspace.reset.archived.one": "將封存 1 個工作階段。",
   "workspace.reset.archived.many": "將封存 {{count}} 個工作階段。",
   "workspace.reset.note": "這將把工作區重設為與預設分支一致。",
-} satisfies Partial<Record<Keys, string>>
+} satisfies Partial<Record<Keys, string>>

+ 95 - 0
packages/ui/src/i18n/no.ts

@@ -0,0 +1,95 @@
+import { dict as en } from "./en"
+type Keys = keyof typeof en
+
+export const dict: Record<Keys, string> = {
+  "ui.sessionReview.title": "Sesjonsendringer",
+  "ui.sessionReview.diffStyle.unified": "Samlet",
+  "ui.sessionReview.diffStyle.split": "Delt",
+  "ui.sessionReview.expandAll": "Utvid alle",
+  "ui.sessionReview.collapseAll": "Fold sammen alle",
+
+  "ui.sessionTurn.steps.show": "Vis trinn",
+  "ui.sessionTurn.steps.hide": "Skjul trinn",
+  "ui.sessionTurn.summary.response": "Svar",
+  "ui.sessionTurn.diff.showMore": "Vis flere endringer ({{count}})",
+
+  "ui.sessionTurn.retry.retrying": "Prøver igjen",
+  "ui.sessionTurn.retry.inSeconds": "om {{seconds}}s",
+
+  "ui.sessionTurn.status.delegating": "Delegerer arbeid",
+  "ui.sessionTurn.status.planning": "Planlegger neste trinn",
+  "ui.sessionTurn.status.gatheringContext": "Samler inn kontekst",
+  "ui.sessionTurn.status.searchingCodebase": "Søker i kodebasen",
+  "ui.sessionTurn.status.searchingWeb": "Søker på nettet",
+  "ui.sessionTurn.status.makingEdits": "Gjør endringer",
+  "ui.sessionTurn.status.runningCommands": "Kjører kommandoer",
+  "ui.sessionTurn.status.thinking": "Tenker",
+  "ui.sessionTurn.status.thinkingWithTopic": "Tenker - {{topic}}",
+  "ui.sessionTurn.status.gatheringThoughts": "Samler tanker",
+  "ui.sessionTurn.status.consideringNextSteps": "Vurderer neste trinn",
+
+  "ui.messagePart.diagnostic.error": "Feil",
+  "ui.messagePart.title.edit": "Rediger",
+  "ui.messagePart.title.write": "Skriv",
+  "ui.messagePart.option.typeOwnAnswer": "Skriv ditt eget svar",
+  "ui.messagePart.review.title": "Gjennomgå svarene dine",
+
+  "ui.list.loading": "Laster",
+  "ui.list.empty": "Ingen resultater",
+  "ui.list.clearFilter": "Tøm filter",
+  "ui.list.emptyWithFilter.prefix": "Ingen resultater for",
+  "ui.list.emptyWithFilter.suffix": "",
+
+  "ui.messageNav.newMessage": "Ny melding",
+
+  "ui.textField.copyToClipboard": "Kopier til utklippstavlen",
+  "ui.textField.copied": "Kopiert",
+
+  "ui.imagePreview.alt": "Bildeforhåndsvisning",
+
+  "ui.tool.read": "Les",
+  "ui.tool.list": "Liste",
+  "ui.tool.glob": "Glob",
+  "ui.tool.grep": "Grep",
+  "ui.tool.webfetch": "Webhenting",
+  "ui.tool.shell": "Shell",
+  "ui.tool.patch": "Patch",
+  "ui.tool.todos": "Gjøremål",
+  "ui.tool.todos.read": "Les gjøremål",
+  "ui.tool.questions": "Spørsmål",
+  "ui.tool.agent": "{{type}}-agent",
+
+  "ui.common.file.one": "fil",
+  "ui.common.file.other": "filer",
+  "ui.common.question.one": "spørsmål",
+  "ui.common.question.other": "spørsmål",
+
+  "ui.common.add": "Legg til",
+  "ui.common.cancel": "Avbryt",
+  "ui.common.confirm": "Bekreft",
+  "ui.common.dismiss": "Avvis",
+  "ui.common.close": "Lukk",
+  "ui.common.next": "Neste",
+  "ui.common.submit": "Send inn",
+
+  "ui.permission.deny": "Avslå",
+  "ui.permission.allowAlways": "Tillat alltid",
+  "ui.permission.allowOnce": "Tillat én gang",
+
+  "ui.message.expand": "Utvid melding",
+  "ui.message.collapse": "Skjul melding",
+  "ui.message.copy": "Kopier",
+  "ui.message.copied": "Kopiert!",
+  "ui.message.attachment.alt": "vedlegg",
+
+  "ui.patch.action.deleted": "Slettet",
+  "ui.patch.action.created": "Opprettet",
+  "ui.patch.action.moved": "Flyttet",
+  "ui.patch.action.patched": "Oppdatert",
+
+  "ui.question.subtitle.answered": "{{count}} besvart",
+  "ui.question.answer.none": "(ingen svar)",
+  "ui.question.review.notAnswered": "(ikke besvart)",
+  "ui.question.multiHint": "(velg alle som gjelder)",
+  "ui.question.custom.placeholder": "Skriv svaret ditt...",
+}