Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion packages/opencode/src/cli/cmd/tui/component/dialog-agent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ import { createMemo } from "solid-js"
import { useLocal } from "@tui/context/local"
import { DialogSelect } from "@tui/ui/dialog-select"
import { useDialog } from "@tui/ui/dialog"
import { useLanguage } from "@tui/context/language"

export function DialogAgent() {
const local = useLocal()
const dialog = useDialog()
const { t } = useLanguage()

const options = createMemo(() =>
local.agent.list().map((item) => {
Expand All @@ -19,7 +21,7 @@ export function DialogAgent() {

return (
<DialogSelect
title="Select agent"
title={t("tui.dialog.agent.title")}
current={local.agent.current()?.name}
options={options()}
onSelect={(option) => {
Expand Down
4 changes: 3 additions & 1 deletion packages/opencode/src/cli/cmd/tui/component/dialog-mcp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { useSync } from "@tui/context/sync"
import { map, pipe, entries, sortBy } from "remeda"
import { DialogSelect, type DialogSelectRef, type DialogSelectOption } from "@tui/ui/dialog-select"
import { useTheme } from "../context/theme"
import { useLanguage } from "../context/language"
import { Keybind } from "@/util"
import { TextAttributes } from "@opentui/core"
import { useSDK } from "@tui/context/sdk"
Expand All @@ -23,6 +24,7 @@ export function DialogMcp() {
const local = useLocal()
const sync = useSync()
const sdk = useSDK()
const { t } = useLanguage()
const [, setRef] = createSignal<DialogSelectRef<unknown>>()
const [loading, setLoading] = createSignal<string | null>(null)

Expand Down Expand Up @@ -75,7 +77,7 @@ export function DialogMcp() {
return (
<DialogSelect
ref={setRef}
title="MCPs"
title={t("tui.dialog.mcp.title")}
options={options()}
keybind={keybinds()}
onSelect={(_option) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { useSDK } from "../context/sdk"
import { DialogPrompt } from "../ui/dialog-prompt"
import { Link } from "../ui/link"
import { useTheme } from "../context/theme"
import { useLanguage } from "../context/language"
import { TextAttributes } from "@opentui/core"
import type { ProviderAuthAuthorization, ProviderAuthMethod } from "@mimo-ai/sdk/v2"
import { DialogModel } from "./dialog-model"
Expand All @@ -30,6 +31,7 @@ export function createDialogProviderOptions() {
const sdk = useSDK()
const toast = useToast()
const { theme } = useTheme()
const { t } = useLanguage()
const options = createMemo(() => {
const list = pipe(
sync.data.provider_next.all,
Expand Down Expand Up @@ -65,7 +67,7 @@ export function createDialogProviderOptions() {
dialog.replace(
() => (
<DialogSelect
title="Select auth method"
title={t("tui.dialog.provider.select_auth")}
options={methods.map((x, index) => ({
title: x.label,
value: index,
Expand Down Expand Up @@ -159,7 +161,8 @@ export function createDialogProviderOptions() {

export function DialogProvider() {
const options = createDialogProviderOptions()
return <DialogSelect title="Connect a provider" options={options()} />
const { t } = useLanguage()
return <DialogSelect title={t("tui.dialog.provider.title")} options={options()} />
}

export async function runCustomProviderWizard(opts: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ export function DialogSessionList() {

return (
<DialogSelect
title="Sessions"
title={t("tui.dialog.session_list.title")}
options={options()}
skipFilter={true}
current={currentSessionID()}
Expand Down
4 changes: 3 additions & 1 deletion packages/opencode/src/cli/cmd/tui/component/dialog-skill.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { createResource, createMemo } from "solid-js"
import { useDialog } from "@tui/ui/dialog"
import { useSDK } from "@tui/context/sdk"
import { useLocal } from "@tui/context/local"
import { useLanguage } from "@tui/context/language"

export type DialogSkillProps = {
onSelect: (skill: string) => void
Expand All @@ -12,6 +13,7 @@ export function DialogSkill(props: DialogSkillProps) {
const dialog = useDialog()
const sdk = useSDK()
const local = useLocal()
const { t } = useLanguage()
dialog.setSize("large")

const [skills] = createResource(async () => {
Expand All @@ -38,5 +40,5 @@ export function DialogSkill(props: DialogSkillProps) {
}))
})

return <DialogSelect title="Skills" placeholder="Search skills..." options={options()} />
return <DialogSelect title={t("tui.dialog.skill.title")} placeholder={t("tui.dialog.skill.placeholder")} options={options()} />
}
4 changes: 3 additions & 1 deletion packages/opencode/src/cli/cmd/tui/component/dialog-stash.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { DialogSelect } from "@tui/ui/dialog-select"
import { createMemo, createSignal } from "solid-js"
import { Locale } from "@/util"
import { useTheme } from "../context/theme"
import { useLanguage } from "../context/language"
import { useKeybind } from "../context/keybind"
import { usePromptStash, type StashEntry } from "./prompt/stash"

Expand Down Expand Up @@ -31,6 +32,7 @@ export function DialogStash(props: { onSelect: (entry: StashEntry) => void }) {
const stash = usePromptStash()
const { theme } = useTheme()
const keybind = useKeybind()
const { t } = useLanguage()

const [toDelete, setToDelete] = createSignal<number>()

Expand All @@ -54,7 +56,7 @@ export function DialogStash(props: { onSelect: (entry: StashEntry) => void }) {

return (
<DialogSelect
title="Stash"
title={t("tui.dialog.stash.title")}
options={options()}
onMove={() => {
setToDelete(undefined)
Expand Down
4 changes: 3 additions & 1 deletion packages/opencode/src/cli/cmd/tui/component/dialog-tag.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ import { createMemo, createResource } from "solid-js"
import { DialogSelect } from "@tui/ui/dialog-select"
import { useDialog } from "@tui/ui/dialog"
import { useSDK } from "@tui/context/sdk"
import { useLanguage } from "@tui/context/language"
import { createStore } from "solid-js/store"

export function DialogTag(props: { onSelect?: (value: string) => void }) {
const sdk = useSDK()
const dialog = useDialog()
const { t } = useLanguage()

const [store] = createStore({
filter: "",
Expand All @@ -33,7 +35,7 @@ export function DialogTag(props: { onSelect?: (value: string) => void }) {

return (
<DialogSelect
title="Autocomplete"
title={t("tui.dialog.tag.title")}
options={options()}
onSelect={(option) => {
props.onSelect?.(option.value)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { DialogSelect, type DialogSelectRef } from "../ui/dialog-select"
import { useTheme } from "../context/theme"
import { useDialog } from "../ui/dialog"
import { useLanguage } from "../context/language"
import { onCleanup } from "solid-js"

export function DialogThemeList() {
const theme = useTheme()
const { t } = useLanguage()
const options = Object.keys(theme.all())
.sort((a, b) => a.localeCompare(b, undefined, { sensitivity: "base" }))
.map((value) => ({
Expand All @@ -22,7 +24,7 @@ export function DialogThemeList() {

return (
<DialogSelect
title="Themes"
title={t("tui.dialog.theme_list.title")}
options={options}
current={initial}
onMove={(opt) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ import { createMemo } from "solid-js"
import { useLocal } from "@tui/context/local"
import { DialogSelect } from "@tui/ui/dialog-select"
import { useDialog } from "@tui/ui/dialog"
import { useLanguage } from "@tui/context/language"

export function DialogVariant() {
const local = useLocal()
const dialog = useDialog()
const { t } = useLanguage()

const options = createMemo(() => {
return [
Expand All @@ -31,7 +33,7 @@ export function DialogVariant() {
return (
<DialogSelect<string>
options={options()}
title={"Select variant"}
title={t("tui.dialog.variant.title")}
current={local.model.variant.selected()}
flat={true}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,14 @@ import { DialogConfirm } from "@tui/ui/dialog-confirm"
import { DialogSelect, type DialogSelectOption } from "@tui/ui/dialog-select"
import { useRoute } from "@tui/context/route"
import { useSync } from "@tui/context/sync"
import { useLanguage } from "@tui/context/language"
import { createMemo, onCleanup, onMount } from "solid-js"

export function DialogWorkflows() {
const dialog = useDialog()
const route = useRoute()
const sync = useSync()
const { t } = useLanguage()

const currentSessionID = createMemo(() => (route.data.type === "session" ? route.data.sessionID : undefined))

Expand Down Expand Up @@ -58,5 +60,5 @@ export function DialogWorkflows() {
}))
})

return <DialogSelect title="Workflows" options={options()} />
return <DialogSelect title={t("tui.dialog.workflows.title")} options={options()} />
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { DialogSelect } from "@tui/ui/dialog-select"
import { useRoute } from "@tui/context/route"
import { useSync } from "@tui/context/sync"
import { useProject } from "@tui/context/project"
import { useLanguage } from "@tui/context/language"
import { createMemo, createSignal, onMount } from "solid-js"
import { setTimeout as sleep } from "node:timers/promises"
import { errorData, errorMessage } from "@/util/error"
Expand Down Expand Up @@ -175,6 +176,7 @@ export function DialogWorkspaceCreate(props: { onSelect: (workspaceID: string) =
const project = useProject()
const sdk = useSDK()
const toast = useToast()
const { t } = useLanguage()
const [creating, setCreating] = createSignal<string>()
const [adaptors, setAdaptors] = createSignal<Adaptor[]>()

Expand Down Expand Up @@ -277,7 +279,7 @@ export function DialogWorkspaceCreate(props: { onSelect: (workspaceID: string) =

return (
<DialogSelect
title={creating() ? "Creating Workspace" : "New Workspace"}
title={creating() ? t("tui.dialog.workspace_create.creating") : t("tui.dialog.workspace_create.title")}
skipFilter={true}
options={options()}
onSelect={(option) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { useSDK } from "../context/sdk"
import { useSync } from "@tui/context/sync"
import { useRoute } from "@tui/context/route"
import { useToast } from "../ui/toast"
import { useLanguage } from "@tui/context/language"
import path from "path"

const CREATE_SENTINEL = "__create_worktree__"
Expand All @@ -15,6 +16,7 @@ export function DialogWorktree() {
const sync = useSync()
const route = useRoute()
const toast = useToast()
const { t } = useLanguage()
const [worktrees, setWorktrees] = createSignal<string[]>()
const [busy, setBusy] = createSignal<string>()

Expand Down Expand Up @@ -74,7 +76,7 @@ export function DialogWorktree() {

return (
<DialogSelect
title="Worktrees"
title={t("tui.dialog.worktree.title")}
options={options()}
skipFilter={true}
onSelect={(option) => {
Expand Down
17 changes: 17 additions & 0 deletions packages/opencode/src/cli/cmd/tui/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -428,4 +428,21 @@ export const dict: Record<string, string> = {
"trust.dangerous.advice_root": "Unless you have a very specific reason, DO NOT trust the filesystem root.",
"trust.dangerous.option.yes": "I understand the risks, trust for this session",
"trust.dangerous.option.no": "Exit (recommended)",

// Dialog titles
"tui.dialog.workflows.title": "Workflows",
"tui.dialog.workspace_create.title": "New Workspace",
"tui.dialog.workspace_create.creating": "Creating Workspace",
"tui.dialog.session_list.title": "Sessions",
"tui.dialog.tag.title": "Autocomplete",
"tui.dialog.theme_list.title": "Themes",
"tui.dialog.agent.title": "Select agent",
"tui.dialog.worktree.title": "Worktrees",
"tui.dialog.skill.title": "Skills",
"tui.dialog.skill.placeholder": "Search skills...",
"tui.dialog.variant.title": "Select variant",
"tui.dialog.provider.select_auth": "Select auth method",
"tui.dialog.provider.title": "Connect a provider",
"tui.dialog.mcp.title": "MCPs",
"tui.dialog.stash.title": "Stash",
}
17 changes: 17 additions & 0 deletions packages/opencode/src/cli/cmd/tui/i18n/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -470,4 +470,21 @@ export const dict = {
"tui.dialog.login.flow.waiting": "Esperando autorización del navegador...",
"tui.dialog.login.flow.invalid_code": "Código inválido, intenta de nuevo",
"tui.dialog.login.flow.copied": "Copiado",

// Dialog titles
"tui.dialog.workflows.title": "Flujos de trabajo",
"tui.dialog.workspace_create.title": "Nuevo espacio de trabajo",
"tui.dialog.workspace_create.creating": "Creando espacio de trabajo",
"tui.dialog.session_list.title": "Sesiones",
"tui.dialog.tag.title": "Autocompletar",
"tui.dialog.theme_list.title": "Temas",
"tui.dialog.agent.title": "Seleccionar agente",
"tui.dialog.worktree.title": "Árboles de trabajo",
"tui.dialog.skill.title": "Habilidades",
"tui.dialog.skill.placeholder": "Buscar habilidades...",
"tui.dialog.variant.title": "Seleccionar variante",
"tui.dialog.provider.select_auth": "Seleccionar método de autenticación",
"tui.dialog.provider.title": "Conectar un proveedor",
"tui.dialog.mcp.title": "MCPs",
"tui.dialog.stash.title": "Stash",
} satisfies Partial<Record<Keys, string>>
17 changes: 17 additions & 0 deletions packages/opencode/src/cli/cmd/tui/i18n/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -477,4 +477,21 @@ export const dict = {
"trust.dangerous.advice_root": "Sauf raison très spécifique, NE faites PAS confiance à la racine du système de fichiers.",
"trust.dangerous.option.yes": "Je comprends les risques, faire confiance pour cette session",
"trust.dangerous.option.no": "Quitter (recommandé)",

// Dialog titles
"tui.dialog.workflows.title": "Workflows",
"tui.dialog.workspace_create.title": "Nouvel espace de travail",
"tui.dialog.workspace_create.creating": "Création de l'espace de travail",
"tui.dialog.session_list.title": "Sessions",
"tui.dialog.tag.title": "Autocomplétion",
"tui.dialog.theme_list.title": "Thèmes",
"tui.dialog.agent.title": "Sélectionner un agent",
"tui.dialog.worktree.title": "Arbres de travail",
"tui.dialog.skill.title": "Compétences",
"tui.dialog.skill.placeholder": "Rechercher des compétences...",
"tui.dialog.variant.title": "Sélectionner une variante",
"tui.dialog.provider.select_auth": "Sélectionner la méthode d'authentification",
"tui.dialog.provider.title": "Connecter un fournisseur",
"tui.dialog.mcp.title": "MCPs",
"tui.dialog.stash.title": "Stash",
} satisfies Partial<Record<Keys, string>>
17 changes: 17 additions & 0 deletions packages/opencode/src/cli/cmd/tui/i18n/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -429,4 +429,21 @@ export const dict = {
"trust.dangerous.advice_root": "明確な理由がない限り、ファイルシステムのルートを信頼しないでください。",
"trust.dangerous.option.yes": "リスクを理解した上で、今回のみ信頼する",
"trust.dangerous.option.no": "終了(推奨)",

// Dialog titles
"tui.dialog.workflows.title": "ワークフロー",
"tui.dialog.workspace_create.title": "新しいワークスペース",
"tui.dialog.workspace_create.creating": "ワークスペース作成中",
"tui.dialog.session_list.title": "セッション一覧",
"tui.dialog.tag.title": "オートコンプリート",
"tui.dialog.theme_list.title": "テーマ",
"tui.dialog.agent.title": "エージェントを選択",
"tui.dialog.worktree.title": "ワークツリー",
"tui.dialog.skill.title": "スキル",
"tui.dialog.skill.placeholder": "スキルを検索...",
"tui.dialog.variant.title": "バリアントを選択",
"tui.dialog.provider.select_auth": "認証方法を選択",
"tui.dialog.provider.title": "プロバイダーに接続",
"tui.dialog.mcp.title": "MCP",
"tui.dialog.stash.title": "Stash",
} satisfies Partial<Record<Keys, string>>
17 changes: 17 additions & 0 deletions packages/opencode/src/cli/cmd/tui/i18n/ru.ts
Original file line number Diff line number Diff line change
Expand Up @@ -489,4 +489,21 @@ export const dict = {
"trust.dangerous.advice_root": "Если нет весомой причины, НЕ доверяйте корню файловой системы.",
"trust.dangerous.option.yes": "Я понимаю риски, доверять только в этой сессии",
"trust.dangerous.option.no": "Выйти (рекомендуется)",

// Dialog titles
"tui.dialog.workflows.title": "Workflow-и",
"tui.dialog.workspace_create.title": "Новое рабочее пространство",
"tui.dialog.workspace_create.creating": "Создание рабочего пространства",
"tui.dialog.session_list.title": "Сессии",
"tui.dialog.tag.title": "Автодополнение",
"tui.dialog.theme_list.title": "Темы",
"tui.dialog.agent.title": "Выбрать агента",
"tui.dialog.worktree.title": "Рабочие деревья",
"tui.dialog.skill.title": "Навыки",
"tui.dialog.skill.placeholder": "Поиск навыков...",
"tui.dialog.variant.title": "Выбрать вариант",
"tui.dialog.provider.select_auth": "Выбрать метод аутентификации",
"tui.dialog.provider.title": "Подключить провайдера",
"tui.dialog.mcp.title": "MCP",
"tui.dialog.stash.title": "Stash",
} satisfies Partial<Record<Keys, string>>
Loading