diff --git a/packages/opencode/src/cli/cmd/tui/i18n/en.ts b/packages/opencode/src/cli/cmd/tui/i18n/en.ts index 68c9eb2a..be00b9a8 100644 --- a/packages/opencode/src/cli/cmd/tui/i18n/en.ts +++ b/packages/opencode/src/cli/cmd/tui/i18n/en.ts @@ -428,4 +428,51 @@ export const dict: Record = { "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)", + + // Permission dialog + "tui.permission.always_allow.title": "Always allow", + "tui.permission.always_allow.single": "This will allow {{permission}} until MiMoCode is restarted.", + "tui.permission.always_allow.multi": "This will allow the following patterns until MiMoCode is restarted", + "tui.permission.confirm": "Confirm", + "tui.permission.cancel": "Cancel", + "tui.permission.no_diff": "No diff provided", + "tui.permission.path": "Path: {{path}}", + "tui.permission.pattern": "Pattern: {{pattern}}", + "tui.permission.shell_command": "Shell command", + "tui.permission.unknown_type": "Unknown", + "tui.permission.query": "Query: {{query}}", + "tui.permission.url": "URL: {{url}}", + "tui.permission.patterns": "Patterns", + "tui.permission.external_dir": "Access external directory {{dir}}", + "tui.permission.doom_loop.title": "Continue after repeated failures", + "tui.permission.doom_loop.body": "This keeps the session running despite repeated failures.", + "tui.permission.call_tool": "Call tool {{tool}}", + "tui.permission.tool": "Tool: {{tool}}", + "tui.permission.required": "Permission required", + "tui.permission.allow_once": "Allow once", + "tui.permission.allow_always": "Allow always", + "tui.permission.reject": "Reject", + "tui.permission.reject.title": "Reject permission", + "tui.permission.reject.hint": "Tell MiMoCode what to do differently", + "tui.permission.edit": "Edit {{path}}", + "tui.permission.read": "Read {{path}}", + "tui.permission.glob": "Glob \"{{pattern}}\"", + "tui.permission.grep": "Grep \"{{pattern}}\"", + "tui.permission.list": "List {{path}}", + "tui.permission.task": "{{type}} Task", + "tui.permission.webfetch": "WebFetch {{url}}", + "tui.permission.websearch": "Web Search \"{{query}}\"", + "tui.permission.codesearch": "Exa Code Search \"{{query}}\"", + + // Session route dialogs + "tui.dialog.message.title": "Message Actions", + "tui.dialog.message.revert": "Revert", + "tui.dialog.message.revert.desc": "undo messages and file changes", + "tui.dialog.message.copy": "Copy", + "tui.dialog.message.copy.desc": "message text to clipboard", + "tui.dialog.message.fork": "Fork", + "tui.dialog.message.fork.desc": "create a new session", + "tui.dialog.timeline.title": "Timeline", + "tui.dialog.fork.title": "Fork session", + "tui.dialog.fork.full_session": "Full session", } diff --git a/packages/opencode/src/cli/cmd/tui/i18n/es.ts b/packages/opencode/src/cli/cmd/tui/i18n/es.ts index 5160b363..3127bb44 100644 --- a/packages/opencode/src/cli/cmd/tui/i18n/es.ts +++ b/packages/opencode/src/cli/cmd/tui/i18n/es.ts @@ -470,4 +470,51 @@ 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", + + // Permission dialog + "tui.permission.always_allow.title": "Permitir siempre", + "tui.permission.always_allow.single": "Esto permitirá {{permission}} hasta que MiMoCode se reinicie.", + "tui.permission.always_allow.multi": "Esto permitirá los siguientes patrones hasta que MiMoCode se reinicie", + "tui.permission.confirm": "Confirmar", + "tui.permission.cancel": "Cancelar", + "tui.permission.no_diff": "No se proporcionó diff", + "tui.permission.path": "Ruta: {{path}}", + "tui.permission.pattern": "Patrón: {{pattern}}", + "tui.permission.shell_command": "Comando de shell", + "tui.permission.unknown_type": "Desconocido", + "tui.permission.query": "Consulta: {{query}}", + "tui.permission.url": "URL: {{url}}", + "tui.permission.patterns": "Patrones", + "tui.permission.external_dir": "Acceder al directorio externo {{dir}}", + "tui.permission.doom_loop.title": "Continuar tras fallos repetidos", + "tui.permission.doom_loop.body": "Esto mantiene la sesión activa a pesar de los fallos repetidos.", + "tui.permission.call_tool": "Llamar herramienta {{tool}}", + "tui.permission.tool": "Herramienta: {{tool}}", + "tui.permission.required": "Permiso requerido", + "tui.permission.allow_once": "Permitir una vez", + "tui.permission.allow_always": "Permitir siempre", + "tui.permission.reject": "Rechazar", + "tui.permission.reject.title": "Rechazar permiso", + "tui.permission.reject.hint": "Indica a MiMoCode qué hacer diferente", + "tui.permission.edit": "Editar {{path}}", + "tui.permission.read": "Leer {{path}}", + "tui.permission.glob": "Glob \"{{pattern}}\"", + "tui.permission.grep": "Grep \"{{pattern}}\"", + "tui.permission.list": "Listar {{path}}", + "tui.permission.task": "Tarea de {{type}}", + "tui.permission.webfetch": "WebFetch {{url}}", + "tui.permission.websearch": "Búsqueda web \"{{query}}\"", + "tui.permission.codesearch": "Búsqueda de código Exa \"{{query}}\"", + + // Session route dialogs + "tui.dialog.message.title": "Acciones del mensaje", + "tui.dialog.message.revert": "Revertir", + "tui.dialog.message.revert.desc": "deshacer mensajes y cambios de archivos", + "tui.dialog.message.copy": "Copiar", + "tui.dialog.message.copy.desc": "texto del mensaje al portapapeles", + "tui.dialog.message.fork": "Bifurcar", + "tui.dialog.message.fork.desc": "crear una nueva sesión", + "tui.dialog.timeline.title": "Línea temporal", + "tui.dialog.fork.title": "Bifurcar sesión", + "tui.dialog.fork.full_session": "Sesión completa", } satisfies Partial> diff --git a/packages/opencode/src/cli/cmd/tui/i18n/fr.ts b/packages/opencode/src/cli/cmd/tui/i18n/fr.ts index 3f462f74..9991a4fb 100644 --- a/packages/opencode/src/cli/cmd/tui/i18n/fr.ts +++ b/packages/opencode/src/cli/cmd/tui/i18n/fr.ts @@ -477,4 +477,51 @@ 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é)", + + // Permission dialog + "tui.permission.always_allow.title": "Toujours autoriser", + "tui.permission.always_allow.single": "Cela autorisera {{permission}} jusqu'au redémarrage de MiMoCode.", + "tui.permission.always_allow.multi": "Cela autorisera les motifs suivants jusqu'au redémarrage de MiMoCode", + "tui.permission.confirm": "Confirmer", + "tui.permission.cancel": "Annuler", + "tui.permission.no_diff": "Aucun diff fourni", + "tui.permission.path": "Chemin : {{path}}", + "tui.permission.pattern": "Motif : {{pattern}}", + "tui.permission.shell_command": "Commande shell", + "tui.permission.unknown_type": "Inconnu", + "tui.permission.query": "Requête : {{query}}", + "tui.permission.url": "URL : {{url}}", + "tui.permission.patterns": "Motifs", + "tui.permission.external_dir": "Accéder au répertoire externe {{dir}}", + "tui.permission.doom_loop.title": "Continuer après des échecs répétés", + "tui.permission.doom_loop.body": "Cela maintient la session active malgré les échecs répétés.", + "tui.permission.call_tool": "Appeler l'outil {{tool}}", + "tui.permission.tool": "Outil : {{tool}}", + "tui.permission.required": "Permission requise", + "tui.permission.allow_once": "Autoriser une fois", + "tui.permission.allow_always": "Toujours autoriser", + "tui.permission.reject": "Refuser", + "tui.permission.reject.title": "Refuser la permission", + "tui.permission.reject.hint": "Dites à MiMoCode quoi faire différemment", + "tui.permission.edit": "Modifier {{path}}", + "tui.permission.read": "Lire {{path}}", + "tui.permission.glob": "Glob \"{{pattern}}\"", + "tui.permission.grep": "Grep \"{{pattern}}\"", + "tui.permission.list": "Lister {{path}}", + "tui.permission.task": "Tâche {{type}}", + "tui.permission.webfetch": "WebFetch {{url}}", + "tui.permission.websearch": "Recherche web \"{{query}}\"", + "tui.permission.codesearch": "Recherche de code Exa \"{{query}}\"", + + // Session route dialogs + "tui.dialog.message.title": "Actions du message", + "tui.dialog.message.revert": "Rétablir", + "tui.dialog.message.revert.desc": "annuler les messages et modifications de fichiers", + "tui.dialog.message.copy": "Copier", + "tui.dialog.message.copy.desc": "texte du message dans le presse-papiers", + "tui.dialog.message.fork": "Fork", + "tui.dialog.message.fork.desc": "créer une nouvelle session", + "tui.dialog.timeline.title": "Chronologie", + "tui.dialog.fork.title": "Fork la session", + "tui.dialog.fork.full_session": "Session complète", } satisfies Partial> diff --git a/packages/opencode/src/cli/cmd/tui/i18n/ja.ts b/packages/opencode/src/cli/cmd/tui/i18n/ja.ts index 6f79d969..1555fe0f 100644 --- a/packages/opencode/src/cli/cmd/tui/i18n/ja.ts +++ b/packages/opencode/src/cli/cmd/tui/i18n/ja.ts @@ -429,4 +429,51 @@ export const dict = { "trust.dangerous.advice_root": "明確な理由がない限り、ファイルシステムのルートを信頼しないでください。", "trust.dangerous.option.yes": "リスクを理解した上で、今回のみ信頼する", "trust.dangerous.option.no": "終了(推奨)", + + // Permission dialog + "tui.permission.always_allow.title": "常に許可", + "tui.permission.always_allow.single": "MiMoCodeの再起動まで{{permission}}を許可します。", + "tui.permission.always_allow.multi": "MiMoCodeの再起動まで以下のパターンを許可します", + "tui.permission.confirm": "確認", + "tui.permission.cancel": "キャンセル", + "tui.permission.no_diff": "差分が提供されていません", + "tui.permission.path": "パス:{{path}}", + "tui.permission.pattern": "パターン:{{pattern}}", + "tui.permission.shell_command": "シェルコマンド", + "tui.permission.unknown_type": "不明", + "tui.permission.query": "クエリ:{{query}}", + "tui.permission.url": "URL:{{url}}", + "tui.permission.patterns": "パターン", + "tui.permission.external_dir": "外部ディレクトリへのアクセス {{dir}}", + "tui.permission.doom_loop.title": "繰り返し失敗後も続行", + "tui.permission.doom_loop.body": "繰り返し失敗してもセッションを維持します。", + "tui.permission.call_tool": "ツール呼び出し {{tool}}", + "tui.permission.tool": "ツール:{{tool}}", + "tui.permission.required": "権限が必要です", + "tui.permission.allow_once": "1回だけ許可", + "tui.permission.allow_always": "常に許可", + "tui.permission.reject": "拒否", + "tui.permission.reject.title": "権限を拒否", + "tui.permission.reject.hint": "MiMoCodeに今後の対応を伝えてください", + "tui.permission.edit": "編集 {{path}}", + "tui.permission.read": "読み取り {{path}}", + "tui.permission.glob": "Glob \"{{pattern}}\"", + "tui.permission.grep": "Grep \"{{pattern}}\"", + "tui.permission.list": "一覧 {{path}}", + "tui.permission.task": "{{type}}タスク", + "tui.permission.webfetch": "WebFetch {{url}}", + "tui.permission.websearch": "Web検索 \"{{query}}\"", + "tui.permission.codesearch": "Exa コード検索 \"{{query}}\"", + + // Session route dialogs + "tui.dialog.message.title": "メッセージアクション", + "tui.dialog.message.revert": "元に戻す", + "tui.dialog.message.revert.desc": "メッセージとファイルの変更を取り消す", + "tui.dialog.message.copy": "コピー", + "tui.dialog.message.copy.desc": "メッセージテキストをクリップボードにコピー", + "tui.dialog.message.fork": "フォーク", + "tui.dialog.message.fork.desc": "新しいセッションを作成", + "tui.dialog.timeline.title": "タイムライン", + "tui.dialog.fork.title": "セッションをフォーク", + "tui.dialog.fork.full_session": "セッション全体", } satisfies Partial> diff --git a/packages/opencode/src/cli/cmd/tui/i18n/ru.ts b/packages/opencode/src/cli/cmd/tui/i18n/ru.ts index ee774a06..79cd0c83 100644 --- a/packages/opencode/src/cli/cmd/tui/i18n/ru.ts +++ b/packages/opencode/src/cli/cmd/tui/i18n/ru.ts @@ -489,4 +489,51 @@ export const dict = { "trust.dangerous.advice_root": "Если нет весомой причины, НЕ доверяйте корню файловой системы.", "trust.dangerous.option.yes": "Я понимаю риски, доверять только в этой сессии", "trust.dangerous.option.no": "Выйти (рекомендуется)", + + // Permission dialog + "tui.permission.always_allow.title": "Разрешить всегда", + "tui.permission.always_allow.single": "Это разрешит {{permission}} до перезапуска MiMoCode.", + "tui.permission.always_allow.multi": "Это разрешит следующие шаблоны до перезапуска MiMoCode", + "tui.permission.confirm": "Подтвердить", + "tui.permission.cancel": "Отмена", + "tui.permission.no_diff": "Diff не предоставлен", + "tui.permission.path": "Путь: {{path}}", + "tui.permission.pattern": "Шаблон: {{pattern}}", + "tui.permission.shell_command": "Shell-команда", + "tui.permission.unknown_type": "Неизвестно", + "tui.permission.query": "Запрос: {{query}}", + "tui.permission.url": "URL: {{url}}", + "tui.permission.patterns": "Шаблоны", + "tui.permission.external_dir": "Доступ к внешнему каталогу {{dir}}", + "tui.permission.doom_loop.title": "Продолжить после повторных сбоев", + "tui.permission.doom_loop.body": "Это сохранит сессию, несмотря на повторные сбои.", + "tui.permission.call_tool": "Вызов инструмента {{tool}}", + "tui.permission.tool": "Инструмент: {{tool}}", + "tui.permission.required": "Требуется разрешение", + "tui.permission.allow_once": "Разрешить один раз", + "tui.permission.allow_always": "Разрешить всегда", + "tui.permission.reject": "Отклонить", + "tui.permission.reject.title": "Отклонить разрешение", + "tui.permission.reject.hint": "Укажите MiMoCode, что нужно сделать иначе", + "tui.permission.edit": "Редактирование {{path}}", + "tui.permission.read": "Чтение {{path}}", + "tui.permission.glob": "Glob \"{{pattern}}\"", + "tui.permission.grep": "Grep \"{{pattern}}\"", + "tui.permission.list": "Список {{path}}", + "tui.permission.task": "Задача {{type}}", + "tui.permission.webfetch": "WebFetch {{url}}", + "tui.permission.websearch": "Веб-поиск \"{{query}}\"", + "tui.permission.codesearch": "Поиск кода Exa \"{{query}}\"", + + // Session route dialogs + "tui.dialog.message.title": "Действия с сообщением", + "tui.dialog.message.revert": "Откатить", + "tui.dialog.message.revert.desc": "отменить сообщения и изменения файлов", + "tui.dialog.message.copy": "Копировать", + "tui.dialog.message.copy.desc": "текст сообщения в буфер обмена", + "tui.dialog.message.fork": "Форк", + "tui.dialog.message.fork.desc": "создать новую сессию", + "tui.dialog.timeline.title": "Хронология", + "tui.dialog.fork.title": "Форк сессии", + "tui.dialog.fork.full_session": "Полная сессия", } satisfies Partial> diff --git a/packages/opencode/src/cli/cmd/tui/i18n/zh.ts b/packages/opencode/src/cli/cmd/tui/i18n/zh.ts index cf12b5e0..09204607 100644 --- a/packages/opencode/src/cli/cmd/tui/i18n/zh.ts +++ b/packages/opencode/src/cli/cmd/tui/i18n/zh.ts @@ -421,4 +421,51 @@ export const dict = { "trust.dangerous.advice_root": "除非有明确的理由,否则不要信任文件系统根目录。", "trust.dangerous.option.yes": "我了解风险,仅本次信任", "trust.dangerous.option.no": "退出(推荐)", + + // Permission dialog + "tui.permission.always_allow.title": "始终允许", + "tui.permission.always_allow.single": "这将允许 {{permission}},直到 MiMoCode 重启。", + "tui.permission.always_allow.multi": "这将允许以下模式,直到 MiMoCode 重启", + "tui.permission.confirm": "确认", + "tui.permission.cancel": "取消", + "tui.permission.no_diff": "未提供差异信息", + "tui.permission.path": "路径:{{path}}", + "tui.permission.pattern": "模式:{{pattern}}", + "tui.permission.shell_command": "Shell 命令", + "tui.permission.unknown_type": "未知", + "tui.permission.query": "查询:{{query}}", + "tui.permission.url": "URL:{{url}}", + "tui.permission.patterns": "模式", + "tui.permission.external_dir": "访问外部目录 {{dir}}", + "tui.permission.doom_loop.title": "在反复失败后继续", + "tui.permission.doom_loop.body": "尽管反复失败,仍保持会话运行。", + "tui.permission.call_tool": "调用工具 {{tool}}", + "tui.permission.tool": "工具:{{tool}}", + "tui.permission.required": "需要权限", + "tui.permission.allow_once": "允许一次", + "tui.permission.allow_always": "始终允许", + "tui.permission.reject": "拒绝", + "tui.permission.reject.title": "拒绝权限", + "tui.permission.reject.hint": "告诉 MiMoCode 应该怎么做", + "tui.permission.edit": "编辑 {{path}}", + "tui.permission.read": "读取 {{path}}", + "tui.permission.glob": "Glob \"{{pattern}}\"", + "tui.permission.grep": "Grep \"{{pattern}}\"", + "tui.permission.list": "列出 {{path}}", + "tui.permission.task": "{{type}} 任务", + "tui.permission.webfetch": "WebFetch {{url}}", + "tui.permission.websearch": "网络搜索 \"{{query}}\"", + "tui.permission.codesearch": "Exa 代码搜索 \"{{query}}\"", + + // Session route dialogs + "tui.dialog.message.title": "消息操作", + "tui.dialog.message.revert": "回退", + "tui.dialog.message.revert.desc": "撤销消息和文件更改", + "tui.dialog.message.copy": "复制", + "tui.dialog.message.copy.desc": "将消息文本复制到剪贴板", + "tui.dialog.message.fork": "分叉", + "tui.dialog.message.fork.desc": "创建新会话", + "tui.dialog.timeline.title": "时间线", + "tui.dialog.fork.title": "分叉会话", + "tui.dialog.fork.full_session": "完整会话", } satisfies Partial> diff --git a/packages/opencode/src/cli/cmd/tui/i18n/zht.ts b/packages/opencode/src/cli/cmd/tui/i18n/zht.ts index fb097786..99fabef6 100644 --- a/packages/opencode/src/cli/cmd/tui/i18n/zht.ts +++ b/packages/opencode/src/cli/cmd/tui/i18n/zht.ts @@ -390,6 +390,53 @@ export const dict = { "trust.dangerous.advice_root": "除非有明確的理由,否則不要信任檔案系統根目錄。", "trust.dangerous.option.yes": "我了解風險,僅本次信任", "trust.dangerous.option.no": "退出(推薦)", + + // Permission dialog + "tui.permission.always_allow.title": "始終允許", + "tui.permission.always_allow.single": "這將允許 {{permission}},直到 MiMoCode 重新啟動。", + "tui.permission.always_allow.multi": "這將允許以下模式,直到 MiMoCode 重新啟動", + "tui.permission.confirm": "確認", + "tui.permission.cancel": "取消", + "tui.permission.no_diff": "未提供差異資訊", + "tui.permission.path": "路徑:{{path}}", + "tui.permission.pattern": "模式:{{pattern}}", + "tui.permission.shell_command": "Shell 命令", + "tui.permission.unknown_type": "未知", + "tui.permission.query": "查詢:{{query}}", + "tui.permission.url": "URL:{{url}}", + "tui.permission.patterns": "模式", + "tui.permission.external_dir": "存取外部目錄 {{dir}}", + "tui.permission.doom_loop.title": "在反覆失敗後繼續", + "tui.permission.doom_loop.body": "儘管反覆失敗,仍保持工作階段執行。", + "tui.permission.call_tool": "呼叫工具 {{tool}}", + "tui.permission.tool": "工具:{{tool}}", + "tui.permission.required": "需要權限", + "tui.permission.allow_once": "允許一次", + "tui.permission.allow_always": "始終允許", + "tui.permission.reject": "拒絕", + "tui.permission.reject.title": "拒絕權限", + "tui.permission.reject.hint": "告訴 MiMoCode 應該怎麼做", + "tui.permission.edit": "編輯 {{path}}", + "tui.permission.read": "讀取 {{path}}", + "tui.permission.glob": "Glob \"{{pattern}}\"", + "tui.permission.grep": "Grep \"{{pattern}}\"", + "tui.permission.list": "列出 {{path}}", + "tui.permission.task": "{{type}} 任務", + "tui.permission.webfetch": "WebFetch {{url}}", + "tui.permission.websearch": "網路搜尋 \"{{query}}\"", + "tui.permission.codesearch": "Exa 程式碼搜尋 \"{{query}}\"", + + // Session route dialogs + "tui.dialog.message.title": "訊息操作", + "tui.dialog.message.revert": "回退", + "tui.dialog.message.revert.desc": "撤銷訊息和檔案變更", + "tui.dialog.message.copy": "複製", + "tui.dialog.message.copy.desc": "將訊息文字複製到剪貼簿", + "tui.dialog.message.fork": "分叉", + "tui.dialog.message.fork.desc": "建立新工作階段", + "tui.dialog.timeline.title": "時間線", + "tui.dialog.fork.title": "分叉工作階段", + "tui.dialog.fork.full_session": "完整工作階段", "tui.dialog.login.flow.title": "MiMo 登入", "tui.dialog.login.flow.placeholder": "貼上 Code(或等待瀏覽器回調)", "tui.dialog.login.flow.busy": "登入中...", diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx index e4f7eefb..21378773 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-fork-from-timeline.tsx @@ -6,6 +6,7 @@ import { Locale } from "@/util" import { useSDK } from "@tui/context/sdk" import { useRoute } from "@tui/context/route" import { useDialog, type DialogContext } from "../../ui/dialog" +import { useLanguage } from "../../context/language" import type { PromptInfo } from "@tui/component/prompt/history" import { strip } from "@tui/component/prompt/part" @@ -14,6 +15,7 @@ export function DialogForkFromTimeline(props: { sessionID: string; onMove: (mess const dialog = useDialog() const sdk = useSDK() const route = useRoute() + const { t } = useLanguage() onMount(() => { dialog.setSize("large") @@ -22,7 +24,7 @@ export function DialogForkFromTimeline(props: { sessionID: string; onMove: (mess const options = createMemo((): DialogSelectOption[] => { const messages = sync.data.message[props.sessionID]?.["main"] ?? [] const fullSession = { - title: "Full session", + title: t("tui.dialog.fork.full_session"), value: undefined, onSelect: async (dialog: DialogContext) => { const forked = await sdk.client.session.fork({ sessionID: props.sessionID }) @@ -72,5 +74,5 @@ export function DialogForkFromTimeline(props: { sessionID: string; onMove: (mess return [fullSession, ...result.reverse()] }) - return props.onMove(option.value)} title="Fork session" options={options()} /> + return props.onMove(option.value)} title={t("tui.dialog.fork.title")} options={options()} /> } diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-message.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-message.tsx index e7d3f3a5..25f2b1f4 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-message.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-message.tsx @@ -3,6 +3,7 @@ import { useSync } from "@tui/context/sync" import { DialogSelect } from "@tui/ui/dialog-select" import { useSDK } from "@tui/context/sdk" import { useRoute } from "@tui/context/route" +import { useLanguage } from "../../context/language" import * as Clipboard from "@tui/util/clipboard" import type { PromptInfo } from "@tui/component/prompt/history" import { strip } from "@tui/component/prompt/part" @@ -24,15 +25,16 @@ export function DialogMessage(props: { return undefined }) const route = useRoute() + const { t } = useLanguage() return ( { const msg = message() if (!msg) return @@ -61,9 +63,9 @@ export function DialogMessage(props: { }, }, { - title: "Copy", + title: t("tui.dialog.message.copy"), value: "message.copy", - description: "message text to clipboard", + description: t("tui.dialog.message.copy.desc"), onSelect: async (dialog) => { const msg = message() if (!msg) return @@ -81,9 +83,9 @@ export function DialogMessage(props: { }, }, { - title: "Fork", + title: t("tui.dialog.message.fork"), value: "session.fork", - description: "create a new session", + description: t("tui.dialog.message.fork.desc"), onSelect: async (dialog) => { const result = await sdk.client.session.fork({ sessionID: props.sessionID, diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-timeline.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-timeline.tsx index d37deeaf..fdadb302 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/dialog-timeline.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/dialog-timeline.tsx @@ -5,6 +5,7 @@ import type { TextPart } from "@mimo-ai/sdk/v2" import { Locale } from "@/util" import { DialogMessage } from "./dialog-message" import { useDialog } from "../../ui/dialog" +import { useLanguage } from "../../context/language" import type { PromptInfo } from "../../component/prompt/history" export function DialogTimeline(props: { @@ -14,6 +15,7 @@ export function DialogTimeline(props: { }) { const sync = useSync() const dialog = useDialog() + const { t } = useLanguage() onMount(() => { dialog.setSize("large") @@ -43,5 +45,5 @@ export function DialogTimeline(props: { return result }) - return props.onMove(option.value)} title="Timeline" options={options()} /> + return props.onMove(option.value)} title={t("tui.dialog.timeline.title")} options={options()} /> } diff --git a/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx b/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx index 39b48a3e..2953708e 100644 --- a/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx +++ b/packages/opencode/src/cli/cmd/tui/routes/session/permission.tsx @@ -15,6 +15,7 @@ import { Keybind } from "@/util" import { Locale } from "@/util" import { Global } from "@/global" import { useDialog } from "../../ui/dialog" +import { useLanguage } from "../../context/language" import { getScrollAcceleration } from "../../util/scroll" import { useTuiConfig } from "../../context/tui-config" @@ -52,6 +53,7 @@ function EditBody(props: { request: PermissionRequest }) { const syntax = themeState.syntax const config = useTuiConfig() const dimensions = useTerminalDimensions() + const { t } = useLanguage() const filepath = createMemo(() => (props.request.metadata?.filepath as string) ?? "") const diff = createMemo(() => (props.request.metadata?.diff as string) ?? "") @@ -101,7 +103,7 @@ function EditBody(props: { request: PermissionRequest }) { - No diff provided + {t("tui.permission.no_diff")} @@ -151,20 +153,21 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { }) const { theme } = useTheme() + const { t } = useLanguage() return ( - + - This will allow the following patterns until MiMoCode is restarted + {t("tui.permission.always_allow.multi")} {(pattern) => ( @@ -179,7 +182,7 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { } - options={{ confirm: "Confirm", cancel: "Cancel" }} + options={{ confirm: t("tui.permission.confirm"), cancel: t("tui.permission.cancel") }} escapeKey="cancel" onSelect={(option) => { setStore("stage", "permission") @@ -216,7 +219,7 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { const filepath = typeof raw === "string" ? raw : "" return { icon: "→", - title: `Edit ${normalizePath(filepath)}`, + title: t("tui.permission.edit", { path: normalizePath(filepath) }), body: , } } @@ -226,11 +229,11 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { const filePath = typeof raw === "string" ? raw : "" return { icon: "→", - title: `Read ${normalizePath(filePath)}`, + title: t("tui.permission.read", { path: normalizePath(filePath) }), body: ( - {"Path: " + normalizePath(filePath)} + {t("tui.permission.path", { path: normalizePath(filePath) })} ), @@ -241,11 +244,11 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { const pattern = typeof data.pattern === "string" ? data.pattern : "" return { icon: "✱", - title: `Glob "${pattern}"`, + title: t("tui.permission.glob", { pattern }), body: ( - {"Pattern: " + pattern} + {t("tui.permission.pattern", { pattern })} ), @@ -256,11 +259,11 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { const pattern = typeof data.pattern === "string" ? data.pattern : "" return { icon: "✱", - title: `Grep "${pattern}"`, + title: t("tui.permission.grep", { pattern }), body: ( - {"Pattern: " + pattern} + {t("tui.permission.pattern", { pattern })} ), @@ -272,11 +275,11 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { const dir = typeof raw === "string" ? raw : "" return { icon: "→", - title: `List ${normalizePath(dir)}`, + title: t("tui.permission.list", { path: normalizePath(dir) }), body: ( - {"Path: " + normalizePath(dir)} + {t("tui.permission.path", { path: normalizePath(dir) })} ), @@ -285,7 +288,7 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { if (permission === "bash") { const title = - typeof data.description === "string" && data.description ? data.description : "Shell command" + typeof data.description === "string" && data.description ? data.description : t("tui.permission.shell_command") const command = typeof data.command === "string" ? data.command : "" return { icon: "#", @@ -301,11 +304,11 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { } if (permission === "task") { - const type = typeof data.subagent_type === "string" ? data.subagent_type : "Unknown" + const type = typeof data.subagent_type === "string" ? data.subagent_type : t("tui.permission.unknown_type") const desc = typeof data.description === "string" ? data.description : "" return { icon: "#", - title: `${Locale.titlecase(type)} Task`, + title: t("tui.permission.task", { type: Locale.titlecase(type) }), body: ( @@ -320,11 +323,11 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { const url = typeof data.url === "string" ? data.url : "" return { icon: "%", - title: `WebFetch ${url}`, + title: t("tui.permission.webfetch", { url }), body: ( - {"URL: " + url} + {t("tui.permission.url", { url })} ), @@ -335,11 +338,11 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { const query = typeof data.query === "string" ? data.query : "" return { icon: "◈", - title: `Web Search "${query}"`, + title: t("tui.permission.websearch", { query }), body: ( - {"Query: " + query} + {t("tui.permission.query", { query })} ), @@ -350,11 +353,11 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { const query = typeof data.query === "string" ? data.query : "" return { icon: "◇", - title: `Exa Code Search "${query}"`, + title: t("tui.permission.codesearch", { query }), body: ( - {"Query: " + query} + {t("tui.permission.query", { query })} ), @@ -375,11 +378,11 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { return { icon: "←", - title: `Access external directory ${dir}`, + title: t("tui.permission.external_dir", { dir }), body: ( 0}> - Patterns + {t("tui.permission.patterns")} {(p) => {"- " + p}} @@ -392,10 +395,10 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { if (permission === "doom_loop") { return { icon: "⟳", - title: "Continue after repeated failures", + title: t("tui.permission.doom_loop.title"), body: ( - This keeps the session running despite repeated failures. + {t("tui.permission.doom_loop.body")} ), } @@ -403,10 +406,10 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { return { icon: "⚙", - title: `Call tool ${permission}`, + title: t("tui.permission.call_tool", { tool: permission }), body: ( - {"Tool: " + permission} + {t("tui.permission.tool", { tool: permission })} ), } @@ -418,7 +421,7 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { {"△"} - Permission required + {t("tui.permission.required")} @@ -431,10 +434,10 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { const body = ( { @@ -471,6 +474,7 @@ export function PermissionPrompt(props: { request: PermissionRequest }) { function RejectPrompt(props: { onConfirm: (message: string) => void; onCancel: () => void }) { let input: TextareaRenderable const { theme } = useTheme() + const { t } = useLanguage() const keybind = useKeybind() const textareaKeybindings = useTextareaKeybindings() const dimensions = useTerminalDimensions() @@ -501,10 +505,10 @@ function RejectPrompt(props: { onConfirm: (message: string) => void; onCancel: ( {"△"} - Reject permission + {t("tui.permission.reject.title")} - Tell MiMoCode what to do differently + {t("tui.permission.reject.hint")}