summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAdam <[email protected]>2026-02-27 09:45:00 -0600
committerGitHub <[email protected]>2026-02-27 09:45:00 -0600
commit6ef3af73dfa1c72bb2001c86d898f2edf8ea4b10 (patch)
tree845adb9ccc47884a0f102a59cb887bd17a51a75c
parente5ae6c51b0d2f5dececd16970250aa2ab6c71a2f (diff)
downloadopencode-6ef3af73dfa1c72bb2001c86d898f2edf8ea4b10.tar.gz
opencode-6ef3af73dfa1c72bb2001c86d898f2edf8ea4b10.zip
chore(app): i18n sync (#15362)
-rw-r--r--packages/app/src/components/dialog-release-notes.tsx10
-rw-r--r--packages/app/src/components/dialog-select-file.tsx2
-rw-r--r--packages/app/src/components/session/session-header.tsx2
-rw-r--r--packages/app/src/components/settings-providers.tsx8
-rw-r--r--packages/app/src/context/global-sync.tsx10
-rw-r--r--packages/app/src/context/global-sync/bootstrap.ts17
-rw-r--r--packages/app/src/i18n/ar.ts14
-rw-r--r--packages/app/src/i18n/br.ts14
-rw-r--r--packages/app/src/i18n/bs.ts14
-rw-r--r--packages/app/src/i18n/da.ts14
-rw-r--r--packages/app/src/i18n/de.ts14
-rw-r--r--packages/app/src/i18n/en.ts16
-rw-r--r--packages/app/src/i18n/es.ts14
-rw-r--r--packages/app/src/i18n/fr.ts14
-rw-r--r--packages/app/src/i18n/ja.ts14
-rw-r--r--packages/app/src/i18n/ko.ts14
-rw-r--r--packages/app/src/i18n/no.ts14
-rw-r--r--packages/app/src/i18n/pl.ts14
-rw-r--r--packages/app/src/i18n/ru.ts14
-rw-r--r--packages/app/src/i18n/th.ts14
-rw-r--r--packages/app/src/i18n/tr.ts14
-rw-r--r--packages/app/src/i18n/zh.ts14
-rw-r--r--packages/app/src/i18n/zht.ts14
-rw-r--r--packages/app/src/utils/server-errors.ts27
-rw-r--r--packages/app/src/utils/time.ts18
-rw-r--r--packages/desktop/src/cli.ts30
-rw-r--r--packages/desktop/src/i18n/ar.ts33
-rw-r--r--packages/desktop/src/i18n/br.ts34
-rw-r--r--packages/desktop/src/i18n/bs.ts34
-rw-r--r--packages/desktop/src/i18n/da.ts33
-rw-r--r--packages/desktop/src/i18n/de.ts34
-rw-r--r--packages/desktop/src/i18n/en.ts34
-rw-r--r--packages/desktop/src/i18n/es.ts34
-rw-r--r--packages/desktop/src/i18n/fr.ts34
-rw-r--r--packages/desktop/src/i18n/ja.ts34
-rw-r--r--packages/desktop/src/i18n/ko.ts33
-rw-r--r--packages/desktop/src/i18n/no.ts33
-rw-r--r--packages/desktop/src/i18n/pl.ts34
-rw-r--r--packages/desktop/src/i18n/ru.ts34
-rw-r--r--packages/desktop/src/i18n/zh.ts33
-rw-r--r--packages/desktop/src/i18n/zht.ts33
-rw-r--r--packages/desktop/src/index.tsx2
-rw-r--r--packages/desktop/src/loading.tsx15
-rw-r--r--packages/desktop/src/menu.ts36
-rw-r--r--packages/enterprise/src/app.tsx3
-rw-r--r--packages/ui/src/components/message-part.tsx20
-rw-r--r--packages/ui/src/components/scroll-view.tsx4
-rw-r--r--packages/ui/src/components/session-review.tsx30
-rw-r--r--packages/ui/src/i18n/ar.ts11
-rw-r--r--packages/ui/src/i18n/br.ts11
-rw-r--r--packages/ui/src/i18n/bs.ts11
-rw-r--r--packages/ui/src/i18n/da.ts11
-rw-r--r--packages/ui/src/i18n/de.ts11
-rw-r--r--packages/ui/src/i18n/en.ts13
-rw-r--r--packages/ui/src/i18n/es.ts11
-rw-r--r--packages/ui/src/i18n/fr.ts11
-rw-r--r--packages/ui/src/i18n/ja.ts11
-rw-r--r--packages/ui/src/i18n/ko.ts11
-rw-r--r--packages/ui/src/i18n/no.ts11
-rw-r--r--packages/ui/src/i18n/pl.ts11
-rw-r--r--packages/ui/src/i18n/ru.ts11
-rw-r--r--packages/ui/src/i18n/th.ts11
-rw-r--r--packages/ui/src/i18n/tr.ts11
-rw-r--r--packages/ui/src/i18n/zh.ts11
-rw-r--r--packages/ui/src/i18n/zht.ts11
65 files changed, 1096 insertions, 71 deletions
diff --git a/packages/app/src/components/dialog-release-notes.tsx b/packages/app/src/components/dialog-release-notes.tsx
index 2040009a8..d0a35b71b 100644
--- a/packages/app/src/components/dialog-release-notes.tsx
+++ b/packages/app/src/components/dialog-release-notes.tsx
@@ -2,6 +2,7 @@ import { createSignal } from "solid-js"
import { Dialog } from "@opencode-ai/ui/dialog"
import { Button } from "@opencode-ai/ui/button"
import { useDialog } from "@opencode-ai/ui/context/dialog"
+import { useLanguage } from "@/context/language"
import { useSettings } from "@/context/settings"
export type Highlight = {
@@ -16,6 +17,7 @@ export type Highlight = {
export function DialogReleaseNotes(props: { highlights: Highlight[] }) {
const dialog = useDialog()
+ const language = useLanguage()
const settings = useSettings()
const [index, setIndex] = createSignal(0)
@@ -83,16 +85,16 @@ export function DialogReleaseNotes(props: { highlights: Highlight[] }) {
<div class="flex flex-col items-start gap-3">
{isLast() ? (
<Button variant="primary" size="large" onClick={handleClose}>
- Get started
+ {language.t("dialog.releaseNotes.action.getStarted")}
</Button>
) : (
<Button variant="secondary" size="large" onClick={handleNext}>
- Next
+ {language.t("dialog.releaseNotes.action.next")}
</Button>
)}
<Button variant="ghost" size="small" onClick={handleDisable}>
- Don't show these in the future
+ {language.t("dialog.releaseNotes.action.hideFuture")}
</Button>
</div>
@@ -128,7 +130,7 @@ export function DialogReleaseNotes(props: { highlights: Highlight[] }) {
{feature()!.media!.type === "image" ? (
<img
src={feature()!.media!.src}
- alt={feature()!.media!.alt ?? feature()?.title ?? "Release preview"}
+ alt={feature()!.media!.alt ?? feature()?.title ?? language.t("dialog.releaseNotes.media.alt")}
class="w-full h-full object-cover"
/>
) : (
diff --git a/packages/app/src/components/dialog-select-file.tsx b/packages/app/src/components/dialog-select-file.tsx
index 29a3666c0..b530aff53 100644
--- a/packages/app/src/components/dialog-select-file.tsx
+++ b/packages/app/src/components/dialog-select-file.tsx
@@ -449,7 +449,7 @@ export function DialogSelectFile(props: { mode?: DialogSelectFileMode; onOpenFil
</div>
<Show when={item.updated}>
<span class="text-12-regular text-text-weak whitespace-nowrap ml-2">
- {getRelativeTime(new Date(item.updated!).toISOString())}
+ {getRelativeTime(new Date(item.updated!).toISOString(), language.t)}
</span>
</Show>
</div>
diff --git a/packages/app/src/components/session/session-header.tsx b/packages/app/src/components/session/session-header.tsx
index f3209c354..27b1b9cc0 100644
--- a/packages/app/src/components/session/session-header.tsx
+++ b/packages/app/src/components/session/session-header.tsx
@@ -430,7 +430,7 @@ export function SessionHeader() {
<Spinner class="size-3.5 text-icon-base" />
</Show>
</div>
- <span class="text-12-regular text-text-strong">Open</span>
+ <span class="text-12-regular text-text-strong">{language.t("common.open")}</span>
</Button>
<div class="self-stretch w-px bg-border-weak-base" />
<DropdownMenu
diff --git a/packages/app/src/components/settings-providers.tsx b/packages/app/src/components/settings-providers.tsx
index 55a25ca0c..6fac9feca 100644
--- a/packages/app/src/components/settings-providers.tsx
+++ b/packages/app/src/components/settings-providers.tsx
@@ -162,7 +162,7 @@ export const SettingsProviders: Component = () => {
when={canDisconnect(item)}
fallback={
<span class="text-14-regular text-text-base opacity-0 group-hover:opacity-100 transition-opacity duration-200 pr-3 cursor-default">
- Connected from your environment variables
+ {language.t("settings.providers.connected.environmentDescription")}
</span>
}
>
@@ -229,10 +229,12 @@ export const SettingsProviders: Component = () => {
<div class="flex flex-col min-w-0">
<div class="flex flex-wrap items-center gap-x-3 gap-y-1">
<ProviderIcon id={icon("synthetic")} class="size-5 shrink-0 icon-strong-base" />
- <span class="text-14-medium text-text-strong">Custom provider</span>
+ <span class="text-14-medium text-text-strong">{language.t("provider.custom.title")}</span>
<Tag>{language.t("settings.providers.tag.custom")}</Tag>
</div>
- <span class="text-12-regular text-text-weak pl-8">Add an OpenAI-compatible provider by base URL.</span>
+ <span class="text-12-regular text-text-weak pl-8">
+ {language.t("settings.providers.custom.description")}
+ </span>
</div>
<Button
size="large"
diff --git a/packages/app/src/context/global-sync.tsx b/packages/app/src/context/global-sync.tsx
index f87c3fb39..112bc9240 100644
--- a/packages/app/src/context/global-sync.tsx
+++ b/packages/app/src/context/global-sync.tsx
@@ -204,7 +204,10 @@ function createGlobalSync() {
showToast({
variant: "error",
title: language.t("toast.session.listFailed.title", { project }),
- description: formatServerError(err),
+ description: formatServerError(err, {
+ unknown: language.t("error.chain.unknown"),
+ invalidConfiguration: language.t("error.server.invalidConfiguration"),
+ }),
})
})
@@ -234,6 +237,8 @@ function createGlobalSync() {
setStore: child[1],
vcsCache: cache,
loadSessions,
+ unknownError: language.t("error.chain.unknown"),
+ invalidConfigurationError: language.t("error.server.invalidConfiguration"),
})
})()
@@ -308,6 +313,9 @@ function createGlobalSync() {
url: globalSDK.url,
}),
requestFailedTitle: language.t("common.requestFailed"),
+ unknownError: language.t("error.chain.unknown"),
+ invalidConfigurationError: language.t("error.server.invalidConfiguration"),
+ formatMoreCount: (count) => language.t("common.moreCountSuffix", { count }),
setGlobalStore,
})
}
diff --git a/packages/app/src/context/global-sync/bootstrap.ts b/packages/app/src/context/global-sync/bootstrap.ts
index b26106561..bc84eb169 100644
--- a/packages/app/src/context/global-sync/bootstrap.ts
+++ b/packages/app/src/context/global-sync/bootstrap.ts
@@ -36,6 +36,9 @@ export async function bootstrapGlobal(input: {
connectErrorTitle: string
connectErrorDescription: string
requestFailedTitle: string
+ unknownError: string
+ invalidConfigurationError: string
+ formatMoreCount: (count: number) => string
setGlobalStore: SetStoreFunction<GlobalStore>
}) {
const health = await input.globalSDK.global
@@ -88,8 +91,11 @@ export async function bootstrapGlobal(input: {
const results = await Promise.allSettled(tasks)
const errors = results.filter((r): r is PromiseRejectedResult => r.status === "rejected").map((r) => r.reason)
if (errors.length) {
- const message = errors[0] instanceof Error ? errors[0].message : String(errors[0])
- const more = errors.length > 1 ? ` (+${errors.length - 1} more)` : ""
+ const message = formatServerError(errors[0], {
+ unknown: input.unknownError,
+ invalidConfiguration: input.invalidConfigurationError,
+ })
+ const more = errors.length > 1 ? input.formatMoreCount(errors.length - 1) : ""
showToast({
variant: "error",
title: input.requestFailedTitle,
@@ -116,6 +122,8 @@ export async function bootstrapDirectory(input: {
setStore: SetStoreFunction<State>
vcsCache: VcsCache
loadSessions: (directory: string) => Promise<void> | void
+ unknownError: string
+ invalidConfigurationError: string
}) {
if (input.store.status !== "complete") input.setStore("status", "loading")
@@ -137,7 +145,10 @@ export async function bootstrapDirectory(input: {
showToast({
variant: "error",
title: `Failed to reload ${project}`,
- description: formatServerError(err),
+ description: formatServerError(err, {
+ unknown: input.unknownError,
+ invalidConfiguration: input.invalidConfigurationError,
+ }),
})
input.setStore("status", "partial")
return
diff --git a/packages/app/src/i18n/ar.ts b/packages/app/src/i18n/ar.ts
index 0046a8bc4..16f2fbf49 100644
--- a/packages/app/src/i18n/ar.ts
+++ b/packages/app/src/i18n/ar.ts
@@ -734,4 +734,18 @@ export const dict = {
"workspace.reset.archived.one": "ستتم أرشفة جلسة واحدة.",
"workspace.reset.archived.many": "ستتم أرشفة {{count}} جلسات.",
"workspace.reset.note": "سيؤدي هذا إلى إعادة تعيين مساحة العمل لتتطابق مع الفرع الافتراضي.",
+ "common.open": "فتح",
+ "dialog.releaseNotes.action.getStarted": "البدء",
+ "dialog.releaseNotes.action.next": "التالي",
+ "dialog.releaseNotes.action.hideFuture": "عدم إظهار هذا في المستقبل",
+ "dialog.releaseNotes.media.alt": "معاينة الإصدار",
+ "toast.project.reloadFailed.title": "فشل في إعادة تحميل {{project}}",
+ "error.server.invalidConfiguration": "تكوين غير صالح",
+ "common.moreCountSuffix": " (+{{count}} إضافي)",
+ "common.time.justNow": "الآن",
+ "common.time.minutesAgo.short": "قبل {{count}} د",
+ "common.time.hoursAgo.short": "قبل {{count}} س",
+ "common.time.daysAgo.short": "قبل {{count}} ي",
+ "settings.providers.connected.environmentDescription": "متصل من متغيرات البيئة الخاصة بك",
+ "settings.providers.custom.description": "أضف مزود متوافق مع OpenAI بواسطة عنوان URL الأساسي.",
}
diff --git a/packages/app/src/i18n/br.ts b/packages/app/src/i18n/br.ts
index 0d41ba7fc..26cf433e0 100644
--- a/packages/app/src/i18n/br.ts
+++ b/packages/app/src/i18n/br.ts
@@ -742,4 +742,18 @@ export const dict = {
"workspace.reset.archived.one": "1 sessão será arquivada.",
"workspace.reset.archived.many": "{{count}} sessões serão arquivadas.",
"workspace.reset.note": "Isso redefinirá o espaço de trabalho para corresponder ao branch padrão.",
+ "common.open": "Abrir",
+ "dialog.releaseNotes.action.getStarted": "Começar",
+ "dialog.releaseNotes.action.next": "Próximo",
+ "dialog.releaseNotes.action.hideFuture": "Não mostrar isso no futuro",
+ "dialog.releaseNotes.media.alt": "Prévia do lançamento",
+ "toast.project.reloadFailed.title": "Falha ao recarregar {{project}}",
+ "error.server.invalidConfiguration": "Configuração inválida",
+ "common.moreCountSuffix": " (+{{count}} mais)",
+ "common.time.justNow": "Agora mesmo",
+ "common.time.minutesAgo.short": "{{count}}m atrás",
+ "common.time.hoursAgo.short": "{{count}}h atrás",
+ "common.time.daysAgo.short": "{{count}}d atrás",
+ "settings.providers.connected.environmentDescription": "Conectado a partir de suas variáveis de ambiente",
+ "settings.providers.custom.description": "Adicionar um provedor compatível com a OpenAI através do URL base.",
}
diff --git a/packages/app/src/i18n/bs.ts b/packages/app/src/i18n/bs.ts
index a34d857b9..6c8198bd7 100644
--- a/packages/app/src/i18n/bs.ts
+++ b/packages/app/src/i18n/bs.ts
@@ -819,4 +819,18 @@ export const dict = {
"workspace.reset.archived.one": "1 sesija će biti arhivirana.",
"workspace.reset.archived.many": "Biće arhivirano {{count}} sesija.",
"workspace.reset.note": "Ovo će resetovati radni prostor da odgovara podrazumijevanoj grani.",
+ "common.open": "Otvori",
+ "dialog.releaseNotes.action.getStarted": "Započni",
+ "dialog.releaseNotes.action.next": "Sljedeće",
+ "dialog.releaseNotes.action.hideFuture": "Ne prikazuj ovo u budućnosti",
+ "dialog.releaseNotes.media.alt": "Pregled izdanja",
+ "toast.project.reloadFailed.title": "Nije uspjelo ponovno učitavanje {{project}}",
+ "error.server.invalidConfiguration": "Nevažeća konfiguracija",
+ "common.moreCountSuffix": " (+{{count}} više)",
+ "common.time.justNow": "Upravo sada",
+ "common.time.minutesAgo.short": "prije {{count}} min",
+ "common.time.hoursAgo.short": "prije {{count}} h",
+ "common.time.daysAgo.short": "prije {{count}} d",
+ "settings.providers.connected.environmentDescription": "Povezano sa vašim varijablama okruženja",
+ "settings.providers.custom.description": "Dodajte provajdera kompatibilnog s OpenAI putem osnovnog URL-a.",
}
diff --git a/packages/app/src/i18n/da.ts b/packages/app/src/i18n/da.ts
index 3df23bd43..11da68176 100644
--- a/packages/app/src/i18n/da.ts
+++ b/packages/app/src/i18n/da.ts
@@ -813,4 +813,18 @@ 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.",
+ "common.open": "Åbn",
+ "dialog.releaseNotes.action.getStarted": "Kom i gang",
+ "dialog.releaseNotes.action.next": "Næste",
+ "dialog.releaseNotes.action.hideFuture": "Vis ikke disse i fremtiden",
+ "dialog.releaseNotes.media.alt": "Forhåndsvisning af udgivelse",
+ "toast.project.reloadFailed.title": "Kunne ikke genindlæse {{project}}",
+ "error.server.invalidConfiguration": "Ugyldig konfiguration",
+ "common.moreCountSuffix": " (+{{count}} mere)",
+ "common.time.justNow": "Lige nu",
+ "common.time.minutesAgo.short": "{{count}}m siden",
+ "common.time.hoursAgo.short": "{{count}}t siden",
+ "common.time.daysAgo.short": "{{count}}d siden",
+ "settings.providers.connected.environmentDescription": "Tilsluttet fra dine miljøvariabler",
+ "settings.providers.custom.description": "Tilføj en OpenAI-kompatibel udbyder via basis-URL.",
}
diff --git a/packages/app/src/i18n/de.ts b/packages/app/src/i18n/de.ts
index ce48a1953..51b9ec353 100644
--- a/packages/app/src/i18n/de.ts
+++ b/packages/app/src/i18n/de.ts
@@ -751,4 +751,18 @@ 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.",
+ "common.open": "Öffnen",
+ "dialog.releaseNotes.action.getStarted": "Loslegen",
+ "dialog.releaseNotes.action.next": "Weiter",
+ "dialog.releaseNotes.action.hideFuture": "In Zukunft nicht mehr anzeigen",
+ "dialog.releaseNotes.media.alt": "Vorschau auf die Version",
+ "toast.project.reloadFailed.title": "Fehler beim Neuladen von {{project}}",
+ "error.server.invalidConfiguration": "Ungültige Konfiguration",
+ "common.moreCountSuffix": " (+{{count}} weitere)",
+ "common.time.justNow": "Gerade eben",
+ "common.time.minutesAgo.short": "vor {{count}} Min",
+ "common.time.hoursAgo.short": "vor {{count}} Std",
+ "common.time.daysAgo.short": "vor {{count}} Tg",
+ "settings.providers.connected.environmentDescription": "Verbunden aus Ihren Umgebungsvariablen",
+ "settings.providers.custom.description": "Fügen Sie einen OpenAI-kompatiblen Anbieter per Basis-URL hinzu.",
} satisfies Partial<Record<Keys, string>>
diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts
index 4b97bfb89..7e95fd739 100644
--- a/packages/app/src/i18n/en.ts
+++ b/packages/app/src/i18n/en.ts
@@ -218,6 +218,7 @@ export const dict = {
"common.loading": "Loading",
"common.loading.ellipsis": "...",
"common.cancel": "Cancel",
+ "common.open": "Open",
"common.connect": "Connect",
"common.disconnect": "Disconnect",
"common.submit": "Submit",
@@ -347,6 +348,11 @@ export const dict = {
"dialog.project.edit.worktree.startup.description": "Runs after creating a new workspace (worktree).",
"dialog.project.edit.worktree.startup.placeholder": "e.g. bun install",
+ "dialog.releaseNotes.action.getStarted": "Get started",
+ "dialog.releaseNotes.action.next": "Next",
+ "dialog.releaseNotes.action.hideFuture": "Don't show these in the future",
+ "dialog.releaseNotes.media.alt": "Release preview",
+
"context.breakdown.title": "Context Breakdown",
"context.breakdown.note": 'Approximate breakdown of input tokens. "Other" includes tool definitions and overhead.',
"context.breakdown.system": "System",
@@ -436,6 +442,7 @@ export const dict = {
"toast.session.unshare.failed.description": "An error occurred while unsharing the session",
"toast.session.listFailed.title": "Failed to load sessions for {{project}}",
+ "toast.project.reloadFailed.title": "Failed to reload {{project}}",
"toast.update.title": "Update available",
"toast.update.description": "A new version of OpenCode ({{version}}) is now available to install.",
@@ -460,6 +467,7 @@ export const dict = {
"directory.error.invalidUrl": "Invalid directory in URL.",
"error.chain.unknown": "Unknown error",
+ "error.server.invalidConfiguration": "Invalid configuration",
"error.chain.causedBy": "Caused by:",
"error.chain.apiError": "API error",
"error.chain.status": "Status: {{status}}",
@@ -570,6 +578,7 @@ export const dict = {
"common.closeTab": "Close tab",
"common.dismiss": "Dismiss",
+ "common.moreCountSuffix": " (+{{count}} more)",
"common.requestFailed": "Request failed",
"common.moreOptions": "More options",
"common.learnMore": "Learn more",
@@ -582,6 +591,11 @@ export const dict = {
"common.loadMore": "Load more",
"common.key.esc": "ESC",
+ "common.time.justNow": "Just now",
+ "common.time.minutesAgo.short": "{{count}}m ago",
+ "common.time.hoursAgo.short": "{{count}}h ago",
+ "common.time.daysAgo.short": "{{count}}d ago",
+
"sidebar.menu.toggle": "Toggle menu",
"sidebar.nav.projectsAndSessions": "Projects and sessions",
"sidebar.settings": "Settings",
@@ -742,7 +756,9 @@ export const dict = {
"settings.providers.description": "Provider settings will be configurable here.",
"settings.providers.section.connected": "Connected providers",
"settings.providers.connected.empty": "No connected providers",
+ "settings.providers.connected.environmentDescription": "Connected from your environment variables",
"settings.providers.section.popular": "Popular providers",
+ "settings.providers.custom.description": "Add an OpenAI-compatible provider by base URL.",
"settings.providers.tag.environment": "Environment",
"settings.providers.tag.config": "Config",
"settings.providers.tag.custom": "Custom",
diff --git a/packages/app/src/i18n/es.ts b/packages/app/src/i18n/es.ts
index de490cbe9..2665a8085 100644
--- a/packages/app/src/i18n/es.ts
+++ b/packages/app/src/i18n/es.ts
@@ -825,4 +825,18 @@ 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.",
+ "common.open": "Abrir",
+ "dialog.releaseNotes.action.getStarted": "Comenzar",
+ "dialog.releaseNotes.action.next": "Siguiente",
+ "dialog.releaseNotes.action.hideFuture": "No mostrar esto en el futuro",
+ "dialog.releaseNotes.media.alt": "Vista previa de la versión",
+ "toast.project.reloadFailed.title": "Error al recargar {{project}}",
+ "error.server.invalidConfiguration": "Configuración inválida",
+ "common.moreCountSuffix": " (+{{count}} más)",
+ "common.time.justNow": "Justo ahora",
+ "common.time.minutesAgo.short": "hace {{count}} min",
+ "common.time.hoursAgo.short": "hace {{count}} h",
+ "common.time.daysAgo.short": "hace {{count}} d",
+ "settings.providers.connected.environmentDescription": "Conectado desde tus variables de entorno",
+ "settings.providers.custom.description": "Añade un proveedor compatible con OpenAI por su URL base.",
}
diff --git a/packages/app/src/i18n/fr.ts b/packages/app/src/i18n/fr.ts
index 5e197b4fb..1e67db193 100644
--- a/packages/app/src/i18n/fr.ts
+++ b/packages/app/src/i18n/fr.ts
@@ -749,4 +749,18 @@ 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.",
+ "common.open": "Ouvrir",
+ "dialog.releaseNotes.action.getStarted": "Commencer",
+ "dialog.releaseNotes.action.next": "Suivant",
+ "dialog.releaseNotes.action.hideFuture": "Ne plus afficher à l'avenir",
+ "dialog.releaseNotes.media.alt": "Aperçu de la version",
+ "toast.project.reloadFailed.title": "Échec du rechargement de {{project}}",
+ "error.server.invalidConfiguration": "Configuration invalide",
+ "common.moreCountSuffix": " (+{{count}} de plus)",
+ "common.time.justNow": "À l'instant",
+ "common.time.minutesAgo.short": "il y a {{count}}m",
+ "common.time.hoursAgo.short": "il y a {{count}}h",
+ "common.time.daysAgo.short": "il y a {{count}}j",
+ "settings.providers.connected.environmentDescription": "Connecté à partir de vos variables d'environnement",
+ "settings.providers.custom.description": "Ajouter un fournisseur compatible avec OpenAI via l'URL de base.",
}
diff --git a/packages/app/src/i18n/ja.ts b/packages/app/src/i18n/ja.ts
index 30f27c197..ecd38d332 100644
--- a/packages/app/src/i18n/ja.ts
+++ b/packages/app/src/i18n/ja.ts
@@ -738,4 +738,18 @@ export const dict = {
"workspace.reset.archived.one": "1つのセッションがアーカイブされます。",
"workspace.reset.archived.many": "{{count}}個のセッションがアーカイブされます。",
"workspace.reset.note": "これにより、ワークスペースはデフォルトブランチと一致するようにリセットされます。",
+ "common.open": "開く",
+ "dialog.releaseNotes.action.getStarted": "始める",
+ "dialog.releaseNotes.action.next": "次へ",
+ "dialog.releaseNotes.action.hideFuture": "今後表示しない",
+ "dialog.releaseNotes.media.alt": "リリースのプレビュー",
+ "toast.project.reloadFailed.title": "{{project}} の再読み込みに失敗しました",
+ "error.server.invalidConfiguration": "無効な設定",
+ "common.moreCountSuffix": " (他 {{count}} 件)",
+ "common.time.justNow": "たった今",
+ "common.time.minutesAgo.short": "{{count}} 分前",
+ "common.time.hoursAgo.short": "{{count}} 時間前",
+ "common.time.daysAgo.short": "{{count}} 日前",
+ "settings.providers.connected.environmentDescription": "環境変数から接続されました",
+ "settings.providers.custom.description": "ベース URL を指定して OpenAI 互換のプロバイダーを追加します。",
}
diff --git a/packages/app/src/i18n/ko.ts b/packages/app/src/i18n/ko.ts
index da6cde9ea..8f54b8abd 100644
--- a/packages/app/src/i18n/ko.ts
+++ b/packages/app/src/i18n/ko.ts
@@ -738,4 +738,18 @@ export const dict = {
"workspace.reset.archived.one": "1개의 세션이 보관됩니다.",
"workspace.reset.archived.many": "{{count}}개의 세션이 보관됩니다.",
"workspace.reset.note": "이 작업은 작업 공간을 기본 브랜치와 일치하도록 재설정합니다.",
+ "common.open": "열기",
+ "dialog.releaseNotes.action.getStarted": "시작하기",
+ "dialog.releaseNotes.action.next": "다음",
+ "dialog.releaseNotes.action.hideFuture": "다시 보지 않기",
+ "dialog.releaseNotes.media.alt": "릴리스 미리보기",
+ "toast.project.reloadFailed.title": "{{project}} 다시 불러오기 실패",
+ "error.server.invalidConfiguration": "잘못된 구성",
+ "common.moreCountSuffix": " (외 {{count}}개)",
+ "common.time.justNow": "방금 전",
+ "common.time.minutesAgo.short": "{{count}}분 전",
+ "common.time.hoursAgo.short": "{{count}}시간 전",
+ "common.time.daysAgo.short": "{{count}}일 전",
+ "settings.providers.connected.environmentDescription": "환경 변수에서 연결됨",
+ "settings.providers.custom.description": "기본 URL로 OpenAI 호환 공급자를 추가합니다.",
}
diff --git a/packages/app/src/i18n/no.ts b/packages/app/src/i18n/no.ts
index bc04695d3..0c94046eb 100644
--- a/packages/app/src/i18n/no.ts
+++ b/packages/app/src/i18n/no.ts
@@ -821,4 +821,18 @@ export const dict = {
"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.",
+ "common.open": "Åpne",
+ "dialog.releaseNotes.action.getStarted": "Kom i gang",
+ "dialog.releaseNotes.action.next": "Neste",
+ "dialog.releaseNotes.action.hideFuture": "Ikke vis disse igjen",
+ "dialog.releaseNotes.media.alt": "Forhåndsvisning av utgivelse",
+ "toast.project.reloadFailed.title": "Kunne ikke laste inn {{project}} på nytt",
+ "error.server.invalidConfiguration": "Ugyldig konfigurasjon",
+ "common.moreCountSuffix": " (+{{count}} mer)",
+ "common.time.justNow": "Akkurat nå",
+ "common.time.minutesAgo.short": "{{count}} m siden",
+ "common.time.hoursAgo.short": "{{count}} t siden",
+ "common.time.daysAgo.short": "{{count}} d siden",
+ "settings.providers.connected.environmentDescription": "Koblet til fra miljøvariablene dine",
+ "settings.providers.custom.description": "Legg til en OpenAI-kompatibel leverandør via basis-URL.",
} satisfies Partial<Record<Keys, string>>
diff --git a/packages/app/src/i18n/pl.ts b/packages/app/src/i18n/pl.ts
index 0be46f095..59c0513be 100644
--- a/packages/app/src/i18n/pl.ts
+++ b/packages/app/src/i18n/pl.ts
@@ -740,4 +740,18 @@ 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.",
+ "common.open": "Otwórz",
+ "dialog.releaseNotes.action.getStarted": "Rozpocznij",
+ "dialog.releaseNotes.action.next": "Dalej",
+ "dialog.releaseNotes.action.hideFuture": "Nie pokazuj tego w przyszłości",
+ "dialog.releaseNotes.media.alt": "Podgląd wydania",
+ "toast.project.reloadFailed.title": "Nie udało się ponownie wczytać {{project}}",
+ "error.server.invalidConfiguration": "Nieprawidłowa konfiguracja",
+ "common.moreCountSuffix": " (jeszcze {{count}})",
+ "common.time.justNow": "Przed chwilą",
+ "common.time.minutesAgo.short": "{{count}} min temu",
+ "common.time.hoursAgo.short": "{{count}} godz. temu",
+ "common.time.daysAgo.short": "{{count}} dni temu",
+ "settings.providers.connected.environmentDescription": "Połączono ze zmiennymi środowiskowymi",
+ "settings.providers.custom.description": "Dodaj dostawcę zgodnego z OpenAI poprzez podstawowy URL.",
}
diff --git a/packages/app/src/i18n/ru.ts b/packages/app/src/i18n/ru.ts
index cbb916a59..2071eaae7 100644
--- a/packages/app/src/i18n/ru.ts
+++ b/packages/app/src/i18n/ru.ts
@@ -821,4 +821,18 @@ export const dict = {
"workspace.reset.archived.one": "1 сессия будет архивирована.",
"workspace.reset.archived.many": "{{count}} сессий будет архивировано.",
"workspace.reset.note": "Рабочее пространство будет сброшено в соответствие с веткой по умолчанию.",
+ "common.open": "Открыть",
+ "dialog.releaseNotes.action.getStarted": "Начать",
+ "dialog.releaseNotes.action.next": "Далее",
+ "dialog.releaseNotes.action.hideFuture": "Больше не показывать",
+ "dialog.releaseNotes.media.alt": "Превью релиза",
+ "toast.project.reloadFailed.title": "Не удалось перезагрузить {{project}}",
+ "error.server.invalidConfiguration": "Недопустимая конфигурация",
+ "common.moreCountSuffix": " (ещё {{count}})",
+ "common.time.justNow": "Только что",
+ "common.time.minutesAgo.short": "{{count}} мин назад",
+ "common.time.hoursAgo.short": "{{count}} ч назад",
+ "common.time.daysAgo.short": "{{count}} д назад",
+ "settings.providers.connected.environmentDescription": "Подключено из ваших переменных окружения",
+ "settings.providers.custom.description": "Добавить провайдера, совместимого с OpenAI, по базовому URL.",
}
diff --git a/packages/app/src/i18n/th.ts b/packages/app/src/i18n/th.ts
index c6a33dc67..987155553 100644
--- a/packages/app/src/i18n/th.ts
+++ b/packages/app/src/i18n/th.ts
@@ -811,4 +811,18 @@ export const dict = {
"workspace.reset.archived.one": "1 เซสชันจะถูกจัดเก็บ",
"workspace.reset.archived.many": "{{count}} เซสชันจะถูกจัดเก็บ",
"workspace.reset.note": "สิ่งนี้จะรีเซ็ตพื้นที่ทำงานให้ตรงกับสาขาเริ่มต้น",
+ "common.open": "เปิด",
+ "dialog.releaseNotes.action.getStarted": "เริ่มต้น",
+ "dialog.releaseNotes.action.next": "ถัดไป",
+ "dialog.releaseNotes.action.hideFuture": "ไม่ต้องแสดงสิ่งนี้อีกในอนาคต",
+ "dialog.releaseNotes.media.alt": "ตัวอย่างรุ่น",
+ "toast.project.reloadFailed.title": "ไม่สามารถโหลด {{project}} ใหม่ได้",
+ "error.server.invalidConfiguration": "การกำหนดค่าไม่ถูกต้อง",
+ "common.moreCountSuffix": " (เพิ่มอีก {{count}})",
+ "common.time.justNow": "เมื่อสักครู่นี้",
+ "common.time.minutesAgo.short": "{{count}} นาทีที่แล้ว",
+ "common.time.hoursAgo.short": "{{count}} ชม. ที่แล้ว",
+ "common.time.daysAgo.short": "{{count}} วันที่แล้ว",
+ "settings.providers.connected.environmentDescription": "เชื่อมต่อจากตัวแปรสภาพแวดล้อมของคุณ",
+ "settings.providers.custom.description": "เพิ่มผู้ให้บริการที่รองรับ OpenAI ด้วย URL หลัก",
}
diff --git a/packages/app/src/i18n/tr.ts b/packages/app/src/i18n/tr.ts
index 4a38e61ec..701ee0919 100644
--- a/packages/app/src/i18n/tr.ts
+++ b/packages/app/src/i18n/tr.ts
@@ -832,4 +832,18 @@ export const dict = {
"workspace.reset.archived.one": "1 oturum arşivlenecek.",
"workspace.reset.archived.many": "{{count}} oturum arşivlenecek.",
"workspace.reset.note": "Bu işlem çalışma alanını varsayılan dalla eşleşecek şekilde sıfırlayacak.",
+ "common.open": "Aç",
+ "dialog.releaseNotes.action.getStarted": "Başla",
+ "dialog.releaseNotes.action.next": "İleri",
+ "dialog.releaseNotes.action.hideFuture": "Bunu gelecekte bir daha gösterme",
+ "dialog.releaseNotes.media.alt": "Sürüm önizlemesi",
+ "toast.project.reloadFailed.title": "{{project}} yeniden yüklenemedi",
+ "error.server.invalidConfiguration": "Geçersiz yapılandırma",
+ "common.moreCountSuffix": " (+{{count}} daha)",
+ "common.time.justNow": "Şimdi",
+ "common.time.minutesAgo.short": "{{count}}dk önce",
+ "common.time.hoursAgo.short": "{{count}}sa önce",
+ "common.time.daysAgo.short": "{{count}}g önce",
+ "settings.providers.connected.environmentDescription": "Ortam değişkenlerinizden bağlandı",
+ "settings.providers.custom.description": "Temel URL üzerinden OpenAI uyumlu bir sağlayıcı ekleyin.",
} satisfies Partial<Record<Keys, string>>
diff --git a/packages/app/src/i18n/zh.ts b/packages/app/src/i18n/zh.ts
index 0b5739083..e72d4c0e3 100644
--- a/packages/app/src/i18n/zh.ts
+++ b/packages/app/src/i18n/zh.ts
@@ -809,4 +809,18 @@ export const dict = {
"workspace.reset.archived.one": "将归档 1 个会话。",
"workspace.reset.archived.many": "将归档 {{count}} 个会话。",
"workspace.reset.note": "这将把工作区重置为与默认分支一致。",
+ "common.open": "打开",
+ "dialog.releaseNotes.action.getStarted": "开始",
+ "dialog.releaseNotes.action.next": "下一步",
+ "dialog.releaseNotes.action.hideFuture": "不再显示",
+ "dialog.releaseNotes.media.alt": "发布预览",
+ "toast.project.reloadFailed.title": "无法重新加载 {{project}}",
+ "error.server.invalidConfiguration": "配置无效",
+ "common.moreCountSuffix": " (还有 {{count}} 个)",
+ "common.time.justNow": "刚刚",
+ "common.time.minutesAgo.short": "{{count}}分钟前",
+ "common.time.hoursAgo.short": "{{count}}小时前",
+ "common.time.daysAgo.short": "{{count}}天前",
+ "settings.providers.connected.environmentDescription": "已通过环境变量连接",
+ "settings.providers.custom.description": "通过基础 URL 添加与 OpenAI 兼容的提供商。",
} satisfies Partial<Record<Keys, string>>
diff --git a/packages/app/src/i18n/zht.ts b/packages/app/src/i18n/zht.ts
index 4e4509e20..70421dfe1 100644
--- a/packages/app/src/i18n/zht.ts
+++ b/packages/app/src/i18n/zht.ts
@@ -804,4 +804,18 @@ export const dict = {
"workspace.reset.archived.one": "將封存 1 個工作階段。",
"workspace.reset.archived.many": "將封存 {{count}} 個工作階段。",
"workspace.reset.note": "這將把工作區重設為與預設分支一致。",
+ "common.open": "打開",
+ "dialog.releaseNotes.action.getStarted": "開始",
+ "dialog.releaseNotes.action.next": "下一步",
+ "dialog.releaseNotes.action.hideFuture": "不再顯示",
+ "dialog.releaseNotes.media.alt": "發佈預覽",
+ "toast.project.reloadFailed.title": "無法重新載入 {{project}}",
+ "error.server.invalidConfiguration": "無效的設定",
+ "common.moreCountSuffix": " (還有 {{count}} 個)",
+ "common.time.justNow": "剛剛",
+ "common.time.minutesAgo.short": "{{count}}分鐘前",
+ "common.time.hoursAgo.short": "{{count}}小時前",
+ "common.time.daysAgo.short": "{{count}}天前",
+ "settings.providers.connected.environmentDescription": "已從環境變數連線",
+ "settings.providers.custom.description": "透過基本 URL 新增與 OpenAI 相容的提供者。",
} satisfies Partial<Record<Keys, string>>
diff --git a/packages/app/src/utils/server-errors.ts b/packages/app/src/utils/server-errors.ts
index 4b9727e61..85ebca132 100644
--- a/packages/app/src/utils/server-errors.ts
+++ b/packages/app/src/utils/server-errors.ts
@@ -7,11 +7,28 @@ export type ConfigInvalidError = {
}
}
-export function formatServerError(error: unknown) {
- if (isConfigInvalidErrorLike(error)) return parseReabaleConfigInvalidError(error)
+type Label = {
+ unknown: string
+ invalidConfiguration: string
+}
+
+const fallback: Label = {
+ unknown: "Unknown error",
+ invalidConfiguration: "Invalid configuration",
+}
+
+function resolveLabel(labels: Partial<Label> | undefined): Label {
+ return {
+ unknown: labels?.unknown ?? fallback.unknown,
+ invalidConfiguration: labels?.invalidConfiguration ?? fallback.invalidConfiguration,
+ }
+}
+
+export function formatServerError(error: unknown, labels?: Partial<Label>) {
+ if (isConfigInvalidErrorLike(error)) return parseReabaleConfigInvalidError(error, labels)
if (error instanceof Error && error.message) return error.message
if (typeof error === "string" && error) return error
- return "Unknown error"
+ return resolveLabel(labels).unknown
}
function isConfigInvalidErrorLike(error: unknown): error is ConfigInvalidError {
@@ -20,8 +37,8 @@ function isConfigInvalidErrorLike(error: unknown): error is ConfigInvalidError {
return o.name === "ConfigInvalidError" && typeof o.data === "object" && o.data !== null
}
-export function parseReabaleConfigInvalidError(errorInput: ConfigInvalidError) {
- const head = "Invalid configuration"
+export function parseReabaleConfigInvalidError(errorInput: ConfigInvalidError, labels?: Partial<Label>) {
+ const head = resolveLabel(labels).invalidConfiguration
const file = errorInput.data.path && errorInput.data.path !== "config" ? errorInput.data.path : ""
const detail = errorInput.data.message?.trim() ?? ""
const issues = (errorInput.data.issues ?? []).map((issue) => {
diff --git a/packages/app/src/utils/time.ts b/packages/app/src/utils/time.ts
index ac709d86d..d183e1080 100644
--- a/packages/app/src/utils/time.ts
+++ b/packages/app/src/utils/time.ts
@@ -1,4 +1,12 @@
-export function getRelativeTime(dateString: string): string {
+type TimeKey =
+ | "common.time.justNow"
+ | "common.time.minutesAgo.short"
+ | "common.time.hoursAgo.short"
+ | "common.time.daysAgo.short"
+
+type Translate = (key: TimeKey, params?: Record<string, string | number>) => string
+
+export function getRelativeTime(dateString: string, t: Translate): string {
const date = new Date(dateString)
const now = new Date()
const diffMs = now.getTime() - date.getTime()
@@ -7,8 +15,8 @@ export function getRelativeTime(dateString: string): string {
const diffHours = Math.floor(diffMinutes / 60)
const diffDays = Math.floor(diffHours / 24)
- if (diffSeconds < 60) return "Just now"
- if (diffMinutes < 60) return `${diffMinutes}m ago`
- if (diffHours < 24) return `${diffHours}h ago`
- return `${diffDays}d ago`
+ if (diffSeconds < 60) return t("common.time.justNow")
+ if (diffMinutes < 60) return t("common.time.minutesAgo.short", { count: diffMinutes })
+ if (diffHours < 24) return t("common.time.hoursAgo.short", { count: diffHours })
+ return t("common.time.daysAgo.short", { count: diffDays })
}
diff --git a/packages/desktop/src/cli.ts b/packages/desktop/src/cli.ts
index 28623bdf7..49e47534f 100644
--- a/packages/desktop/src/cli.ts
+++ b/packages/desktop/src/cli.ts
@@ -3,6 +3,32 @@ import { message } from "@tauri-apps/plugin-dialog"
import { initI18n, t } from "./i18n"
import { commands } from "./bindings"
+function installError(error: unknown) {
+ const text = String(error)
+ if (text.includes("CLI installation is only supported on macOS & Linux")) {
+ return t("desktop.cli.error.unsupportedPlatform")
+ }
+ if (text.includes("Sidecar binary not found")) {
+ return t("desktop.cli.error.sidecarMissing")
+ }
+ if (text.includes("Failed to write install script")) {
+ return t("desktop.cli.error.scriptWriteFailed")
+ }
+ if (text.includes("Failed to set script permissions")) {
+ return t("desktop.cli.error.scriptPermissionFailed")
+ }
+ if (text.includes("Failed to run install script")) {
+ return t("desktop.cli.error.scriptRunFailed")
+ }
+ if (text.includes("Install script failed")) {
+ return t("desktop.cli.error.scriptFailed")
+ }
+ if (text.includes("Could not determine install path")) {
+ return t("desktop.cli.error.installPathUnknown")
+ }
+ return text || t("desktop.cli.error.unknown")
+}
+
export async function installCli(): Promise<void> {
await initI18n()
@@ -10,6 +36,8 @@ export async function installCli(): Promise<void> {
const path = await commands.installCli()
await message(t("desktop.cli.installed.message", { path }), { title: t("desktop.cli.installed.title") })
} catch (e) {
- await message(t("desktop.cli.failed.message", { error: String(e) }), { title: t("desktop.cli.failed.title") })
+ await message(t("desktop.cli.failed.message", { error: installError(e) }), {
+ title: t("desktop.cli.failed.title"),
+ })
}
}
diff --git a/packages/desktop/src/i18n/ar.ts b/packages/desktop/src/i18n/ar.ts
index fdbf0a804..21ab1c39b 100644
--- a/packages/desktop/src/i18n/ar.ts
+++ b/packages/desktop/src/i18n/ar.ts
@@ -23,4 +23,37 @@ export const dict = {
"desktop.cli.installed.message": "تم تثبيت CLI في {{path}}\n\nأعد تشغيل الطرفية لاستخدام الأمر 'opencode'.",
"desktop.cli.failed.title": "فشل التثبيت",
"desktop.cli.failed.message": "فشل تثبيت CLI: {{error}}",
+
+ "desktop.menu.app": "OpenCode",
+ "desktop.menu.file": "ملف",
+ "desktop.menu.edit": "تعديل",
+ "desktop.menu.view": "عرض",
+ "desktop.menu.help": "مساعدة",
+ "desktop.menu.file.newSession": "جلسة جديدة",
+ "desktop.menu.file.openProject": "فتح مشروع...",
+ "desktop.menu.view.toggleSidebar": "تبديل الشريط الجانبي",
+ "desktop.menu.view.toggleTerminal": "تبديل الطرفية",
+ "desktop.menu.view.toggleFileTree": "تبديل شجرة الملفات",
+ "desktop.menu.view.back": "رجوع",
+ "desktop.menu.view.forward": "تقدم",
+ "desktop.menu.view.previousSession": "الجلسة السابقة",
+ "desktop.menu.view.nextSession": "الجلسة التالية",
+ "desktop.menu.help.documentation": "وثائق OpenCode",
+ "desktop.menu.help.supportForum": "منتدى الدعم",
+ "desktop.menu.help.shareFeedback": "مشاركة التعليقات",
+ "desktop.menu.help.reportBug": "الإبلاغ عن خطأ",
+ "desktop.cli.error.unsupportedPlatform": "تثبيت CLI مدعوم فقط على macOS و Linux.",
+ "desktop.cli.error.sidecarMissing": "ملف OpenCode CLI الثنائي مفقود. حاول إعادة تثبيت تطبيق سطح المكتب.",
+ "desktop.cli.error.scriptWriteFailed": "فشل تحضير برنامج تثبيت CLI.",
+ "desktop.cli.error.scriptPermissionFailed": "فشل جعل برنامج تثبيت CLI قابلاً للتنفيذ.",
+ "desktop.cli.error.scriptRunFailed": "فشل تشغيل برنامج تثبيت CLI.",
+ "desktop.cli.error.scriptFailed": "فشل برنامج تثبيت CLI.",
+ "desktop.cli.error.installPathUnknown": "تعذر تحديد مكان تثبيت CLI.",
+ "desktop.cli.error.unknown": "خطأ تثبيت غير معروف",
+ "desktop.loading.status.initial": "لحظة من فضلك...",
+ "desktop.loading.status.done": "تم الانتهاء",
+ "desktop.loading.status.migrating": "جارٍ ترحيل قاعدة البيانات الخاصة بك",
+ "desktop.loading.status.waiting": "قد يستغرق هذا بضع دقائق",
+ "desktop.loading.progressAria": "تقدم ترحيل قاعدة البيانات",
+ "desktop.server.local": "خادم محلي",
}
diff --git a/packages/desktop/src/i18n/br.ts b/packages/desktop/src/i18n/br.ts
index 75fe2dc32..82c84c2c9 100644
--- a/packages/desktop/src/i18n/br.ts
+++ b/packages/desktop/src/i18n/br.ts
@@ -24,4 +24,38 @@ export const dict = {
"desktop.cli.installed.message": "CLI instalada em {{path}}\n\nReinicie seu terminal para usar o comando 'opencode'.",
"desktop.cli.failed.title": "Falha na instalação",
"desktop.cli.failed.message": "Falha ao instalar a CLI: {{error}}",
+
+ "desktop.menu.app": "OpenCode",
+ "desktop.menu.file": "Arquivo",
+ "desktop.menu.edit": "Editar",
+ "desktop.menu.view": "Visualizar",
+ "desktop.menu.help": "Ajuda",
+ "desktop.menu.file.newSession": "Nova Sessão",
+ "desktop.menu.file.openProject": "Abrir Projeto...",
+ "desktop.menu.view.toggleSidebar": "Alternar Barra Lateral",
+ "desktop.menu.view.toggleTerminal": "Alternar Terminal",
+ "desktop.menu.view.toggleFileTree": "Alternar Árvore de Arquivos",
+ "desktop.menu.view.back": "Voltar",
+ "desktop.menu.view.forward": "Avançar",
+ "desktop.menu.view.previousSession": "Sessão Anterior",
+ "desktop.menu.view.nextSession": "Próxima Sessão",
+ "desktop.menu.help.documentation": "Documentação do OpenCode",
+ "desktop.menu.help.supportForum": "Fórum de Suporte",
+ "desktop.menu.help.shareFeedback": "Compartilhar Feedback",
+ "desktop.menu.help.reportBug": "Relatar um Bug",
+ "desktop.cli.error.unsupportedPlatform": "A instalação da CLI é suportada apenas no macOS e Linux.",
+ "desktop.cli.error.sidecarMissing":
+ "O binário da CLI do OpenCode está ausente. Tente reinstalar o aplicativo de desktop.",
+ "desktop.cli.error.scriptWriteFailed": "Falha ao preparar o script de instalação da CLI.",
+ "desktop.cli.error.scriptPermissionFailed": "Falha ao tornar o script de instalação da CLI executável.",
+ "desktop.cli.error.scriptRunFailed": "Falha ao executar o script de instalação da CLI.",
+ "desktop.cli.error.scriptFailed": "O instalador da CLI falhou.",
+ "desktop.cli.error.installPathUnknown": "Não foi possível determinar onde a CLI foi instalada.",
+ "desktop.cli.error.unknown": "Erro de instalação desconhecido",
+ "desktop.loading.status.initial": "Só um momento...",
+ "desktop.loading.status.done": "Tudo pronto",
+ "desktop.loading.status.migrating": "Migrando seu banco de dados",
+ "desktop.loading.status.waiting": "Isso pode levar alguns minutos",
+ "desktop.loading.progressAria": "Progresso da migração do banco de dados",
+ "desktop.server.local": "Servidor Local",
}
diff --git a/packages/desktop/src/i18n/bs.ts b/packages/desktop/src/i18n/bs.ts
index 58c266f53..bf16065d1 100644
--- a/packages/desktop/src/i18n/bs.ts
+++ b/packages/desktop/src/i18n/bs.ts
@@ -25,4 +25,38 @@ export const dict = {
"CLI je instaliran u {{path}}\n\nRestartuj terminal da bi koristio komandu 'opencode'.",
"desktop.cli.failed.title": "Instalacija nije uspjela",
"desktop.cli.failed.message": "Neuspjela instalacija CLI-a: {{error}}",
+
+ "desktop.menu.app": "OpenCode",
+ "desktop.menu.file": "Datoteka",
+ "desktop.menu.edit": "Uredi",
+ "desktop.menu.view": "Prikaz",
+ "desktop.menu.help": "Pomoć",
+ "desktop.menu.file.newSession": "Nova sesija",
+ "desktop.menu.file.openProject": "Otvori projekat...",
+ "desktop.menu.view.toggleSidebar": "Prebaci bočnu traku",
+ "desktop.menu.view.toggleTerminal": "Prebaci terminal",
+ "desktop.menu.view.toggleFileTree": "Prebaci stablo datoteka",
+ "desktop.menu.view.back": "Nazad",
+ "desktop.menu.view.forward": "Naprijed",
+ "desktop.menu.view.previousSession": "Prethodna sesija",
+ "desktop.menu.view.nextSession": "Sljedeća sesija",
+ "desktop.menu.help.documentation": "OpenCode Dokumentacija",
+ "desktop.menu.help.supportForum": "Forum za podršku",
+ "desktop.menu.help.shareFeedback": "Podijeli povratne informacije",
+ "desktop.menu.help.reportBug": "Prijavi grešku",
+ "desktop.cli.error.unsupportedPlatform": "Instalacija CLI-a je podržana samo na macOS-u i Linux-u.",
+ "desktop.cli.error.sidecarMissing":
+ "Nedostaje binarna datoteka OpenCode CLI-a. Pokušaj ponovo instalirati desktop aplikaciju.",
+ "desktop.cli.error.scriptWriteFailed": "Nije uspjela priprema skripte za instalaciju CLI-a.",
+ "desktop.cli.error.scriptPermissionFailed": "Nije uspjelo postavljanje izvršnih dozvola za instalaciju CLI-a.",
+ "desktop.cli.error.scriptRunFailed": "Nije uspjelo pokretanje skripte za instalaciju CLI-a.",
+ "desktop.cli.error.scriptFailed": "Instalacija CLI-a nije uspjela.",
+ "desktop.cli.error.installPathUnknown": "Nije bilo moguće utvrditi gdje je instaliran CLI.",
+ "desktop.cli.error.unknown": "Nepoznata greška pri instalaciji",
+ "desktop.loading.status.initial": "Samo trenutak...",
+ "desktop.loading.status.done": "Sve je gotovo",
+ "desktop.loading.status.migrating": "Migracija baze podataka u toku",
+ "desktop.loading.status.waiting": "Ovo može potrajati nekoliko minuta",
+ "desktop.loading.progressAria": "Napredak migracije baze podataka",
+ "desktop.server.local": "Lokalni server",
}
diff --git a/packages/desktop/src/i18n/da.ts b/packages/desktop/src/i18n/da.ts
index 2109495f7..463ffa329 100644
--- a/packages/desktop/src/i18n/da.ts
+++ b/packages/desktop/src/i18n/da.ts
@@ -25,4 +25,37 @@ export const dict = {
"CLI installeret i {{path}}\n\nGenstart din terminal for at bruge 'opencode'-kommandoen.",
"desktop.cli.failed.title": "Installation mislykkedes",
"desktop.cli.failed.message": "Kunne ikke installere CLI: {{error}}",
+
+ "desktop.menu.app": "OpenCode",
+ "desktop.menu.file": "Filer",
+ "desktop.menu.edit": "Rediger",
+ "desktop.menu.view": "Vis",
+ "desktop.menu.help": "Hjælp",
+ "desktop.menu.file.newSession": "Ny session",
+ "desktop.menu.file.openProject": "Åbn projekt...",
+ "desktop.menu.view.toggleSidebar": "Slå sidepanel til/fra",
+ "desktop.menu.view.toggleTerminal": "Slå terminal til/fra",
+ "desktop.menu.view.toggleFileTree": "Slå filoversigt til/fra",
+ "desktop.menu.view.back": "Tilbage",
+ "desktop.menu.view.forward": "Fremad",
+ "desktop.menu.view.previousSession": "Forrige session",
+ "desktop.menu.view.nextSession": "Næste session",
+ "desktop.menu.help.documentation": "OpenCode Dokumentation",
+ "desktop.menu.help.supportForum": "Supportforum",
+ "desktop.menu.help.shareFeedback": "Del feedback",
+ "desktop.menu.help.reportBug": "Rapporter en fejl",
+ "desktop.cli.error.unsupportedPlatform": "CLI-installation understøttes kun på macOS og Linux.",
+ "desktop.cli.error.sidecarMissing": "OpenCode CLI-binærfil mangler. Prøv at geninstallere desktop-appen.",
+ "desktop.cli.error.scriptWriteFailed": "Kunne ikke forberede CLI-installationsscriptet.",
+ "desktop.cli.error.scriptPermissionFailed": "Kunne ikke gøre CLI-installationsscriptet eksekverbart.",
+ "desktop.cli.error.scriptRunFailed": "Kunne ikke køre CLI-installationsscriptet.",
+ "desktop.cli.error.scriptFailed": "CLI-installationsprogrammet mislykkedes.",
+ "desktop.cli.error.installPathUnknown": "Kunne ikke fastslå, hvor CLI'en blev installeret.",
+ "desktop.cli.error.unknown": "Ukendt installationsfejl",
+ "desktop.loading.status.initial": "Lige et øjeblik...",
+ "desktop.loading.status.done": "Helt færdig",
+ "desktop.loading.status.migrating": "Migrerer din database",
+ "desktop.loading.status.waiting": "Dette kan tage et par minutter",
+ "desktop.loading.progressAria": "Status for databasemigrering",
+ "desktop.server.local": "Lokal server",
}
diff --git a/packages/desktop/src/i18n/de.ts b/packages/desktop/src/i18n/de.ts
index 38ad8096e..26026d1ff 100644
--- a/packages/desktop/src/i18n/de.ts
+++ b/packages/desktop/src/i18n/de.ts
@@ -25,4 +25,38 @@ export const dict = {
"CLI wurde in {{path}} installiert\n\nStarten Sie Ihr Terminal neu, um den Befehl 'opencode' zu verwenden.",
"desktop.cli.failed.title": "Installation fehlgeschlagen",
"desktop.cli.failed.message": "CLI konnte nicht installiert werden: {{error}}",
+
+ "desktop.menu.app": "OpenCode",
+ "desktop.menu.file": "Datei",
+ "desktop.menu.edit": "Bearbeiten",
+ "desktop.menu.view": "Ansicht",
+ "desktop.menu.help": "Hilfe",
+ "desktop.menu.file.newSession": "Neue Sitzung",
+ "desktop.menu.file.openProject": "Projekt öffnen...",
+ "desktop.menu.view.toggleSidebar": "Seitenleiste umschalten",
+ "desktop.menu.view.toggleTerminal": "Terminal umschalten",
+ "desktop.menu.view.toggleFileTree": "Dateibaum umschalten",
+ "desktop.menu.view.back": "Zurück",
+ "desktop.menu.view.forward": "Vorwärts",
+ "desktop.menu.view.previousSession": "Vorherige Sitzung",
+ "desktop.menu.view.nextSession": "Nächste Sitzung",
+ "desktop.menu.help.documentation": "OpenCode-Dokumentation",
+ "desktop.menu.help.supportForum": "Support-Forum",
+ "desktop.menu.help.shareFeedback": "Feedback teilen",
+ "desktop.menu.help.reportBug": "Einen Fehler melden",
+ "desktop.cli.error.unsupportedPlatform": "Die CLI-Installation wird nur unter macOS und Linux unterstützt.",
+ "desktop.cli.error.sidecarMissing":
+ "Das OpenCode CLI-Binary fehlt. Versuchen Sie, die Desktop-App neu zu installieren.",
+ "desktop.cli.error.scriptWriteFailed": "Das CLI-Installationsskript konnte nicht vorbereitet werden.",
+ "desktop.cli.error.scriptPermissionFailed": "Das CLI-Installationsskript konnte nicht ausführbar gemacht werden.",
+ "desktop.cli.error.scriptRunFailed": "Das CLI-Installationsskript konnte nicht ausgeführt werden.",
+ "desktop.cli.error.scriptFailed": "Das CLI-Installationsprogramm ist fehlgeschlagen.",
+ "desktop.cli.error.installPathUnknown": "Es konnte nicht ermittelt werden, wo die CLI installiert wurde.",
+ "desktop.cli.error.unknown": "Unbekannter Installationsfehler",
+ "desktop.loading.status.initial": "Einen Moment bitte...",
+ "desktop.loading.status.done": "Alles erledigt",
+ "desktop.loading.status.migrating": "Ihre Datenbank wird migriert",
+ "desktop.loading.status.waiting": "Dies kann einige Minuten dauern",
+ "desktop.loading.progressAria": "Fortschritt der Datenbankmigration",
+ "desktop.server.local": "Lokaler Server",
}
diff --git a/packages/desktop/src/i18n/en.ts b/packages/desktop/src/i18n/en.ts
index 4c30380d5..f93fe58f7 100644
--- a/packages/desktop/src/i18n/en.ts
+++ b/packages/desktop/src/i18n/en.ts
@@ -3,6 +3,24 @@ export const dict = {
"desktop.menu.installCli": "Install CLI...",
"desktop.menu.reloadWebview": "Reload Webview",
"desktop.menu.restart": "Restart",
+ "desktop.menu.app": "OpenCode",
+ "desktop.menu.file": "File",
+ "desktop.menu.edit": "Edit",
+ "desktop.menu.view": "View",
+ "desktop.menu.help": "Help",
+ "desktop.menu.file.newSession": "New Session",
+ "desktop.menu.file.openProject": "Open Project...",
+ "desktop.menu.view.toggleSidebar": "Toggle Sidebar",
+ "desktop.menu.view.toggleTerminal": "Toggle Terminal",
+ "desktop.menu.view.toggleFileTree": "Toggle File Tree",
+ "desktop.menu.view.back": "Back",
+ "desktop.menu.view.forward": "Forward",
+ "desktop.menu.view.previousSession": "Previous Session",
+ "desktop.menu.view.nextSession": "Next Session",
+ "desktop.menu.help.documentation": "OpenCode Documentation",
+ "desktop.menu.help.supportForum": "Support Forum",
+ "desktop.menu.help.shareFeedback": "Share Feedback",
+ "desktop.menu.help.reportBug": "Report a Bug",
"desktop.dialog.chooseFolder": "Choose a folder",
"desktop.dialog.chooseFile": "Choose a file",
@@ -24,4 +42,20 @@ export const dict = {
"desktop.cli.installed.message": "CLI installed to {{path}}\n\nRestart your terminal to use the 'opencode' command.",
"desktop.cli.failed.title": "Installation Failed",
"desktop.cli.failed.message": "Failed to install CLI: {{error}}",
+ "desktop.cli.error.unsupportedPlatform": "CLI installation is only supported on macOS and Linux.",
+ "desktop.cli.error.sidecarMissing": "OpenCode CLI binary is missing. Try reinstalling the desktop app.",
+ "desktop.cli.error.scriptWriteFailed": "Failed to prepare CLI installer script.",
+ "desktop.cli.error.scriptPermissionFailed": "Failed to make CLI installer executable.",
+ "desktop.cli.error.scriptRunFailed": "Failed to run CLI installer script.",
+ "desktop.cli.error.scriptFailed": "CLI installer failed.",
+ "desktop.cli.error.installPathUnknown": "Could not determine where the CLI was installed.",
+ "desktop.cli.error.unknown": "Unknown installation error",
+
+ "desktop.loading.status.initial": "Just a moment...",
+ "desktop.loading.status.done": "All done",
+ "desktop.loading.status.migrating": "Migrating your database",
+ "desktop.loading.status.waiting": "This may take a couple of minutes",
+ "desktop.loading.progressAria": "Database migration progress",
+
+ "desktop.server.local": "Local Server",
}
diff --git a/packages/desktop/src/i18n/es.ts b/packages/desktop/src/i18n/es.ts
index 80504a8f2..6b0d0dee2 100644
--- a/packages/desktop/src/i18n/es.ts
+++ b/packages/desktop/src/i18n/es.ts
@@ -24,4 +24,38 @@ export const dict = {
"desktop.cli.installed.message": "CLI instalada en {{path}}\n\nReinicia tu terminal para usar el comando 'opencode'.",
"desktop.cli.failed.title": "Instalación fallida",
"desktop.cli.failed.message": "No se pudo instalar la CLI: {{error}}",
+
+ "desktop.menu.app": "OpenCode",
+ "desktop.menu.file": "Archivo",
+ "desktop.menu.edit": "Editar",
+ "desktop.menu.view": "Ver",
+ "desktop.menu.help": "Ayuda",
+ "desktop.menu.file.newSession": "Nueva sesión",
+ "desktop.menu.file.openProject": "Abrir proyecto...",
+ "desktop.menu.view.toggleSidebar": "Alternar barra lateral",
+ "desktop.menu.view.toggleTerminal": "Alternar terminal",
+ "desktop.menu.view.toggleFileTree": "Alternar árbol de archivos",
+ "desktop.menu.view.back": "Atrás",
+ "desktop.menu.view.forward": "Adelante",
+ "desktop.menu.view.previousSession": "Sesión anterior",
+ "desktop.menu.view.nextSession": "Siguiente sesión",
+ "desktop.menu.help.documentation": "Documentación de OpenCode",
+ "desktop.menu.help.supportForum": "Foro de soporte",
+ "desktop.menu.help.shareFeedback": "Compartir comentarios",
+ "desktop.menu.help.reportBug": "Informar de un error",
+ "desktop.cli.error.unsupportedPlatform": "La instalación de la CLI solo es compatible con macOS y Linux.",
+ "desktop.cli.error.sidecarMissing":
+ "Falta el binario de la CLI de OpenCode. Intenta reinstalar la aplicación de escritorio.",
+ "desktop.cli.error.scriptWriteFailed": "No se pudo preparar el script del instalador de la CLI.",
+ "desktop.cli.error.scriptPermissionFailed": "No se pudo hacer ejecutable el script del instalador de la CLI.",
+ "desktop.cli.error.scriptRunFailed": "No se pudo ejecutar el script del instalador de la CLI.",
+ "desktop.cli.error.scriptFailed": "El instalador de la CLI falló.",
+ "desktop.cli.error.installPathUnknown": "No se pudo determinar dónde se instaló la CLI.",
+ "desktop.cli.error.unknown": "Error de instalación desconocido",
+ "desktop.loading.status.initial": "Un momento...",
+ "desktop.loading.status.done": "Todo listo",
+ "desktop.loading.status.migrating": "Migrando tu base de datos",
+ "desktop.loading.status.waiting": "Esto puede tardar unos minutos",
+ "desktop.loading.progressAria": "Progreso de migración de la base de datos",
+ "desktop.server.local": "Servidor local",
}
diff --git a/packages/desktop/src/i18n/fr.ts b/packages/desktop/src/i18n/fr.ts
index 4f0bb2b16..cd9c854b3 100644
--- a/packages/desktop/src/i18n/fr.ts
+++ b/packages/desktop/src/i18n/fr.ts
@@ -25,4 +25,38 @@ export const dict = {
"CLI installée dans {{path}}\n\nRedémarrez votre terminal pour utiliser la commande 'opencode'.",
"desktop.cli.failed.title": "Échec de l'installation",
"desktop.cli.failed.message": "Impossible d'installer la CLI : {{error}}",
+
+ "desktop.menu.app": "OpenCode",
+ "desktop.menu.file": "Fichier",
+ "desktop.menu.edit": "Édition",
+ "desktop.menu.view": "Affichage",
+ "desktop.menu.help": "Aide",
+ "desktop.menu.file.newSession": "Nouvelle session",
+ "desktop.menu.file.openProject": "Ouvrir un projet...",
+ "desktop.menu.view.toggleSidebar": "Basculer la barre latérale",
+ "desktop.menu.view.toggleTerminal": "Basculer le terminal",
+ "desktop.menu.view.toggleFileTree": "Basculer l'arborescence des fichiers",
+ "desktop.menu.view.back": "Retour",
+ "desktop.menu.view.forward": "Suivant",
+ "desktop.menu.view.previousSession": "Session précédente",
+ "desktop.menu.view.nextSession": "Session suivante",
+ "desktop.menu.help.documentation": "Documentation d'OpenCode",
+ "desktop.menu.help.supportForum": "Forum d'assistance",
+ "desktop.menu.help.shareFeedback": "Partager des commentaires",
+ "desktop.menu.help.reportBug": "Signaler un bug",
+ "desktop.cli.error.unsupportedPlatform": "L'installation de la CLI n'est prise en charge que sur macOS et Linux.",
+ "desktop.cli.error.sidecarMissing":
+ "Le binaire de la CLI OpenCode est manquant. Essayez de réinstaller l'application de bureau.",
+ "desktop.cli.error.scriptWriteFailed": "Impossible de préparer le script d'installation de la CLI.",
+ "desktop.cli.error.scriptPermissionFailed": "Impossible de rendre le script d'installation de la CLI exécutable.",
+ "desktop.cli.error.scriptRunFailed": "Impossible d'exécuter le script d'installation de la CLI.",
+ "desktop.cli.error.scriptFailed": "L'installateur de la CLI a échoué.",
+ "desktop.cli.error.installPathUnknown": "Impossible de déterminer où la CLI a été installée.",
+ "desktop.cli.error.unknown": "Erreur d'installation inconnue",
+ "desktop.loading.status.initial": "Un instant...",
+ "desktop.loading.status.done": "Terminé",
+ "desktop.loading.status.migrating": "Migration de votre base de données",
+ "desktop.loading.status.waiting": "Cela peut prendre quelques minutes",
+ "desktop.loading.progressAria": "Progression de la migration de la base de données",
+ "desktop.server.local": "Serveur local",
}
diff --git a/packages/desktop/src/i18n/ja.ts b/packages/desktop/src/i18n/ja.ts
index fc485c6f4..ff768c067 100644
--- a/packages/desktop/src/i18n/ja.ts
+++ b/packages/desktop/src/i18n/ja.ts
@@ -25,4 +25,38 @@ export const dict = {
"CLI を {{path}} にインストールしました\n\nターミナルを再起動して 'opencode' コマンドを使用してください。",
"desktop.cli.failed.title": "インストールに失敗しました",
"desktop.cli.failed.message": "CLI のインストールに失敗しました: {{error}}",
+
+ "desktop.menu.app": "OpenCode",
+ "desktop.menu.file": "ファイル",
+ "desktop.menu.edit": "編集",
+ "desktop.menu.view": "表示",
+ "desktop.menu.help": "ヘルプ",
+ "desktop.menu.file.newSession": "新しいセッション",
+ "desktop.menu.file.openProject": "プロジェクトを開く...",
+ "desktop.menu.view.toggleSidebar": "サイドバーの切り替え",
+ "desktop.menu.view.toggleTerminal": "ターミナルの切り替え",
+ "desktop.menu.view.toggleFileTree": "ファイルツリーの切り替え",
+ "desktop.menu.view.back": "戻る",
+ "desktop.menu.view.forward": "進む",
+ "desktop.menu.view.previousSession": "前のセッション",
+ "desktop.menu.view.nextSession": "次のセッション",
+ "desktop.menu.help.documentation": "OpenCode ドキュメント",
+ "desktop.menu.help.supportForum": "サポートフォーラム",
+ "desktop.menu.help.shareFeedback": "フィードバックを共有",
+ "desktop.menu.help.reportBug": "バグを報告",
+ "desktop.cli.error.unsupportedPlatform": "CLI のインストールは macOS と Linux のみでサポートされています。",
+ "desktop.cli.error.sidecarMissing":
+ "OpenCode CLI のバイナリが見つかりません。デスクトップアプリを再インストールしてみてください。",
+ "desktop.cli.error.scriptWriteFailed": "CLI インストーラースクリプトの準備に失敗しました。",
+ "desktop.cli.error.scriptPermissionFailed": "CLI インストーラースクリプトに実行権限を付与できませんでした。",
+ "desktop.cli.error.scriptRunFailed": "CLI インストーラースクリプトの実行に失敗しました。",
+ "desktop.cli.error.scriptFailed": "CLI インストーラーが失敗しました。",
+ "desktop.cli.error.installPathUnknown": "CLI がどこにインストールされたか特定できませんでした。",
+ "desktop.cli.error.unknown": "不明なインストールエラー",
+ "desktop.loading.status.initial": "少々お待ちください...",
+ "desktop.loading.status.done": "完了しました",
+ "desktop.loading.status.migrating": "データベースを移行しています",
+ "desktop.loading.status.waiting": "これには数分かかる場合があります",
+ "desktop.loading.progressAria": "データベース移行の進行状況",
+ "desktop.server.local": "ローカルサーバー",
}
diff --git a/packages/desktop/src/i18n/ko.ts b/packages/desktop/src/i18n/ko.ts
index be27cec86..c50b7fdef 100644
--- a/packages/desktop/src/i18n/ko.ts
+++ b/packages/desktop/src/i18n/ko.ts
@@ -24,4 +24,37 @@ export const dict = {
"CLI가 {{path}}에 설치되었습니다\n\n터미널을 다시 시작하여 'opencode' 명령을 사용하세요.",
"desktop.cli.failed.title": "설치 실패",
"desktop.cli.failed.message": "CLI 설치 실패: {{error}}",
+
+ "desktop.menu.app": "OpenCode",
+ "desktop.menu.file": "파일",
+ "desktop.menu.edit": "편집",
+ "desktop.menu.view": "보기",
+ "desktop.menu.help": "도움말",
+ "desktop.menu.file.newSession": "새 세션",
+ "desktop.menu.file.openProject": "프로젝트 열기...",
+ "desktop.menu.view.toggleSidebar": "사이드바 전환",
+ "desktop.menu.view.toggleTerminal": "터미널 전환",
+ "desktop.menu.view.toggleFileTree": "파일 트리 전환",
+ "desktop.menu.view.back": "뒤로",
+ "desktop.menu.view.forward": "앞으로",
+ "desktop.menu.view.previousSession": "이전 세션",
+ "desktop.menu.view.nextSession": "다음 세션",
+ "desktop.menu.help.documentation": "OpenCode 문서",
+ "desktop.menu.help.supportForum": "지원 포럼",
+ "desktop.menu.help.shareFeedback": "피드백 공유",
+ "desktop.menu.help.reportBug": "버그 신고",
+ "desktop.cli.error.unsupportedPlatform": "CLI 설치는 macOS 및 Linux에서만 지원됩니다.",
+ "desktop.cli.error.sidecarMissing": "OpenCode CLI 바이너리가 누락되었습니다. 데스크톱 앱을 다시 설치해 보세요.",
+ "desktop.cli.error.scriptWriteFailed": "CLI 설치 스크립트를 준비하지 못했습니다.",
+ "desktop.cli.error.scriptPermissionFailed": "CLI 설치 스크립트를 실행 가능하게 만들지 못했습니다.",
+ "desktop.cli.error.scriptRunFailed": "CLI 설치 스크립트를 실행하지 못했습니다.",
+ "desktop.cli.error.scriptFailed": "CLI 설치 프로그램이 실패했습니다.",
+ "desktop.cli.error.installPathUnknown": "CLI가 어디에 설치되었는지 확인할 수 없습니다.",
+ "desktop.cli.error.unknown": "알 수 없는 설치 오류",
+ "desktop.loading.status.initial": "잠시만 기다려 주세요...",
+ "desktop.loading.status.done": "모두 완료되었습니다",
+ "desktop.loading.status.migrating": "데이터베이스 마이그레이션 중",
+ "desktop.loading.status.waiting": "이 작업은 몇 분 정도 걸릴 수 있습니다",
+ "desktop.loading.progressAria": "데이터베이스 마이그레이션 진행률",
+ "desktop.server.local": "로컬 서버",
}
diff --git a/packages/desktop/src/i18n/no.ts b/packages/desktop/src/i18n/no.ts
index e39bd7f3b..ced60e835 100644
--- a/packages/desktop/src/i18n/no.ts
+++ b/packages/desktop/src/i18n/no.ts
@@ -25,4 +25,37 @@ export const dict = {
"CLI installert til {{path}}\n\nStart terminalen på nytt for å bruke 'opencode'-kommandoen.",
"desktop.cli.failed.title": "Installasjon mislyktes",
"desktop.cli.failed.message": "Kunne ikke installere CLI: {{error}}",
+
+ "desktop.menu.app": "OpenCode",
+ "desktop.menu.file": "Fil",
+ "desktop.menu.edit": "Rediger",
+ "desktop.menu.view": "Vis",
+ "desktop.menu.help": "Hjelp",
+ "desktop.menu.file.newSession": "Ny sesjon",
+ "desktop.menu.file.openProject": "Åpne prosjekt...",
+ "desktop.menu.view.toggleSidebar": "Vis/skjul sidefelt",
+ "desktop.menu.view.toggleTerminal": "Vis/skjul terminal",
+ "desktop.menu.view.toggleFileTree": "Vis/skjul filtre",
+ "desktop.menu.view.back": "Tilbake",
+ "desktop.menu.view.forward": "Frem",
+ "desktop.menu.view.previousSession": "Forrige sesjon",
+ "desktop.menu.view.nextSession": "Neste sesjon",
+ "desktop.menu.help.documentation": "OpenCode Dokumentasjon",
+ "desktop.menu.help.supportForum": "Støtteforum",
+ "desktop.menu.help.shareFeedback": "Del tilbakemelding",
+ "desktop.menu.help.reportBug": "Rapporter en feil",
+ "desktop.cli.error.unsupportedPlatform": "CLI-installasjon støttes kun på macOS og Linux.",
+ "desktop.cli.error.sidecarMissing": "OpenCode CLI-binærfil mangler. Prøv å installere skrivebordsappen på nytt.",
+ "desktop.cli.error.scriptWriteFailed": "Kunne ikke klargjøre CLI-installasjonsskriptet.",
+ "desktop.cli.error.scriptPermissionFailed": "Kunne ikke gjøre CLI-installasjonsskriptet kjørbart.",
+ "desktop.cli.error.scriptRunFailed": "Kunne ikke kjøre CLI-installasjonsskriptet.",
+ "desktop.cli.error.scriptFailed": "CLI-installasjonsprogrammet mislyktes.",
+ "desktop.cli.error.installPathUnknown": "Kunne ikke avgjøre hvor CLI ble installert.",
+ "desktop.cli.error.unknown": "Ukjent installasjonsfeil",
+ "desktop.loading.status.initial": "Et øyeblikk...",
+ "desktop.loading.status.done": "Alt ferdig",
+ "desktop.loading.status.migrating": "Migrerer databasen din",
+ "desktop.loading.status.waiting": "Dette kan ta et par minutter",
+ "desktop.loading.progressAria": "Fremdrift for databasemigrering",
+ "desktop.server.local": "Lokal server",
}
diff --git a/packages/desktop/src/i18n/pl.ts b/packages/desktop/src/i18n/pl.ts
index d3ad7ce64..0452ab5da 100644
--- a/packages/desktop/src/i18n/pl.ts
+++ b/packages/desktop/src/i18n/pl.ts
@@ -25,4 +25,38 @@ export const dict = {
"CLI zainstalowane w {{path}}\n\nUruchom ponownie terminal, aby użyć polecenia 'opencode'.",
"desktop.cli.failed.title": "Instalacja nie powiodła się",
"desktop.cli.failed.message": "Nie udało się zainstalować CLI: {{error}}",
+
+ "desktop.menu.app": "OpenCode",
+ "desktop.menu.file": "Plik",
+ "desktop.menu.edit": "Edycja",
+ "desktop.menu.view": "Widok",
+ "desktop.menu.help": "Pomoc",
+ "desktop.menu.file.newSession": "Nowa sesja",
+ "desktop.menu.file.openProject": "Otwórz projekt...",
+ "desktop.menu.view.toggleSidebar": "Przełącz pasek boczny",
+ "desktop.menu.view.toggleTerminal": "Przełącz terminal",
+ "desktop.menu.view.toggleFileTree": "Przełącz drzewo plików",
+ "desktop.menu.view.back": "Wstecz",
+ "desktop.menu.view.forward": "Dalej",
+ "desktop.menu.view.previousSession": "Poprzednia sesja",
+ "desktop.menu.view.nextSession": "Następna sesja",
+ "desktop.menu.help.documentation": "Dokumentacja OpenCode",
+ "desktop.menu.help.supportForum": "Forum wsparcia",
+ "desktop.menu.help.shareFeedback": "Prześlij opinię",
+ "desktop.menu.help.reportBug": "Zgłoś błąd",
+ "desktop.cli.error.unsupportedPlatform": "Instalacja CLI jest obsługiwana tylko na macOS i Linux.",
+ "desktop.cli.error.sidecarMissing":
+ "Brakuje pliku binarnego OpenCode CLI. Spróbuj ponownie zainstalować aplikację na komputer.",
+ "desktop.cli.error.scriptWriteFailed": "Nie udało się przygotować skryptu instalatora CLI.",
+ "desktop.cli.error.scriptPermissionFailed": "Nie udało się nadać uprawnień do wykonania skryptu instalatora CLI.",
+ "desktop.cli.error.scriptRunFailed": "Nie udało się uruchomić skryptu instalatora CLI.",
+ "desktop.cli.error.scriptFailed": "Instalator CLI nie powiódł się.",
+ "desktop.cli.error.installPathUnknown": "Nie udało się ustalić, gdzie zostało zainstalowane CLI.",
+ "desktop.cli.error.unknown": "Nieznany błąd instalacji",
+ "desktop.loading.status.initial": "Chwileczkę...",
+ "desktop.loading.status.done": "Gotowe",
+ "desktop.loading.status.migrating": "Migrowanie bazy danych",
+ "desktop.loading.status.waiting": "Może to potrwać kilka minut",
+ "desktop.loading.progressAria": "Postęp migracji bazy danych",
+ "desktop.server.local": "Serwer lokalny",
}
diff --git a/packages/desktop/src/i18n/ru.ts b/packages/desktop/src/i18n/ru.ts
index 8e09cc45b..d0d6c8aff 100644
--- a/packages/desktop/src/i18n/ru.ts
+++ b/packages/desktop/src/i18n/ru.ts
@@ -24,4 +24,38 @@ export const dict = {
"CLI установлен в {{path}}\n\nПерезапустите терминал, чтобы использовать команду 'opencode'.",
"desktop.cli.failed.title": "Ошибка установки",
"desktop.cli.failed.message": "Не удалось установить CLI: {{error}}",
+
+ "desktop.menu.app": "OpenCode",
+ "desktop.menu.file": "Файл",
+ "desktop.menu.edit": "Правка",
+ "desktop.menu.view": "Вид",
+ "desktop.menu.help": "Справка",
+ "desktop.menu.file.newSession": "Новая сессия",
+ "desktop.menu.file.openProject": "Открыть проект...",
+ "desktop.menu.view.toggleSidebar": "Переключить боковую панель",
+ "desktop.menu.view.toggleTerminal": "Переключить терминал",
+ "desktop.menu.view.toggleFileTree": "Переключить дерево файлов",
+ "desktop.menu.view.back": "Назад",
+ "desktop.menu.view.forward": "Вперед",
+ "desktop.menu.view.previousSession": "Предыдущая сессия",
+ "desktop.menu.view.nextSession": "Следующая сессия",
+ "desktop.menu.help.documentation": "Документация OpenCode",
+ "desktop.menu.help.supportForum": "Форум поддержки",
+ "desktop.menu.help.shareFeedback": "Поделиться отзывом",
+ "desktop.menu.help.reportBug": "Сообщить об ошибке",
+ "desktop.cli.error.unsupportedPlatform": "Установка CLI поддерживается только в macOS и Linux.",
+ "desktop.cli.error.sidecarMissing":
+ "Отсутствует бинарный файл OpenCode CLI. Попробуйте переустановить настольное приложение.",
+ "desktop.cli.error.scriptWriteFailed": "Не удалось подготовить скрипт установщика CLI.",
+ "desktop.cli.error.scriptPermissionFailed": "Не удалось сделать скрипт установщика CLI исполняемым.",
+ "desktop.cli.error.scriptRunFailed": "Не удалось запустить скрипт установщика CLI.",
+ "desktop.cli.error.scriptFailed": "Ошибка установщика CLI.",
+ "desktop.cli.error.installPathUnknown": "Не удалось определить, куда был установлен CLI.",
+ "desktop.cli.error.unknown": "Неизвестная ошибка установки",
+ "desktop.loading.status.initial": "Минуточку...",
+ "desktop.loading.status.done": "Всё готово",
+ "desktop.loading.status.migrating": "Миграция вашей базы данных",
+ "desktop.loading.status.waiting": "Это может занять пару минут",
+ "desktop.loading.progressAria": "Прогресс миграции базы данных",
+ "desktop.server.local": "Локальный сервер",
}
diff --git a/packages/desktop/src/i18n/zh.ts b/packages/desktop/src/i18n/zh.ts
index aeb3a54e0..a173e2b55 100644
--- a/packages/desktop/src/i18n/zh.ts
+++ b/packages/desktop/src/i18n/zh.ts
@@ -23,4 +23,37 @@ export const dict = {
"desktop.cli.installed.message": "CLI 已安装到 {{path}}\n\n重启终端以使用 'opencode' 命令。",
"desktop.cli.failed.title": "安装失败",
"desktop.cli.failed.message": "无法安装 CLI: {{error}}",
+
+ "desktop.menu.app": "OpenCode",
+ "desktop.menu.file": "文件",
+ "desktop.menu.edit": "编辑",
+ "desktop.menu.view": "查看",
+ "desktop.menu.help": "帮助",
+ "desktop.menu.file.newSession": "新会话",
+ "desktop.menu.file.openProject": "打开项目...",
+ "desktop.menu.view.toggleSidebar": "切换侧边栏",
+ "desktop.menu.view.toggleTerminal": "切换终端",
+ "desktop.menu.view.toggleFileTree": "切换文件树",
+ "desktop.menu.view.back": "后退",
+ "desktop.menu.view.forward": "前进",
+ "desktop.menu.view.previousSession": "上一个会话",
+ "desktop.menu.view.nextSession": "下一个会话",
+ "desktop.menu.help.documentation": "OpenCode 文档",
+ "desktop.menu.help.supportForum": "支持论坛",
+ "desktop.menu.help.shareFeedback": "分享反馈",
+ "desktop.menu.help.reportBug": "报告错误",
+ "desktop.cli.error.unsupportedPlatform": "CLI 安装仅在 macOS 和 Linux 上受支持。",
+ "desktop.cli.error.sidecarMissing": "OpenCode CLI 二进制文件缺失。请尝试重新安装桌面应用程序。",
+ "desktop.cli.error.scriptWriteFailed": "无法准备 CLI 安装脚本。",
+ "desktop.cli.error.scriptPermissionFailed": "无法使 CLI 安装脚本可执行。",
+ "desktop.cli.error.scriptRunFailed": "无法运行 CLI 安装脚本。",
+ "desktop.cli.error.scriptFailed": "CLI 安装程序失败。",
+ "desktop.cli.error.installPathUnknown": "无法确定 CLI 的安装位置。",
+ "desktop.cli.error.unknown": "未知的安装错误",
+ "desktop.loading.status.initial": "稍等片刻...",
+ "desktop.loading.status.done": "全部完成",
+ "desktop.loading.status.migrating": "正在迁移您的数据库",
+ "desktop.loading.status.waiting": "这可能需要几分钟",
+ "desktop.loading.progressAria": "数据库迁移进度",
+ "desktop.server.local": "本地服务器",
}
diff --git a/packages/desktop/src/i18n/zht.ts b/packages/desktop/src/i18n/zht.ts
index 7fd677aca..fca239ba6 100644
--- a/packages/desktop/src/i18n/zht.ts
+++ b/packages/desktop/src/i18n/zht.ts
@@ -23,4 +23,37 @@ export const dict = {
"desktop.cli.installed.message": "CLI 已安裝到 {{path}}\n\n重新啟動終端機以使用 'opencode' 命令。",
"desktop.cli.failed.title": "安裝失敗",
"desktop.cli.failed.message": "無法安裝 CLI: {{error}}",
+
+ "desktop.menu.app": "OpenCode",
+ "desktop.menu.file": "檔案",
+ "desktop.menu.edit": "編輯",
+ "desktop.menu.view": "檢視",
+ "desktop.menu.help": "說明",
+ "desktop.menu.file.newSession": "新工作階段",
+ "desktop.menu.file.openProject": "開啟專案...",
+ "desktop.menu.view.toggleSidebar": "切換側邊欄",
+ "desktop.menu.view.toggleTerminal": "切換終端機",
+ "desktop.menu.view.toggleFileTree": "切換檔案樹",
+ "desktop.menu.view.back": "上一步",
+ "desktop.menu.view.forward": "下一步",
+ "desktop.menu.view.previousSession": "上一個工作階段",
+ "desktop.menu.view.nextSession": "下一個工作階段",
+ "desktop.menu.help.documentation": "OpenCode 文件",
+ "desktop.menu.help.supportForum": "支援論壇",
+ "desktop.menu.help.shareFeedback": "分享意見回饋",
+ "desktop.menu.help.reportBug": "回報錯誤",
+ "desktop.cli.error.unsupportedPlatform": "CLI 安裝僅支援 macOS 與 Linux。",
+ "desktop.cli.error.sidecarMissing": "OpenCode CLI 執行檔遺失。請嘗試重新安裝桌面應用程式。",
+ "desktop.cli.error.scriptWriteFailed": "無法準備 CLI 安裝指令碼。",
+ "desktop.cli.error.scriptPermissionFailed": "無法將 CLI 安裝指令碼設為可執行。",
+ "desktop.cli.error.scriptRunFailed": "無法執行 CLI 安裝指令碼。",
+ "desktop.cli.error.scriptFailed": "CLI 安裝程式失敗。",
+ "desktop.cli.error.installPathUnknown": "無法確定 CLI 的安裝位置。",
+ "desktop.cli.error.unknown": "未知的安裝錯誤",
+ "desktop.loading.status.initial": "稍等片刻...",
+ "desktop.loading.status.done": "全部完成",
+ "desktop.loading.status.migrating": "正在移轉您的資料庫",
+ "desktop.loading.status.waiting": "這可能需要幾分鐘",
+ "desktop.loading.progressAria": "資料庫移轉進度",
+ "desktop.server.local": "本機伺服器",
}
diff --git a/packages/desktop/src/index.tsx b/packages/desktop/src/index.tsx
index 17b4638bd..9afabe918 100644
--- a/packages/desktop/src/index.tsx
+++ b/packages/desktop/src/index.tsx
@@ -445,7 +445,7 @@ render(() => {
}
const server: ServerConnection.Any = data.is_sidecar
? {
- displayName: "Local Server",
+ displayName: t("desktop.server.local"),
type: "sidecar",
variant: "base",
http,
diff --git a/packages/desktop/src/loading.tsx b/packages/desktop/src/loading.tsx
index 23a8055c9..a02f1a95e 100644
--- a/packages/desktop/src/loading.tsx
+++ b/packages/desktop/src/loading.tsx
@@ -8,11 +8,18 @@ import "./styles.css"
import { createEffect, createMemo, createSignal, onCleanup, onMount } from "solid-js"
import { commands, events, InitStep } from "./bindings"
import { Channel } from "@tauri-apps/api/core"
+import { initI18n, t } from "./i18n"
const root = document.getElementById("root")!
-const lines = ["Just a moment...", "Migrating your database", "This may take a couple of minutes"]
+const lines = [
+ t("desktop.loading.status.initial"),
+ t("desktop.loading.status.migrating"),
+ t("desktop.loading.status.waiting"),
+]
const delays = [3000, 9000]
+void initI18n()
+
render(() => {
const [step, setStep] = createSignal<InitStep | null>(null)
const [line, setLine] = createSignal(0)
@@ -54,9 +61,9 @@ render(() => {
})
const status = createMemo(() => {
- if (phase() === "done") return "All done"
+ if (phase() === "done") return t("desktop.loading.status.done")
if (phase() === "sqlite_waiting") return lines[line()]
- return "Just a moment..."
+ return t("desktop.loading.status.initial")
})
return (
@@ -72,7 +79,7 @@ render(() => {
<Progress
value={value()}
class="w-20 [&_[data-slot='progress-track']]:h-1 [&_[data-slot='progress-track']]:border-0 [&_[data-slot='progress-track']]:rounded-none [&_[data-slot='progress-track']]:bg-surface-weak [&_[data-slot='progress-fill']]:rounded-none [&_[data-slot='progress-fill']]:bg-icon-warning-base"
- aria-label="Database migration progress"
+ aria-label={t("desktop.loading.progressAria")}
getValueLabel={({ value }) => `${Math.round(value)}%`}
/>
</div>
diff --git a/packages/desktop/src/menu.ts b/packages/desktop/src/menu.ts
index 9fcb6115b..de6a1d6a7 100644
--- a/packages/desktop/src/menu.ts
+++ b/packages/desktop/src/menu.ts
@@ -16,7 +16,7 @@ export async function createMenu(trigger: (id: string) => void) {
const menu = await Menu.new({
items: [
await Submenu.new({
- text: "OpenCode",
+ text: t("desktop.menu.app"),
items: [
await PredefinedMenuItem.new({
item: { About: null },
@@ -62,15 +62,15 @@ export async function createMenu(trigger: (id: string) => void) {
].filter(Boolean),
}),
await Submenu.new({
- text: "File",
+ text: t("desktop.menu.file"),
items: [
await MenuItem.new({
- text: "New Session",
+ text: t("desktop.menu.file.newSession"),
accelerator: "Shift+Cmd+S",
action: () => trigger("session.new"),
}),
await MenuItem.new({
- text: "Open Project...",
+ text: t("desktop.menu.file.openProject"),
accelerator: "Cmd+O",
action: () => trigger("project.open"),
}),
@@ -83,7 +83,7 @@ export async function createMenu(trigger: (id: string) => void) {
],
}),
await Submenu.new({
- text: "Edit",
+ text: t("desktop.menu.edit"),
items: [
await PredefinedMenuItem.new({
item: "Undo",
@@ -109,44 +109,44 @@ export async function createMenu(trigger: (id: string) => void) {
],
}),
await Submenu.new({
- text: "View",
+ text: t("desktop.menu.view"),
items: [
await MenuItem.new({
action: () => trigger("sidebar.toggle"),
- text: "Toggle Sidebar",
+ text: t("desktop.menu.view.toggleSidebar"),
accelerator: "Cmd+B",
}),
await MenuItem.new({
action: () => trigger("terminal.toggle"),
- text: "Toggle Terminal",
+ text: t("desktop.menu.view.toggleTerminal"),
accelerator: "Ctrl+`",
}),
await MenuItem.new({
action: () => trigger("fileTree.toggle"),
- text: "Toggle File Tree",
+ text: t("desktop.menu.view.toggleFileTree"),
}),
await PredefinedMenuItem.new({
item: "Separator",
}),
await MenuItem.new({
action: () => trigger("common.goBack"),
- text: "Back",
+ text: t("desktop.menu.view.back"),
}),
await MenuItem.new({
action: () => trigger("common.goForward"),
- text: "Forward",
+ text: t("desktop.menu.view.forward"),
}),
await PredefinedMenuItem.new({
item: "Separator",
}),
await MenuItem.new({
action: () => trigger("session.previous"),
- text: "Previous Session",
+ text: t("desktop.menu.view.previousSession"),
accelerator: "Option+ArrowUp",
}),
await MenuItem.new({
action: () => trigger("session.next"),
- text: "Next Session",
+ text: t("desktop.menu.view.nextSession"),
accelerator: "Option+ArrowDown",
}),
await PredefinedMenuItem.new({
@@ -155,16 +155,16 @@ export async function createMenu(trigger: (id: string) => void) {
],
}),
await Submenu.new({
- text: "Help",
+ text: t("desktop.menu.help"),
items: [
// missing native macos search
await MenuItem.new({
action: () => openUrl("https://opencode.ai/docs"),
- text: "OpenCode Documentation",
+ text: t("desktop.menu.help.documentation"),
}),
await MenuItem.new({
action: () => openUrl("https://discord.com/invite/opencode"),
- text: "Support Forum",
+ text: t("desktop.menu.help.supportForum"),
}),
await PredefinedMenuItem.new({
item: "Separator",
@@ -177,11 +177,11 @@ export async function createMenu(trigger: (id: string) => void) {
}),
await MenuItem.new({
action: () => openUrl("https://github.com/anomalyco/opencode/issues/new?template=feature_request.yml"),
- text: "Share Feedback",
+ text: t("desktop.menu.help.shareFeedback"),
}),
await MenuItem.new({
action: () => openUrl("https://github.com/anomalyco/opencode/issues/new?template=bug_report.yml"),
- text: "Report a Bug",
+ text: t("desktop.menu.help.reportBug"),
}),
],
}),
diff --git a/packages/enterprise/src/app.tsx b/packages/enterprise/src/app.tsx
index 6f9cdcafb..b73888ec5 100644
--- a/packages/enterprise/src/app.tsx
+++ b/packages/enterprise/src/app.tsx
@@ -56,8 +56,9 @@ function detectLocale() {
function UiI18nBridge(props: ParentProps) {
const locale = createMemo(() => detectLocale())
+ const zh = uiZh as Partial<Record<string, string>>
const t = (key: keyof typeof uiEn, params?: UiI18nParams) => {
- const value = locale() === "zh" ? (uiZh[key] ?? uiEn[key]) : uiEn[key]
+ const value = locale() === "zh" ? (zh[key] ?? uiEn[key]) : uiEn[key]
const text = value ?? String(key)
return resolveTemplate(text, params)
}
diff --git a/packages/ui/src/components/message-part.tsx b/packages/ui/src/components/message-part.tsx
index e877fc725..5c110ccd6 100644
--- a/packages/ui/src/components/message-part.tsx
+++ b/packages/ui/src/components/message-part.tsx
@@ -463,14 +463,22 @@ function contextToolTrigger(part: ToolPart, i18n: ReturnType<typeof useI18n>) {
}
}
-function contextToolSummary(parts: ToolPart[]) {
+function contextToolSummary(parts: ToolPart[], i18n: ReturnType<typeof useI18n>) {
const read = parts.filter((part) => part.tool === "read").length
const search = parts.filter((part) => part.tool === "glob" || part.tool === "grep").length
const list = parts.filter((part) => part.tool === "list").length
return [
- read ? `${read} ${read === 1 ? "read" : "reads"}` : undefined,
- search ? `${search} ${search === 1 ? "search" : "searches"}` : undefined,
- list ? `${list} ${list === 1 ? "list" : "lists"}` : undefined,
+ read
+ ? i18n.t(read === 1 ? "ui.messagePart.context.read.one" : "ui.messagePart.context.read.other", { count: read })
+ : undefined,
+ search
+ ? i18n.t(search === 1 ? "ui.messagePart.context.search.one" : "ui.messagePart.context.search.other", {
+ count: search,
+ })
+ : undefined,
+ list
+ ? i18n.t(list === 1 ? "ui.messagePart.context.list.one" : "ui.messagePart.context.list.other", { count: list })
+ : undefined,
].filter((value): value is string => !!value)
}
@@ -595,7 +603,7 @@ function ContextToolGroup(props: { parts: ToolPart[]; busy?: boolean }) {
() =>
!!props.busy || props.parts.some((part) => part.state.status === "pending" || part.state.status === "running"),
)
- const summary = createMemo(() => contextToolSummary(props.parts))
+ const summary = createMemo(() => contextToolSummary(props.parts, i18n))
const details = createMemo(() => summary().join(", "))
return (
@@ -979,7 +987,7 @@ PART_MAPPING["tool"] = function ToolPartDisplay(props) {
return (
<div style="width: 100%; display: flex; justify-content: flex-end;">
<span class="text-13-regular text-text-weak cursor-default">
- {i18n.t("ui.tool.questions")} dismissed
+ {i18n.t("ui.messagePart.questions.dismissed")}
</span>
</div>
)
diff --git a/packages/ui/src/components/scroll-view.tsx b/packages/ui/src/components/scroll-view.tsx
index acc54c8c3..52ed39a46 100644
--- a/packages/ui/src/components/scroll-view.tsx
+++ b/packages/ui/src/components/scroll-view.tsx
@@ -1,4 +1,5 @@
import { createSignal, onCleanup, onMount, splitProps, type ComponentProps, Show, mergeProps } from "solid-js"
+import { useI18n } from "../context/i18n"
export interface ScrollViewProps extends ComponentProps<"div"> {
viewportRef?: (el: HTMLDivElement) => void
@@ -6,6 +7,7 @@ export interface ScrollViewProps extends ComponentProps<"div"> {
}
export function ScrollView(props: ScrollViewProps) {
+ const i18n = useI18n()
const merged = mergeProps({ orientation: "vertical" }, props)
const [local, events, rest] = splitProps(
merged,
@@ -188,7 +190,7 @@ export function ScrollView(props: ScrollViewProps) {
onClick={events.onClick as any}
tabIndex={0}
role="region"
- aria-label="scrollable content"
+ aria-label={i18n.t("ui.scrollView.ariaLabel")}
onKeyDown={(e) => {
onKeyDown(e)
if (typeof events.onKeyDown === "function") events.onKeyDown(e as any)
diff --git a/packages/ui/src/components/session-review.tsx b/packages/ui/src/components/session-review.tsx
index 5829401eb..77bd9506d 100644
--- a/packages/ui/src/components/session-review.tsx
+++ b/packages/ui/src/components/session-review.tsx
@@ -16,18 +16,8 @@ import { useFileComponent } from "../context/file"
import { useI18n } from "../context/i18n"
import { getDirectory, getFilename } from "@opencode-ai/util/path"
import { checksum } from "@opencode-ai/util/encode"
-import {
- createEffect,
- createMemo,
- createSignal,
- For,
- Match,
- onCleanup,
- Show,
- Switch,
- untrack,
- type JSX,
-} from "solid-js"
+import { createEffect, createMemo, createSignal, For, Match, Show, Switch, untrack, type JSX } from "solid-js"
+import { onCleanup } from "solid-js"
import { createStore } from "solid-js/store"
import { type FileContent, type FileDiff } from "@opencode-ai/sdk/v2"
import { PreloadMultiFileDiffResult } from "@pierre/diffs/ssr"
@@ -191,6 +181,15 @@ export const SessionReview = (props: SessionReviewProps) => {
highlightedFile = undefined
}
+ const openFileLabel = () => i18n.t("ui.sessionReview.openFile")
+
+ const selectionLabel = (range: SelectedLineRange) => {
+ const start = Math.min(range.start, range.end)
+ const end = Math.max(range.start, range.end)
+ if (start === end) return i18n.t("ui.sessionReview.selection.line", { line: start })
+ return i18n.t("ui.sessionReview.selection.lines", { start, end })
+ }
+
const focusSearch = () => {
if (!hasDiffs()) return
setSearchOpen(true)
@@ -475,7 +474,8 @@ export const SessionReview = (props: SessionReviewProps) => {
const wrapper = anchors.get(focus.file)
const anchor = wrapper?.querySelector(`[data-comment-id="${focus.id}"]`)
- const ready = anchor instanceof HTMLElement
+ const ready =
+ anchor instanceof HTMLElement && anchor.style.pointerEvents !== "none" && anchor.style.opacity !== "0"
const target = ready ? anchor : wrapper
if (!target) {
@@ -751,11 +751,11 @@ export const SessionReview = (props: SessionReviewProps) => {
</Show>
<span data-slot="session-review-filename">{getFilename(file)}</span>
<Show when={props.onViewFile}>
- <Tooltip value="Open file" placement="top" gutter={4}>
+ <Tooltip value={openFileLabel()} placement="top" gutter={4}>
<button
data-slot="session-review-view-button"
type="button"
- aria-label="Open file"
+ aria-label={openFileLabel()}
onClick={(e) => {
e.stopPropagation()
props.onViewFile?.(file)
diff --git a/packages/ui/src/i18n/ar.ts b/packages/ui/src/i18n/ar.ts
index 9739edf14..4eb1b4755 100644
--- a/packages/ui/src/i18n/ar.ts
+++ b/packages/ui/src/i18n/ar.ts
@@ -3,6 +3,9 @@ export const dict = {
"ui.sessionReview.title.lastTurn": "تغييرات آخر دور",
"ui.sessionReview.diffStyle.unified": "موحد",
"ui.sessionReview.diffStyle.split": "منقسم",
+ "ui.sessionReview.openFile": "فتح ملف",
+ "ui.sessionReview.selection.line": "سطر {{line}}",
+ "ui.sessionReview.selection.lines": "الأسطر {{start}}-{{end}}",
"ui.sessionReview.expandAll": "توسيع الكل",
"ui.sessionReview.collapseAll": "طي الكل",
"ui.sessionReview.change.added": "مضاف",
@@ -53,6 +56,13 @@ export const dict = {
"ui.sessionTurn.status.gatheringThoughts": "جمع الأفكار",
"ui.sessionTurn.status.consideringNextSteps": "النظر في الخطوات التالية",
+ "ui.messagePart.questions.dismissed": "تم رفض الأسئلة",
+ "ui.messagePart.context.read.one": "{{count}} قراءة",
+ "ui.messagePart.context.read.other": "{{count}} قراءات",
+ "ui.messagePart.context.search.one": "{{count}} بحث",
+ "ui.messagePart.context.search.other": "{{count}} عمليات بحث",
+ "ui.messagePart.context.list.one": "{{count}} قائمة",
+ "ui.messagePart.context.list.other": "{{count}} قوائم",
"ui.messagePart.diagnostic.error": "خطأ",
"ui.messagePart.title.edit": "تحرير",
"ui.messagePart.title.write": "كتابة",
@@ -72,6 +82,7 @@ export const dict = {
"ui.textField.copied": "تم النسخ",
"ui.imagePreview.alt": "معاينة الصورة",
+ "ui.scrollView.ariaLabel": "محتوى قابل للتمرير",
"ui.tool.read": "قراءة",
"ui.tool.loaded": "تم التحميل",
diff --git a/packages/ui/src/i18n/br.ts b/packages/ui/src/i18n/br.ts
index 36e4fa8d8..a2c3fb642 100644
--- a/packages/ui/src/i18n/br.ts
+++ b/packages/ui/src/i18n/br.ts
@@ -3,6 +3,9 @@ export const dict = {
"ui.sessionReview.title.lastTurn": "Alterações do último turno",
"ui.sessionReview.diffStyle.unified": "Unificado",
"ui.sessionReview.diffStyle.split": "Dividido",
+ "ui.sessionReview.openFile": "Abrir arquivo",
+ "ui.sessionReview.selection.line": "linha {{line}}",
+ "ui.sessionReview.selection.lines": "linhas {{start}}-{{end}}",
"ui.sessionReview.expandAll": "Expandir tudo",
"ui.sessionReview.collapseAll": "Recolher tudo",
"ui.sessionReview.change.added": "Adicionado",
@@ -53,6 +56,13 @@ export const dict = {
"ui.sessionTurn.status.gatheringThoughts": "Organizando pensamentos",
"ui.sessionTurn.status.consideringNextSteps": "Considerando próximos passos",
+ "ui.messagePart.questions.dismissed": "Perguntas descartadas",
+ "ui.messagePart.context.read.one": "{{count}} leitura",
+ "ui.messagePart.context.read.other": "{{count}} leituras",
+ "ui.messagePart.context.search.one": "{{count}} pesquisa",
+ "ui.messagePart.context.search.other": "{{count}} pesquisas",
+ "ui.messagePart.context.list.one": "{{count}} lista",
+ "ui.messagePart.context.list.other": "{{count}} listas",
"ui.messagePart.diagnostic.error": "Erro",
"ui.messagePart.title.edit": "Editar",
"ui.messagePart.title.write": "Escrever",
@@ -72,6 +82,7 @@ export const dict = {
"ui.textField.copied": "Copiado",
"ui.imagePreview.alt": "Visualização de imagem",
+ "ui.scrollView.ariaLabel": "conteúdo rolável",
"ui.tool.read": "Ler",
"ui.tool.loaded": "Carregado",
diff --git a/packages/ui/src/i18n/bs.ts b/packages/ui/src/i18n/bs.ts
index 6727cc50c..c75e158ba 100644
--- a/packages/ui/src/i18n/bs.ts
+++ b/packages/ui/src/i18n/bs.ts
@@ -7,6 +7,9 @@ export const dict = {
"ui.sessionReview.title.lastTurn": "Promjene u posljednjem potezu",
"ui.sessionReview.diffStyle.unified": "Ujedinjeno",
"ui.sessionReview.diffStyle.split": "Podijeljeno",
+ "ui.sessionReview.openFile": "Otvori fajl",
+ "ui.sessionReview.selection.line": "linija {{line}}",
+ "ui.sessionReview.selection.lines": "linije {{start}}-{{end}}",
"ui.sessionReview.expandAll": "Proširi sve",
"ui.sessionReview.collapseAll": "Sažmi sve",
"ui.sessionReview.change.added": "Dodano",
@@ -57,6 +60,13 @@ export const dict = {
"ui.sessionTurn.status.gatheringThoughts": "Sređivanje misli",
"ui.sessionTurn.status.consideringNextSteps": "Razmatranje sljedećih koraka",
+ "ui.messagePart.questions.dismissed": "Pitanja odbačena",
+ "ui.messagePart.context.read.one": "{{count}} čitanje",
+ "ui.messagePart.context.read.other": "{{count}} čitanja",
+ "ui.messagePart.context.search.one": "{{count}} pretraga",
+ "ui.messagePart.context.search.other": "{{count}} pretrage",
+ "ui.messagePart.context.list.one": "{{count}} lista",
+ "ui.messagePart.context.list.other": "{{count}} liste",
"ui.messagePart.diagnostic.error": "Greška",
"ui.messagePart.title.edit": "Uredi",
"ui.messagePart.title.write": "Napiši",
@@ -76,6 +86,7 @@ export const dict = {
"ui.textField.copied": "Kopirano",
"ui.imagePreview.alt": "Pregled slike",
+ "ui.scrollView.ariaLabel": "sadržaj za pomjeranje",
"ui.tool.read": "Čitanje",
"ui.tool.loaded": "Učitano",
diff --git a/packages/ui/src/i18n/da.ts b/packages/ui/src/i18n/da.ts
index 48afb6cbe..59c18e8e9 100644
--- a/packages/ui/src/i18n/da.ts
+++ b/packages/ui/src/i18n/da.ts
@@ -3,6 +3,9 @@ export const dict = {
"ui.sessionReview.title.lastTurn": "Ændringer fra sidste tur",
"ui.sessionReview.diffStyle.unified": "Samlet",
"ui.sessionReview.diffStyle.split": "Opdelt",
+ "ui.sessionReview.openFile": "Åbn fil",
+ "ui.sessionReview.selection.line": "linje {{line}}",
+ "ui.sessionReview.selection.lines": "linjer {{start}}-{{end}}",
"ui.sessionReview.expandAll": "Udvid alle",
"ui.sessionReview.collapseAll": "Skjul alle",
@@ -52,6 +55,13 @@ export const dict = {
"ui.sessionTurn.status.gatheringThoughts": "Samler tanker",
"ui.sessionTurn.status.consideringNextSteps": "Overvejer næste skridt",
+ "ui.messagePart.questions.dismissed": "Spørgsmål afvist",
+ "ui.messagePart.context.read.one": "{{count}} læsning",
+ "ui.messagePart.context.read.other": "{{count}} læsninger",
+ "ui.messagePart.context.search.one": "{{count}} søgning",
+ "ui.messagePart.context.search.other": "{{count}} søgninger",
+ "ui.messagePart.context.list.one": "{{count}} liste",
+ "ui.messagePart.context.list.other": "{{count}} lister",
"ui.messagePart.diagnostic.error": "Fejl",
"ui.messagePart.title.edit": "Rediger",
"ui.messagePart.title.write": "Skriv",
@@ -71,6 +81,7 @@ export const dict = {
"ui.textField.copied": "Kopieret",
"ui.imagePreview.alt": "Billedforhåndsvisning",
+ "ui.scrollView.ariaLabel": "rulbart indhold",
"ui.tool.read": "Læs",
"ui.tool.loaded": "Indlæst",
diff --git a/packages/ui/src/i18n/de.ts b/packages/ui/src/i18n/de.ts
index 5f4225343..b3fb61061 100644
--- a/packages/ui/src/i18n/de.ts
+++ b/packages/ui/src/i18n/de.ts
@@ -7,6 +7,9 @@ export const dict = {
"ui.sessionReview.title.lastTurn": "Änderungen der letzten Runde",
"ui.sessionReview.diffStyle.unified": "Vereinheitlicht",
"ui.sessionReview.diffStyle.split": "Geteilt",
+ "ui.sessionReview.openFile": "Datei öffnen",
+ "ui.sessionReview.selection.line": "Zeile {{line}}",
+ "ui.sessionReview.selection.lines": "Zeilen {{start}}-{{end}}",
"ui.sessionReview.expandAll": "Alle erweitern",
"ui.sessionReview.collapseAll": "Alle reduzieren",
@@ -58,6 +61,13 @@ export const dict = {
"ui.sessionTurn.status.gatheringThoughts": "Gedanken sammeln",
"ui.sessionTurn.status.consideringNextSteps": "Nächste Schritte erwägen",
+ "ui.messagePart.questions.dismissed": "Fragen verworfen",
+ "ui.messagePart.context.read.one": "{{count}} Lesevorgang",
+ "ui.messagePart.context.read.other": "{{count}} Lesevorgänge",
+ "ui.messagePart.context.search.one": "{{count}} Suche",
+ "ui.messagePart.context.search.other": "{{count}} Suchen",
+ "ui.messagePart.context.list.one": "{{count}} Liste",
+ "ui.messagePart.context.list.other": "{{count}} Listen",
"ui.messagePart.diagnostic.error": "Fehler",
"ui.messagePart.title.edit": "Bearbeiten",
"ui.messagePart.title.write": "Schreiben",
@@ -77,6 +87,7 @@ export const dict = {
"ui.textField.copied": "Kopiert",
"ui.imagePreview.alt": "Bildvorschau",
+ "ui.scrollView.ariaLabel": "scrollbarer Inhalt",
"ui.tool.read": "Lesen",
"ui.tool.loaded": "Geladen",
diff --git a/packages/ui/src/i18n/en.ts b/packages/ui/src/i18n/en.ts
index fe1b2ee89..ba4ff62fb 100644
--- a/packages/ui/src/i18n/en.ts
+++ b/packages/ui/src/i18n/en.ts
@@ -1,4 +1,4 @@
-export const dict = {
+export const dict: Record<string, string> = {
"ui.sessionReview.title": "Session changes",
"ui.sessionReview.title.lastTurn": "Last turn changes",
"ui.sessionReview.diffStyle.unified": "Unified",
@@ -13,6 +13,9 @@ export const dict = {
"ui.sessionReview.largeDiff.title": "Diff too large to render",
"ui.sessionReview.largeDiff.meta": "Limit: {{limit}} changed lines. Current: {{current}} changed lines.",
"ui.sessionReview.largeDiff.renderAnyway": "Render anyway",
+ "ui.sessionReview.openFile": "Open file",
+ "ui.sessionReview.selection.line": "line {{line}}",
+ "ui.sessionReview.selection.lines": "lines {{start}}-{{end}}",
"ui.fileMedia.kind.image": "image",
"ui.fileMedia.kind.audio": "audio",
@@ -59,6 +62,13 @@ export const dict = {
"ui.messagePart.title.write": "Write",
"ui.messagePart.option.typeOwnAnswer": "Type your own answer",
"ui.messagePart.review.title": "Review your answers",
+ "ui.messagePart.questions.dismissed": "Questions dismissed",
+ "ui.messagePart.context.read.one": "{{count}} read",
+ "ui.messagePart.context.read.other": "{{count}} reads",
+ "ui.messagePart.context.search.one": "{{count}} search",
+ "ui.messagePart.context.search.other": "{{count}} searches",
+ "ui.messagePart.context.list.one": "{{count}} list",
+ "ui.messagePart.context.list.other": "{{count}} lists",
"ui.list.loading": "Loading",
"ui.list.empty": "No results",
@@ -73,6 +83,7 @@ export const dict = {
"ui.textField.copied": "Copied",
"ui.imagePreview.alt": "Image preview",
+ "ui.scrollView.ariaLabel": "scrollable content",
"ui.tool.read": "Read",
"ui.tool.loaded": "Loaded",
diff --git a/packages/ui/src/i18n/es.ts b/packages/ui/src/i18n/es.ts
index 124a3c387..0b4566c9b 100644
--- a/packages/ui/src/i18n/es.ts
+++ b/packages/ui/src/i18n/es.ts
@@ -3,6 +3,9 @@ export const dict = {
"ui.sessionReview.title.lastTurn": "Cambios del último turno",
"ui.sessionReview.diffStyle.unified": "Unificado",
"ui.sessionReview.diffStyle.split": "Dividido",
+ "ui.sessionReview.openFile": "Abrir archivo",
+ "ui.sessionReview.selection.line": "línea {{line}}",
+ "ui.sessionReview.selection.lines": "líneas {{start}}-{{end}}",
"ui.sessionReview.expandAll": "Expandir todo",
"ui.sessionReview.collapseAll": "Colapsar todo",
"ui.sessionReview.change.added": "Añadido",
@@ -53,6 +56,13 @@ export const dict = {
"ui.sessionTurn.status.gatheringThoughts": "Recopilando pensamientos",
"ui.sessionTurn.status.consideringNextSteps": "Considerando siguientes pasos",
+ "ui.messagePart.questions.dismissed": "Preguntas descartadas",
+ "ui.messagePart.context.read.one": "{{count}} lectura",
+ "ui.messagePart.context.read.other": "{{count}} lecturas",
+ "ui.messagePart.context.search.one": "{{count}} búsqueda",
+ "ui.messagePart.context.search.other": "{{count}} búsquedas",
+ "ui.messagePart.context.list.one": "{{count}} lista",
+ "ui.messagePart.context.list.other": "{{count}} listas",
"ui.messagePart.diagnostic.error": "Error",
"ui.messagePart.title.edit": "Editar",
"ui.messagePart.title.write": "Escribir",
@@ -72,6 +82,7 @@ export const dict = {
"ui.textField.copied": "Copiado",
"ui.imagePreview.alt": "Vista previa de imagen",
+ "ui.scrollView.ariaLabel": "contenido desplazable",
"ui.tool.read": "Leer",
"ui.tool.loaded": "Cargado",
diff --git a/packages/ui/src/i18n/fr.ts b/packages/ui/src/i18n/fr.ts
index 13fda5891..4092fac9a 100644
--- a/packages/ui/src/i18n/fr.ts
+++ b/packages/ui/src/i18n/fr.ts
@@ -3,6 +3,9 @@ export const dict = {
"ui.sessionReview.title.lastTurn": "Modifications du dernier tour",
"ui.sessionReview.diffStyle.unified": "Unifié",
"ui.sessionReview.diffStyle.split": "Divisé",
+ "ui.sessionReview.openFile": "Ouvrir le fichier",
+ "ui.sessionReview.selection.line": "ligne {{line}}",
+ "ui.sessionReview.selection.lines": "lignes {{start}}-{{end}}",
"ui.sessionReview.expandAll": "Tout développer",
"ui.sessionReview.collapseAll": "Tout réduire",
"ui.sessionReview.change.added": "Ajouté",
@@ -53,6 +56,13 @@ export const dict = {
"ui.sessionTurn.status.gatheringThoughts": "Rassemblement des idées",
"ui.sessionTurn.status.consideringNextSteps": "Examen des prochaines étapes",
+ "ui.messagePart.questions.dismissed": "Questions ignorées",
+ "ui.messagePart.context.read.one": "{{count}} lecture",
+ "ui.messagePart.context.read.other": "{{count}} lectures",
+ "ui.messagePart.context.search.one": "{{count}} recherche",
+ "ui.messagePart.context.search.other": "{{count}} recherches",
+ "ui.messagePart.context.list.one": "{{count}} liste",
+ "ui.messagePart.context.list.other": "{{count}} listes",
"ui.messagePart.diagnostic.error": "Erreur",
"ui.messagePart.title.edit": "Modifier",
"ui.messagePart.title.write": "Écrire",
@@ -72,6 +82,7 @@ export const dict = {
"ui.textField.copied": "Copié",
"ui.imagePreview.alt": "Aperçu de l'image",
+ "ui.scrollView.ariaLabel": "contenu défilable",
"ui.tool.read": "Lire",
"ui.tool.loaded": "Chargé",
diff --git a/packages/ui/src/i18n/ja.ts b/packages/ui/src/i18n/ja.ts
index 27e7f32ab..ea855d1b7 100644
--- a/packages/ui/src/i18n/ja.ts
+++ b/packages/ui/src/i18n/ja.ts
@@ -3,6 +3,9 @@ export const dict = {
"ui.sessionReview.title.lastTurn": "前回ターンの変更",
"ui.sessionReview.diffStyle.unified": "Unified",
"ui.sessionReview.diffStyle.split": "Split",
+ "ui.sessionReview.openFile": "ファイルを開く",
+ "ui.sessionReview.selection.line": "{{line}} 行目",
+ "ui.sessionReview.selection.lines": "{{start}}-{{end}} 行目",
"ui.sessionReview.expandAll": "すべて展開",
"ui.sessionReview.collapseAll": "すべて折りたたむ",
@@ -52,6 +55,13 @@ export const dict = {
"ui.sessionTurn.status.gatheringThoughts": "考えをまとめています",
"ui.sessionTurn.status.consideringNextSteps": "次のステップを検討中",
+ "ui.messagePart.questions.dismissed": "質問をスキップしました",
+ "ui.messagePart.context.read.one": "{{count}} 件の読み取り",
+ "ui.messagePart.context.read.other": "{{count}} 件の読み取り",
+ "ui.messagePart.context.search.one": "{{count}} 件の検索",
+ "ui.messagePart.context.search.other": "{{count}} 件の検索",
+ "ui.messagePart.context.list.one": "{{count}} 件のリスト",
+ "ui.messagePart.context.list.other": "{{count}} 件のリスト",
"ui.messagePart.diagnostic.error": "エラー",
"ui.messagePart.title.edit": "編集",
"ui.messagePart.title.write": "作成",
@@ -71,6 +81,7 @@ export const dict = {
"ui.textField.copied": "コピーしました",
"ui.imagePreview.alt": "画像プレビュー",
+ "ui.scrollView.ariaLabel": "スクロール可能なコンテンツ",
"ui.tool.read": "読み込み",
"ui.tool.loaded": "読み込み済み",
diff --git a/packages/ui/src/i18n/ko.ts b/packages/ui/src/i18n/ko.ts
index 4ac8f4a30..80de94e95 100644
--- a/packages/ui/src/i18n/ko.ts
+++ b/packages/ui/src/i18n/ko.ts
@@ -3,6 +3,9 @@ export const dict = {
"ui.sessionReview.title.lastTurn": "마지막 턴 변경 사항",
"ui.sessionReview.diffStyle.unified": "통합 보기",
"ui.sessionReview.diffStyle.split": "분할 보기",
+ "ui.sessionReview.openFile": "파일 열기",
+ "ui.sessionReview.selection.line": "{{line}}번 줄",
+ "ui.sessionReview.selection.lines": "{{start}}-{{end}}번 줄",
"ui.sessionReview.expandAll": "모두 펼치기",
"ui.sessionReview.collapseAll": "모두 접기",
"ui.sessionReview.change.added": "추가됨",
@@ -53,6 +56,13 @@ export const dict = {
"ui.sessionTurn.status.gatheringThoughts": "생각 정리 중",
"ui.sessionTurn.status.consideringNextSteps": "다음 단계 고려 중",
+ "ui.messagePart.questions.dismissed": "질문 무시됨",
+ "ui.messagePart.context.read.one": "{{count}}개 읽음",
+ "ui.messagePart.context.read.other": "{{count}}개 읽음",
+ "ui.messagePart.context.search.one": "{{count}}개 검색",
+ "ui.messagePart.context.search.other": "{{count}}개 검색",
+ "ui.messagePart.context.list.one": "{{count}}개 목록",
+ "ui.messagePart.context.list.other": "{{count}}개 목록",
"ui.messagePart.diagnostic.error": "오류",
"ui.messagePart.title.edit": "편집",
"ui.messagePart.title.write": "작성",
@@ -72,6 +82,7 @@ export const dict = {
"ui.textField.copied": "복사됨",
"ui.imagePreview.alt": "이미지 미리보기",
+ "ui.scrollView.ariaLabel": "스크롤 가능한 콘텐츠",
"ui.tool.read": "읽기",
"ui.tool.loaded": "로드됨",
diff --git a/packages/ui/src/i18n/no.ts b/packages/ui/src/i18n/no.ts
index 5f414209b..77f6df554 100644
--- a/packages/ui/src/i18n/no.ts
+++ b/packages/ui/src/i18n/no.ts
@@ -6,6 +6,9 @@ export const dict: Record<Keys, string> = {
"ui.sessionReview.title.lastTurn": "Endringer i siste tur",
"ui.sessionReview.diffStyle.unified": "Samlet",
"ui.sessionReview.diffStyle.split": "Delt",
+ "ui.sessionReview.openFile": "Åpne fil",
+ "ui.sessionReview.selection.line": "linje {{line}}",
+ "ui.sessionReview.selection.lines": "linjer {{start}}-{{end}}",
"ui.sessionReview.expandAll": "Utvid alle",
"ui.sessionReview.collapseAll": "Fold sammen alle",
"ui.sessionReview.change.added": "Lagt til",
@@ -56,6 +59,13 @@ export const dict: Record<Keys, string> = {
"ui.sessionTurn.status.gatheringThoughts": "Samler tanker",
"ui.sessionTurn.status.consideringNextSteps": "Vurderer neste trinn",
+ "ui.messagePart.questions.dismissed": "Spørsmål avvist",
+ "ui.messagePart.context.read.one": "{{count}} lest",
+ "ui.messagePart.context.read.other": "{{count}} lest",
+ "ui.messagePart.context.search.one": "{{count}} søk",
+ "ui.messagePart.context.search.other": "{{count}} søk",
+ "ui.messagePart.context.list.one": "{{count}} liste",
+ "ui.messagePart.context.list.other": "{{count}} lister",
"ui.messagePart.diagnostic.error": "Feil",
"ui.messagePart.title.edit": "Rediger",
"ui.messagePart.title.write": "Skriv",
@@ -75,6 +85,7 @@ export const dict: Record<Keys, string> = {
"ui.textField.copied": "Kopiert",
"ui.imagePreview.alt": "Bildeforhåndsvisning",
+ "ui.scrollView.ariaLabel": "rullbart innhold",
"ui.tool.read": "Les",
"ui.tool.loaded": "Lastet",
diff --git a/packages/ui/src/i18n/pl.ts b/packages/ui/src/i18n/pl.ts
index b0ef94dd4..877e6505f 100644
--- a/packages/ui/src/i18n/pl.ts
+++ b/packages/ui/src/i18n/pl.ts
@@ -3,6 +3,9 @@ export const dict = {
"ui.sessionReview.title.lastTurn": "Zmiany z ostatniej tury",
"ui.sessionReview.diffStyle.unified": "Ujednolicony",
"ui.sessionReview.diffStyle.split": "Podzielony",
+ "ui.sessionReview.openFile": "Otwórz plik",
+ "ui.sessionReview.selection.line": "linia {{line}}",
+ "ui.sessionReview.selection.lines": "linie {{start}}-{{end}}",
"ui.sessionReview.expandAll": "Rozwiń wszystko",
"ui.sessionReview.collapseAll": "Zwiń wszystko",
@@ -52,6 +55,13 @@ export const dict = {
"ui.sessionTurn.status.gatheringThoughts": "Zbieranie myśli",
"ui.sessionTurn.status.consideringNextSteps": "Rozważanie kolejnych kroków",
+ "ui.messagePart.questions.dismissed": "Pytania odrzucone",
+ "ui.messagePart.context.read.one": "{{count}} odczyt",
+ "ui.messagePart.context.read.other": "{{count}} odczyty",
+ "ui.messagePart.context.search.one": "{{count}} wyszukiwanie",
+ "ui.messagePart.context.search.other": "{{count}} wyszukiwania",
+ "ui.messagePart.context.list.one": "{{count}} lista",
+ "ui.messagePart.context.list.other": "{{count}} listy",
"ui.messagePart.diagnostic.error": "Błąd",
"ui.messagePart.title.edit": "Edycja",
"ui.messagePart.title.write": "Pisanie",
@@ -71,6 +81,7 @@ export const dict = {
"ui.textField.copied": "Skopiowano",
"ui.imagePreview.alt": "Podgląd obrazu",
+ "ui.scrollView.ariaLabel": "treść przewijana",
"ui.tool.read": "Odczyt",
"ui.tool.loaded": "Załadowano",
diff --git a/packages/ui/src/i18n/ru.ts b/packages/ui/src/i18n/ru.ts
index 6c2eb290d..545be1b63 100644
--- a/packages/ui/src/i18n/ru.ts
+++ b/packages/ui/src/i18n/ru.ts
@@ -3,6 +3,9 @@ export const dict = {
"ui.sessionReview.title.lastTurn": "Изменения последнего хода",
"ui.sessionReview.diffStyle.unified": "Объединённый",
"ui.sessionReview.diffStyle.split": "Разделённый",
+ "ui.sessionReview.openFile": "Открыть файл",
+ "ui.sessionReview.selection.line": "строка {{line}}",
+ "ui.sessionReview.selection.lines": "строки {{start}}-{{end}}",
"ui.sessionReview.expandAll": "Развернуть всё",
"ui.sessionReview.collapseAll": "Свернуть всё",
@@ -52,6 +55,13 @@ export const dict = {
"ui.sessionTurn.status.gatheringThoughts": "Сбор мыслей",
"ui.sessionTurn.status.consideringNextSteps": "Рассмотрение следующих шагов",
+ "ui.messagePart.questions.dismissed": "Вопросы отклонены",
+ "ui.messagePart.context.read.one": "{{count}} чтение",
+ "ui.messagePart.context.read.other": "{{count}} чтений",
+ "ui.messagePart.context.search.one": "{{count}} поиск",
+ "ui.messagePart.context.search.other": "{{count}} поисков",
+ "ui.messagePart.context.list.one": "{{count}} список",
+ "ui.messagePart.context.list.other": "{{count}} списков",
"ui.messagePart.diagnostic.error": "Ошибка",
"ui.messagePart.title.edit": "Редактировать",
"ui.messagePart.title.write": "Написать",
@@ -71,6 +81,7 @@ export const dict = {
"ui.textField.copied": "Скопировано",
"ui.imagePreview.alt": "Предпросмотр изображения",
+ "ui.scrollView.ariaLabel": "прокручиваемый контент",
"ui.tool.read": "Чтение",
"ui.tool.loaded": "Загружено",
diff --git a/packages/ui/src/i18n/th.ts b/packages/ui/src/i18n/th.ts
index 091d1b70c..54b3db649 100644
--- a/packages/ui/src/i18n/th.ts
+++ b/packages/ui/src/i18n/th.ts
@@ -3,6 +3,9 @@ export const dict = {
"ui.sessionReview.title.lastTurn": "การเปลี่ยนแปลงของเทิร์นล่าสุด",
"ui.sessionReview.diffStyle.unified": "แบบรวม",
"ui.sessionReview.diffStyle.split": "แบบแยก",
+ "ui.sessionReview.openFile": "เปิดไฟล์",
+ "ui.sessionReview.selection.line": "บรรทัดที่ {{line}}",
+ "ui.sessionReview.selection.lines": "บรรทัดที่ {{start}}-{{end}}",
"ui.sessionReview.expandAll": "ขยายทั้งหมด",
"ui.sessionReview.collapseAll": "ย่อทั้งหมด",
"ui.sessionReview.change.added": "เพิ่ม",
@@ -54,6 +57,13 @@ export const dict = {
"ui.sessionTurn.status.gatheringThoughts": "รวบรวมความคิด",
"ui.sessionTurn.status.consideringNextSteps": "พิจารณาขั้นตอนถัดไป",
+ "ui.messagePart.questions.dismissed": "ละทิ้งคำถามแล้ว",
+ "ui.messagePart.context.read.one": "อ่าน {{count}} รายการ",
+ "ui.messagePart.context.read.other": "อ่าน {{count}} รายการ",
+ "ui.messagePart.context.search.one": "ค้นหา {{count}} รายการ",
+ "ui.messagePart.context.search.other": "ค้นหา {{count}} รายการ",
+ "ui.messagePart.context.list.one": "รายการ {{count}} รายการ",
+ "ui.messagePart.context.list.other": "รายการ {{count}} รายการ",
"ui.messagePart.diagnostic.error": "ข้อผิดพลาด",
"ui.messagePart.title.edit": "แก้ไข",
"ui.messagePart.title.write": "เขียน",
@@ -73,6 +83,7 @@ export const dict = {
"ui.textField.copied": "คัดลอกแล้ว",
"ui.imagePreview.alt": "ตัวอย่างรูปภาพ",
+ "ui.scrollView.ariaLabel": "เนื้อหาที่เลื่อนได้",
"ui.tool.read": "อ่าน",
"ui.tool.loaded": "โหลดแล้ว",
diff --git a/packages/ui/src/i18n/tr.ts b/packages/ui/src/i18n/tr.ts
index 15db281cd..b68a9b257 100644
--- a/packages/ui/src/i18n/tr.ts
+++ b/packages/ui/src/i18n/tr.ts
@@ -7,6 +7,9 @@ export const dict = {
"ui.sessionReview.title.lastTurn": "Son tur değişiklikleri",
"ui.sessionReview.diffStyle.unified": "Birleşik",
"ui.sessionReview.diffStyle.split": "Bölünmüş",
+ "ui.sessionReview.openFile": "Dosyayı aç",
+ "ui.sessionReview.selection.line": "satır {{line}}",
+ "ui.sessionReview.selection.lines": "satırlar {{start}}-{{end}}",
"ui.sessionReview.expandAll": "Tümünü genişlet",
"ui.sessionReview.collapseAll": "Tümünü daralt",
@@ -49,6 +52,13 @@ export const dict = {
"ui.sessionTurn.status.gatheringThoughts": "Düşünceler toplanıyor",
"ui.sessionTurn.status.consideringNextSteps": "Sonraki adımlar değerlendiriliyor",
+ "ui.messagePart.questions.dismissed": "Sorular reddedildi",
+ "ui.messagePart.context.read.one": "{{count}} okuma",
+ "ui.messagePart.context.read.other": "{{count}} okuma",
+ "ui.messagePart.context.search.one": "{{count}} arama",
+ "ui.messagePart.context.search.other": "{{count}} arama",
+ "ui.messagePart.context.list.one": "{{count}} liste",
+ "ui.messagePart.context.list.other": "{{count}} liste",
"ui.messagePart.diagnostic.error": "Hata",
"ui.messagePart.title.edit": "Düzenle",
"ui.messagePart.title.write": "Yaz",
@@ -68,6 +78,7 @@ export const dict = {
"ui.textField.copied": "Kopyalandı",
"ui.imagePreview.alt": "Görsel önizleme",
+ "ui.scrollView.ariaLabel": "kaydırılabilir içerik",
"ui.tool.read": "Oku",
"ui.tool.loaded": "Yüklendi",
diff --git a/packages/ui/src/i18n/zh.ts b/packages/ui/src/i18n/zh.ts
index 8e7d9fcd2..9a00e2dc9 100644
--- a/packages/ui/src/i18n/zh.ts
+++ b/packages/ui/src/i18n/zh.ts
@@ -7,6 +7,9 @@ export const dict = {
"ui.sessionReview.title.lastTurn": "上一轮变更",
"ui.sessionReview.diffStyle.unified": "统一",
"ui.sessionReview.diffStyle.split": "拆分",
+ "ui.sessionReview.openFile": "打开文件",
+ "ui.sessionReview.selection.line": "第 {{line}} 行",
+ "ui.sessionReview.selection.lines": "第 {{start}}-{{end}} 行",
"ui.sessionReview.expandAll": "全部展开",
"ui.sessionReview.collapseAll": "全部收起",
"ui.sessionReview.change.added": "已添加",
@@ -57,6 +60,13 @@ export const dict = {
"ui.sessionTurn.status.gatheringThoughts": "正在整理思路",
"ui.sessionTurn.status.consideringNextSteps": "正在考虑下一步",
+ "ui.messagePart.questions.dismissed": "问题已忽略",
+ "ui.messagePart.context.read.one": "{{count}} 次读取",
+ "ui.messagePart.context.read.other": "{{count}} 次读取",
+ "ui.messagePart.context.search.one": "{{count}} 次搜索",
+ "ui.messagePart.context.search.other": "{{count}} 次搜索",
+ "ui.messagePart.context.list.one": "{{count}} 个列表",
+ "ui.messagePart.context.list.other": "{{count}} 个列表",
"ui.messagePart.diagnostic.error": "错误",
"ui.messagePart.title.edit": "编辑",
"ui.messagePart.title.write": "写入",
@@ -76,6 +86,7 @@ export const dict = {
"ui.textField.copied": "已复制",
"ui.imagePreview.alt": "图片预览",
+ "ui.scrollView.ariaLabel": "可滚动内容",
"ui.tool.read": "读取",
"ui.tool.loaded": "已加载",
diff --git a/packages/ui/src/i18n/zht.ts b/packages/ui/src/i18n/zht.ts
index 781cde457..81a140d93 100644
--- a/packages/ui/src/i18n/zht.ts
+++ b/packages/ui/src/i18n/zht.ts
@@ -7,6 +7,9 @@ export const dict = {
"ui.sessionReview.title.lastTurn": "上一輪變更",
"ui.sessionReview.diffStyle.unified": "整合",
"ui.sessionReview.diffStyle.split": "拆分",
+ "ui.sessionReview.openFile": "開啟檔案",
+ "ui.sessionReview.selection.line": "第 {{line}} 行",
+ "ui.sessionReview.selection.lines": "第 {{start}}-{{end}} 行",
"ui.sessionReview.expandAll": "全部展開",
"ui.sessionReview.collapseAll": "全部收合",
"ui.sessionReview.change.added": "已新增",
@@ -57,6 +60,13 @@ export const dict = {
"ui.sessionTurn.status.gatheringThoughts": "正在整理思緒",
"ui.sessionTurn.status.consideringNextSteps": "正在考慮下一步",
+ "ui.messagePart.questions.dismissed": "問題已略過",
+ "ui.messagePart.context.read.one": "{{count}} 次讀取",
+ "ui.messagePart.context.read.other": "{{count}} 次讀取",
+ "ui.messagePart.context.search.one": "{{count}} 次搜尋",
+ "ui.messagePart.context.search.other": "{{count}} 次搜尋",
+ "ui.messagePart.context.list.one": "{{count}} 個清單",
+ "ui.messagePart.context.list.other": "{{count}} 個清單",
"ui.messagePart.diagnostic.error": "錯誤",
"ui.messagePart.title.edit": "編輯",
"ui.messagePart.title.write": "寫入",
@@ -76,6 +86,7 @@ export const dict = {
"ui.textField.copied": "已複製",
"ui.imagePreview.alt": "圖片預覽",
+ "ui.scrollView.ariaLabel": "可捲動內容",
"ui.tool.read": "讀取",
"ui.tool.loaded": "已載入",